示例#1
0
        private void RunNextExperiment(int expIndex)
        {
            IExperiment exp = (IExperiment)scanMethod[expIndex];

            log.Add("Configuring " + ((ParametrizableObject)exp).Name + "...");
            enExperimentStatus expStatus = exp.Configure(null, scanMethodResultsPath);

            if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Idle))
            {
                log.Warning("Experiment Sequence Aborted due to exp.Configure() returning: " + expStatus);
                OnNotifyScanEnded(new ExperimentEndedEventArgs(enExperimentStatus.Error, null));
            }

            exp.NotifyExperimentDataUpdated -= Exp_NotifyExperimentDataUpdated;
            exp.NotifyExperimentDataUpdated += Exp_NotifyExperimentDataUpdated;
            exp.NotifyExperimentEnded       -= Exp_NotifyExperimentEnded;
            exp.NotifyExperimentEnded       += Exp_NotifyExperimentEnded;
            experimentRunning     = expIndex;
            experimentRunningName = (scanMethod[experimentRunning] as ParametrizableObject).Name;

            log.Add("Running " + ((ParametrizableObject)exp).Name + "...");
            expStatus = exp.Run();
            if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Running))
            {
                exp.NotifyExperimentDataUpdated -= Exp_NotifyExperimentDataUpdated;
                exp.NotifyExperimentEnded       -= Exp_NotifyExperimentEnded;
                try
                {
                    // just in case Experiment was started
                    exp.Abort();
                }
                catch (Exception e)
                {
                }
                log.Warning("Experiment Sequence Aborted due to exp.Run() returning: " + expStatus);
                OnNotifyScanEnded(new ExperimentEndedEventArgs(enExperimentStatus.Error, null));
            }
        }
示例#2
0
        private void ChildExperimentRunner()
        {
            foreach (IExperiment exp in this)
            {
                childExperimentCompleted = new TaskCompletionSource <bool>();
                currentChildExperiment   = exp;

                log.Add("Configuring " + ((ParametrizableObject)exp).Name + "...");

                enExperimentStatus expStatus = enExperimentStatus.Uninitialized;

                // is the child another container?
                if (typeof(ExperimentContainer).IsAssignableFrom(exp.GetType()))
                {
                    // Use the path as is (container will append its on subdirectory)
                    expStatus = exp.Configure(this, ResultsFilePath);
                }
                else
                {
                    // For non-container experiments specifiy a sub directory here
                    expStatus = exp.Configure(this, Path.Combine(ResultsFilePath, (exp as ParametrizableObject).Name));
                }

                if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Idle))
                {
                    log.Warning("Experiment Sequence Aborted due to exp.Configure() returning: " + expStatus);
                    status = enExperimentStatus.Error;
                    return;
                }

                exp.NotifyExperimentDataUpdated -= Child_ExperimentDataUpdated;
                exp.NotifyExperimentDataUpdated += Child_ExperimentDataUpdated;
                exp.NotifyExperimentEnded       -= Child_ExperimentEnded;
                exp.NotifyExperimentEnded       += Child_ExperimentEnded;
                expStatus = exp.Run();
                if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Running))
                {
                    exp.NotifyExperimentDataUpdated -= Child_ExperimentDataUpdated;
                    exp.NotifyExperimentEnded       -= Child_ExperimentEnded;
                    try
                    {
                        // just in case Experiment was started
                        exp.Abort();
                    }
                    catch (Exception e)
                    {
                    }
                    log.Warning("Experiment Sequence Aborted due to exp.Run() returning: " + expStatus);
                    status = enExperimentStatus.Error;
                    return;
                }

                childExperimentCompleted.Task.Wait();

                // Was there an error?
                if (childExperimentCompleted.Task.Result == false)
                {
                    log.Warning("Child Experiment ended with error status");
                    status = enExperimentStatus.Error;
                    return;
                }

                currentChildExperiment           = null;
                exp.NotifyExperimentEnded       -= Child_ExperimentEnded;
                exp.NotifyExperimentDataUpdated -= Child_ExperimentDataUpdated;

                // is abort Flag set?
                if (abortExperiment)
                {
                    status = enExperimentStatus.Aborted;
                    return;
                }
            }

            status = enExperimentStatus.Completed;
        }
        private void ParallelChildExperimentRunner()
        {
            childExperimentsCompleted = new TaskCompletionSource <bool> [this.Count];
            int i = 0;
            enExperimentStatus expStatus = enExperimentStatus.OK;

            foreach (IExperiment exp in this)
            {
                childExperimentsCompleted[i] = new TaskCompletionSource <bool>();

                log.Add("Configuring " + ((ParametrizableObject)exp).Name + "...");
                expStatus = exp.Configure(this, Path.Combine(ResultsFilePath, (exp as ParametrizableObject).Name));
                if ((expStatus != enExperimentStatus.OK) && (expStatus != enExperimentStatus.Idle))
                {
                    log.Warning("Experiment Sequence Aborted due to exp.Configure() returning: " + expStatus);
                    status = enExperimentStatus.Error;
                    return;
                }

                exp.NotifyExperimentDataUpdated -= Child_ParallelExperimentDataUpdated;
                exp.NotifyExperimentDataUpdated += Child_ParallelExperimentDataUpdated;
                exp.NotifyExperimentEnded       -= Child_ParallelExperimentEnded;
                exp.NotifyExperimentEnded       += Child_ParallelExperimentEnded;

                i++;
            }

            experimentData = new Generic2DExperimentData();
            experimentData.experimentName = "Linear Sweep Voltammetry";
            firstExperimentData           = false;

            // fill Experiment Data with dummies
            for (i = 0; i < this.Count; i++)
            {
                // Add a dummy
                experimentData.datasetNames.Add("");
                experimentData.axisNames.Add(new string[] { "", "" });
                experimentData.axisUnits.Add(new string[] { "", "" });
                experimentData.data.Add(new double[2][] { new double[] { double.NaN }, new double[] { double.NaN } });
            }

            i = 0;
            foreach (IExperiment exp in this)
            {
                enExperimentStatus childStatus = exp.Run();
                if ((childStatus != enExperimentStatus.OK) && (childStatus != enExperimentStatus.Running))
                {
                    expStatus = enExperimentStatus.Error;
                }
            }

            if (expStatus == enExperimentStatus.Error)
            {
                foreach (IExperiment exp in this)
                {
                    exp.NotifyExperimentDataUpdated -= Child_ParallelExperimentDataUpdated;
                    exp.NotifyExperimentEnded       -= Child_ParallelExperimentEnded;
                    exp.Abort();
                }

                log.Warning("Parallel experiment execution error during exp.Run() - all experiments aborted");
                status = enExperimentStatus.Error;
                return;
            }

            Task.WaitAll(childExperimentsCompleted.Select(x => x.Task).ToArray());

            // Check if all Children completed normaly (Task.Result == true)
            if (childExperimentsCompleted.Count(x => x.Task.Result == true) == this.Count)
            {
                status = enExperimentStatus.Completed;
            }

            childExperimentsCompleted = null;
        }
示例#4
0
 public ExperimentEndedEventArgs(enExperimentStatus status, IExperimentData data)
 {
     this.status = status;
     this.data   = data;
 }