fragmentation.cpp

来自「MS-Clustering is designed to rapidly clu」· C++ 代码 · 共 682 行 · 第 1/2 页

CPP
682
字号
			frag_no_inten_idxs.push_back(f_idx);
		}
		else
			break;
	}
}




struct idx_prob {
	bool operator< (const idx_prob& other) const
	{
		return (prob>other.prob);
	}
	int idx;
	score_t prob;
};



void RegionalFragments::sort_by_prob()
{
	vector<idx_prob> ip;

	if (frag_type_idxs.size() != frag_probs.size())
	{
		cout << "Error: probs and frag_idxs mismatch!" << endl;
		exit(1);
	}
	
	ip.resize(frag_type_idxs.size());
	int i;
	for (i=0; i<frag_type_idxs.size(); i++)
	{
		ip[i].idx=frag_type_idxs[i];
		ip[i].prob= frag_probs[i];
	}
	sort(ip.begin(),ip.end());
	for (i=0; i<ip.size(); i++)
	{
		frag_type_idxs[i]=ip[i].idx;
		frag_probs[i]=ip[i].prob;
	}

	strong_frag_type_idxs.clear();
	frag_type_combos.clear();
}


/***************************************************
Sets default fragments for PepNovo charge 2
****************************************************/
void RegionalFragments::init_pepnovo_types(int charge, Config *config)
{
	const char* pep_labels[]={"y","b","a","y-H2O","b-H2O","a-H2O","y-NH3","b-NH3",
                           "a-NH3","y-H2OH2O","b-H2OH2O","y-NH3H2O","b-NH3H2O",
						   "y2","b2","y3","b3","y2-H2O","b2-H2O","y2-NH3","b2-NH3",
						   "y3-H2O","b3-H2O","y3-NH3","b3-NH3"};
	frag_type_idxs.resize(13);
	int i;

	for (i=0; i<13; i++)
	{
		string label(pep_labels[i]);
		frag_type_idxs[i]=config->get_frag_idx_from_label(label);
	}
		
	if (charge>1)
	{
		frag_type_idxs.resize(15);
		for (i=13; i<15; i++)
		{
			string label(pep_labels[i]);
			frag_type_idxs[i]=config->get_frag_idx_from_label(label);
		}
	}

	
	if (charge>2)
	{
		frag_type_idxs.resize(21);
		for (i=15; i<21; i++)
		{
			string label(pep_labels[i]);
			frag_type_idxs[i]=config->get_frag_idx_from_label(label);
		}
	}

//	cout << ">> ";
//	for (i=0; i<frag_type_idxs.size(); i++)
//		cout << frag_type_idxs[i] << " ";
//	cout << endl;

	frag_probs.resize(config->get_all_fragments().size(),0);
}




void RegionalFragments::init_with_all_types(int charge, Config *config)
{
	int i;
	frag_type_idxs.clear();
	const vector<FragmentType>& all_fragments = config->get_all_fragments();
	for (i=0; i<all_fragments.size(); i++)
		if (all_fragments[i].charge<=charge)
			frag_type_idxs.push_back(i);

	frag_probs.resize(all_fragments.size(),0);
}






struct idx_pair {
	bool operator< (const idx_pair& other) const
	{
		return (prob>other.prob);
	}
	int f_idx;
	score_t prob;
};

/******************************************************************
// makes the order of the fragments in the frag_idxs and frag_probs 
// vectors be in descending probability order
*******************************************************************/
void RegionalFragments::sort_according_to_frag_probs()
{
	int i;
	vector<idx_pair> pairs;
	if (frag_type_idxs.size() != frag_probs.size())
	{
		cout << "Error: mismtach in frag_idxs and frag_probs sizes!" << 
			frag_type_idxs.size() << " <=> " << frag_probs.size() << endl;
		exit(1);
	}

	pairs.resize(frag_type_idxs.size());
	for (i=0; i<frag_type_idxs.size(); i++)
	{
		pairs[i].f_idx=frag_type_idxs[i];
		pairs[i].prob =frag_probs[i];
	}
	sort(pairs.begin(),pairs.end());
	for (i=0; i<pairs.size(); i++)
	{
		frag_type_idxs[i]=pairs[i].f_idx;
		frag_probs[i]=pairs[i].prob;
	}
}





/*********************************************************************
// chooses all fragments that have high enough probability to be strong
**********************************************************************/
void RegionalFragments::select_strong_fragments(Config *config,
												score_t min_prob, 
												int max_num_strong)
{
	const vector<FragmentType>& all_fragments = config->get_all_fragments();
	int i;

	bool got_prefix = false;
	bool got_suffix = false;

	strong_frag_type_idxs.clear();
	for (i=0; i<frag_type_idxs.size() && i <max_num_strong; i++)
	{
		if (i>=2 && frag_probs[i]<min_prob)
			continue;

		strong_frag_type_idxs.push_back(frag_type_idxs[i]);

		if (all_fragments[frag_type_idxs[i]].orientation == PREFIX)
			got_prefix=true;
		if (all_fragments[frag_type_idxs[i]].orientation == SUFFIX)
			got_suffix=true;
	}

	// try and add an additional frag type...
	if (! got_prefix)
	{
		for (i=0; i<frag_type_idxs.size(); i++)
		{
			if (all_fragments[frag_type_idxs[i]].orientation == PREFIX &&
				frag_probs[i]>min_prob*0.5)
			{
				strong_frag_type_idxs.push_back(frag_type_idxs[i]);
				break;
			}
		}
	}

	if (! got_suffix)
	{
		for (i=0; i<frag_type_idxs.size(); i++)
		{
			if (all_fragments[frag_type_idxs[i]].orientation == SUFFIX &&
				frag_probs[i]>min_prob*0.5)
			{
				strong_frag_type_idxs.push_back(frag_type_idxs[i]);
				break;
			}
		}
	}
}


void Config::set_all_regional_fragment_relationships()
{
	int charge;
	for (charge=0; charge<regional_fragment_sets.size(); charge++)
	{
		int size_idx;
		for (size_idx=0; size_idx<regional_fragment_sets[charge].size(); size_idx++)
		{
			int region_idx;
			for (region_idx=0; region_idx<regional_fragment_sets[charge][size_idx].size(); region_idx++)
				if (regional_fragment_sets[charge][size_idx][region_idx].get_num_fragments()>0)
				{
					regional_fragment_sets[charge][size_idx][region_idx].set_fragment_relationships(this);

				//	if (charge==2 && size_idx==1 && region_idx ==0)
				//		regional_fragment_sets[charge][size_idx][region_idx].print_fragment_relationships(this);
				}
			
		}
	}
}

void Config::print_all_regional_fragment_relationships() const
{
	int charge;
	for (charge=0; charge<regional_fragment_sets.size(); charge++)
	{
		int size_idx;
		for (size_idx=0; size_idx<regional_fragment_sets[charge].size(); size_idx++)
		{
			int region_idx;
			for (region_idx=0; region_idx<regional_fragment_sets[charge][size_idx].size(); region_idx++)
				if (regional_fragment_sets[charge][size_idx][region_idx].get_num_fragments()>0)
				{
					cout << "MODEL " << charge << " " << size_idx << " " << region_idx << endl;
					regional_fragment_sets[charge][size_idx][region_idx].print_fragment_relationships(this);
				}
			
		}
	}
}

/****************************************************************************
This function sets the idxs of parents of the fragments (i.e., they appear in
a higher rank in the table. We distinguish between two cases for the parents:
same charge orientation, and other.
The function also chooses for each strong fragment a 
*****************************************************************************/
void RegionalFragments::set_fragment_relationships(Config *config)
{
	const vector<FragmentType>& all_fragments = config->get_all_fragments();
	const int num_frags = frag_type_idxs.size();

	mirror_frag_idxs.clear();
	parent_idxs.clear();
	parents_with_same_charge_ori_idxs.clear();
	
	mirror_frag_idxs.resize(num_frags);
	parent_idxs.resize(num_frags);
	parents_with_same_charge_ori_idxs.resize(num_frags);
	
	int i;
	for (i=0; i<num_frags; i++)
	{
		const int curr_frag_idx = frag_type_idxs[i];
		const FragmentType& curr_frag = all_fragments[curr_frag_idx];
		int j;
		for (j=0; j<i; j++)
		{
			const int other_frag_idx = frag_type_idxs[j];
			const FragmentType& other_frag = all_fragments[other_frag_idx];

			parent_idxs[i].push_back(other_frag_idx);

			if (curr_frag.charge == other_frag.charge &&
				curr_frag.orientation == other_frag.orientation)
				parents_with_same_charge_ori_idxs[i].push_back(other_frag_idx);
			
			if (curr_frag.orientation != other_frag.orientation)
			{
				const mass_t sum_offset = (curr_frag.offset * curr_frag.charge) + (other_frag.offset * other_frag.charge);
				const int sum_charge = (curr_frag.charge + other_frag.charge);
				if (fabs(sum_offset - MASS_PROTON*(sum_charge-1)-MASS_OHHH)<0.1) 
				{
					mirror_frag_idxs[i].push_back(other_frag_idx);
					mirror_frag_idxs[j].push_back(curr_frag_idx);
				}
			}
		}	
	}
}

void RegionalFragments::print_fragment_relationships(const Config *config) const
{
	const vector<FragmentType>& all_fragments = config->get_all_fragments();
	const int num_frags = frag_type_idxs.size();
	int i;
	for (i=0; i<num_frags; i++)
	{
		const int curr_frag_idx = frag_type_idxs[i];
		const FragmentType& curr_frag = all_fragments[curr_frag_idx];
		int j;

		cout << i <<"\t" << curr_frag.label <<"\tparents  " << parent_idxs[i].size() << " ";
		for (j=0; j<parent_idxs[i].size(); j++)
			cout << "\t" << all_fragments[parent_idxs[i][j]].label;
		cout << endl;
		
		cout <<  "\t\tparents with same " << parents_with_same_charge_ori_idxs[i].size() << " ";
		for (j=0; j<parents_with_same_charge_ori_idxs[i].size(); j++)
			cout << "\t" << all_fragments[parents_with_same_charge_ori_idxs[i][j]].label;
		cout << endl;
		
		cout << "\t\tmirror frags " << mirror_frag_idxs[i].size() << " ";
		for (j=0; j<mirror_frag_idxs[i].size(); j++)
			cout << "\t" << all_fragments[mirror_frag_idxs[i][j]].label;
		cout << endl;

		cout << endl << endl;
	}
}




⌨️ 快捷键说明

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