UC1:
    number:
        Use Case 4.1
    title:        
        Add VoltageProtocol to Experiment
    description:    
        Adds a successfully initialized VoltageProtocol instance to the Experiment's map of VoltageProtocols
    actor:
        User    
    level:
        user
    preconditions:  
        - An instance of Experiment has been initialized successfully 
        - An instance of VoltageProtocol has been initialized successfully 
        - A VoltageProtocol with the same name does not already exist in the map of VoltageProtocols
    postconditions: 
        The VoltageProtocol is added to Experiment's map of VoltageProtocols with its name as the key
    steps:
        - The user calls Experiment's addVoltageProtocol() method with a pointer to the new VoltageProtocol as the sole argument
    extensions:    
        - A VoltageProtocol with the same name already exist in the map of VoltageProtocols
        - The map of VoltageProtocols is full

UC2:
    number:
        Use Case 4.2
    title:        
        Add Concentration to Experiment
    description:    
        Adds a Concentration with the given name to Experiment's vector of Concentrations
    actor:
        User    
    level:
        user
    preconditions:  
        - An instance of Experiment has been initialized successfully 
    postconditions: 
        The Concentration's name will be added to Experiment's vector of Concentrations
    steps:
        - The user calls Experiment's addConcentration() method with the name of the Concentration as the sole argument
    extensions:    
        - A Concentration with the same name already exist in the vector of Concentration
        - The vector of Concentrations is full

UC3:
    number:
        Use Case 4.3
    title:        
        Add Experiment Protocol
    description:    
        Creates and adds a named ExperimentProtocol defined by a single VoltageProtocol, and zero or more Concentration values
    actor:
        User    
    level:
        user
    preconditions:  
        - An instance of Experiment has been initialized successfully
        - The VoltageProtocol to be used in the ExperimentProtocol has been added to the map of VoltageProtocols
        - The Concentration values to be used have been declared and exist in the vector of Concentrations
    postconditions: 
        - The ExperimentProtocol will be created and added to Experiment's map of ExperimentProtocols with its name as the key
        - The ExperimentProtocol will contain the Concentration values specified in the arguments to the method
        - The ExperimentProtocol will contain a vector of VoltageProtocolIterations
        - Each VoltageProtocolIteration will contain T time, voltage pairs, where T is the maximum time defined by the VoltageProtocol
        - The vector of VoltageProtocolIterations will have N entries, where N is the number of steps in the stepped VoltageProtocolStage in the VoltageProtocol
    steps:
        - The user calls Experiment's addExperimentProtocol() method with a the name of the ExperimentProtocol, name of the VoltageProtocol to use, and Concentration values as the arguments
        - The system checks that the Concentrations have been declared
        - The system checks that the named VoltageProtocol exists in the map of VoltageProtocols
        - The system calls the VoltageProtocol's serializeProtocol() method, which returns a vector of voltage VoltageProtocolIterations
        - The system creates a new ExperimentProtocol and adds the vector of VoltageProtocolIterations, and the map of Concentrations
        - The system adds the new ExperimentProtocol to the map of ExperimentProtocols with its name as the key
    extensions:    
        - The VoltageProtocol does not exist
        - A Concentration has not been declared
        - An ExperimentProtocol with the same name already exists in the map of ExperimentProtocols

UC4:
    number:
        Use Case 4.4
    title:        
        Run ExperimentProtocol Sweep
    description:    
        Uses the SimulationRunner to run every ExperimentProtocol defined in the map of ExperimentProtocols and stores their results
    actor:
        User    
    level:
        user
    preconditions:  
        - An instance of Experiment has been initialized successfully
        - A valid MarkovModel has been defined
        - A valid VoltageProtocol has been added to the map of VoltageProtocols
        - The Concentration values to be used to run the experiment have been declared and exist in the vector of Concentrations
    postconditions: 
        The experiment will be run by the ODESolver and the results stored in the map of results
    steps:
        - The user calls Experiment's run() method with a the name of the experiment, voltage protocol to use, and Concentration values as the arguments
        - The system checks that the named VoltageProtocol exists in the map of VoltageProtocols
        - The system checks that the Concentrations have been declared
        - The system calls validate() on the MarkovModel to assure that it is valid
    extensions:    
        - The VoltageProtocol does not exist
        - A Concentration has not been declared
        - A MarkovModel has not been added
        - The MarkovModel is not valid