Exemplo n.º 1
0
        private bool UpdateProgress(ChromatogramTask chromatogramTask, int progress)
        {
            // TODO(nicksh)
//            if (chromatogramTask.WorkspaceChange.MassVersion != _workspace.WorkspaceChange.MassVersion)
//            {
//                return false;
//            }
            lock (this)
            {
                _progress = progress;
                return(_isRunning && !_isSuspended);
            }
        }
Exemplo n.º 2
0
 private bool UpdateProgress(ChromatogramTask chromatogramTask, int progress)
 {
     // TODO(nicksh)
     //            if (chromatogramTask.WorkspaceChange.MassVersion != _workspace.WorkspaceChange.MassVersion)
     //            {
     //                return false;
     //            }
     lock(this)
     {
         _progress = progress;
         return _isRunning && !_isSuspended;
     }
 }
Exemplo n.º 3
0
 private void SaveChromatograms(ChromatogramTask chromatogramTask, ICollection<AnalysisChromatograms> analyses, bool finished)
 {
     if (analyses.Count == 0)
     {
         return;
     }
     if (!IsRunning())
     {
         return;
     }
     _workspace.RunOnEventQueue(() =>
                             {
                                 if (
                                     chromatogramTask.Workspace.CompareSettings(_workspace)
                                                     .HasChromatogramMassChange)
                                 {
                                     return;
                                 }
                                 foreach (var analysisChromatograms in analyses)
                                 {
                                     PeptideAnalysis peptideAnalysis;
                                     _workspace.PeptideAnalyses.TryGetValue(
                                         analysisChromatograms.PeptideAnalysisId, out peptideAnalysis);
                                     if (peptideAnalysis == null ||
                                         0 == peptideAnalysis.GetChromatogramRefCount())
                                     {
                                         continue;
                                     }
                                     var peptideFileAnalysis =
                                         peptideAnalysis.GetFileAnalysis(
                                             analysisChromatograms.PeptideFileAnalysisId);
                                     if (peptideFileAnalysis == null)
                                     {
                                         continue;
                                     }
                                     peptideFileAnalysis.SetChromatograms(analysisChromatograms);
                                 }
                             });
     if (!chromatogramTask.CanSave())
     {
         return;
     }
     using (_session = _workspace.OpenWriteSession())
     {
         // TODO(nicksh)
     //                if (chromatogramTask.WorkspaceChange.MassVersion != _workspace.SavedWorkspaceChange.MassVersion)
     //                {
     //                    return;
     //                }
         _session.BeginTransaction();
         foreach (AnalysisChromatograms analysis in analyses)
         {
             if (!IsRunning())
             {
                 return;
             }
             var dbPeptideFileAnalysis = _session.Get<DbPeptideFileAnalysis>(analysis.PeptideFileAnalysisId);
             if (dbPeptideFileAnalysis == null)
             {
                 continue;
             }
             if (analysis.MinCharge != dbPeptideFileAnalysis.PeptideAnalysis.MinCharge
                 || analysis.MaxCharge != dbPeptideFileAnalysis.PeptideAnalysis.MaxCharge)
             {
                 continue;
             }
             foreach (DbChromatogramSet dbChromatogramSet in _session.CreateCriteria(typeof(DbChromatogramSet))
                 .Add(Restrictions.Eq("PeptideFileAnalysis", dbPeptideFileAnalysis)).List())
             {
                 foreach (DbChromatogram dbChromatogram in _session.CreateCriteria(typeof(DbChromatogram))
                     .Add(Restrictions.Eq("ChromatogramSet", dbChromatogramSet)).List())
                 {
                     _session.Delete(dbChromatogram);
                 }
                 _session.Delete(dbChromatogramSet);
             }
             dbPeptideFileAnalysis.ChromatogramSet = null;
             _session.Update(dbPeptideFileAnalysis);
             _session.Flush();
             dbPeptideFileAnalysis.ChromatogramSet = new DbChromatogramSet
                                   {
                                       PeptideFileAnalysis = dbPeptideFileAnalysis,
                                       Times = analysis.Times.ToArray(),
                                       ScanIndexes = analysis.ScanIndexes.ToArray(),
                                       ChromatogramCount = analysis.Chromatograms.Count,
                                   };
             bool noPoints = false;
             if (dbPeptideFileAnalysis.ChromatogramSet.Times.Length == 0)
             {
                 noPoints = true;
                 dbPeptideFileAnalysis.ChromatogramSet.Times = new double[]{0};
                 dbPeptideFileAnalysis.ChromatogramSet.ScanIndexes = new int[]{0};
             }
             _session.Save(dbPeptideFileAnalysis.ChromatogramSet);
             foreach (Chromatogram chromatogram in analysis.Chromatograms)
             {
                 DbChromatogram dbChromatogram = new DbChromatogram
                                          {
                                              ChromatogramSet = dbPeptideFileAnalysis.ChromatogramSet,
                                              MzKey = chromatogram.MzKey,
                                              ChromatogramPoints = chromatogram.Points,
                                              MzRange = chromatogram.MzRange,
                                          };
                 if (noPoints)
                 {
                     dbChromatogram.ChromatogramPoints = new []{new ChromatogramPoint(), };
                 }
                 _session.Save(dbChromatogram);
             }
             _session.Update(dbPeptideFileAnalysis);
             _session.Save(new DbChangeLog(_workspace, dbPeptideFileAnalysis.PeptideAnalysis));
         }
         if (chromatogramTask.MsDataFile.IsBinaryDirty)
         {
             chromatogramTask.MsDataFile.SaveBinary(_session);
         }
         chromatogramTask.UpdateLock(_session);
         _session.Transaction.Commit();
     }
 }
Exemplo n.º 4
0
 private void GenerateChromatograms(ChromatogramTask chromatogramTask)
 {
     int totalAnalyses = chromatogramTask.AnalysisChromatograms.Count;
     if (totalAnalyses == 0)
     {
         return;
     }
     if (!UpdateProgress(chromatogramTask, 0))
     {
         return;
     }
     var msDataFile = chromatogramTask.MsDataFile;
     MsDataFileUtil.InitMsDataFile(chromatogramTask.Workspace, msDataFile);
     var analyses = new List<AnalysisChromatograms>(chromatogramTask.AnalysisChromatograms);
     MsDataFileImpl pwizMsDataFileImpl;
     var path = _workspace.GetDataFilePath(msDataFile.Name);
     try
     {
         pwizMsDataFileImpl = new MsDataFileImpl(path);
     }
     catch (Exception exception)
     {
         ErrorHandler.LogException("Chromatogram Generator", "Error opening " + path, exception);
         _workspace.RejectMsDataFile(msDataFile);
         return;
     }
     using (pwizMsDataFileImpl)
     {
         var completeAnalyses = new List<AnalysisChromatograms>();
         int totalScanCount = pwizMsDataFileImpl.SpectrumCount;
         var lastTimeInDataFile =
             chromatogramTask.MsDataFile.GetTime(chromatogramTask.MsDataFile.GetSpectrumCount() - 1);
         double minTime = lastTimeInDataFile;
         double maxTime = msDataFile.GetTime(0);
         foreach (var analysis in analyses)
         {
             minTime = Math.Min(minTime, analysis.FirstTime);
             maxTime = Math.Max(maxTime, analysis.LastTime);
         }
         int firstScan = msDataFile.FindScanIndex(minTime);
         for (int iScan = firstScan; analyses.Count > 0 && iScan < totalScanCount; iScan++)
         {
             double time = msDataFile.GetTime(iScan);
             int progress = (int)(100 * (time - minTime) / (maxTime - minTime));
             progress = Math.Min(progress, 100);
             progress = Math.Max(progress, 0);
             if (!UpdateProgress(chromatogramTask, progress))
             {
                 return;
             }
             List<AnalysisChromatograms> activeAnalyses = new List<AnalysisChromatograms>();
             double nextTime = Double.MaxValue;
             if (msDataFile.GetMsLevel(iScan, pwizMsDataFileImpl) != 1)
             {
                 continue;
             }
             foreach (var analysis in analyses)
             {
                 nextTime = Math.Min(nextTime, analysis.FirstTime);
                 if (analysis.FirstTime <= time)
                 {
                     activeAnalyses.Add(analysis);
                 }
             }
             if (activeAnalyses.Count == 0)
             {
                 int nextScan = msDataFile.FindScanIndex(nextTime);
                 iScan = Math.Max(iScan, nextScan - 1);
                 continue;
             }
             bool lowMemory = IsLowOnMemory();
             // If we have exceeded the number of analyses we should be working on at once,
             // throw out any that we haven't started.
             for (int iAnalysis = activeAnalyses.Count - 1; iAnalysis >= 0
                 && (activeAnalyses.Count > _maxConcurrentAnalyses || lowMemory); iAnalysis--)
             {
                 var analysis = activeAnalyses[iAnalysis];
                 if (analysis.Times.Count > 0)
                 {
                     continue;
                 }
                 activeAnalyses.RemoveAt(iAnalysis);
                 analyses.Remove(analysis);
             }
             double[] mzArray, intensityArray;
             pwizMsDataFileImpl.GetSpectrum(iScan, out mzArray, out intensityArray);
             if (!pwizMsDataFileImpl.IsCentroided(iScan))
             {
                 var centroider = new Centroider(mzArray, intensityArray);
                 centroider.GetCentroidedData(out mzArray, out intensityArray);
             }
             foreach (var analysis in activeAnalyses)
             {
                 var points = new List<ChromatogramPoint>();
                 foreach (var chromatogram in analysis.Chromatograms)
                 {
                     points.Add(MsDataFileUtil.GetPoint(chromatogram.MzRange, mzArray, intensityArray));
                 }
                 analysis.AddPoints(iScan, time, points);
             }
             var incompleteAnalyses = new List<AnalysisChromatograms>();
             foreach (var analysis in analyses)
             {
                 if (analysis.LastTime <= time)
                 {
                     completeAnalyses.Add(analysis);
                 }
                 else
                 {
                     incompleteAnalyses.Add(analysis);
                 }
             }
             SaveChromatograms(chromatogramTask, completeAnalyses, false);
             completeAnalyses.Clear();
             analyses = incompleteAnalyses;
         }
         completeAnalyses.AddRange(analyses);
         SaveChromatograms(chromatogramTask, completeAnalyses, true);
     }
 }
Exemplo n.º 5
0
        private void SaveChromatograms(ChromatogramTask chromatogramTask, ICollection <AnalysisChromatograms> analyses, bool finished)
        {
            if (analyses.Count == 0)
            {
                return;
            }
            if (!IsRunning())
            {
                return;
            }
            _workspace.RunOnEventQueue(() =>
            {
                if (
                    chromatogramTask.Workspace.CompareSettings(_workspace)
                    .HasChromatogramMassChange)
                {
                    return;
                }
                foreach (var analysisChromatograms in analyses)
                {
                    PeptideAnalysis peptideAnalysis;
                    _workspace.PeptideAnalyses.TryGetValue(
                        analysisChromatograms.PeptideAnalysisId, out peptideAnalysis);
                    if (peptideAnalysis == null ||
                        0 == peptideAnalysis.GetChromatogramRefCount())
                    {
                        continue;
                    }
                    var peptideFileAnalysis =
                        peptideAnalysis.GetFileAnalysis(
                            analysisChromatograms.PeptideFileAnalysisId);
                    if (peptideFileAnalysis == null)
                    {
                        continue;
                    }
                    peptideFileAnalysis.SetChromatograms(analysisChromatograms);
                }
            });
            if (!chromatogramTask.CanSave())
            {
                return;
            }
            using (_session = _workspace.OpenWriteSession())
            {
                // TODO(nicksh)
//                if (chromatogramTask.WorkspaceChange.MassVersion != _workspace.SavedWorkspaceChange.MassVersion)
//                {
//                    return;
//                }
                _session.BeginTransaction();
                foreach (AnalysisChromatograms analysis in analyses)
                {
                    if (!IsRunning())
                    {
                        return;
                    }
                    var dbPeptideFileAnalysis = _session.Get <DbPeptideFileAnalysis>(analysis.PeptideFileAnalysisId);
                    if (dbPeptideFileAnalysis == null)
                    {
                        continue;
                    }
                    if (analysis.MinCharge != dbPeptideFileAnalysis.PeptideAnalysis.MinCharge ||
                        analysis.MaxCharge != dbPeptideFileAnalysis.PeptideAnalysis.MaxCharge)
                    {
                        continue;
                    }
                    foreach (DbChromatogramSet dbChromatogramSet in _session.CreateCriteria(typeof(DbChromatogramSet))
                             .Add(Restrictions.Eq("PeptideFileAnalysis", dbPeptideFileAnalysis)).List())
                    {
                        foreach (DbChromatogram dbChromatogram in _session.CreateCriteria(typeof(DbChromatogram))
                                 .Add(Restrictions.Eq("ChromatogramSet", dbChromatogramSet)).List())
                        {
                            _session.Delete(dbChromatogram);
                        }
                        _session.Delete(dbChromatogramSet);
                    }
                    dbPeptideFileAnalysis.ChromatogramSet = null;
                    _session.Update(dbPeptideFileAnalysis);
                    _session.Flush();
                    dbPeptideFileAnalysis.ChromatogramSet = new DbChromatogramSet
                    {
                        PeptideFileAnalysis = dbPeptideFileAnalysis,
                        Times             = analysis.Times.ToArray(),
                        ScanIndexes       = analysis.ScanIndexes.ToArray(),
                        ChromatogramCount = analysis.Chromatograms.Count,
                    };
                    bool noPoints = false;
                    if (dbPeptideFileAnalysis.ChromatogramSet.Times.Length == 0)
                    {
                        noPoints = true;
                        dbPeptideFileAnalysis.ChromatogramSet.Times       = new double[] { 0 };
                        dbPeptideFileAnalysis.ChromatogramSet.ScanIndexes = new int[] { 0 };
                    }
                    _session.Save(dbPeptideFileAnalysis.ChromatogramSet);
                    foreach (Chromatogram chromatogram in analysis.Chromatograms)
                    {
                        DbChromatogram dbChromatogram = new DbChromatogram
                        {
                            ChromatogramSet    = dbPeptideFileAnalysis.ChromatogramSet,
                            MzKey              = chromatogram.MzKey,
                            ChromatogramPoints = chromatogram.Points,
                            MzRange            = chromatogram.MzRange,
                        };
                        if (noPoints)
                        {
                            dbChromatogram.ChromatogramPoints = new [] { new ChromatogramPoint(), };
                        }
                        _session.Save(dbChromatogram);
                    }
                    _session.Update(dbPeptideFileAnalysis);
                    _session.Save(new DbChangeLog(_workspace, dbPeptideFileAnalysis.PeptideAnalysis));
                }
                if (chromatogramTask.MsDataFile.IsBinaryDirty)
                {
                    chromatogramTask.MsDataFile.SaveBinary(_session);
                }
                chromatogramTask.UpdateLock(_session);
                _session.Transaction.Commit();
            }
        }
Exemplo n.º 6
0
        private void GenerateChromatograms(ChromatogramTask chromatogramTask)
        {
            int totalAnalyses = chromatogramTask.AnalysisChromatograms.Count;

            if (totalAnalyses == 0)
            {
                return;
            }
            if (!UpdateProgress(chromatogramTask, 0))
            {
                return;
            }
            var msDataFile = chromatogramTask.MsDataFile;

            MsDataFileUtil.InitMsDataFile(chromatogramTask.Workspace, msDataFile);
            var            analyses = new List <AnalysisChromatograms>(chromatogramTask.AnalysisChromatograms);
            MsDataFileImpl pwizMsDataFileImpl;
            var            path = _workspace.GetDataFilePath(msDataFile.Name);

            try
            {
                pwizMsDataFileImpl = new MsDataFileImpl(path);
            }
            catch (Exception exception)
            {
                ErrorHandler.LogException("Chromatogram Generator", "Error opening " + path, exception);
                _workspace.RejectMsDataFile(msDataFile);
                return;
            }
            using (pwizMsDataFileImpl)
            {
                var completeAnalyses   = new List <AnalysisChromatograms>();
                int totalScanCount     = pwizMsDataFileImpl.SpectrumCount;
                var lastTimeInDataFile =
                    chromatogramTask.MsDataFile.GetTime(chromatogramTask.MsDataFile.GetSpectrumCount() - 1);
                double minTime = lastTimeInDataFile;
                double maxTime = msDataFile.GetTime(0);
                foreach (var analysis in analyses)
                {
                    minTime = Math.Min(minTime, analysis.FirstTime);
                    maxTime = Math.Max(maxTime, analysis.LastTime);
                }
                int firstScan = msDataFile.FindScanIndex(minTime);
                for (int iScan = firstScan; analyses.Count > 0 && iScan < totalScanCount; iScan++)
                {
                    double time     = msDataFile.GetTime(iScan);
                    int    progress = (int)(100 * (time - minTime) / (maxTime - minTime));
                    progress = Math.Min(progress, 100);
                    progress = Math.Max(progress, 0);
                    if (!UpdateProgress(chromatogramTask, progress))
                    {
                        return;
                    }
                    List <AnalysisChromatograms> activeAnalyses = new List <AnalysisChromatograms>();
                    double nextTime = Double.MaxValue;
                    if (msDataFile.GetMsLevel(iScan, pwizMsDataFileImpl) != 1)
                    {
                        continue;
                    }
                    foreach (var analysis in analyses)
                    {
                        nextTime = Math.Min(nextTime, analysis.FirstTime);
                        if (analysis.FirstTime <= time)
                        {
                            activeAnalyses.Add(analysis);
                        }
                    }
                    if (activeAnalyses.Count == 0)
                    {
                        int nextScan = msDataFile.FindScanIndex(nextTime);
                        iScan = Math.Max(iScan, nextScan - 1);
                        continue;
                    }
                    bool lowMemory = IsLowOnMemory();
                    // If we have exceeded the number of analyses we should be working on at once,
                    // throw out any that we haven't started.
                    for (int iAnalysis = activeAnalyses.Count - 1; iAnalysis >= 0 &&
                         (activeAnalyses.Count > _maxConcurrentAnalyses || lowMemory); iAnalysis--)
                    {
                        var analysis = activeAnalyses[iAnalysis];
                        if (analysis.Times.Count > 0)
                        {
                            continue;
                        }
                        activeAnalyses.RemoveAt(iAnalysis);
                        analyses.Remove(analysis);
                    }
                    double[] mzArray, intensityArray;
                    pwizMsDataFileImpl.GetSpectrum(iScan, out mzArray, out intensityArray);
                    if (!pwizMsDataFileImpl.IsCentroided(iScan))
                    {
                        var centroider = new Centroider(mzArray, intensityArray);
                        centroider.GetCentroidedData(out mzArray, out intensityArray);
                    }
                    foreach (var analysis in activeAnalyses)
                    {
                        var points = new List <ChromatogramPoint>();
                        foreach (var chromatogram in analysis.Chromatograms)
                        {
                            points.Add(MsDataFileUtil.GetPoint(chromatogram.MzRange, mzArray, intensityArray));
                        }
                        analysis.AddPoints(iScan, time, points);
                    }
                    var incompleteAnalyses = new List <AnalysisChromatograms>();
                    foreach (var analysis in analyses)
                    {
                        if (analysis.LastTime <= time)
                        {
                            completeAnalyses.Add(analysis);
                        }
                        else
                        {
                            incompleteAnalyses.Add(analysis);
                        }
                    }
                    SaveChromatograms(chromatogramTask, completeAnalyses, false);
                    completeAnalyses.Clear();
                    analyses = incompleteAnalyses;
                }
                completeAnalyses.AddRange(analyses);
                SaveChromatograms(chromatogramTask, completeAnalyses, true);
            }
        }