OpenSwath::SpectrumPtr OpenSwathScoring::getAddedSpectra_(OpenSwath::SpectrumAccessPtr swath_map, double RT, int nr_spectra_to_add) { std::vector<std::size_t> indices = swath_map->getSpectraByRT(RT, 0.0); if (indices.empty() ) { OpenSwath::SpectrumPtr sptr(new OpenSwath::Spectrum); return sptr; } int closest_idx = boost::numeric_cast<int>(indices[0]); if (indices[0] != 0 && std::fabs(swath_map->getSpectrumMetaById(boost::numeric_cast<int>(indices[0]) - 1).RT - RT) < std::fabs(swath_map->getSpectrumMetaById(boost::numeric_cast<int>(indices[0])).RT - RT)) { closest_idx--; } if (nr_spectra_to_add == 1) { OpenSwath::SpectrumPtr spectrum_ = swath_map->getSpectrumById(closest_idx); return spectrum_; } else { std::vector<OpenSwath::SpectrumPtr> all_spectra; // always add the spectrum 0, then add those right and left all_spectra.push_back(swath_map->getSpectrumById(closest_idx)); for (int i = 1; i <= nr_spectra_to_add / 2; i++) // cast to int is intended! { if (closest_idx - i >= 0) { all_spectra.push_back(swath_map->getSpectrumById(closest_idx - i)); } if (closest_idx + i < (int)swath_map->getNrSpectra()) { all_spectra.push_back(swath_map->getSpectrumById(closest_idx + i)); } } OpenSwath::SpectrumPtr spectrum_ = SpectrumAddition::addUpSpectra(all_spectra, spacing_for_spectra_resampling_, true); return spectrum_; } }
void ChromatogramExtractorAlgorithm::extractChromatograms(const OpenSwath::SpectrumAccessPtr input, std::vector< OpenSwath::ChromatogramPtr >& output, std::vector<ExtractionCoordinates> extraction_coordinates, double mz_extraction_window, bool ppm, String filter) { Size input_size = input->getNrSpectra(); if (input_size < 1) { return; } if (output.size() != extraction_coordinates.size()) { throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Output and extraction coordinates need to have the same size"); } int used_filter = getFilterNr_(filter); // assert that they are sorted! if (std::adjacent_find(extraction_coordinates.begin(), extraction_coordinates.end(), ExtractionCoordinates::SortExtractionCoordinatesReverseByMZ) != extraction_coordinates.end()) { throw Exception::IllegalArgument(__FILE__, __LINE__, __PRETTY_FUNCTION__, "Input to extractChromatogram needs to be sorted by m/z"); } //go through all spectra startProgress(0, input_size, "Extracting chromatograms"); for (Size scan_idx = 0; scan_idx < input_size; ++scan_idx) { setProgress(scan_idx); OpenSwath::SpectrumPtr sptr = input->getSpectrumById(scan_idx); OpenSwath::SpectrumMeta s_meta = input->getSpectrumMetaById(scan_idx); OpenSwath::BinaryDataArrayPtr mz_arr = sptr->getMZArray(); OpenSwath::BinaryDataArrayPtr int_arr = sptr->getIntensityArray(); std::vector<double>::const_iterator mz_start = mz_arr->data.begin(); std::vector<double>::const_iterator mz_end = mz_arr->data.end(); std::vector<double>::const_iterator mz_it = mz_arr->data.begin(); std::vector<double>::const_iterator int_it = int_arr->data.begin(); if (sptr->getMZArray()->data.size() == 0) continue; // go through all transitions / chromatograms which are sorted by // ProductMZ. We can use this to step through the spectrum and at the // same time step through the transitions. We increase the peak counter // until we hit the next transition and then extract the signal. for (Size k = 0; k < extraction_coordinates.size(); ++k) { double integrated_intensity = 0; double current_rt = s_meta.RT; if (extraction_coordinates[k].rt_end - extraction_coordinates[k].rt_start > 0 && (current_rt < extraction_coordinates[k].rt_start || current_rt > extraction_coordinates[k].rt_end) ) { continue; } if (used_filter == 1) { extract_value_tophat( mz_start, mz_it, mz_end, int_it, extraction_coordinates[k].mz, integrated_intensity, mz_extraction_window, ppm); } else if (used_filter == 2) { throw Exception::NotImplemented(__FILE__, __LINE__, __PRETTY_FUNCTION__); } // Time is first, intensity is second output[k]->binaryDataArrayPtrs[0]->data.push_back(current_rt); output[k]->binaryDataArrayPtrs[1]->data.push_back(integrated_intensity); } } endProgress(); }