pmcsqs.cpp
来自「MS-Clustering is designed to rapidly clu」· C++ 代码 · 共 1,870 行 · 第 1/4 页
CPP
1,870 行
}
// find indicators for min tolerance and max pairs
float tol_pairs = POS_INF;
float tol_strong_pairs = POS_INF;
float tol_c2_pairs = POS_INF;
float tol_c2_strong_pairs = POS_INF;
int idx_pairs=0;
int idx_strong_pairs=0;
int idx_c2_pairs=0;
int idx_c2_strong_pairs=0;
for (i=0; i<curr_spec_rank_pmc_tables[charge].size(); i++)
{
const PMCRankStats& curr_stats = curr_spec_rank_pmc_tables[charge][i];
if (curr_stats.num_frag_pairs == maximal.num_frag_pairs &&
curr_stats.mean_offset_pairs < tol_pairs)
{
idx_pairs=i;
tol_pairs=curr_stats.mean_offset_pairs;
}
if (curr_stats.num_strong_frag_pairs == maximal.num_strong_frag_pairs &&
curr_stats.mean_offset_c2_strong_pairs < tol_strong_pairs)
{
idx_strong_pairs=i;
tol_strong_pairs=curr_stats.mean_offset_c2_strong_pairs;
}
if (curr_stats.num_c2_frag_pairs == maximal.num_c2_frag_pairs &&
curr_stats.mean_offset_c2_pairs < tol_c2_pairs)
{
idx_c2_pairs=i;
tol_c2_pairs=curr_stats.mean_offset_c2_pairs;
}
if (curr_stats.num_strong_c2_frag_pairs == maximal.num_strong_c2_frag_pairs &&
curr_stats.mean_offset_c2_strong_pairs < tol_c2_strong_pairs)
{
idx_c2_strong_pairs=i;
tol_c2_strong_pairs=curr_stats.mean_offset_c2_strong_pairs;
}
}
curr_spec_rank_pmc_tables[charge][idx_pairs].ind_pairs_with_min_tol=true;
curr_spec_rank_pmc_tables[charge][idx_strong_pairs].ind_strong_pairs_with_min_tol=true;
curr_spec_rank_pmc_tables[charge][idx_c2_pairs].ind_c2_pairs_with_min_tol=true;
curr_spec_rank_pmc_tables[charge][idx_c2_strong_pairs].ind_c2_strong_pairs_with_min_tol=true;
static vector<float> log_distances;
if (log_distances.size()<curr_spec_rank_pmc_tables[charge].size())
{
log_distances.resize(curr_spec_rank_pmc_tables[charge].size(),0);
int i;
for (i=1; i<log_distances.size(); i++)
log_distances[i]=log(1.0+(float)i);
}
for (i=0; i<curr_spec_rank_pmc_tables[charge].size(); i++)
{
PMCRankStats& curr_stats = curr_spec_rank_pmc_tables[charge][i];
curr_stats.log_dis_from_pairs_min_tol = log_distances[abs(i-idx_pairs)];
curr_stats.log_dis_from_strong_pairs_min_tol = log_distances[abs(i-idx_strong_pairs)];
curr_stats.log_dis_from_c2_pairs_min_tol = log_distances[abs(i-idx_c2_pairs)];
curr_stats.log_dis_from_c2_strong_pairs_min_tol = log_distances[abs(i-idx_c2_strong_pairs)];
}
}
}
/*****************************************************************************************
******************************************************************************************/
void PMCSQS_Scorer::get_sqs_features_from_pmc_tables(const BasicSpectrum& bs,
vector< vector<float> >& sqs_features) const
{
const mass_t org_m_over_z = bs.ssf->m_over_z;
float max_num_strong_pairs=0;
int best_table_idx=0;
mass_t mz_diff = 99999;
if (sqs_features.size() != max_model_charge +1)
sqs_features.resize(max_model_charge+1);
int charge;
for (charge=1; charge<=max_model_charge; charge++)
{
// find entry which has the maximal number of strong pairs, while maining the minimial
// m/z distance shift from the original
int i;
for (i=1; i<this->curr_spec_rank_pmc_tables[charge].size(); i++)
{
const float curr_num_strong = curr_spec_rank_pmc_tables[charge][i].num_strong_frag_pairs;
if (curr_num_strong>=max_num_strong_pairs)
{
const mass_t distance = fabs(curr_spec_rank_pmc_tables[charge][i].m_over_z - org_m_over_z);
if (curr_num_strong == max_num_strong_pairs && distance>= mz_diff)
continue;
max_num_strong_pairs = curr_num_strong;
mz_diff = distance;
best_table_idx = i;
}
}
const PMCRankStats& best_stats = curr_spec_rank_pmc_tables[charge][best_table_idx];
sqs_features[charge].clear();
sqs_features[charge].push_back(best_stats.num_frag_pairs);
sqs_features[charge].push_back(best_stats.num_strong_frag_pairs);
sqs_features[charge].push_back(best_stats.num_c2_frag_pairs);
sqs_features[charge].push_back(best_stats.num_strong_c2_frag_pairs);
}
}
void PMCSQS_Scorer::compute_sqs_cum_stats_for_ided(Config *config, char *list)
{
const float max_prob=0.5;
const int max_bin_idx = int(max_prob*100)+1;
vector< vector< vector<int> > > bin_counts; //charge / size_idx / bin
vector< vector< int > > totals;
bin_counts.resize(4);
totals.resize(4);
int i;
for (i=0; i<4; i++)
{
int n = this->sqs_mass_thresholds.size() + 1;
totals[i].resize(n,0);
bin_counts[i].resize(n);
int j;
for (j=0; j<n; j++)
bin_counts[i][j].resize(max_bin_idx+1,0);
}
// prefrom sqs on all
FileManager fm;
FileSet fs;
fm.init_from_list_file(config,list);
fs.select_all_files(fm);
const int max_to_read_per_file = 100000;
const vector<SingleSpectrumFile *>& all_ssf = fs.get_ssf_pointers();
BasicSpecReader bsr;
static QCPeak peaks[5000];
int low_count = 0;
for (i=0; i<all_ssf.size(); i++)
{
SingleSpectrumFile* ssf = all_ssf[i];
BasicSpectrum bs;
bs.num_peaks = bsr.read_basic_spec(config,fm,ssf,peaks);
bs.peaks = peaks;
bs.ssf = ssf;
const int org_charge=ssf->peptide.calc_charge(ssf->m_over_z);
const int size_idx = get_sqs_size_idx(ssf->m_over_z);
int charge=0;
float prob=get_sqs_for_spectrum(config,bs,&charge);
int bin_idx=int(100*prob);
if (bin_idx>max_bin_idx)
bin_idx = max_bin_idx;
totals[org_charge][size_idx]++;
int j;
for (j=0; j<=bin_idx; j++)
bin_counts[org_charge][size_idx][j]++;
if (prob<0.1)
{
cout << ++low_count << "\t" << ssf->single_name << "\t" << org_charge << " : " <<
charge << " --> " << prob << endl;
}
}
int c;
for (c=0; c<4; c++)
{
int specs=0;
int i;
for (i=0; i<totals[c].size(); i++)
specs+=totals[c][i];
if (specs<100)
continue;
cout << endl << "CHARGE " << c << endl;
for (i=0; i<totals[c].size(); i++)
{
if (totals[c][i]<50)
continue;
cout << "SIZE " << i << " ( charge " << c << " )" << endl;
int j;
cout << setprecision(4);
for (j=0; j<=max_bin_idx; j++)
{
cout << j*0.01 << "\t" << bin_counts[c][i][j] << "\t" <<
bin_counts[c][i][j]/(float)totals[c][i] << endl;
}
cout << endl;
}
}
}
void PMCSQS_Scorer::create_filtered_peak_list_for_sqs(
QCPeak *org_peaks, int num_org_peaks,
QCPeak *new_peaks, int& num_new_peaks) const
{
static vector<MassInten> peak_list;
static int peak_list_size =0;
int i;
if (num_org_peaks>peak_list_size)
{
peak_list_size = (int)(num_org_peaks * 1.5);
if (peak_list_size<2000)
peak_list_size = 2000;
peak_list.resize(peak_list_size);
}
// copy org_peaks to the temporary peak_list
int f_idx=0;
for (i=0; i<num_org_peaks; i++)
{
peak_list[i].mass=org_peaks[i].mass;
peak_list[i].intensity=org_peaks[i].intensity;
}
const mass_t tolerance = config->get_tolerance();
const mass_t join_tolerance = (tolerance < 0.05 ? tolerance : 0.5 * tolerance);
int p_idx=0;
i=1;
while (i<num_org_peaks)
{
if (peak_list[i].mass - peak_list[p_idx].mass<=join_tolerance)
{
intensity_t inten_sum = peak_list[i].intensity + peak_list[p_idx].intensity;
mass_t new_mass = (peak_list[i].intensity * peak_list[i].mass +
peak_list[p_idx].intensity * peak_list[p_idx].mass ) / inten_sum;
peak_list[p_idx].mass = new_mass;
peak_list[p_idx].intensity = inten_sum;
}
else
{
peak_list[++p_idx]=peak_list[i];
}
i++;
}
int num_peaks = p_idx+1;
// filter low intensity noise
const mass_t half_window_size = 0.5 * config->get_local_window_size();
const int num_peaks_in_window = config->get_max_number_peaks_per_local_window();
const int max_peak_idx = num_peaks -1;
int min_idx=1;
int max_idx=1;
p_idx =1;
new_peaks[0].mass = peak_list[0].mass;
new_peaks[0].intensity = peak_list[0].intensity;
f_idx=1;
// check the rest of the peaks
for (i=1; i<max_peak_idx; i++)
{
const mass_t& peak_mass=peak_list[i].mass;
mass_t min_mass = peak_list[min_idx].mass;
mass_t max_mass = peak_list[max_idx].mass;
// advance min/max pointers
while (peak_mass-min_mass > half_window_size)
min_mass=peak_list[++min_idx].mass;
while (max_idx < max_peak_idx && max_mass - peak_mass <= half_window_size)
max_mass=peak_list[++max_idx].mass;
if (max_mass - peak_mass > half_window_size)
max_idx--;
// if there are less than the maximum number of peaks in the window, keep it.
if (max_idx-min_idx < num_peaks_in_window)
{
new_peaks[f_idx].mass = peak_list[i].mass;
new_peaks[f_idx].intensity = peak_list[i].intensity;
f_idx++;
continue;
}
// check if this is one of the top peaks in the window
int higher_count=0;
for (int j=min_idx; j<=max_idx; j++)
if (peak_list[j].intensity > peak_list[i].intensity)
higher_count++;
if (higher_count < num_peaks_in_window)
{
new_peaks[f_idx].mass = peak_list[i].mass;
new_peaks[f_idx].intensity = peak_list[i].intensity;
f_idx++;
}
}
new_peaks[f_idx].mass = peak_list[i].mass;
new_peaks[f_idx].intensity = peak_list[i].intensity;
f_idx++;
num_new_peaks = f_idx;
// normalize intensities
if (1)
{
intensity_t total_inten=0;
for (i=1; i<num_new_peaks; i++)
total_inten+=new_peaks[i].intensity;
const mass_t one_over_total_inten = (1000.0 / total_inten);
for (i=1; i<num_new_peaks; i++)
new_peaks[i].intensity *= one_over_total_inten;
}
}
/*****************************************************************
Creates for each input file an mgf file that holds the spectra
that passed quality filtering does not correct PM and charge in the
mgf files.
******************************************************************/
void PMCSQS_Scorer::output_filtered_spectra_to_mgfs(
Config *config,
const vector<string>& files,
char *out_dir,
float filter_prob,
int& total_num_written,
int& total_num_read)
{
total_num_read = 0;
total_num_read = 0;
int f;
for (f=0; f<files.size(); f++)
{
const char *spectra_file = files[f].c_str();
FileManager fm;
FileSet fs;
BasicSpecReader bsr;
string fname, mgf_name, map_name;
get_file_name_without_extension(files[f],fname);
mgf_name = string(out_dir) + "/" + fname + "_fil.mgf";
map_name = string(out_dir) + "/" + fname + "_map.txt";
///////////////////////////////////////////////
// Quick read, get all pointers to begining of spectra
if (get_file_extension_type(files[f]) != MZXML)
{
fm.init_from_file(config,spectra_file);
}
else
fm.init_and_read_single_mzXML(config,spectra_file,f);
fs.select_all_files(fm);
const vector<SingleSpectrumFile *>& all_ssf = fs.get_ssf_pointers();
int sc;
int num_spec_written=0;
bool first=true;
ofstream out_stream, map_stream;
for (sc=0; sc<all_ssf.size(); sc++)
{
static vector<QCPeak> peaks;
SingleSpectrumFile *ssf = all_ssf[sc];
if (peaks.size()<ssf->num_peaks)
{
int new_size = ssf->num_peaks*2;
if (new_size<2500)
new_size=2500;
peaks.resize(new_size);
}
// read without processing peaks
const int num_peaks = bsr.read_basic_spec(config,fm,ssf,&peaks[0],false,true);
ssf->file_idx = f;
BasicSpectrum bs;
bs.peaks = &peaks[0];
bs.num_peaks = num_peaks;
bs.ssf = all_ssf[sc];
int max_charge;
float prob = get_sqs_for_spectrum(config,bs,&max_charge);
if (prob<filter_prob)
{
continue;
}
if (first)
{
out_stream.open(mgf_name.c_str(),ios::out);
map_stream.open(map_name.c_str(),ios::out);
cout << "Filtering spectra to minumum quality score: " << filter_prob << endl;
cout << "Writing spectra info to:" << endl;
cout << mgf_name << endl << map_name << endl;
if (! out_stream.is_open() || ! out_stream.good())
{
cout << "Error: couldn\'t open for out mgf stream for writing: " <<
endl << mgf_name << endl;
exit(1);
}
first = false;
}
char single_name[64];
sprintf(single_name,"%d:%d",f,bs.ssf->get_scan());
bs.ssf->single_name = single_name;
bs.output_to_mgf(out_stream,config);
if (prob>1.0)
prob=1.0;
map_stream << num_spec_written++ << "\t" << all_ssf[sc]->get_scan() << "\t" << fixed << prob << endl;
}
out_stream.close();
map_stream.close();
total_num_read+= all_ssf.size();
total_num_written += num_spec_written;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?