⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 annotatedspecturm.cpp

📁 MS-Clustering is designed to rapidly cluster large MS/MS datasets. The program merges similar spectr
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if (peak_annotations[i].size()>0)
			n++;

	return n;
}


float AnnotatedSpectrum::get_explianed_intensity() const
{
	if (peak_annotations.size()==0 || (peaks.size() != peak_annotations.size()) )
	{
		cout << "Error: mismatch in peaks annotations!" << endl;
		exit(1);
	}

	float tot_inten=0;
	float ann_inten=0;
	int i;
	for (i=0; i<peaks.size(); i++)
	{
		tot_inten += peaks[i].intensity;
		if (peak_annotations[i].size()>0)
			ann_inten += peaks[i].intensity;
	}
	
	return (ann_inten/tot_inten);
}

/**************************************************************************
Checks if the spectrum has a suffcient stretch of b or y ladders
***************************************************************************/
bool AnnotatedSpectrum::has_stretch_of_b_or_y(int min_stretch_length, int max_skip)
{
	vector<mass_t> b_ladder,y_ladder;
	int b_frag_idx = config->get_frag_idx_from_label("b");
	int y_frag_idx = config->get_frag_idx_from_label("y");
	const vector<mass_t>& aa2mass = config->get_aa2mass();
	mass_t tolerance = config->get_tolerance();

	if (breakages.size() ==0)
	{
		cout << "Error: need to first annotate spectrum!" << endl;
		exit(1);
	}

	b_ladder.resize(breakages.size(),0);
	b_ladder[0]=1;
	b_ladder[b_ladder.size()-1]=get_true_mass()+1;
	y_ladder.resize(breakages.size(),0);
	y_ladder[0]=get_true_mass_with_19();
	y_ladder[y_ladder.size()-1]=19;

	int i;
	vector<mass_t> exp_b_masses,exp_y_masses;
	peptide.calc_expected_breakage_masses(config,exp_b_masses);
	exp_y_masses = exp_b_masses;

	for (i=0; i<exp_y_masses.size(); i++)
		exp_y_masses[i] = get_true_mass_with_19() - exp_y_masses[i];
	for (i=0; i<exp_b_masses.size(); i++)
		exp_b_masses[i]+=0.95;


	for (i=0; i<breakages.size(); i++)
	{
		int b_pos= breakages[i].get_position_of_frag_idx(b_frag_idx);
		if (b_pos>=0)
			b_ladder[i]=breakages[i].fragments[b_pos].mass;

		int y_pos = breakages[i].get_position_of_frag_idx(y_frag_idx);
		if (y_pos>=0)
			y_ladder[i]=breakages[i].fragments[y_pos].mass;
	}

	
	const vector<int>& amino_acids = peptide.get_amino_acids();

//	for (i=0; i<b_ladder.size(); i++)
//		cout << y_ladder[i] << " " << exp_y_masses[i] << endl;


	// check for stretch
	for (i=0; i<= b_ladder.size()-min_stretch_length; i++)
	{
		int gaps=0;
		int j;

		mass_t last_b = exp_b_masses[i];
		mass_t exp_mass =0;
		for (j=0; j<min_stretch_length; j++)
		{
			if (j>0)
				exp_mass += aa2mass[amino_acids[i+j-1]];

			if (b_ladder[i+j]>0 && (j==0 || 
									fabs(b_ladder[i+j]-last_b - exp_mass)<=0.5 * tolerance ) )
			{
				gaps=0;
				exp_mass =0;
				last_b = exp_b_masses[i+j];
			}
			else
				gaps++;

			if (gaps>max_skip)
				break;
		}

		if (j==min_stretch_length)
			return true;
	} 

	// check for stretch
	int num_aa = amino_acids.size();
	for (i=0; i<= y_ladder.size()-min_stretch_length; i++)
	{
		int gaps=0;
		int j;
		mass_t last_y = exp_y_masses[i];
		mass_t exp_mass =0;
		for (j=0; j<min_stretch_length; j++)
		{
			if (j>0)
				exp_mass += aa2mass[amino_acids[i+j-1]];

			if (y_ladder[i+j]>0 && (j==0 || 
									fabs(last_y - y_ladder[i+j]- exp_mass)<=0.5*tolerance ) )
			{
				gaps=0;
				exp_mass =0;
				last_y = exp_y_masses[i+j];
			}
			else
				gaps++;

			if (gaps>max_skip)
				break;
		}
		if (j==min_stretch_length)
			return true;
	}

//	exit(0);
	return false;
}


/********************************************************************************
Extracts tables of peak intensities and peak masses.
#rows = all fragments
# column = # num breakages (peptide length + 1)
*********************************************************************************/
void AnnotatedSpectrum::extract_annotated_intens_and_masses(
											 vector< vector<intensity_t> >& intens,
											 vector< vector<mass_t> >&      masses) const
{
	const int num_frags = config->get_all_fragments().size();
	const int num_breakages = breakages.size();
	int i;
	intens.resize(num_frags);
	masses.resize(num_frags);
	for (i=0; i<num_frags; i++)
	{
		intens[i].resize(num_breakages,0);
		masses[i].resize(num_breakages,0);
	}

	for (i=0; i<peak_annotations.size(); i++)
	{
		int j;
		for (j=0; j<peak_annotations[i].size(); j++)
		{
			const PeakAnnotation& ann = peak_annotations[i][j];
			if (ann.breakage_idx>0 && ann.frag_type_idx<num_frags)
			{
				intens[ann.frag_type_idx][ann.breakage_idx]=peaks[i].intensity;
				masses[ann.frag_type_idx][ann.breakage_idx]=peaks[i].mass;
			}
		}
	}
}


// report file names of files that have a minimal b/y stretch
void filter_file_list(const FileManager& fm, Config *config, ostream& os)
{
	FileSet fs;
	fs.select_all_files(fm);
	int good=0;
	while(1)
	{
		AnnotatedSpectrum as;

		if (! fs.get_next_spectrum(fm,config,&as))
			break;

		as.annotate_spectrum(as.get_true_mass_with_19());
	//	as.print_expected_by();
		if (as.has_stretch_of_b_or_y(8,1))
		{
			good++;
			cout << good << " ";
			os << as.get_file_name() << endl;
			
		}
		else
			cout << "XXXX"<<endl;
	}

//	cout << good << " / " << fs.get_total_spectra() << " = " << 
//			good / (double)fs.get_total_spectra() << endl;
}




void AnnotatedSpectrum::print_annotated(ostream& os) const
{
		int i;
	if (file_name.length() > 0)
		os << "#FILE " << file_name << endl;
	if (peptide.get_num_aas()>0)
		os << "#SEQ " << peptide.as_string(config) << endl;

	os << fixed << setprecision(2) << org_pm_with_19 << " " << charge << endl;

	cout << "Peak  Mass        Inten   Rank   Annotation" << endl;
	int strong_idx=0;
	for (i=0; i<peaks.size(); i++)
	{
		os << left << setw(5) << i << setw(8) << setprecision(NUM_SIG_DIGITS) 
			<< fixed << right  << peaks[i].mass;
		os << setw(12) << right  << setprecision(2) << peaks[i].intensity << " " << setw(4) 
		//	<< setprecision(1) << peaks[i].iso_level <<  setw(4) 
		//	<< setprecision(1) << peaks[i].log_local_rank 
			<< setw(4) << right << peaks[i].rank;

		if (strong_idx<strong_peak_idxs.size())
		{
			if (strong_peak_idxs[strong_idx]==i)
			{
				strong_idx++;
				os << " *";
			}
			else
				os << "  ";
		}
		else
			os << "  ";

		int j;
		for (j=0; j<peak_annotations[i].size(); j++)
			os << "  " << peak_annotations[i][j].label;
			
		os << endl;
	}
}


void print_dataset_spectra_by_stats(Config *config, char *mgf_file)
{
	FileManager fm;
	FileSet     fs;

	fm.init_from_mgf(config,mgf_file);
	fs.select_all_files(fm);

	int b_frag_idx = config->get_frag_idx_from_label("b");
	int y_frag_idx = config->get_frag_idx_from_label("y");

	int counter=0;
	while (1)
	{
		AnnotatedSpectrum as;

		if (! fs.get_next_spectrum(fm,config,&as))
			break;

		as.annotate_spectrum(as.get_true_mass_with_19());

		if (counter==0)
			as.print_expected_by();

		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 << counter++ << " " << num_b << " " << num_y << " " << exp_int << endl;
	}
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -