diff --git a/CycloBranch/External/linux/correctprofile.sh b/CycloBranch/External/linux/correctprofile.sh new file mode 100644 index 0000000..1e283e8 --- /dev/null +++ b/CycloBranch/External/linux/correctprofile.sh @@ -0,0 +1,11 @@ +#!/bin/bash +SAVEIFS=$IFS +IFS=$',' read name fwhm <<< $@ +IFS=$SAVEIFS +FileConverter -in "$name"".mgf" -out "$name"".FileConverter.mzML" +NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm +rm "$name"".mzML" +BaselineFilter -in "$name"".NoiseFilterGaussian.mzML" -out "$name"".mzML" +rm "$name"".mgf" +rm "$name"".FileConverter.mzML" +rm "$name"".NoiseFilterGaussian.mzML" diff --git a/CycloBranch/External/macosx/correctprofile.sh b/CycloBranch/External/macosx/correctprofile.sh new file mode 100644 index 0000000..23ed9df --- /dev/null +++ b/CycloBranch/External/macosx/correctprofile.sh @@ -0,0 +1 @@ +SAVEIFS=$IFS IFS=$',' read name fwhm <<< $@ IFS=$SAVEIFS FileConverter -in "$name"".mgf" -out "$name"".FileConverter.mzML" NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm rm "$name"".mzML" BaselineFilter -in "$name"".NoiseFilterGaussian.mzML" -out "$name"".mzML" rm "$name"".mgf" rm "$name"".FileConverter.mzML" rm "$name"".NoiseFilterGaussian.mzML" \ No newline at end of file diff --git a/CycloBranch/External/windows/correctprofile.bat b/CycloBranch/External/windows/correctprofile.bat new file mode 100644 index 0000000..ce03f08 --- /dev/null +++ b/CycloBranch/External/windows/correctprofile.bat @@ -0,0 +1,11 @@ +@echo off +SET PATH=%PATH:C:\Xcalibur\system\programs;=% + +FileConverter.exe -in "%~f1.mgf" -out "%~f1.FileConverter.mzML" 1>NUL +NoiseFilterGaussian.exe -in "%~f1.FileConverter.mzML" -out "%~f1.NoiseFilterGaussian.mzML" -algorithm:gaussian_width %2 1>NUL +del "%~f1.mzML" 2>NUL +BaselineFilter.exe -in "%~f1.NoiseFilterGaussian.mzML" -out "%~f1.mzML" 1>NUL + +del "%~f1.mgf" 2>NUL +del "%~f1.FileConverter.mzML" 2>NUL +del "%~f1.NoiseFilterGaussian.mzML" 2>NUL diff --git a/CycloBranch/core/cMzML.cpp b/CycloBranch/core/cMzML.cpp index ad0f832..4baadb7 100644 --- a/CycloBranch/core/cMzML.cpp +++ b/CycloBranch/core/cMzML.cpp @@ -329,11 +329,13 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode mgfofstream.open(ss.str()); } - if ((count + 1) % 100 == 0) { - *os << count + 1 << " "; - } - if ((count + 1) % 2500 == 0) { - *os << endl; + if (os) { + if ((count + 1) % 100 == 0) { + *os << count + 1 << " "; + } + if ((count + 1) % 2500 == 0) { + *os << endl; + } } mgfofstream << "BEGIN IONS" << endl; diff --git a/CycloBranch/core/cParameters.cpp b/CycloBranch/core/cParameters.cpp index 419cfb0..0e2d35c 100644 --- a/CycloBranch/core/cParameters.cpp +++ b/CycloBranch/core/cParameters.cpp @@ -17,6 +17,7 @@ void cParameters::clear() { peaklistfilename = ""; useprofiledata = false; convertprofiledata = true; + profiledatafilename = ""; peaklistfileformat = txt; peaklistseries.clear(); scannumber = 1; @@ -1163,6 +1164,8 @@ void cParameters::store(ofstream& os) { os.write((char *)&useprofiledata, sizeof(bool)); os.write((char *)&convertprofiledata, sizeof(bool)); + storeString(profiledatafilename, os); + os.write((char *)&scannumber, sizeof(int)); os.write((char *)&precursormass, sizeof(double)); @@ -1287,6 +1290,8 @@ void cParameters::load(ifstream& is) { is.read((char *)&useprofiledata, sizeof(bool)); is.read((char *)&convertprofiledata, sizeof(bool)); + loadString(profiledatafilename, is); + is.read((char *)&scannumber, sizeof(int)); is.read((char *)&precursormass, sizeof(double)); diff --git a/CycloBranch/core/cParameters.h b/CycloBranch/core/cParameters.h index 2071c22..d15c198 100644 --- a/CycloBranch/core/cParameters.h +++ b/CycloBranch/core/cParameters.h @@ -91,6 +91,12 @@ class cParameters { bool convertprofiledata; + /** + \brief Profile data file name. + */ + string profiledatafilename; + + /** \brief A file format of peak list. */ diff --git a/CycloBranch/core/cPeaksList.cpp b/CycloBranch/core/cPeaksList.cpp index 7912aad..6dc567c 100644 --- a/CycloBranch/core/cPeaksList.cpp +++ b/CycloBranch/core/cPeaksList.cpp @@ -143,10 +143,6 @@ void cPeaksList::loadFromIBDStream(cImzMLItem& imzmlitem, ifstream &ibdstream, b } } - if (imzmlitem.mzlength != imzmlitem.intensitylength) { - return; - } - // intensities if (use_64bit_float_intensity_precision) { start = imzmlitem.intensitystart; diff --git a/CycloBranch/core/utilities.cpp b/CycloBranch/core/utilities.cpp index 645a8f4..958377d 100644 --- a/CycloBranch/core/utilities.cpp +++ b/CycloBranch/core/utilities.cpp @@ -4,7 +4,7 @@ QString appname = "CycloBranch"; -QString appversion = "v. 1.3.0 (64-bit)"; +QString appversion = "v. 1.3.1 (64-bit)"; #if OS_TYPE == UNX diff --git a/CycloBranch/gui/cMainWindow.cpp b/CycloBranch/gui/cMainWindow.cpp index 93db8bb..a36db36 100644 --- a/CycloBranch/gui/cMainWindow.cpp +++ b/CycloBranch/gui/cMainWindow.cpp @@ -329,7 +329,11 @@ cMainWindow::cMainWindow() { spectradetails.clear(); parameters.clear(); + rawdata.clear(); + imzmlprofilemetadata.clear(); + profilemz64precision = false; + profileintensity64precision = false; resultsbasecolumncount = 9; resultsspecificcolumncount = 0; @@ -736,13 +740,20 @@ void cMainWindow::run() { spectradetails.clear(); parameters.clear(); + rawdata.clear(); + imzmlprofilemetadata.clear(); + profilemz64precision = false; + profileintensity64precision = false; cParameters localparameters = parameterswidget->getParameters(); regex rx; rx = "\\.[iI][mM][zZ][mM][lL]$"; + localparameters.profiledatafilename = ""; if (regex_search(localparameters.peaklistfilename, rx)) { + localparameters.profiledatafilename = localparameters.peaklistfilename; + string convertedimzml = localparameters.peaklistfilename.substr(0, (int)localparameters.peaklistfilename.size() - 6); string convertedibd = convertedimzml; convertedimzml += "_converted_fwhm_"; @@ -1140,13 +1151,39 @@ void cMainWindow::reportSpectra() { results->resizeColumnsToContents(); - if (parameters.useprofiledata && (parameters.peaklistfileformat == baf)) { - if ((parameters.mode == denovoengine) || (parameters.mode == databasesearch)) { - rawdata.resize(1); + if (parameters.useprofiledata) { + + if (parameters.peaklistfileformat == baf) { + if ((parameters.mode == denovoengine) || (parameters.mode == databasesearch)) { + rawdata.resize(1); + } + else { + rawdata.resize(theoreticalspectrumlist.size()); + } } - else { + + if ((parameters.peaklistfileformat == imzML) && (parameters.mode == dereplication)) { rawdata.resize(theoreticalspectrumlist.size()); + imzmlprofilemetadata.clear(); + profilemz64precision = false; + profileintensity64precision = false; + + cImzML imzml; + int defaultmaxx; + int defaultmaxy; + int defaultpixelsizex; + int defaultpixelsizey; + eVendorType vendor; + + if (imzml.parse(parameters.profiledatafilename, defaultmaxx, defaultmaxy, defaultpixelsizex, defaultpixelsizey, vendor) == 0) { + if (imzml.hasProfileSpectra()) { + imzmlprofilemetadata = imzml.getItems(); + profilemz64precision = imzml.use64BitMzPrecision(); + profileintensity64precision = imzml.use64BitIntensityPrecision(); + } + } } + } QProgressDialog progress("Preparing the report...", /*"Cancel"*/0, 0, theoreticalspectrumlist.size(), this); @@ -1247,7 +1284,7 @@ void cMainWindow::rowDoubleClicked(const QModelIndex& item) { int row = resultsproxymodel->mapToSource(item).row(); int rowid = resultsmodel->item(row, 1)->data(Qt::DisplayRole).toInt() - 1; - spectradetails[rowid].prepareToShow(&rawdata, actionShowIsomers); + spectradetails[rowid].prepareToShow(actionShowIsomers, &rawdata, &imzmlprofilemetadata, profilemz64precision, profileintensity64precision); spectradetails[rowid].show(); spectradetails[rowid].activateWindow(); if (spectradetails[rowid].isMinimized()) { @@ -1741,8 +1778,12 @@ void cMainWindow::openResultsFile() { spectradetails.clear(); parameters.clear(); + rawdata.clear(); - + imzmlprofilemetadata.clear(); + profilemz64precision = false; + profileintensity64precision = false; + // load graph window graph->load(infile); graph->updateView(actionShowIsomers->isChecked()); @@ -1898,7 +1939,7 @@ void cMainWindow::summaryPeaksTableCancelled() { void cMainWindow::summaryPeaksTableRowDoubleClicked(int rowid, double experimentalmz) { - spectradetails[rowid].prepareToShow(&rawdata, actionShowIsomers); + spectradetails[rowid].prepareToShow(actionShowIsomers, &rawdata, &imzmlprofilemetadata, profilemz64precision, profileintensity64precision); spectradetails[rowid].show(); spectradetails[rowid].activateWindow(); if (spectradetails[rowid].isMinimized()) { diff --git a/CycloBranch/gui/cMainWindow.h b/CycloBranch/gui/cMainWindow.h index ad45b28..8a71f06 100644 --- a/CycloBranch/gui/cMainWindow.h +++ b/CycloBranch/gui/cMainWindow.h @@ -131,7 +131,11 @@ class cMainWindow : public QMainWindow vector spectradetails; cParameters parameters; + cPeakListSeries rawdata; + vector imzmlprofilemetadata; + bool profilemz64precision; + bool profileintensity64precision; QTextEdit* logWindow; QSplitter* splitter; diff --git a/CycloBranch/gui/cSpectrumDetailWidget.cpp b/CycloBranch/gui/cSpectrumDetailWidget.cpp index 7721b43..9bad8bb 100644 --- a/CycloBranch/gui/cSpectrumDetailWidget.cpp +++ b/CycloBranch/gui/cSpectrumDetailWidget.cpp @@ -16,12 +16,18 @@ #include #include #include +#include cSpectrumDetailWidget::cSpectrumDetailWidget() { parent = 0; parameters = 0; + rawdata = 0; + imzmlprofilemetadata = 0; + profilemz64precision = false; + profileintensity64precision = false; + rowid = 0; preparedToShow = false; theoreticalspectrum = new cTheoreticalSpectrum(); @@ -35,7 +41,11 @@ cSpectrumDetailWidget::cSpectrumDetailWidget(const cSpectrumDetailWidget& sd) { cSpectrumDetailWidget& cSpectrumDetailWidget::operator=(const cSpectrumDetailWidget& sd) { parameters = sd.parameters; + rawdata = sd.rawdata; + imzmlprofilemetadata = sd.imzmlprofilemetadata; + profilemz64precision = sd.profilemz64precision; + profileintensity64precision = sd.profileintensity64precision; preparedToShow = false; theoreticalspectrum = new cTheoreticalSpectrum(); @@ -45,7 +55,7 @@ cSpectrumDetailWidget& cSpectrumDetailWidget::operator=(const cSpectrumDetailWid } if (parameters && sd.preparedToShow) { - prepareToShow(rawdata, actionShowIsomers); + prepareToShow(actionShowIsomers, rawdata, imzmlprofilemetadata, profilemz64precision, profileintensity64precision); } setWindowTitle(sd.windowTitle()); @@ -642,7 +652,7 @@ void cSpectrumDetailWidget::closeEvent(QCloseEvent *event) { } -void cSpectrumDetailWidget::prepareToShow(cPeakListSeries* rawdata, QAction* actionShowIsomers) { +void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListSeries* rawdata, vector* imzmlprofilemetadata, bool profilemz64precision, bool profileintensity64precision) { if (!preparedToShow) { @@ -657,6 +667,9 @@ void cSpectrumDetailWidget::prepareToShow(cPeakListSeries* rawdata, QAction* act } this->rawdata = rawdata; + this->imzmlprofilemetadata = imzmlprofilemetadata; + this->profilemz64precision = profilemz64precision; + this->profileintensity64precision = profileintensity64precision; connect(actionShowIsomers, SIGNAL(triggered()), this, SLOT(showIsomersStateChanged())); this->actionShowIsomers = actionShowIsomers; @@ -2151,39 +2164,154 @@ void cSpectrumDetailWidget::rawDataStateChanged(bool state) { int targetid; string s; - if (parameters && theoreticalspectrum && parameters->useprofiledata && (parameters->peaklistfileformat == baf)) { - - if ((parameters->mode == denovoengine) || (parameters->mode == databasesearch)) { - fileid = parameters->scannumber; - targetid = 0; - } - else { - fileid = rowid; - targetid = rowid - 1; - } + int maximum = 100; + + QProgressDialog progress("Preparing profile data...", /*"Cancel"*/0, 0, maximum, this); + progress.setMinimumWidth(250); + cEventFilter filter; + progress.installEventFilter(&filter); + progress.setMinimumDuration(0); + progress.setWindowModality(Qt::ApplicationModal); + progress.setValue(1); + + if (parameters && theoreticalspectrum && parameters->useprofiledata) { + + progress.setValue(10); - if (state) { - peakliststream.open(parameters->peaklistfilename + ".profile." + to_string(fileid) + ".csv"); - while (peakliststream.good() && !(strstr(s.c_str(), "M/Z"))) { - getline(peakliststream, s); + if (parameters->peaklistfileformat == baf) { + + if ((parameters->mode == denovoengine) || (parameters->mode == databasesearch)) { + fileid = parameters->scannumber; + targetid = 0; + } + else { + fileid = rowid; + targetid = rowid - 1; } - (*rawdata)[targetid].loadFromBAFStream(peakliststream); - peakliststream.close(); if ((targetid >= 0) && (targetid < rawdata->size())) { - (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity()); + if (state) { + peakliststream.open(parameters->peaklistfilename + ".profile." + to_string(fileid) + ".csv"); + while (peakliststream.good() && !(strstr(s.c_str(), "M/Z"))) { + getline(peakliststream, s); + } + + (*rawdata)[targetid].clear(); + (*rawdata)[targetid].loadFromBAFStream(peakliststream); + + peakliststream.close(); + + progress.setValue(33); + + (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity()); + + progress.setValue(66); + } + else { + (*rawdata)[targetid].clear(); + } } + + emit rawDataStateChangedSignal(state); + } - else { + + if ((parameters->peaklistfileformat == imzML) && (parameters->mode == dereplication) && (imzmlprofilemetadata->size() > 0)) { + targetid = rowid - 1; + if ((targetid >= 0) && (targetid < rawdata->size())) { - (*rawdata)[targetid].clear(); + if (state) { + string ibdfilename = parameters->profiledatafilename.substr(0, (int)parameters->profiledatafilename.size() - 5); + ibdfilename += "ibd"; + peakliststream.open(ibdfilename, std::ifstream::binary); + + (*rawdata)[targetid].clear(); + if ((targetid >= 0) && (targetid < imzmlprofilemetadata->size())) { + (*rawdata)[targetid].loadFromIBDStream((*imzmlprofilemetadata)[targetid], peakliststream, profilemz64precision, profileintensity64precision); + } + + peakliststream.close(); + + progress.setValue(25); + + ofstream mgfofstream; + ifstream mgfifstream; + string fname; + + char tempstring[1024]; + string peaksstring; + peaksstring.reserve(25000000); + + fname = parameters->profiledatafilename.substr(0, (int)parameters->profiledatafilename.size() - 5); + fname += "scan." + to_string(rowid); + mgfofstream.open(fname + ".mgf"); + + mgfofstream << "BEGIN IONS" << endl; + mgfofstream << "TITLE=" << endl; + mgfofstream << "SCAN=" << to_string(rowid) << endl; + mgfofstream << "PEPMASS=1" << endl; + mgfofstream << "RTINSECONDS=1" << endl; + mgfofstream << "CHARGE=1+" << endl << endl; + + for (int i = 0; i < (*rawdata)[targetid].size(); i++) { + sprintf_s(tempstring, "%f %f\n\0", (*rawdata)[targetid][i].mzratio, (*rawdata)[targetid][i].absoluteintensity); + peaksstring.append(tempstring); + } + mgfofstream << peaksstring; + mgfofstream << "END IONS" << endl << endl; + mgfofstream.close(); + + progress.setValue(50); + + string s; + #if OS_TYPE == UNX + s = installdir.toStdString() + "External/linux/correctprofile.sh " + fname + "," + to_string(parameters->fwhm); + #else + #if OS_TYPE == OSX + s = installdir.toStdString() + "External/macosx/correctprofile.sh " + fname + "," + to_string(parameters->fwhm); + #else + s = "External\\windows\\correctprofile.bat \"" + fname + "\" " + to_string(parameters->fwhm); + #endif + #endif + + (*rawdata)[targetid].clear(); + + progress.setValue(75); + + if (system(s.c_str()) == 0) { + cMzML mzml; + vector peaklists; + bool terminatecomputation = false; + + string mzmlname = fname + ".mzML"; + string mgfname = fname + ".0000000000.mgf"; + + int resultcode = mzml.parse(mzmlname, peaklists, singlecomparison /* ok */, 0 /* ok */, terminatecomputation /* ok */); + if ((resultcode == 0) && (peaklists.size() == 1)) { + QFile::remove(mzmlname.c_str()); + + mgfifstream.open(mgfname); + (*rawdata)[targetid].loadFromMGFStream(mgfifstream); + mgfifstream.close(); + + QFile::remove(mgfname.c_str()); + + (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity()); + } + } + } + else { + (*rawdata)[targetid].clear(); + } } - } - emit rawDataStateChangedSignal(state); + emit rawDataStateChangedSignal(state); + + } } + progress.setValue(maximum); } diff --git a/CycloBranch/gui/cSpectrumDetailWidget.h b/CycloBranch/gui/cSpectrumDetailWidget.h index d2e9d3e..417f6b3 100644 --- a/CycloBranch/gui/cSpectrumDetailWidget.h +++ b/CycloBranch/gui/cSpectrumDetailWidget.h @@ -161,10 +161,13 @@ class cSpectrumDetailWidget : public QMainWindow /** \brief Prepare the widget to show. - \param rawdata a pointer to a structure handling raw data \param actionShowIsomers reference to QAction to show isomers of building blocks - */ - void prepareToShow(cPeakListSeries* rawdata, QAction* actionShowIsomers); + \param rawdata a pointer to a structure handling raw data + \param imzmlprofilemetadata imzml profile metadata + \param profilemz64precision true if 64 mz precision is used, false if 32 bit mz precision is used + \param profileintensity64precision true if 64 intensity precision is used, false if 32 bit intensity precision is used + */ + void prepareToShow(QAction* actionShowIsomers, cPeakListSeries* rawdata, vector* imzmlprofilemetadata, bool profilemz64precision, bool profileintensity64precision); /** @@ -292,7 +295,11 @@ class cSpectrumDetailWidget : public QMainWindow bool preparedToShow; cParameters* parameters; + cPeakListSeries* rawdata; + vector* imzmlprofilemetadata; + bool profilemz64precision; + bool profileintensity64precision; cFindDialog* finddialog; cExportDialog* exportdialog; diff --git a/CycloBranch/gui/cSpectrumSceneWidget.cpp b/CycloBranch/gui/cSpectrumSceneWidget.cpp index d9cea61..db2c72f 100644 --- a/CycloBranch/gui/cSpectrumSceneWidget.cpp +++ b/CycloBranch/gui/cSpectrumSceneWidget.cpp @@ -74,9 +74,11 @@ void cSpectrumSceneWidget::initialize(cParameters* parameters, cTheoreticalSpect this->parameters = parameters; this->theoreticalspectrum = theoreticalspectrum; - if (parameters && parameters->useprofiledata && (parameters->peaklistfileformat == baf)) { - if ((rowid > 0) && (rowid <= rawdata->size())) { - this->rawdatapeaklist = &((*rawdata)[rowid - 1]); + if (parameters && parameters->useprofiledata) { + if ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) { + if ((rowid > 0) && (rowid <= rawdata->size())) { + this->rawdatapeaklist = &((*rawdata)[rowid - 1]); + } } } @@ -376,23 +378,26 @@ void cSpectrumSceneWidget::redrawScene() { // maximum intensity in the interval - double maxintensity = 0; + double maxintensity = 0; + double rawdatamaxintensity = 0; - if (parameters->useprofiledata && (parameters->peaklistfileformat == baf) && rawdatastate && (rawdatapeaklist->size() > 0)) { + if (parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { if (absoluteintensity) { maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); } else { maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); } - + + if (absoluteintensity) { + rawdatamaxintensity = rawdatapeaklist->getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + else { + rawdatamaxintensity = rawdatapeaklist->getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + if (maxintensity == 0) { - if (absoluteintensity) { - maxintensity = rawdatapeaklist->getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } - else { - maxintensity = rawdatapeaklist->getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } + maxintensity = rawdatamaxintensity; } } else { @@ -839,7 +844,7 @@ void cSpectrumSceneWidget::redrawScene() { // raw data (intersections with other objects are not tested) - if ((maxintensity > 0) && parameters->useprofiledata && (parameters->peaklistfileformat == baf) && rawdatastate && (rawdatapeaklist->size() > 0)) { + if ((maxintensity > 0) && parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { QPainterPath rpath; int rx, ry, lastrx, lastry;