def test_isInside(self): p1 = Peak(100, 0.5, calculate_Delta_based_MZ) p2 = Peak(101, 0.3, calculate_Delta_based_MZ) p3 = Peak(100 + 0.001, 0.2, calculate_Delta_based_MZ) mp = MasterPeak(p1) assert_false(mp.isInside(p2)) assert_true(mp.isInside(p3))
def test_greater(self): # tests if left border is greater than peak p1 = Peak(100, 0.5, calculate_Delta_based_MZ) mp = MasterPeak(p1) p2 = Peak(90, 0.5, calculate_Delta_based_MZ) p3 = Peak(110, 0.5, calculate_Delta_based_MZ) assert_true(mp.greater(p2)) assert_false(mp.greater(p3))
def load_recalibrate(self): fc = calculate_Delta_by_ppm(self.ppm) tmt_mass = calculate_tag_tmt10() with mgf.read(self.path) as spectra: for spectrum in spectra: ms = MasterSpectrum() params = spectrum['params'] for mass, intensity in zip(spectrum['m/z array'], spectrum['intensity array']): ms.add(Peak(mass, intensity, fc)) peak = Peak(tmt_mass, 0.5, fc) if peak.key() not in ms.spectrum[0]: recalibrate = False else: idx, bin_to_ack, a, b = ms.binary( peak, 0, len(ms.spectrum[0][peak.key()]) - 1, 0) if idx == -1: recalibrate = False else: recalibrate = True recalibration_mass = ms.spectrum[0][peak.key()][idx].mz diff = tmt_mass - recalibration_mass print(params['title']) print("original={0}\tdiff={1}".format( recalibration_mass, diff)) mass_list = [] int_list = [] if recalibrate: ppm_shift = calculate_ppm_shift(diff, tmt_mass) for key in ms.spectrum[0].keys(): for mp in ms.spectrum[0][key]: if recalibrate: if self.type == 'ppm': diff = calculate_da_shift(mp.mz, ppm_shift) mass_list.append(mp.mz + diff) elif self.type == 'absolute': diff = diff mass_list.append(mp.mz + diff) else: print(self.type) raise ValueError("what did you dooooo") else: mass_list.append(mp.mz) int_list.append(mp.intensity) print("len is:\t{0}".format(len(mass_list))) mgf.write(spectra=[{ 'm/z array': mass_list, 'intensity array': int_list, 'params': params }], output=self.file_out)
def test_ratio(self): p1 = Peak(100, 0.5, calculate_Delta_based_MZ) mp = MasterPeak(p1) p2 = Peak(100, 0.5, calculate_Delta_based_MZ) mp2 = MasterPeak(p2) mp.recalculate_ratio(mp2) assert_equal(mp.rel_intensity_ratio, 1) assert_equal(mp.counts_ratio, 1)
def test_update(self): p1 = Peak(100, 0.5, calculate_Delta_based_MZ) mp = MasterPeak(p1) assert_equal(mp.left, mp.mz - mp.delta) assert_equal(mp.right, mp.mz + mp.delta) assert_equal(mp.delta, 100 / 56885.29308438425) p2 = Peak(110, 0.4, calculate_Delta_based_MZ) mp.add(p2) mz2 = (100 * 0.5 + 110 * 0.4) / 0.9 delta = mz2 / (math.pow(10, 5.847 + math.log10(mz2) * (-0.546))) assert_equal(mp.delta, delta) assert_equal(mp.left, mz2 - delta) assert_equal(mp.right, mz2 + delta)
def patchDelta(self, input_path, output_path): ''' ''' with open(output_path, "wt") as csvfile: writr = csv.writer(csvfile, lineterminator=os.linesep) with open(input_path, 'r') as r_csvfile: readr = csv.reader(r_csvfile) header = True for row in readr: if header: header = False writr.writerow(row) else: peak = Peak(float(row[0]), 0, self.delta_function) if peak.key() in self.exclusionSpectrum.spectrum[0]: idx, bin_to_ack, should_merge_left_peak, should_merge_right_peak = self.exclusionSpectrum.binary( peak, 0, len(self.exclusionSpectrum.spectrum[0][ peak.key()]) - 1, 0) if idx != -1: # found print("found it") else: # not found writr.writerow(row) else: writr.writerow(row)
def test_add(self): p1 = Peak(100, 0.5, calculate_Delta_based_MZ) p2 = Peak(110, 0.4, calculate_Delta_based_MZ) mp = MasterPeak(p1) mp.add(p2) assert_equal(mp.intensity, 0.9) assert_equal(mp.mz, (100 * 0.5 + 110 * 0.4) / (0.5 + 0.4)) assert_equal(mp.counts, 2) p3 = Peak(120, 0.6, calculate_Delta_based_MZ) mp.add(p3) assert_equal(mp.mz, (100 * 0.5 + 110 * 0.4 + 120 * 0.6) / (0.5 + 0.4 + 0.6)) assert_equal(mp.intensity, 0.9 + 0.6) assert_equal(mp.counts, 3)
def test_init(self): p = Peak(100, 0.5, calculate_Delta_based_MZ) mp = MasterPeak(p) assert_equal(mp.mz, 100) assert_equal(mp.intensity, 0.5) assert_not_equal(mp.left, 0) assert_not_equal(mp.right, 0) assert_equal(mp.counts, 1)
def request_ms(self): ms = MasterSpectrum() delta_func = calculate_Delta_by_ppm(20) for m in self.mz_ary: p = Peak(float(m), 1, delta_func) ms.add(p, 0) return ms
def load_from_csv(self, path, delta_function=calculate_Delta_by_ppm(20)): with open(path, 'r') as csvfile: readr = csv.reader(csvfile) header = True for row in readr: if header: header = False else: p = Peak(float(row[0]), float(row[1]), delta_function) mp = MasterPeak(p) mp.counts = int(row[2]) mp.mz_origin = float(row[5]) self.add(mp, str(row[6]))
def just_create_heavy_ms(self): ms = MasterSpectrum() for mass, i in zip(self.peak_list_1, self.int_list_1): ms.add( Peak(mass, i, self.fc, meta={ 'delta': 511, 'mass': -1, 'decharged': False })) return ms
def createDeltaPrecursorMasterSpectrum( self, delta_func=calculate_Delta_by_ppm(20)): with mgf.read(self.path) as spectra: for spectrum in spectra: int_dic = spectrum['intensity array'] mz_dic = spectrum['m/z array'] chrg_spec = spectrum['params']['charge'][0] precursor = calculatePrecursor( mz=spectrum['params']['pepmass'][0], charge=chrg_spec) rel_int = calculateRelativeIntensity(int_dic) for m, i in zip(mz_dic, rel_int): p = Peak(precursor - float(m), float(i), delta_func) self.masterSpectrum.add(p, 0)
def generateMS_by_score_file(score_info_object): """ every object has an mz array every object has an diff array """ ms = MasterSpectrum() delta_func = calculate_Delta_by_ppm(20) dPeaks_matched = 0 for m, diff in zip(score_info_object['mz'], score_info_object['diff']): p = Peak(float(m), 1, delta_func, meta=diff) ms.add(p, 0) dPeaks_matched += 1 return ms, dPeaks_matched
def load_from_mgf(self, path, ignoreCharges, delta_func=calculate_Delta_by_ppm(20)): up = 0 with mgf.read(path) as spectra: for spectrum in spectra: up = up + 1 rel_int = calculateRelativeIntensity( spectrum['intensity array']) charge_of_spectrum = str(spectrum['params']['charge'][0]) for m, i in zip(spectrum['m/z array'], rel_int): p = Peak(float(m), float(i), delta_func) if ignoreCharges: self.add(p, 0) else: self.add(p, charge_of_spectrum)
def patchMgf(self, input_path, output_path): ''' ''' with mgf.read(input_path) as spectra: spectra_out = [] for spectrum in spectra: int_dic = spectrum['intensity array'] mz_dic = spectrum['m/z array'] param_dic = spectrum['params'] chrg_spec = spectrum['params']['charge'][0] precursor = calculatePrecursor( mz=spectrum['params']['pepmass'][0], charge=chrg_spec) pos = 0 del_array = [] for m in mz_dic: peak = Peak(m, 0, self.delta_function) if peak.key() in self.exclusionSpectrum.spectrum[0]: idx, bin_to_ack, should_merge_left_peak, should_merge_right_peak = self.exclusionSpectrum.binary( peak, 0, len(self.exclusionSpectrum.spectrum[0][peak.key()]) - 1, 0) if idx != -1: # found del_array.append(pos) else: mp = MasterPeak(peak) for precursorDelta in self.precursorDeltas: if mp.isInsideMz(precursor - precursorDelta): del_array.append(pos) else: pass pos += 1 int_dic = np.delete(int_dic, del_array, 0) mz_dic = np.delete(mz_dic, del_array, 0) spectra_out.append({ 'm/z array': mz_dic, 'intensity array': int_dic, 'params': param_dic }) mgf.write(spectra=spectra_out, output=output_path)
def readExclusionList(self, path): ''' exclusionList: 3 columns m/z , comments ''' with open(path, 'r') as csvfile: readr = csv.reader(csvfile) header = True for row in readr: if header: header = False else: if row[2] == 'absolute': p = Peak(float(row[0]), 1.0, self.delta_function) mp = MasterPeak(p) # 0 for no differentiation of charge states self.exclusionSpectrum.add(mp, 0) elif row[2] == 'precursor': self.precursorDeltas.append(float(row[0])) else: raise ValueError('A very specific bad thing happened')
def analyse_mzid_vs_mgf(self): delta_func = calculate_Delta_by_ppm(20) if self.mgf_reads == {}: raise ValueError("need the mgf beforehand read_enhanced_spectrum") else: for ids in self.identifications: mzs = ids.report_all_mzs() ms = self.mgf_reads[ids.scan_id].request_ms() for mz in mzs: peak = Peak(mz, 2, delta_func) if peak.key() in ms.spectrum[0]: idx, bin_to_ack, should_merge_left_peak, should_merge_right_peak = ms.binary(peak, 0, len(ms.spectrum[0][peak.key()]) - 1, 0) if idx == -1: error = "mz:\t{0}\nscan_id:\t{1}".format(mz, ids.scan_id) raise ValueError(error) else: pass else: error = "mz:\t{0}\nscan_id:\t{1}".format(mz, ids.scan_id) raise ValueError(error)
def createDeltaMasterSpectrum(self, min_rel_intensity, delta_func=calculate_Delta_by_ppm(20)): up = 0 with mgf.read(self.path) as spectra: for spectrum in spectra: print(up) up += 1 int_dic = spectrum['intensity array'] mz_dic = spectrum['m/z array'] rel_int = calculateRelativeIntensity(int_dic) smallerArea = [(i, j) for i, j in zip(mz_dic, rel_int) if j >= min_rel_intensity] mz_dic = [i for i, j in smallerArea] rel_int = [j for i, j in smallerArea] for i in range(len(mz_dic) - 1, -1, -1): for j in range(i - 1, -1, -1): diff = mz_dic[i] - mz_dic[j] p = Peak(diff, rel_int[j], delta_func) # intensities are from lower peak self.masterSpectrum.add(p, 0)
def test_init(self): p = Peak(100, 0.5, calculate_Delta_based_MZ) assert_equal(p.mz, 100) assert_equal(p.intensity, 0.5) assert_not_equal(p.left, 0)
def test_key(self): p = Peak(100, 0.5, calculate_Delta_based_MZ) assert_not_equal(p.key(), 99) assert_equal(p.key(), 100)
def test_update(self): p = Peak(100, 0.5, calculate_Delta_based_MZ) assert_equal(p.left, 100 - 100 / 56885.29308438425)
def test_delta(self): p = Peak(100, 0.5, calculate_Delta_based_MZ) assert_equal(p.delta, 100 / 56885.29308438425)
def create_ms(self, iMin_similarity): """ int list 1 and mz list 1 are the ones with a higher precursor mass int/mz list1 will create a master spectrum for every peak in list2 check all allowed mass diffs (depending on charge and number of tags) -> find peak + delta --> for all save a similarity value (calculating ratio of int1/int2) depending which is bigger -> sort for highest similarity score -> check if masterspectrum peak already has an refering peak2 --> if new similarity is higher: replace a peak must have at least int_similarity = 0.5 """ req_min_similarity = iMin_similarity ms = MasterSpectrum() rel_int = calculateRelativeIntensity(self.int_list_1) for mass, rel_int, i in zip(self.peak_list_1, rel_int, self.int_list_1): ms.add( Peak(mass, i, self.fc, meta={ 'delta': 511, 'mass': -1, 'decharged': False, 'similarity': -1, 'originated_mz': mass, 'rel_int': rel_int })) num = round((abs(self.extra_mass) / calculate_Mass_Diff())) # num of tags possible self.params["#numtags"] = "{0}".format(num) deltas = mass_diff_decharging_stuff(n=int(num), z=self.charge) dd = deltas.keys() dd = list(dd) dd.sort() rel_int = calculateRelativeIntensity(self.int_list_2) for mass, rel_int, i in zip(self.peak_list_2, rel_int, self.int_list_2): similarity_most_similar = -1 idx_most_similar = -1 peak_key_most_similar = -1 delta_most_similar = -1 mass_most_similar = -1 for delta in dd: peak = Peak(mass + delta, i, self.fc) if peak.key() in ms.spectrum[0]: idx, bin_to_ack, should_merge_left_peak, should_merge_right_peak = ms.binary( peak, 0, len(ms.spectrum[0][peak.key()]) - 1, 0) if idx != -1: # found rel_int1 = ms.spectrum[0][ peak.key()][idx].meta['rel_int'] ratio = rel_int1 / rel_int if ratio > 1: # i want ratio to be between 0 - 1 ratio = 1 / ratio if ratio > similarity_most_similar: similarity_most_similar = ratio idx_most_similar = idx peak_key_most_similar = peak.key() mass_most_similar = mass delta_most_similar = delta if similarity_most_similar > req_min_similarity: if similarity_most_similar > ms.spectrum[0][ peak_key_most_similar][idx_most_similar].meta[ 'similarity']: ms.spectrum[0][peak_key_most_similar][ idx_most_similar].meta = { 'delta': delta_most_similar, 'mass': mass_most_similar, 'decharged': deltas[delta_most_similar]['decharge']['state'], 'similarity': similarity_most_similar, 'originated_mz': ms.spectrum[0][peak_key_most_similar] [idx_most_similar].mz, 'rel_int': ratio } if deltas[delta_most_similar]['decharge']['state']: ms.add( Peak(calculatePrecursor( ms.spectrum[0][peak_key_most_similar] [idx_most_similar].mz, deltas[delta_most_similar]['decharge']['z']), ms.spectrum[0][peak_key_most_similar] [idx_most_similar].intensity, self.fc, meta=ms.spectrum[0][peak_key_most_similar] [idx_most_similar].meta)) del (ms.spectrum[0][peak_key_most_similar] [idx_most_similar]) if len(ms.spectrum[0][peak_key_most_similar]) == 0: del (ms.spectrum[0][peak_key_most_similar]) return ms
def analyze_mzid_id_vs_score_file(self, path_score, output_path="/home/tobiass/Desktop/out.csv"): """ Prerequirenment: loading mzid(spectrum and peptide info) input: path to score file (created by control.py improve_csv) Description: - finding all important scan ids - loading all scans as spectra from score file - saving delta as meta information for every peak - cheching all identifiacation (--> peptide_ref) - for peptide ref: read series (b/y, index and charge, mz) generate tag amount for every position tag series of b/y with tmt diff for series: check in scans for delta Output: none """ with open(output_path, "wt") as csvfile: writr = csv.writer(csvfile, lineterminator=os.linesep) writr.writerow(("scanid", "rank", "peak", "position", "frag", "expected by mascot", "found", "charge", "PeaksMatchedInSerie", "max_number_of_tmt_tag")) valid_scan_ids = {} delta_func = calculate_Delta_by_ppm(20) for identification_hashobject in self.identifications: valid_scan_ids[identification_hashobject[1].scan_id] = True valid_scan_ids = valid_scan_ids.keys() # quick and dirty - smarter with some kind of unique tree valid_scan_ids = [int(i) for i in valid_scan_ids] valid_spectra_info = self.read_score_file(path_score, valid_scan_ids) self.parse_mz_id_peptide_ref() for identification_hashobject in self.identifications: for i in identification_hashobject: peptide_ref = identification_hashobject[i].peptide_ref scan_id = int(identification_hashobject[i].scan_id) b_tmt, y_tmt = self.peptide_evidence[peptide_ref].get_annotated_positions() max_tmt_tag = calculate_max_tmt(b_tmt) # same num for b and y ms, dPeaks_matched = generateMS_by_score_file(valid_spectra_info[scan_id]) for ion_serie in identification_hashobject[i].ion_series_ary: tmt_masses = calculate_allowed_Mass_Diff(n=max_tmt_tag, z=ion_serie.charge) if 'b' in ion_serie.fragtype: tmt_pos_ary = b_tmt elif 'y' in ion_serie.fragtype: tmt_pos_ary = y_tmt else: raise ValueError("{0}\tis not valid fragtype".format(ion_serie.fragtype)) for pos, mz in zip(ion_serie.ions_index, ion_serie.mz_ary): num_tag_at_pos = tmt_pos_ary[pos] if num_tag_at_pos == 0: expected_mass_delta = 0 else: expected_mass_delta = tmt_masses[num_tag_at_pos][ion_serie.charge] peak = Peak(mz, 1, delta_func) if peak.key() in ms.spectrum[0]: idx, bin_to_ack, should_merge_left_peak, should_merge_right_peak = ms.binary(peak, 0, len(ms.spectrum[0][peak.key()]) - 1, 0) if idx == -1: # just heavy spectra are just all peaks of the heavy labeled partner of a mix (there is no garantee that both # have the same number of peaks # BUT the number of spectra is the same msg = "Peak:\t{0}\n" msg += "frag:\t{4}\n" msg += "position:\t{5}\n" msg += "scanid:\t{1}\n" msg += "expected:\t{2}\n" msg += "found:\t{3}\n" msg += "peak was just part of heavy spectra(but same number before \".\"\n" # print(msg.format(mz, scan_id, expected_mass_delta, -2, # ion_serie.fragtype, pos)) writr.writerow((scan_id, i, mz, pos, ion_serie.fragtype, expected_mass_delta, -2, ion_serie.charge, dPeaks_matched, max_tmt_tag)) # raise ValueError("identified Peak:\t{0}\nscanid:\t{1}\ncouldnt be found in spectra".format(mz, scan_id, expected_mass_delta, -1, # ion_serie.fragtype, pos)) else: found_mass_diff = ms.spectrum[0][peak.key()][idx].meta msg = "Peak:\t{0}\n" msg += "frag:\t{4}\n" msg += "position:\t{5}\n" msg += "scanid:\t{1}\n" msg += "expected:\t{2}\n" msg += "found:\t{3}\n" if found_mass_diff != expected_mass_delta: writr.writerow((scan_id, i, mz, pos, ion_serie.fragtype, expected_mass_delta, found_mass_diff, ion_serie.charge, dPeaks_matched, max_tmt_tag)) # raise ValueError(msg.format(mz, scan_id, expected_mass_delta, found_mass_diff, ion_serie.fragtype, pos)) else: # here is my goal writr.writerow((scan_id, i, mz, pos, ion_serie.fragtype, expected_mass_delta, found_mass_diff, ion_serie.charge, dPeaks_matched, max_tmt_tag)) else: # just heavy spectra are just all peaks of the heavy labeled partner of a mix (there is no garantee that both # have the same number of peaks # BUT the number of spectra is the same msg = "Peak:\t{0}\n" msg += "frag:\t{4}\n" msg += "position:\t{5}\n" msg += "scanid:\t{1}\n" msg += "expected:\t{2}\n" msg += "found:\t{3}\n" msg += "peak was just part of heavy spectra\n" # print(msg.format(mz, scan_id, expected_mass_delta, -1, # ion_serie.fragtype, pos)) writr.writerow((scan_id, i, mz, pos, ion_serie.fragtype, expected_mass_delta, -1, ion_serie.charge, dPeaks_matched, max_tmt_tag))
def test_isInsideMz(self): p1 = Peak(100, 0.5, calculate_Delta_based_MZ) mp = MasterPeak(p1) assert_false(mp.isInsideMz(102)) assert_true(mp.isInsideMz(100))
def load_distiller_mgf2(self): """ creates references based on precursor mass a missing scanid means an ms1 event by default referencing works just within one ms2 block """ fc = calculate_Delta_by_ppm(self.ppm) error = 0 self.ms = MasterSpectrum() with mgf.read(self.path) as spectra: for spectrum in spectra: mass = spectrum['params']['pepmass'][0] precursor_chrg = int(spectrum['params']['charge'][0]) mass = calculatePrecursor(mass, precursor_chrg) scanid = int(parse_scan_id(spectrum['params']['title'])) found = False if len(self.ms.spectrum) == 0: peak = Peak(mass, scanid, fc) self.ms.add(Peak(mass, scanid, fc, meta={'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params']}), charge=precursor_chrg) found = True else: if (precursor_chrg in self.ms.spectrum.keys()): # react to charge !!!!!! if len(self.ms.spectrum[precursor_chrg]) == 0: peak = Peak(mass, scanid, fc) self.ms.add(Peak(mass, scanid, fc, meta={'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params']}), charge=precursor_chrg) found = True else: for extra_mass in gen_allowed_mass_diff_with_sign(n=4, z=1): if found is False: peak = Peak(mass + extra_mass, 0.5, fc) if peak.key() in self.ms.spectrum[precursor_chrg]: print(precursor_chrg) idx, bin_to_ack, a, b = self.ms.binary(peak, 0, len(self.ms.spectrum[precursor_chrg][peak.key()]) - 1, precursor_chrg) if idx != -1: self.references.add(Reference(ppm=self.ppm, id_2=scanid, id_1=self.ms.spectrum[precursor_chrg][peak.key()][idx].intensity, # also scanid peak_list_2=spectrum['m/z array'], peak_list_1=self.ms.spectrum[precursor_chrg][peak.key()][idx].meta['ms'], mass_2=mass, mass_1=self.ms.spectrum[precursor_chrg][peak.key()][idx].mz, charge=spectrum['params']['charge'][0], extra_mass=extra_mass, int_list_2=spectrum['intensity array'], int_list_1=self.ms.spectrum[precursor_chrg][peak.key()][idx].meta['int'], params2=spectrum['params'], params1=self.ms.spectrum[precursor_chrg][peak.key()][idx].meta['params'])) found = True del(self.ms.spectrum[precursor_chrg][peak.key()][idx]) if len(self.ms.spectrum[precursor_chrg][peak.key()]) == 0: del(self.ms.spectrum[precursor_chrg][peak.key()]) if len(self.ms.spectrum[precursor_chrg]) == 0: del(self.ms.spectrum[precursor_chrg]) if found is False: limit_scan_id = scanid - 20 # could start at -19 ms_bac = MasterSpectrum() for chrg in self.ms.spectrum: for key in self.ms.spectrum[chrg].keys(): for mp in self.ms.spectrum[chrg][key]: if mp.intensity >= limit_scan_id: ms_bac.add(mp, charge=chrg) self.ms = ms_bac self.ms.add(Peak(mass, scanid, fc, meta={'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params']}), charge=precursor_chrg) if error > 0: print(" delete valid information {0}".format(error))
def load_msconvert_mgf(self): """ creates references based on precursor mass a missing scanid means an ms1 event by default referencing works just within one ms2 block """ fc = calculate_Delta_by_ppm(self.ppm) scan_id_ary = [] problems = [] error = 0 with mgf.read(self.path) as spectra: for spectrum in spectra: mass = spectrum['params']['pepmass'][0] precursor_chrg = int(spectrum['params']['charge'][0]) mass = calculatePrecursor(mass, precursor_chrg) scanid = int(parse_scan_id(spectrum['params']['title'])) if len(scan_id_ary) == 0: scan_id_ary.append(scanid) else: if scanid != scan_id_ary[-1] + 1: if len(scan_id_ary) % 2 == 1: problems.append(scan_id_ary[0]) error += 1 scan_id_ary = [] scan_id_ary.append(scanid) else: scan_id_ary = [] scan_id_ary.append(scanid) self.ms = MasterSpectrum( ) # new MS if scan_id group (seperated by ms1) is completed else: scan_id_ary.append(scanid) found = False if len(self.ms.spectrum) == 0: peak = Peak(mass, scanid, fc) self.ms.add(Peak(mass, scanid, fc, meta={ 'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params'] }), charge=precursor_chrg) found = True else: if (precursor_chrg in self.ms.spectrum.keys() ): # react to charge !!!!!! if len(self.ms.spectrum[precursor_chrg]) == 0: peak = Peak(mass, scanid, fc) self.ms.add(Peak(mass, scanid, fc, meta={ 'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params'] }), charge=precursor_chrg) found = True else: for extra_mass in gen_allowed_mass_diff_with_sign( n=4, z=1): if found is False: peak = Peak(mass + extra_mass, 0.5, fc) if peak.key( ) in self.ms.spectrum[precursor_chrg]: print(precursor_chrg) idx, bin_to_ack, a, b = self.ms.binary( peak, 0, len(self.ms.spectrum[ precursor_chrg][peak.key()]) - 1, precursor_chrg) if idx != -1: self.references.add( Reference( ppm=self.ppm, id_2=scanid, id_1=self.ms. spectrum[precursor_chrg][ peak.key()][idx]. intensity, # also scanid peak_list_2=spectrum[ 'm/z array'], peak_list_1=self.ms. spectrum[precursor_chrg][ peak.key()] [idx].meta['ms'], mass_2=mass, mass_1=self.ms. spectrum[precursor_chrg][ peak.key()][idx].mz, charge=spectrum['params'] ['charge'][0], extra_mass=extra_mass, int_list_2=spectrum[ 'intensity array'], int_list_1=self.ms. spectrum[precursor_chrg][ peak.key()] [idx].meta['int'], params2=spectrum['params'], params1=self.ms. spectrum[precursor_chrg][ peak.key()] [idx].meta['params'])) found = True del (self.ms. spectrum[precursor_chrg][ peak.key()][idx]) if len(self.ms. spectrum[precursor_chrg][ peak.key()]) == 0: del (self.ms. spectrum[precursor_chrg][ peak.key()]) if len(self.ms.spectrum[ precursor_chrg]) == 0: del (self.ms.spectrum[ precursor_chrg]) if found is False: self.ms.add(Peak(mass, scanid, fc, meta={ 'ms': spectrum['m/z array'], 'int': spectrum['intensity array'], 'params': spectrum['params'] }), charge=precursor_chrg) if error > 0: print(" delete valid information {0}".format(error))