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)); } }
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; }
public ExperimentEndedEventArgs(enExperimentStatus status, IExperimentData data) { this.status = status; this.data = data; }