virtual tribool less(const Spectrum& lhs, const Spectrum& rhs) const { CVParam lhsMSLevel = lhs.cvParam(MS_ms_level); CVParam rhsMSLevel = rhs.cvParam(MS_ms_level); if (lhsMSLevel.empty() || rhsMSLevel.empty()) return boost::logic::indeterminate; return lhsMSLevel.valueAs<int>() < rhsMSLevel.valueAs<int>(); }
void writeSpectrumText(SpectrumPtr s, ostream& os) { os << std::setprecision(7); // 124.4567 // Write the scan numbers os << "S\t"; int scanNum = getScanNumber(s); os << scanNum << "\t" << scanNum << "\t"; // Write the precursor mz Precursor& precur = s->precursors[0]; SelectedIon& si = precur.selectedIons[0]; double mz = si.cvParam(MS_selected_ion_m_z).valueAs<double>(); os << mz << "\n"; // Write the scan time, if available if( s->scanList.scans[0].cvParam(MS_scan_start_time).timeInSeconds() ) os << "I\tRTime\t" << s->scanList.scans[0].cvParam(MS_scan_start_time).timeInSeconds() << "\n"; // Collect charge and mass info vector<int> charges; vector<double> masses; int numChargeStates = 0; // for each selected ion BOOST_FOREACH(const SelectedIon& curIon, precur.selectedIons){ numChargeStates += getChargeStates(curIon, charges, masses); } // Write EZ lines if accurate masses are available CVParam massParam = si.cvParam(MS_accurate_mass); if( !massParam.empty() ){ for(int i=0; i < numChargeStates; i++){ os << "I\tEZ\t" << charges[i] << "\t" << masses[i] << "\t0\t0" << endl; // pad last two fields with 0 } } // For each charge, write the charge and mass for(int i = 0; i < numChargeStates; i++) { os << "Z\t" << charges[i] << "\t" << masses[i] << "\n"; } // Write each mz, intensity pair const BinaryDataArray& mzArray = *s->getMZArray(); const BinaryDataArray& intensityArray = *s->getIntensityArray(); for (size_t p=0; p < s->defaultArrayLength; ++p) { os << mzArray.data[p] << " " << intensityArray.data[p] << "\n"; } }
void writeSpectrumBinary(SpectrumPtr s, int version, bool compress, ostream& os) { // todo // MSnScanInfo header(s); // header.writeSpectrumHeader(version, compress, os); int scanNum = getScanNumber(s); os.write(reinterpret_cast<char *>(&scanNum), sizeIntMSn); os.write(reinterpret_cast<char *>(&scanNum), sizeIntMSn); // Yes, there are two Precursor& precur = s->precursors[0]; SelectedIon& si = precur.selectedIons[0]; double mz = si.cvParam(MS_selected_ion_m_z).valueAs<double>(); os.write(reinterpret_cast<char *>(&mz), sizeDoubleMSn); float rt = (float) s->scanList.scans[0].cvParam(MS_scan_start_time).timeInSeconds(); os.write(reinterpret_cast<char *>(&rt), sizeFloatMSn); if (version >= 2) { float basePeakIntensity = s->cvParam(MS_base_peak_intensity).valueAs<float>(); os.write(reinterpret_cast<char *>(&basePeakIntensity), sizeFloatMSn); double basePeakMZ = s->cvParam(MS_base_peak_m_z).valueAs<double>(); os.write(reinterpret_cast<char *>(&basePeakMZ), sizeDoubleMSn); // We don't have this information, but we need to write something, // so pad with 0's. (version 2 specific data) double conversionFactorA = (double)0; os.write(reinterpret_cast<char *>(&conversionFactorA), sizeDoubleMSn); double conversionFactorB = (double)0; os.write(reinterpret_cast<char *>(&conversionFactorB), sizeDoubleMSn); double tic = s->cvParam(MS_total_ion_current).valueAs<double>(); os.write(reinterpret_cast<char *>(&tic), sizeDoubleMSn); // TODO float ionInjectionTime = (float)0; os.write(reinterpret_cast<char *>(&ionInjectionTime), sizeFloatMSn); } vector<int> charges; vector<double> masses; int numChargeStates = 0; BOOST_FOREACH(const SelectedIon& curIon, precur.selectedIons) { numChargeStates += getChargeStates(curIon, charges, masses); } os.write(reinterpret_cast<char *>(&numChargeStates), sizeIntMSn); bool hasAccurateMass = false; if (version == 3) { int numEzStates = 0; CVParam massParam = si.cvParam(MS_accurate_mass); if (!massParam.empty()) { numEzStates = numChargeStates; hasAccurateMass = true; } os.write(reinterpret_cast<char *>(&numEzStates), sizeIntMSn); } int numPeaks = (int) s->defaultArrayLength; os.write(reinterpret_cast<char *>(&numPeaks), sizeIntMSn); // end spectrum header info // Write out each charge state and corresponding mass for(int i = 0; i < numChargeStates; i++) { os.write(reinterpret_cast<char *>(&(charges[i])), sizeIntMSn); os.write(reinterpret_cast<char *>(&(masses[i])), sizeDoubleMSn); } // if there are accurate masses, write out EZ entries if( hasAccurateMass ){ float blank = 0; // we don't have rTime or area, pad with zeros for(int i=0; i < numChargeStates; i++){ os.write(reinterpret_cast<char *>(&charges[i]), sizeIntMSn); os.write(reinterpret_cast<char *>(&masses[i]), sizeDoubleMSn); os.write(reinterpret_cast<char *>(&blank), sizeFloatMSn); os.write(reinterpret_cast<char *>(&blank), sizeFloatMSn); } } // Do we need to write compressed m/z, intensity arrays? if (compress) { writeCompressedPeaks(s, os); } else { // No need to compress, just write out the arrays const BinaryDataArray& mzArray = *s->getMZArray(); const BinaryDataArray& intensityArray = *s->getIntensityArray(); for(int i = 0; i < numPeaks; i++) { double mzPeak = mzArray.data[i]; os.write(reinterpret_cast<char *>(&mzPeak), sizeDoubleMSn); float intensityPeak = (float) intensityArray.data[i]; os.write(reinterpret_cast<char *>(&intensityPeak), sizeFloatMSn); } } }
void writeSpectrumText(SpectrumPtr s, ostream& os) { os << std::setprecision(7); // 123.4567 bool ms1File = s->cvParam(MS_ms_level).valueAs<int>() == 1; // Write the scan numbers os << "S\t"; int scanNum = getScanNumber(s); os << scanNum << "\t" << scanNum; if (!ms1File) { // Write the precursor mz Precursor& precur = s->precursors[0]; double mz = precur.isolationWindow.cvParam(MS_isolation_window_target_m_z).valueAs<double>(); os << "\t" << mz; } os << "\n"; // Write the scan time, if available if( !(s->scanList.empty()) && s->scanList.scans[0].cvParam(MS_scan_start_time).timeInSeconds() ) os << "I\tRTime\t" << s->scanList.scans[0].cvParam(MS_scan_start_time).timeInSeconds()/60 << "\n"; if (s->defaultArrayLength > 0) { // Write the base peak intensity and base peak m/z if (s->hasCVParam(MS_base_peak_intensity)) { double bpi = s->cvParam(MS_base_peak_intensity).valueAs<double>(); os << "I\tBPI\t" << bpi << "\n"; } if (s->hasCVParam(MS_base_peak_m_z)) { double bpm = s->cvParam(MS_base_peak_m_z).valueAs<double>(); os << "I\tBPM\t" << bpm << "\n"; } // Write the total ion current if (s->hasCVParam(MS_total_ion_current)) { double tic = s->cvParam(MS_total_ion_current).valueAs<double>(); os << "I\tTIC\t" << tic << "\n"; } } //TODO // Write ConvA/ConvB information // Write the ion injection time //os << "I\tIIT\t" << s->scanList.scans[0].cvParam(MS_ion_injection_time).timeInSeconds()/60 << "\n"; if (!ms1File) { Precursor& precur = s->precursors[0]; SelectedIon& si = precur.selectedIons[0]; // Collect charge and mass info vector<int> charges; vector<double> masses; int numChargeStates = 0; // for each selected ion BOOST_FOREACH(const SelectedIon& curIon, precur.selectedIons){ numChargeStates += getChargeStates(curIon, charges, masses); } // Write EZ lines if accurate masses are available CVParam massParam = si.cvParam(MS_accurate_mass_OBSOLETE); if( !massParam.empty() ){ for(int i=0; i < numChargeStates; i++){ os << "I\tEZ\t" << charges[i] << "\t" << masses[i] << "\t0\t0" << endl; // pad last two fields with 0 } } // For each charge, write the charge and mass for(int i = 0; i < numChargeStates; i++) { os << "Z\t" << charges[i] << "\t" << masses[i] << "\n"; } }