/// <summary> /// Starts a multi-Align analysis job. /// </summary> public void StartAnalysis(AnalysisConfig config) { m_config = config; if (m_algorithms == null) { throw new NullReferenceException("The algorithms have not been set for this analysis."); } if (config.Analysis == null) { throw new NullReferenceException("The analysis data storage cannot be null."); } if (config.Analysis.DataProviders == null) { throw new NullReferenceException("The data cache providers have not been set for this analysis."); } Logger.LogPath = AnalysisPathUtils.BuildLogPath(config.AnalysisPath, config.AnalysisName); // Make sure we start with a fresh analysis. AbortAnalysisThread(m_analysisThread); var threadStart = new ThreadStart(PerformAnalysis); m_analysisThread = new Thread(threadStart); m_analysisThread.Start(); }
public static FeatureDataAccessProviders CreateDataAccessProviders(MultiAlignAnalysis analysis, bool deleteIfExists) { var path = AnalysisPathUtils.BuildAnalysisName(analysis.MetaData.AnalysisPath, analysis.MetaData.AnalysisName); return(CreateDataAccessProviders(path, deleteIfExists)); }
/// <summary> /// The main entry point for the application. /// </summary> static int Main(string [] args) { var handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; SetConsoleMode(handle, ENABLE_EXTENDED_FLAGS); try { if (args.Length < 2) { Console.WriteLine(@"MultiAlignChargeStateProcessor databasePath chargeState crossTabPath [dataset List]"); Console.WriteLine(@"\tThe cross-tab file will be placed in the same directory as the database path"); return(1); } // Setup the analysis processing var databasePath = args[0]; var databaseName = Path.GetFileNameWithoutExtension(databasePath); var path = Path.GetDirectoryName(databasePath); var crossPath = args[2]; var chargeState = Convert.ToInt32(args[1]); List <string> datasetList = null; if (args.Length == 4) { datasetList = File.ReadAllLines(args[3]).ToList(); } if (path == null) { Console.WriteLine(@"The directory path is invalid"); return(1); } NHibernateUtil.ConnectToDatabase(databasePath, false); IDatasetDAO datasetCache = new DatasetDAOHibernate(); var dateSuffix = AnalysisPathUtils.BuildDateSuffix(); Logger.LogPath = Path.Combine(path, string.Format("{0}_charge_{2}_{1}.txt", databaseName, dateSuffix, chargeState)); Logger.PrintMessage("Find all datasets", true); var datasets = datasetCache.FindAll(); Logger.PrintMessage(string.Format("Found {0} datasets", datasets.Count), true); // Create the clustering algorithm - average linkage IClusterer <UMCLight, UMCClusterLight> clusterer = new UMCAverageLinkageClusterer <UMCLight, UMCClusterLight>(); // Create the DAO object to extract the features var database = new UmcAdoDAO { DatabasePath = databasePath }; IUmcDAO featureDao = database; Logger.PrintMessage(string.Format("Extracting Features"), true); var tempFeatures = featureDao.FindByCharge(chargeState); Logger.PrintMessage(string.Format("Found {0} features", tempFeatures.Count), true); var features = new List <UMCLight>(); if (datasetList != null) { var featuremap = datasets.ToDictionary(info => info.DatasetName.ToLower()); var focusedDatasetList = new Dictionary <int, DatasetInformation>(); foreach (var name in datasetList) { var key = name.ToLower(); if (featuremap.ContainsKey(key)) { Logger.PrintMessage("Using dataset: " + name); focusedDatasetList.Add(featuremap[key].DatasetId, featuremap[key]); } else { throw new Exception("Didn't find the dataset required..." + name); } } features.AddRange(from feature in tempFeatures let use = focusedDatasetList.ContainsKey(feature.GroupId) where use select feature); Logger.PrintMessage(string.Format("Found {0} filtered features for dataset list", features.Count), true); } else { features = tempFeatures; } // Handle logging progress. clusterer.Progress += clusterer_Progress; clusterer.Parameters.Tolerances.DriftTime = .3; clusterer.Parameters.Tolerances.Mass = 16; clusterer.Parameters.Tolerances.Net = .014; clusterer.Parameters.OnlyClusterSameChargeStates = true; clusterer.Parameters.CentroidRepresentation = ClusterCentroidRepresentation.Mean; clusterer.Parameters.DistanceFunction = DistanceFactory <UMCLight> .CreateDistanceFunction(DistanceMetric.WeightedEuclidean); // Then cluster var clusterWriter = new UmcClusterWriter(); IClusterWriter <UMCClusterLight> writer = clusterWriter; //new UMCClusterDummyWriter(); try { clusterWriter.Open(crossPath); clusterWriter.WriteHeader(datasets); clusterer.ClusterAndProcess(features, writer); Logger.PrintMessage("", true); Logger.PrintMessage("ANALYSIS SUCCESS", true); return(0); } catch (Exception ex) { Logger.PrintMessage("Unhandled Error: " + ex.Message); var innerEx = ex.InnerException; while (innerEx != null) { Logger.PrintMessage("Inner Exception: " + innerEx.Message); innerEx = innerEx.InnerException; } Logger.PrintMessage("Stack: " + ex.StackTrace); Logger.PrintMessage(""); Logger.PrintMessage("ANALYSIS FAILED"); return(1); } finally { clusterWriter.Close(); } } catch (Exception ex) { Logger.PrintMessage("Unhandled Error: " + ex.Message, true); var innerEx = ex.InnerException; while (innerEx != null) { Logger.PrintMessage("Inner Exception: " + innerEx.Message); innerEx = innerEx.InnerException; } Logger.PrintMessage("Stack: " + ex.StackTrace, true); Logger.PrintMessage(""); Logger.PrintMessage("ANALYSIS FAILED"); return(1); } }
/// <summary> /// The main entry point for the application. /// </summary> static int Main(string[] args) { var handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; SetConsoleMode(handle, ENABLE_EXTENDED_FLAGS); var clusterIdMap = new Dictionary <int, UMCClusterLight>(); try { if (args.Length < 2) { Console.WriteLine("MultiAlignSTACRunner crosstabDirectory databasePath outputName"); Console.WriteLine("\tThe cross-tab file will be named similar to the database path"); return(1); } // Setup the analysis processing Logger.PrintMessage("Find all datasets", true); var directoryPath = args[0].Replace("\r", "").Replace("\n", ""); var databasePath = args[1].Replace("\r", "").Replace("\n", ""); var name = args[2].Replace("\r", "").Replace("\n", ""); var files = Directory.GetFiles(directoryPath, "*.csv"); Logger.PrintMessage("Creating Log File"); var loggerPath = AnalysisPathUtils.BuildLogPath(Path.GetDirectoryName(name), Path.GetFileNameWithoutExtension(name)); Logger.LogPath = loggerPath; Logger.PrintMessage("Saving Log Data to: " + loggerPath); Logger.PrintMessage(string.Format("Creating STAC"), true); // Hardcode bad, but per discussions with OHSU var stac = new STACAdapter <UMCClusterLight> { Options = new FeatureMatcherParameters { UserTolerances = { MassTolerancePPM = 25, NETTolerance = .035, DriftTimeTolerance = 3 }, UseDriftTime = true } }; var clusterFilteringOptions = new FilteringOptions(); WriteOptionsToLogFile(clusterFilteringOptions); WriteOptionsToLogFile(stac.Options); // Read the cluster data var allClusters = new List <UMCClusterLight>(); var clusterId = 0; foreach (var file in files) { var filename = Path.GetFileName(file); Logger.PrintMessage(string.Format("Reading {0}", filename)); const string chargeString = "charge"; if (filename == null) { continue; } if (!filename.Contains(chargeString)) { continue; } // Read each file. var start = DateTime.Now; var xname = filename.Replace("_", ""); // ReSharper disable once StringIndexOfIsCultureSpecific.1 var indexOfChargeString = xname.IndexOf(chargeString); var charge = Convert.ToInt32(xname.Substring(indexOfChargeString + chargeString.Length, 1)); var clusters = ReadClusters(file, clusterFilteringOptions); var end = DateTime.Now; Logger.PrintMessage(string.Format("\tReading Took {0:.00} seconds", end.Subtract(start).TotalSeconds)); foreach (var cluster in clusters) { clusterIdMap.Add(clusterId, cluster); cluster.Id = clusterId++; cluster.ChargeState = charge; } allClusters.AddRange(clusters); } // Load the database Logger.PrintMessage(string.Format("Loading Mass Tag Database: {0}", Path.GetFileNameWithoutExtension(databasePath))); var options = new MassTagDatabaseOptions(); var databaseDefinition = new InputDatabase { DatabaseFormat = MassTagDatabaseFormat.Sqlite, LocalPath = databasePath }; var database = MtdbLoaderFactory.LoadMassTagDatabase(databaseDefinition, options); // Run stac try { Logger.PrintMessage("Matching clusters to peptides in mass tag database."); var matches = stac.PerformPeakMatching(allClusters, database); Logger.PrintMessage(string.Format("Writing Results To {0}", name)); var duplicateMatches = new Dictionary <int, Dictionary <int, FeatureMatchLight <UMCClusterLight, MassTagLight> > >(); foreach (var match in matches) { if (!duplicateMatches.ContainsKey(match.Observed.Id)) { duplicateMatches.Add(match.Observed.Id, new Dictionary <int, FeatureMatchLight <UMCClusterLight, MassTagLight> >()); } if (!duplicateMatches[match.Observed.Id].ContainsKey(match.Target.Id)) { duplicateMatches[match.Observed.Id].Add(match.Target.Id, match); } } WriteClusterData(name, duplicateMatches, clusterIdMap); Logger.PrintMessage("ANALYSIS SUCCESS"); return(0); } catch (Exception ex) { Logger.PrintMessage("Unhandled Error: " + ex.Message); var innerEx = ex.InnerException; while (innerEx != null) { Logger.PrintMessage("Inner Exception: " + innerEx.Message); innerEx = innerEx.InnerException; } Logger.PrintMessage("Stack: " + ex.StackTrace); Logger.PrintMessage(""); Logger.PrintMessage("ANALYSIS FAILED"); return(1); } } catch (Exception ex) { Logger.PrintMessage("Unhandled Error: " + ex.Message, true); var innerEx = ex.InnerException; while (innerEx != null) { Logger.PrintMessage("Inner Exception: " + innerEx.Message); innerEx = innerEx.InnerException; } Logger.PrintMessage("Stack: " + ex.StackTrace, true); Logger.PrintMessage(""); Logger.PrintMessage("ANALYSIS FAILED"); return(1); } }