/// <summary> /// Starts fixation calculation for every subject in list. /// </summary> /// <param name="worker">background worker</param> /// <param name="e">do work event arguments</param> private void CalculateFixForAllSubjects(BackgroundWorker worker, DoWorkEventArgs e) { DataTable subjectsTable = Document.ActiveDocument.DocDataSet.SubjectsAdapter.GetData(); foreach (DataRow subjectRow in subjectsTable.Rows) { string strSubject = (string)subjectRow["SubjectName"]; try { ((MainForm)this.MdiParent).StatusLabel.Text = "Calculation Subject: " + strSubject; } catch (InvalidOperationException ex) { ExceptionMethods.HandleExceptionSilent(ex); } // Get trial data of current subject DataTable trialsTable = Document.ActiveDocument.DocDataSet.TrialsAdapter.GetDataBySubject(strSubject); FixationCalculation calculationObject = new FixationCalculation(); calculationObject.CalcFixations(SampleType.Gaze, strSubject, trialsTable, worker, e); calculationObject.CalcFixations(SampleType.Mouse, strSubject, trialsTable, worker, e); if (e.Cancel) { break; } } }
/// <summary> /// This method writes the data that is written in the lists during /// recording to OGAMAs dataset. /// If this could be successfully done the whole new data is /// written to the database (SQL Database file). /// </summary> private void SaveRecordingIntoTablesAndDB() { try { // Set wait cursor until UI is reset Cursor.Current = Cursors.WaitCursor; string subject = this.currentTracker.Subject.SubjectName; if (subject == string.Empty) { var dialog = new AskForSubjectNameDialog(false); dialog.ShowDialog(); subject = dialog.SubjectName; } this.bgwSaveSplash.RunWorkerAsync("Saving to database ..."); // Creates an empty raw data table in the mdf database Queries.CreateRawDataTableInDB(subject); // Write RawDataTable into File with Bulk Statement Queries.WriteRawDataWithBulkStatement(subject, this.subjectRawDataTable); // Save subject information to dataset if (!Queries.WriteSubjectToDataSet(this.currentTracker.Subject)) { throw new DataException("The new subject information could not be written into the dataset."); } // Save trial information to dataset if (!Queries.WriteTrialsDataListToDataSet(this.trialDataList)) { throw new DataException("The new trials table could not be written into the dataset."); } // Save trial event information to dataset if (!Queries.WriteTrialEventsToDataSet(this.trialEventList)) { throw new DataException("The new trials table could not be written into the dataset."); } Document.ActiveDocument.DocDataSet.EnforceConstraints = false; // Update subjects and trials table in the mdf database Document.ActiveDocument.DocDataSet.TrialEventsAdapter.Update(Document.ActiveDocument.DocDataSet.TrialEvents); Document.ActiveDocument.DocDataSet.TrialsAdapter.Update(Document.ActiveDocument.DocDataSet.Trials); Document.ActiveDocument.DocDataSet.SubjectsAdapter.Update(Document.ActiveDocument.DocDataSet.Subjects); Document.ActiveDocument.DocDataSet.AcceptChanges(); Document.ActiveDocument.DocDataSet.CreateRawDataAdapters(); Document.ActiveDocument.DocDataSet.EnforceConstraints = true; // Get trial data of current subject DataTable trialsTable = Document.ActiveDocument.DocDataSet.TrialsAdapter.GetDataBySubject(subject); // Hide splash this.bgwSaveSplash.CancelAsync(); // Show new splash new info this.bgwCalcFixations.RunWorkerAsync("Calculating fixations ..."); Application.DoEvents(); // Calculate fixations var calculationObject = new FixationCalculation(); calculationObject.CalcFixations(SampleType.Gaze, subject, trialsTable, null, null); calculationObject.CalcFixations(SampleType.Mouse, subject, trialsTable, null, null); this.bgwCalcFixations.CancelAsync(); // Show the success information on the // controllers screen var successDlg = new SavingSuccessDialog(); Rectangle controllerBounds = PresentationScreen.GetControllerWorkingArea(); successDlg.Location = new Point( controllerBounds.Width / 2 - successDlg.Width / 2, controllerBounds.Height / 2 - successDlg.Height / 2); successDlg.ShowDialog(); } catch (Exception ex) { ExceptionMethods.HandleException(ex); // Hide saving splash. if (this.bgwSaveSplash.IsBusy) { this.bgwSaveSplash.CancelAsync(); } // Hide fixation calculation splash. if (this.bgwCalcFixations.IsBusy) { this.bgwCalcFixations.CancelAsync(); } // CleanUp // First reject changes (remove trial and subject table modifications) Document.ActiveDocument.DocDataSet.RejectChanges(); Document.ActiveDocument.DocDataSet.EnforceConstraints = false; Document.ActiveDocument.DocDataSet.SubjectsAdapter.Update(Document.ActiveDocument.DocDataSet.Subjects); Document.ActiveDocument.DocDataSet.TrialsAdapter.Update(Document.ActiveDocument.DocDataSet.Trials); Document.ActiveDocument.DocDataSet.TrialEventsAdapter.Update(Document.ActiveDocument.DocDataSet.TrialEvents); // Remove eventually added raw data table in dataset if (Document.ActiveDocument.DocDataSet.Tables.Contains(this.currentTracker.Subject.SubjectName + "Rawdata")) { Document.ActiveDocument.DocDataSet.Tables.Remove(this.currentTracker.Subject.SubjectName + "Rawdata"); } Document.ActiveDocument.DocDataSet.EnforceConstraints = true; // Remove raw data table in database file (.mdf) Queries.DeleteRawDataTableInDB(this.currentTracker.Subject.SubjectName); string filename = Path.Combine( Document.ActiveDocument.ExperimentSettings.ThumbsPath, this.currentTracker.Subject.SubjectName + ".avi"); if (File.Exists(filename)) { File.Delete(filename); } } finally { // Free resources this.trialEventList.Clear(); this.trialDataList.Clear(); this.subjectRawDataTable.Dispose(); } }
/// <summary> /// This method calculates the fixations for the subjects /// that are currently imported. /// </summary> /// <param name="mainWindow"> /// The <see cref="MainForm"/> to get access to the status label. /// </param> private static void CalculateFixations(MainForm mainWindow) { mainWindow.StatusLabel.Text = "Calculating Fixations ..."; foreach (SubjectsData subject in SubjectList) { // Get trial data of current subject DataTable trialsTable = Document.ActiveDocument.DocDataSet.TrialsAdapter.GetDataBySubject(subject.SubjectName); // Calculate fixations var calculationObject = new FixationCalculation(); calculationObject.CalcFixations(SampleType.Gaze, subject.SubjectName, trialsTable, null, null); calculationObject.CalcFixations(SampleType.Mouse, subject.SubjectName, trialsTable, null, null); } mainWindow.StatusLabel.Text = "Fixation calculation done ..."; }