quickclusteringspectra.cpp
来自「MS-Clustering is designed to rapidly clu」· C++ 代码 · 共 2,339 行 · 第 1/4 页
CPP
2,339 行
pkl << charge << endl;
bool use_scaled=false;
double scale_factor=1.0;
double peaks_inten=0;
if (peaks[0].scaled_intensity>0)
{
int i;
for (i=0; i<peaks.size(); i++)
peaks_inten += peaks[i].scaled_intensity;
use_scaled = true;
}
else
{
int i;
for (i=0; i<peaks.size(); i++)
peaks_inten += peaks[i].intensity;
}
// avoid very large peak intensity numbers
// if (total_ion_current > 1000000000)
// total_ion_current = 1000000000;
if (peaks_inten>0 && total_ion_current>0)
{
scale_factor = total_ion_current / peaks_inten;
}
// filter peaks if there are too many
if (peaks.size() <= maximum_good_peaks_to_output)
{
int i;
for (i=0; i<peaks.size(); i++)
{
pkl << fixed << setprecision(2) << peaks[i].mass << "\t" << setprecision(1) <<
scale_factor * (peaks[i].scaled_intensity>0 ? peaks[i].scaled_intensity : peaks[i].intensity);
// if (write_peak_count)
// pkl << " " << peaks[i].num_occurences << "/" << peaks[i].max_num_occurences;
pkl << endl;
}
}
else
{
vector<bool> good_peak_indicators;
mark_top_peaks_with_sliding_window(&peaks[0], peaks.size(),
config->get_local_window_size(),
config->get_max_number_peaks_per_local_window(),
good_peak_indicators);
int i;
for (i=0; i<peaks.size(); i++)
{
if (! good_peak_indicators[i])
continue;
pkl << fixed << setprecision(2) << peaks[i].mass << "\t" << setprecision(1) <<
scale_factor * (peaks[i].scaled_intensity>0 ? peaks[i].scaled_intensity : peaks[i].intensity);
// if (write_peak_count)
// pkl << " " << peaks[i].num_occurences << "/" << peaks[i].max_num_occurences;
pkl << endl;
}
}
pkl.close();
// cout << "Wrote: " << file_name << endl;
}
void ClusterSpectrum::print_explained_intensity_stats(Peptide& pep) const
{
int i;
float total_inten=0;
vector<mass_t> masses;
vector<intensity_t> intensities;
masses.resize(peaks.size());
intensities.resize(peaks.size());
for (i=0; i<peaks.size(); i++)
{
masses[i]=peaks[i].mass;
intensities[i]=peaks[i].intensity;
}
mass_t pm_with_19 = pep.get_mass()+MASS_OHHH;
AnnotatedSpectrum as;
as.read_from_peak_arrays(config,pep,pm_with_19,charge,peaks.size(),
&masses[0],&intensities[0]);
as.init_spectrum();
as.annotate_spectrum(pm_with_19);
as.print_expected_by();
int len = pep.get_num_aas();
// count b,y
const int b_frag_idx = config->get_frag_idx_from_label("b");
const int y_frag_idx = config->get_frag_idx_from_label("y");
int num_b = as.get_num_observed_frags(b_frag_idx);
int num_y = as.get_num_observed_frags(y_frag_idx);
float exp_int = as.get_explianed_intensity();
cout << "exp: " << exp_int << " b:" << num_b << " y:" << num_y <<endl;
}
void BasicSpectrum::print_peaks() const
{
int i;
for (i=0; i<this->num_peaks; i++)
cout << left << setw(5) << i << this->peaks[i].mass << " " << peaks[i].intensity << endl;
}
// Assumes PTMs are already set
void extractAnnoatedScansFromFiles(Config *config, char *file_list, char *anns,
char *output_file, bool extract_no_process)
{
vector< vector<int> > annotation_idxs;
vector<mzXML_annotation> annotations;
read_mzXML_annotations(file_list,anns,annotation_idxs,annotations,35000);
cout << "Read annotations: " << annotations.size() << endl;
FileManager fm;
fm.init_from_list_file_and_add_annotations(config,file_list,
annotation_idxs, annotations,true);
FileSet fs;
fs.select_all_files(fm,true);
const vector<SingleSpectrumFile *>& all_ssf = fs.get_ssf_pointers();
ofstream mgf_stream(output_file,ios::out);
BasicSpecReader bsr;
QCPeak peaks[5000];
int i;
for (i=0; i<all_ssf.size(); i++)
{
BasicSpectrum bs;
MZXML_single *ssf = (MZXML_single *)all_ssf[i];
bs.peaks = peaks;
bs.ssf = ssf;
bs.ssf->charge = ssf->charge;
bs.num_peaks = bsr.read_basic_spec(config,fm,ssf,peaks,extract_no_process);
if (ssf->scan_number<0)
{
cout << "Error: no scan number read from MGF!!!" << endl;
exit(1);
}
bs.output_to_mgf(mgf_stream,config);
}
mgf_stream.close();
}
void read_mzXML_annotations_to_map(char *ann_file,
map<mzXML_annotation,int>& ann_map)
{
int i;
char buff[256];
FILE *ann_stream = fopen(ann_file,"r");
if (! ann_stream)
{
cout << "Error: couldn't open annotation files for run!: " << ann_file << endl;
exit(1);
}
int anns=0;
i=0;
while (fgets(buff,256,ann_stream))
{
int file_idx=-1, mzXML_idx=-1;
char only_peptide[128];
int scan=-1,charge=0;
if (sscanf(buff,"%d %d %d %d %s",&file_idx,&mzXML_idx,&scan,&charge,only_peptide)<5)
continue;
mzXML_annotation ann;
ann.charge =charge;
ann.scan = scan;
ann.mzXML_file_idx = file_idx;
ann.pep = only_peptide;
ann_map.insert(make_pair(ann,1));
anns++;
}
cout << "Read " << anns << " annotations..." << endl;
}
// reads an annotation file. mzXML
// saves the annotation for each file number and scan number
// assume max scan number is 30000
// file_idx mzXML_file_idx scan peptide
// 169 01 8854 2 VAQGVSGAVQDK
void read_mzXML_annotations(char *mzXML_list,
char *ann_file,
vector< vector<int> >& annotation_idxs,
vector<mzXML_annotation>& annotations,
int max_ann_size)
{
int i;
char buff[256];
FILE *mzxml_stream = fopen(mzXML_list,"r");
if (! mzxml_stream)
{
cout << "Error: couldn't open annotation file for mzXML run!: " << mzXML_list << endl;
exit(1);
}
int count=0;
while (fgets(buff,256,mzxml_stream))
{
count++;
}
fclose(mzxml_stream);
annotation_idxs.resize(count+1);
for (i=0; i<=count; i++)
annotation_idxs[i].resize(max_ann_size,-1);
FILE *ann_stream = fopen(ann_file,"r");
if (! ann_stream)
{
cout << "Error: couldn't open annotation files for run!: " << ann_file << endl;
exit(1);
}
/* b-total-try-2nd-digest-b-400ug-2D34-121505-LTQ2-19.mzXML'...
20989 spectra...
255 Parse spectra from 'C:/Work/Data/Briggs\H293b-total-try-2nd-digest-b-400ug-2D34-121505-LTQ2\H293
b-total-try-2nd-digest-b-400ug-2D34-121505-LTQ2-20.mzXML'...
20712 spectra...
256 Parse spectra from 'C:/Work/Data/Briggs\H293b-total-try-2nd-digest-b-400ug-2D34-121505-LTQ2\H293
b-total-try-2nd-digest-b-400ug-2D34-121505-LTQ2-21.mzXML'...
20603 spectra...*/
i=0;
while (fgets(buff,256,ann_stream))
{
int file_idx=-1, mzXML_idx=-1;
char only_peptide[128];
int scan=-1,charge=0;
if (sscanf(buff,"%d %d %d %d %s",&file_idx,&mzXML_idx,&scan,&charge,only_peptide)<5)
continue;
mzXML_annotation ann;
ann.charge =charge;
ann.mzXML_file_idx = file_idx;
ann.pep = only_peptide;
annotation_idxs[file_idx][scan]=annotations.size();
annotations.push_back(ann);
// cout << file_idx << " : >> " << scan << " " << only_peptide << " " << charge << endl;
// if (++i>=200)
// break;
}
}
void FileManager::init_from_dat_list_extract_only_annotated(Config *config,
char* dat_list_file, char *ann_file)
{
int i;
// read annotations
map<mzXML_annotation,int> ann_map;
read_mzXML_annotations_to_map(ann_file,ann_map);
vector<string> list;
read_paths_into_list(dat_list_file,list);
dat_files.clear();
for (i=0; i<list.size(); i++)
{
if (list[i][0] == '#')
continue;
DAT_file dat;
dat.dat_name =list[i];
dat.initial_read(config,dat_files.size());
cout << dat.dat_name << " .. ";
// change the single spectrum pointers in the mgf file record
// to include only those that have a mass that is in the permitted range
vector<DAT_single> good_singles;
int j;
for (j=0; j<dat.single_spectra.size(); j++)
{
int mzxml_file_idx = dat.single_spectra[j].mzxml_file_idx;
int scan_number = dat.single_spectra[j].scan_number;
map<mzXML_annotation,int>::const_iterator it;
mzXML_annotation ann_pos;
ann_pos.mzXML_file_idx = mzxml_file_idx;
ann_pos.scan = scan_number;
it = ann_map.find(ann_pos);
if (it == ann_map.end())
continue;
Peptide pep;
int charge = it->first.charge;
const string& pep_str = it->first.pep;
pep.parse_from_string(config,pep_str);
pep.calc_mass(config);
mass_t m_over_z = (pep.get_mass()+19.0183 + (mass_t)charge)/charge;
if (fabs(m_over_z - dat.single_spectra[j].m_over_z)>7.0)
{
cout << "Error: mismatch between ann " << pep_str << " " << m_over_z << endl;
cout << " and dat " << mzxml_file_idx << ", " << scan_number << " " << dat.single_spectra[j].m_over_z << endl;
cout << "Mass Cys: " << config->get_aa2mass()[Cys] << endl;
continue;
}
dat.single_spectra[j].peptide.parse_from_string(config,
it->first.pep);
good_singles.push_back(dat.single_spectra[j]);
}
dat.single_spectra = good_singles;
dat_files.push_back(dat);
cout << good_singles.size() << " ..." << endl;
}
}
void extract_annotate_scans_from_dat(Config *config, char *dat_list, char *anns_file,
char *out_name)
{
FileManager fm;
fm.init_from_dat_list_extract_only_annotated(config,dat_list,anns_file);
FileSet fs;
fs.select_all_files(fm,true);
const vector<SingleSpectrumFile *>& all_ssf = fs.get_ssf_pointers();
cout << "Processing " << all_ssf.size() << " spectra..." << endl;
vector<FILE *> len_streams,size_streams;
vector<int> len_counts, size_counts;
const int max_len = 60;
const int max_size_idx = 65;
len_streams.resize(max_len+1,NULL);
size_streams.resize(max_size_idx+1,NULL);
len_counts.resize(max_len+1,0);
size_counts.resize(max_size_idx+1,0);
BasicSpecReader bsr;
QCPeak peaks[5000];
int i;
for (i=0; i<all_ssf.size(); i++)
{
BasicSpectrum bs;
DAT_single *ssf = (DAT_single *)all_ssf[i];
bs.peaks = peaks;
bs.ssf = ssf;
bs.ssf->charge = ssf->charge;
bs.num_peaks = bsr.read_basic_spec(config,fm,ssf,peaks,false,true);
const int len_idx = bs.ssf->peptide.get_num_aas();
bs.ssf->peptide.calc_mass(config);
const int size_idx = (int)((bs.ssf->peptide.get_mass()+MASS_OHHH)/100);
if (len_idx>max_len || size_idx>max_size_idx)
continue;
if (ssf->scan_number<0)
{
cout << "Error: no scan number read from MGF!!!" << endl;
exit(1);
}
char title[32];
sprintf(title,"%d_%d",ssf->mzxml_file_idx,ssf->scan_number);
ssf->single_name = string(title);
ofstream len_stream,size_stream;
if (! len_streams[len_idx])
{
char len_name[256];
sprintf(len_name,"%s_%d.mgf",out_name,len_idx);
len_streams[len_idx] = fopen(len_name,"w");
cout << "open: " << len_name << endl;
}
if (! size_streams[size_idx])
{
char size_name[256];
sprintf(size_name,"%s_%d.mgf",out_name,size_idx*100);
size_streams[size_idx] = fopen(size_name,"w");
cout << "open: " << size_name << endl;
}
bs.output_to_mgf(len_streams[len_idx],config);
bs.output_to_mgf(size_streams[size_idx],config);
len_counts[len_idx]++;
size_counts[size_idx]++;
}
for (i=0; i<len_streams.size(); i++)
if (len_streams[i])
fclose(len_streams[i]);
for (i=0; i<size_streams.size(); i++)
if (size_streams[i])
fclose(size_streams[i]);
char len_sum_name[256],size_sum_name[256];
sprintf(len_sum_name,"%s_len_sum.txt",out_name);
sprintf(size_sum_name,"%s_size_sum.txt",out_name);
ofstream len_sum(len_sum_name,ios::out);
for (i=0; i<=max_len; i++)
if (len_counts[i]>0)
len_sum << i << "\t" << len_counts[i] << endl;
len_sum.close();
ofstream size_sum(size_sum_name,ios::out);
for (i=0; i<=max_size_idx; i++)
if (size_counts[i]>0)
size_sum << i*100 << "\t" << size_counts[i] << endl;
size_sum.close();
}
void convert_dat_to_mgf(Config *config,
char *dat_list,
char *out_name,
char *out_dir,
char *anns_file)
{
QCOutputter qco_all,qco_labeled;
qco_all.init(string(out_name) + "_all",out_dir);
qco_labeled.init(string(out_name) + "_labeled",out_dir);
map<mzXML_annotation,int> ann_map;
bool use_map = false;
if (anns_file)
{
read_mzXML_annotations_to_map(anns_file,ann_map);
if (ann_map.size()>1)
use_map=true;
}
FileManager fm;
FileSet fs;
fm.init_from_list_file(config,dat_list);
fs.select_all_files(fm);
const vector<SingleSpectrumFile *>& all_ssf = fs.get_ssf_pointers();
BasicSpecReader bsr;
QCPeak peaks[5000];
cout << "Processing " << all_ssf.size() << " spectra..." << endl;
int num_wrote = 0;
int num_annotated = 0;
int bad_anns= 0;
int i;
for (i=0; i<all_ssf.size(); i++)
{
DAT_single *ssf = (DAT_single *)all_ssf[i];
const int mzxml_file_idx = ssf->mzxml_file_idx;
const int scan_number = ssf->scan_number;
map<mzXML_annotation,int>::const_iterator it;
mzXML_annotation ann_pos;
ann_pos.mzXML_file_idx = mzxml_file_idx;
ann_pos.scan = scan_number;
it = ann_map.find(ann_pos);
bool has_ann = false;
if (it != ann_map.end())
{
ssf->peptide.parse_from_string(config,it->first.pep);
ssf->peptide.calc_mass(config);
const int charge = it->first.charge;
mass_t exp_m_over_z = (ssf->peptide.get_mass() + 18.0 + charge)/charge;
if (fabs(ssf->m_over_z-exp_m_over_z)>6.0)
{
bad_anns++;
has_ann=false;
ssf->peptide.clear();
continue;
}
{
num_annotated++;
has_ann=true;
}
}
BasicSpectrum bs;
bs.peaks = peaks;
bs.ssf = ssf;
bs.ssf->charge = ssf->charge;
bs.num_peaks = bsr.read_basic_spec(config,fm,ssf,peaks,false,true);
if (bs.num_peaks<10)
continue;
char title[32];
sprintf(title,"%d_%d",ssf->mzxml_file_idx,ssf->scan_number);
ssf->single_name = string(title);
qco_all.output_basic_spectrum_to_mgf(bs,config);
if (it != ann_map.end())
qco_labeled.output_basic_spectrum_to_mgf(bs,config);
num_wrote++;
}
cout << "Wrote " << num_wrote << " spectra to MGF" << endl;
cout << num_annotated << " were annotated. " << endl;
cout << "Found " << bad_anns << " bad anns..." << endl;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?