Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

waters_connect support in Skyline and pwiz #3170

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions pwiz.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,9 @@
<ClCompile Include="pwiz\data\vendor_readers\UIMF\Reader_UIMF_Test.cpp" />
<ClCompile Include="pwiz\data\vendor_readers\UIMF\SpectrumList_UIMF.cpp" />
<ClCompile Include="pwiz\data\vendor_readers\UNIFI\ChromatogramList_UNIFI.cpp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\ParallelDownloadQueue.cpp">
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">true</CompileAsManaged>
</ClCompile>
<ClCompile Include="pwiz\data\vendor_readers\UNIFI\Reader_UNIFI_Test.cpp" />
<ClCompile Include="pwiz\data\vendor_readers\UNIFI\Reader_UNIFI.cpp" />
<ClCompile Include="pwiz\data\vendor_readers\UNIFI\Reader_UNIFI_Detail.cpp" />
Expand Down Expand Up @@ -613,6 +616,8 @@
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">true</CompileAsManaged>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|Win32'">PWIZ_READER_THERMO;PWIZ_READER_AGILENT;PWIZ_READER_BRUKER;PWIZ_READER_WATERS;PWIZ_READER_ABI;PWIZ_READER_ABI_T2D;WIN32;USE_RAW_PTR;PWIZ_BINDINGS_CLI_COMBINED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">PWIZ_READER_THERMO;PWIZ_READER_AGILENT;PWIZ_READER_BRUKER;PWIZ_READER_WATERS;PWIZ_READER_ABI;PWIZ_READER_ABI_T2D;WIN32;USE_RAW_PTR;PWIZ_BINDINGS_CLI_COMBINED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalUsingDirectories Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">$(SolutionDir)build-nt-x86\msvc-release-x86_64;$(SolutionDir)build-nt-x86\pwiz\utility\bindings\CLI\msvc-14.3\rls\adrs-mdl-64\thrd-mlt\us-clr-tr</AdditionalUsingDirectories>
<ForcedUsingFiles Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">pwiz_bindings_cli.dll</ForcedUsingFiles>
</ClCompile>
<ClCompile Include="pwiz\utility\bindings\CLI\msdata\Reader.cpp">
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|Win32'">true</CompileAsManaged>
Expand Down Expand Up @@ -866,8 +871,10 @@
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UIMF\UIMFReaderTest.cpp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\UnifiData.cpp">
<ExternalWarningLevel Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">Level1</ExternalWarningLevel>
<CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='BrowseOnly|x64'">true</CompileAsManaged>
</ClCompile>
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\UnifiDataTest.cpp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\WatersConnectData.ipp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\Waters\RawData.cpp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\Waters\RawDataTest.cpp" />
<ClCompile Include="pwiz_tools\BiblioSpec\src\BuildParser.cpp" />
Expand Down Expand Up @@ -992,6 +999,7 @@
<ClInclude Include="pwiz\data\vendor_readers\UIMF\Reader_UIMF.hpp" />
<ClInclude Include="pwiz\data\vendor_readers\UIMF\SpectrumList_UIMF.hpp" />
<ClInclude Include="pwiz\data\vendor_readers\UNIFI\ChromatogramList_UNIFI.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\ParallelDownloadQueue.hpp" />
<ClInclude Include="pwiz\data\vendor_readers\UNIFI\Reader_UNIFI.hpp" />
<ClInclude Include="pwiz\data\vendor_readers\UNIFI\Reader_UNIFI_Detail.hpp" />
<ClInclude Include="pwiz\data\vendor_readers\UNIFI\SpectrumList_UNIFI.hpp" />
Expand Down Expand Up @@ -1359,6 +1367,7 @@
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\thermo\ScanFilter.h" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UIMF\UIMFReader.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\UnifiData.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\WatersConnectProtobuf.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\Waters\MassLynxRaw.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\Waters\MassLynxRawChromatogramReader.h" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\Waters\MassLynxRawDataFile.h" />
Expand Down
4 changes: 4 additions & 0 deletions pwiz.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,8 @@
<ClCompile Include="libraries\SQLite\sqlite3pp.cpp" />
<ClCompile Include="pwiz\data\msdata\mzmlb\Connection_mzMLb.cpp" />
<ClCompile Include="pwiz\analysis\spectrum_processing\MzShiftFilter.cpp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\WatersConnectData.ipp" />
<ClCompile Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\ParallelDownloadQueue.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="libraries\boost_aux\boost\nowide\args.hpp" />
Expand Down Expand Up @@ -1067,6 +1069,8 @@
<ClInclude Include="libraries\SQLite\sqlite3pp.h" />
<ClInclude Include="pwiz\data\msdata\mzmlb\Connection_mzMLb.hpp" />
<ClInclude Include="pwiz\analysis\spectrum_processing\MzShiftFilter.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\WatersConnectProtobuf.hpp" />
<ClInclude Include="pwiz_aux\msrc\utility\vendor_api\UNIFI\ParallelDownloadQueue.hpp" />
</ItemGroup>
<ItemGroup>
<None Include="Jamroot.jam" />
Expand Down
17 changes: 16 additions & 1 deletion pwiz/analysis/spectrum_processing/SpectrumList_PeakPicker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
#include "pwiz/data/vendor_readers/Thermo/SpectrumList_Thermo.hpp"
#include "pwiz/data/vendor_readers/Waters/Reader_Waters.hpp"
#include "pwiz/data/vendor_readers/Waters/SpectrumList_Waters.hpp"
#include "pwiz/data/vendor_readers/UNIFI/Reader_UNIFI.hpp"
#include "pwiz/data/vendor_readers/UNIFI/SpectrumList_UNIFI.hpp"
#include "SpectrumList_LockmassRefiner.hpp"


Expand Down Expand Up @@ -113,6 +115,12 @@ SpectrumList_PeakPicker::SpectrumList_PeakPicker(
{
mode_ = 8;
}

detail::SpectrumList_UNIFI* waters_connect = dynamic_cast<detail::SpectrumList_UNIFI*>(&*inner);
if (waters_connect && waters_connect->isWatersConnect())
{
mode_ = 9;
}
}

// add processing methods to the copy of the inner SpectrumList's data processing
Expand All @@ -137,6 +145,8 @@ SpectrumList_PeakPicker::SpectrumList_PeakPicker(
method.userParams.push_back(UserParam("Waters/MassLynx peak picking"));
else if (mode_ == 7)
method.userParams.push_back(UserParam("Shimadzu peak picking"));
else if (mode_ == 9)
method.userParams.push_back(UserParam("waters_connect peak picking"));
else if (algorithm != NULL)
method.userParams.emplace_back(algorithm->name());

Expand All @@ -161,7 +171,8 @@ PWIZ_API_DECL bool SpectrumList_PeakPicker::supportsVendorPeakPicking(const std:
+ ReaderPtr(new Reader_Bruker_TSF)
+ ReaderPtr(new Reader_Shimadzu)
+ ReaderPtr(new Reader_Thermo)
+ ReaderPtr(new Reader_Waters);
+ ReaderPtr(new Reader_Waters)
+ ReaderPtr(new Reader_UNIFI);
return !peakPickingVendorReaders.identify(rawpath).empty();
}

Expand Down Expand Up @@ -218,6 +229,10 @@ PWIZ_API_DECL SpectrumPtr SpectrumList_PeakPicker::spectrum(size_t index, Detail
s = dynamic_cast<SpectrumList_LockmassRefiner*>(&*inner_)->spectrum(index, detailLevel, msLevelsToPeakPick_);
break;

case 9:
s = dynamic_cast<detail::SpectrumList_UNIFI*>(&*inner_)->spectrum(index, detailLevel, msLevelsToPeakPick_);
break;

case 0:
default:
s = inner_->spectrum(index, true); // TODO you'd think this would be "detailLevel" instead of "true" but that breaks SpectrumListFactoryTest
Expand Down
2 changes: 1 addition & 1 deletion pwiz/data/msdata/Reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ Reader::Config::Config(const Config& rhs)
void Reader::Config::instrumentMetadataError(const std::string& msg) const
{
if (unknownInstrumentIsError)
throw runtime_error(msg + string("; if want to convert the file anyway, use the ignoreUnknownInstrumentError flag"));
throw runtime_error(msg + string("; if you want to convert the file anyway, use the ignoreUnknownInstrumentError flag"));
cerr << msg << endl;
}

Expand Down
70 changes: 48 additions & 22 deletions pwiz/data/vendor_readers/UNIFI/ChromatogramList_UNIFI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,12 @@ PWIZ_API_DECL void ChromatogramList_UNIFI::makeFullFileChromatogram(pwiz::msdata

for (const auto& info : unifiData_->chromatogramInfo())
{
if (!bal::contains(info.id, chromatogramTag) || bal::contains(info.id, "Integrated"))
if (!bal::contains(info.name, chromatogramTag) || bal::contains(info.name, "Integrated"))
continue;

if (!bxp::regex_match(info.id, what, functionNumberRegex))
if (!bxp::regex_match(info.name, what, functionNumberRegex))
{
warn_once(("unable to parse function number from chromatogram name: " + info.id).c_str());
warn_once(("unable to parse function number from chromatogram name: " + info.name).c_str());
continue;
}

Expand Down Expand Up @@ -161,33 +161,49 @@ PWIZ_API_DECL ChromatogramPtr ChromatogramList_UNIFI::chromatogram(size_t index,
result->id = ie.id;
result->set(ie.chromatogramType);

if (detailLevel < DetailLevel_FullMetadata)
return result;

bool getBinaryData = detailLevel == DetailLevel_FullData;

switch (ie.chromatogramType)
{
case MS_TIC_chromatogram:
{
if (detailLevel < DetailLevel_FullMetadata)
return result;

makeFullFileChromatogram(result, "(TIC)", getBinaryData);
}
break;

case MS_basepeak_chromatogram:
{
if (detailLevel < DetailLevel_FullMetadata)
return result;

makeFullFileChromatogram(result, "(BPC)", getBinaryData);
}
break;

case MS_emission_chromatogram:
case MS_SRM_chromatogram:
{
if (detailLevel < DetailLevel_FullMetadata)
return result;
result->setTimeIntensityArrays(std::vector<double>(), std::vector<double>(), UO_minute, MS_number_of_detector_counts);

UnifiChromatogram chromatogram;
unifiData_->getChromatogram(ie.chromatogramInfoIndex, chromatogram, getBinaryData);
result->defaultArrayLength = chromatogram.arrayLength;
result->set(translate(chromatogram.polarity));

result->precursor.isolationWindow.set(MS_isolation_window_target_m_z, chromatogram.Q1, MS_m_z);
//result->precursor.activation.set(MS_collision_energy, );

result->product.isolationWindow.set(MS_isolation_window_target_m_z, chromatogram.Q3, MS_m_z);

if (getBinaryData)
{
swap(chromatogram.timeArray, result->getTimeArray()->data);
swap(chromatogram.intensityArray, result->getIntensityArray()->data);
}
}
break;

case MS_emission_chromatogram:
{
result->setTimeIntensityArrays(std::vector<double>(), std::vector<double>(), UO_minute, MS_number_of_detector_counts);

UnifiChromatogram chromatogram;
Expand All @@ -204,9 +220,6 @@ PWIZ_API_DECL ChromatogramPtr ChromatogramList_UNIFI::chromatogram(size_t index,

case MS_absorption_chromatogram:
{
if (detailLevel < DetailLevel_FullMetadata)
return result;

result->setTimeIntensityArrays(std::vector<double>(), std::vector<double>(), UO_minute, UO_absorbance_unit);

UnifiChromatogram chromatogram;
Expand All @@ -220,6 +233,9 @@ PWIZ_API_DECL ChromatogramPtr ChromatogramList_UNIFI::chromatogram(size_t index,
}
}
break;

default:
throw std::runtime_error("unhandled chromatogram type");
}

return result;
Expand All @@ -231,12 +247,12 @@ PWIZ_API_DECL void ChromatogramList_UNIFI::createIndex() const
for (size_t i=0; i < unifiData_->chromatogramInfo().size(); ++i)
{
const auto& chromatogramInfo = unifiData_->chromatogramInfo()[i];
switch (chromatogramInfo.detectorType)
switch (chromatogramInfo.type)
{
case DetectorType::MS:
case UnifiChromatogramInfo::TIC:
{
// we only make 1 TIC and BPI chromatogram, not one per function like UNIFI provides
if (!hasTIC && bal::contains(chromatogramInfo.id, "(TIC)"))
if (!hasTIC && bal::contains(chromatogramInfo.name, "(TIC)"))
{
hasTIC = true;
index_.push_back(IndexEntry());
Expand All @@ -256,21 +272,31 @@ PWIZ_API_DECL void ChromatogramList_UNIFI::createIndex() const
}
break;

case DetectorType::FLR:
case UnifiChromatogramInfo::MRM:
{
index_.push_back(IndexEntry());
IndexEntry& ie = index_.back();
ie.id = "SRM SIC " + chromatogramInfo.name;
ie.chromatogramInfoIndex = i;
ie.chromatogramType = MS_SRM_chromatogram;
}
break;

case UnifiChromatogramInfo::FLR:
{
index_.push_back(IndexEntry());
IndexEntry& ie = index_.back();
ie.id = chromatogramInfo.id;
ie.id = chromatogramInfo.name;
ie.chromatogramInfoIndex = i;
ie.chromatogramType = MS_emission_chromatogram;
}
break;

case DetectorType::UV:
case UnifiChromatogramInfo::UV:
{
index_.push_back(IndexEntry());
IndexEntry& ie = index_.back();
ie.id = chromatogramInfo.id;
ie.id = chromatogramInfo.name;
ie.chromatogramInfoIndex = i;
ie.chromatogramType = MS_absorption_chromatogram;
}
Expand Down
33 changes: 27 additions & 6 deletions pwiz/data/vendor_readers/UNIFI/Reader_UNIFI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,18 @@
#include "pwiz/utility/misc/Std.hpp"
#include "pwiz/data/msdata/Version.hpp"
#include <boost/foreach_field.hpp>
#include <boost/range/algorithm/find_if.hpp>


PWIZ_API_DECL std::string pwiz::msdata::Reader_UNIFI::identify(const std::string& filename, const std::string& head) const
{
std::string result;
if ((bal::istarts_with(filename, "http://") || bal::istarts_with(filename, "https://")) && bal::icontains(filename, "/sampleresults"))
if (!bal::istarts_with(filename, "http://") && !bal::istarts_with(filename, "https://"))
return result;
if (bal::icontains(filename, "/sampleresults"))
result = getType();
else if (bal::icontains(filename, "sampleSetId=") || bal::icontains(filename, "injectionId=")) // both are required but reader will handle the error message
result = "waters_connect";
return result;
}

Expand Down Expand Up @@ -73,10 +78,15 @@ void fillInMetadata(const string& sampleResultUrl, MSData& msd, const UnifiDataP
else
msd.fileDescription.fileContent.set(MS_SRM_chromatogram);
}*/

string apiName = "UNIFI";
if (unifiData->getRemoteApiType() == UnifiData::RemoteApi::Waters_Connect)
apiName = "waters_connect";

auto queryStrBegin = sampleResultUrl.rfind(")?");
SourceFilePtr sourceFile(new SourceFile);
bfs::path p(sampleResultUrl);
sourceFile->id = "UNIFI";
sourceFile->id = apiName;
sourceFile->location = sampleResultUrl.substr(0, (queryStrBegin != string::npos ? queryStrBegin + 1 : sampleResultUrl.length()));
//sourceFile->set(MS_WIFF_nativeID_format);
//sourceFile->set(MS_UNIFI_WIFF_format);
Expand All @@ -97,8 +107,11 @@ void fillInMetadata(const string& sampleResultUrl, MSData& msd, const UnifiDataP
sourceFile->name = msd.id;

SoftwarePtr acquisitionSoftware(new Software);
acquisitionSoftware->id = "UNIFI";
acquisitionSoftware->set(MS_UNIFY);
if (unifiData->getRemoteApiType() == UnifiData::RemoteApi::Unifi)
acquisitionSoftware->set(MS_UNIFY);
else
acquisitionSoftware->set(MS_waters_connect);
acquisitionSoftware->id = apiName;
acquisitionSoftware->version = "1.0";
msd.softwarePtrs.push_back(acquisitionSoftware);

Expand All @@ -120,8 +133,16 @@ void fillInMetadata(const string& sampleResultUrl, MSData& msd, const UnifiDataP
if (sl) sl->setDataProcessingPtr(dpPwiz);
if (cl) cl->setDataProcessingPtr(dpPwiz);

msd.fileDescription.fileContent.set(MS_MS1_spectrum);
msd.fileDescription.fileContent.set(MS_MSn_spectrum);
if (unifiData->numberOfSpectra() > 0)
{
msd.fileDescription.fileContent.set(MS_MS1_spectrum);
msd.fileDescription.fileContent.set(MS_MSn_spectrum);
}

const auto& ci = unifiData->chromatogramInfo();
bool hasMrm = ci.end() != boost::range::find_if(ci, [](const UnifiChromatogramInfo& info) { return info.type == UnifiChromatogramInfo::MRM; });
if (hasMrm)
msd.fileDescription.fileContent.set(MS_SRM_chromatogram);

InstrumentConfigurationPtr ic(new InstrumentConfiguration("IC1"));
ic->set(MS_Waters_instrument_model);
Expand Down
3 changes: 2 additions & 1 deletion pwiz/data/vendor_readers/UNIFI/Reader_UNIFI_Detail.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,9 @@ PWIZ_API_DECL CVID translate(Polarity polarity)
case Polarity::Negative:
return MS_negative_scan;
case Polarity::Unknown:
default:
return CVID_Unknown;
default:
throw std::runtime_error("invalid polarity value");
}
}

Expand Down
Loading
Loading