|
'ElMo-Knock'
|
00001 #include <sstream> 00002 #include <assert.h> 00003 #include "rk.h" 00004 00009 RK::RK() { 00010 00011 } 00018 RK::RK(const RK &rk) { 00019 00020 this->knock_reacs=rk.knock_reacs; 00021 this->key=rk.key; 00022 this->metab_network=rk.metab_network; 00023 00024 this->inactive_reacs=rk.inactive_reacs; 00025 this->uncollapsed_ineff_efm_indices.assign(rk.uncollapsed_ineff_efm_indices.begin(),rk.uncollapsed_ineff_efm_indices.end()); 00026 this->uncollapsed_eff_efm_indices.assign(rk.uncollapsed_eff_efm_indices.begin(),rk.uncollapsed_eff_efm_indices.end()); 00027 } 00036 RK::RK(map<int,string> knock_reacs, MetabolicNetwork *metab_network) { 00037 00038 00039 stringstream os; 00040 map<int,string>::iterator pi; 00041 00042 //find key for the RK instance 00043 //sort pi->first 00044 for (pi=knock_reacs.begin();pi!=knock_reacs.end();pi++) { 00045 if (pi!=knock_reacs.begin()) 00046 os<<"."; 00047 os << pi->first; 00048 //this->knock_reacs_nos.push_back(pi->first); 00049 } 00050 this->key= os.str(); 00051 00052 this->metab_network=metab_network; 00053 00054 00055 this->uncollapsed_ineff_efm_indices.assign(metab_network->get_ineff_efm_indices().begin(),metab_network->get_ineff_efm_indices().end()); 00056 this->uncollapsed_eff_efm_indices.assign(metab_network->get_eff_efm_indices().begin(),metab_network->get_eff_efm_indices().end()); 00057 00058 //add each reaction to the current instance from knock_reacs 00059 add_reacs(knock_reacs); 00060 00061 } 00062 00072 int RK::add_reacs(map<int,string> reacs) { 00073 //read in local variables the EFM matrix, and indices of inefficient modes 00074 vector<string> reacs_names=this->metab_network->get_reacs_names(); 00075 00076 //update remain_ineff_modes_cnt; 00077 //in one scan find modes that have 0 flux for reactions in this->knock_reacs but non-zero for reaction reac 00078 //find how many modes will be collapsed with the deletion of reaction reac 00079 00080 map<int,string>::iterator pi; 00081 00082 vector<long> remain_efm_indices; 00083 00084 for (long i=0;i< this->uncollapsed_ineff_efm_indices.size();i++) { 00085 00086 int collapsed=1; 00087 for (pi=reacs.begin();pi!=reacs.end();pi++) { 00088 00089 int is_zero; 00090 this->metab_network->is_efm_elem_zero(this->uncollapsed_ineff_efm_indices[i],pi->first, is_zero); 00091 if (!is_zero) { 00092 collapsed=0; 00093 break; 00094 } 00095 } 00096 if (collapsed) 00097 remain_efm_indices.push_back(this->uncollapsed_ineff_efm_indices[i]); 00098 } 00099 this->uncollapsed_ineff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00100 remain_efm_indices.resize(0); 00101 00102 for (long i=0;i< this->uncollapsed_eff_efm_indices.size();i++) { 00103 00104 int collapsed=1; 00105 for (pi=reacs.begin();pi!=reacs.end();pi++) { 00106 00107 int is_zero; 00108 this->metab_network->is_efm_elem_zero(this->uncollapsed_eff_efm_indices[i],pi->first, is_zero); 00109 if (!is_zero) { 00110 collapsed=0; 00111 break; 00112 } 00113 } 00114 if (collapsed) 00115 remain_efm_indices.push_back(this->uncollapsed_eff_efm_indices[i]); 00116 } 00117 this->uncollapsed_eff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00118 remain_efm_indices.resize(0); 00119 00120 00121 //now find what fraction of modes indexed by remain_ineff_efm_indices are collapsed if 'reac' is deleted 00122 00123 00124 for (pi=reacs.begin();pi!=reacs.end();pi++) { 00125 this->knock_reacs[pi->first]=reacs_names[pi->first]; 00126 } 00127 00128 //recompute key from scratch 00129 stringstream os; 00130 00131 //find key for the RK instance 00132 //sort pi->first 00133 for (pi=knock_reacs.begin();pi!=knock_reacs.end();pi++) { 00134 if (pi!=knock_reacs.begin()) 00135 os<<"."; 00136 os << pi->first; 00137 00138 } 00139 00140 00141 this->key= os.str(); 00142 00143 00144 return 0; 00145 } 00146 00147 00158 int RK::add_reac_direct(int reac,double &rank) { 00159 00160 //read in local variables the EFM matrix, and indices of inefficient modes 00161 vector<string> reacs_names=this->metab_network->get_reacs_names(); 00162 00163 //in one scan find modes that have 0 flux for reactions in this->knock_reacs but non-zero for reaction reac 00164 //find how many modes will be collapsed with the deletion of reaction reac 00165 vector<long> remain_efm_indices; 00166 00167 //now find what fraction of modes indexed by remain_ineff_efm_indices are collapsed if 'reac' is deleted 00168 long num_remain_ineff_efm_indices, num_ineff_collapsed=0; 00169 for (long i=0;i<this->uncollapsed_ineff_efm_indices.size();i++) { 00170 int is_zero; 00171 this->metab_network->is_efm_elem_zero(this->uncollapsed_ineff_efm_indices[i],reac, is_zero); 00172 if (is_zero) 00173 remain_efm_indices.push_back(this->uncollapsed_ineff_efm_indices[i]); 00174 } 00175 num_ineff_collapsed=uncollapsed_ineff_efm_indices.size()-remain_efm_indices.size(); 00176 num_remain_ineff_efm_indices=remain_efm_indices.size(); 00177 this->uncollapsed_ineff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00178 00179 00180 remain_efm_indices.resize(0); 00181 //now find what fraction of modes indexed by remain_ineff_efm_indices are collapsed if 'reac' is deleted 00182 long num_remain_eff_efm_indices,num_eff_collapsed=0; 00183 for (long i=0;i<this->uncollapsed_eff_efm_indices.size();i++) { 00184 int is_zero; 00185 this->metab_network->is_efm_elem_zero(this->uncollapsed_eff_efm_indices[i],reac, is_zero); 00186 if (is_zero) 00187 remain_efm_indices.push_back(this->uncollapsed_eff_efm_indices[i]); 00188 } 00189 num_eff_collapsed=uncollapsed_eff_efm_indices.size()-remain_efm_indices.size(); 00190 num_remain_eff_efm_indices=remain_efm_indices.size(); 00191 this->uncollapsed_eff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00192 00193 if (num_eff_collapsed==0) { 00194 rank=-1.0; 00195 } else { 00196 00197 if (this->metab_network->get_options().get_network_capacity().compare("high")==0) { 00198 00199 double frac_ineff_collapsed=num_ineff_collapsed*1.0/num_remain_ineff_efm_indices; 00200 double frac_eff_collapsed=num_eff_collapsed*1.0/num_remain_eff_efm_indices; 00201 rank=frac_ineff_collapsed*(1-frac_eff_collapsed); //or frac_ineff_collapsed*frac_eff_collapsed 00202 00203 } else if (this->metab_network->get_options().get_network_capacity().compare("low")==0) { 00204 00205 int not_all_eff_collapsed=(num_remain_eff_efm_indices!=num_eff_collapsed); 00206 rank=((num_ineff_collapsed+num_eff_collapsed)*1.0/(num_remain_eff_efm_indices+num_remain_ineff_efm_indices))*not_all_eff_collapsed; //or frac_ineff_collapsed*frac_eff_collapsed 00207 00208 } 00209 00210 00211 } 00212 00213 this->knock_reacs[reac]=reacs_names[reac]; 00214 00215 //recompute key from scratch 00216 stringstream os; 00217 00218 map<int,string>::iterator pi; 00219 00220 //find key for the RK instance 00221 //sort pi->first 00222 for (pi=knock_reacs.begin();pi!=knock_reacs.end();pi++) { 00223 if (pi!=knock_reacs.begin()) 00224 os<<"."; 00225 os << pi->first; 00226 } 00227 00228 this->key= os.str(); 00229 00230 return 0; 00231 } 00232 00233 int RK::add_reac(int reac,long &rank) { 00234 00235 //read in local variables the EFM matrix, and indices of inefficient modes 00236 vector<string> reacs_names=this->metab_network->get_reacs_names(); 00237 00238 //update remain_ineff_modes_cnt; 00239 //in one scan find modes that have 0 flux for reactions in this->knock_reacs but non-zero for reaction reac 00240 //find how many modes will be collapsed with the deletion of reaction reac 00241 00242 00243 vector<long> remain_efm_indices; 00244 00245 for (long i=0;i< uncollapsed_ineff_efm_indices.size();i++) { 00246 map<int,string>::iterator pi; 00247 int collapsed=1; 00248 00249 int is_zero; 00250 this->metab_network->is_efm_elem_zero(uncollapsed_ineff_efm_indices[i],reac, is_zero); 00251 if (is_zero) 00252 remain_efm_indices.push_back(uncollapsed_ineff_efm_indices[i]); 00253 } 00254 long num_collapsed; 00255 num_collapsed=uncollapsed_ineff_efm_indices.size()-remain_efm_indices.size(); 00256 uncollapsed_ineff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00257 00258 remain_efm_indices.resize(0); 00259 for (long i=0;i< uncollapsed_eff_efm_indices.size();i++) { 00260 map<int,string>::iterator pi; 00261 int collapsed=1; 00262 00263 int is_zero; 00264 this->metab_network->is_efm_elem_zero(uncollapsed_eff_efm_indices[i],reac, is_zero); 00265 if (is_zero) 00266 remain_efm_indices.push_back(uncollapsed_eff_efm_indices[i]); 00267 } 00268 00269 uncollapsed_eff_efm_indices.assign(remain_efm_indices.begin(),remain_efm_indices.end()); 00270 00271 //now find what fraction of modes indexed by remain_ineff_efm_indices are collapsed if 'reac' is deleted 00272 00273 00274 rank=num_collapsed; //*1.0/remain_ineff_efm_indices.size(); 00275 00276 this->knock_reacs[reac]=reacs_names[reac]; 00277 00278 //recompute key from scratch 00279 stringstream os; 00280 00281 map<int,string>::iterator pi; 00282 00283 //find key for the RK instance 00284 //sort pi->first 00285 for (pi=knock_reacs.begin();pi!=knock_reacs.end();pi++) { 00286 if (pi!=knock_reacs.begin()) 00287 os<<"."; 00288 os << pi->first; 00289 } 00290 00291 this->key= os.str(); 00292 00293 return 0; 00294 } 00295 00296 00297 //find the new rank value if reac is added 00298 int RK::test_reac(int reac,long &rank) { 00299 00300 //read in local variables the EFM matrix, and indices of inefficient modes 00301 00302 vector<long>& ineff_efm_indices=this->metab_network->get_ineff_efm_indices(); 00303 //update remain_ineff_modes_cnt; 00304 //in one scan find modes that have 0 flux for reactions in this->knock_reacs but non-zero for reaction reac 00305 //find how many modes will be collapsed with the deletion of reaction reac 00306 00307 //store in remain_ineff_efm_indices the indices of those modes which are collapsed when reactions from reac_knocks are deleted 00308 vector<long> remain_ineff_efm_indices_lc; 00309 for (long i=0;i<ineff_efm_indices.size();i++) { 00310 map<int,string>::iterator pi; 00311 int collapsed=1; 00312 for (pi=knock_reacs.begin();pi!=knock_reacs.end();pi++) { 00313 int is_zero; 00314 this->metab_network->is_efm_elem_zero(ineff_efm_indices[i],pi->first, is_zero); 00315 if (!is_zero) { 00316 collapsed=0; 00317 break; 00318 } 00319 } 00320 if (collapsed) 00321 remain_ineff_efm_indices_lc.push_back(ineff_efm_indices[i]); 00322 } 00323 00324 //now find what fraction of modes indexed by remain_ineff_efm_indices are collapsed if 'reac' is deleted 00325 long num_collapsed=0; 00326 for (long i=0;i<remain_ineff_efm_indices_lc.size();i++) { 00327 int is_zero; 00328 this->metab_network->is_efm_elem_zero(remain_ineff_efm_indices_lc[i],reac, is_zero); 00329 if (!is_zero) 00330 num_collapsed++; 00331 } 00332 00333 rank=num_collapsed; //*1.0/remain_ineff_efm_indices.size(); 00334 00335 00336 return 0; 00337 } 00338 00339 long RK::test_knock_reacs2(map<int,string> knock_reacs, vector<double> &min_yields, long &num_eff_efm_rem, long &num_ineff_efm_rem) { 00340 00341 00342 num_ineff_efm_rem=this->uncollapsed_ineff_efm_indices.size(); 00343 num_eff_efm_rem=this->uncollapsed_eff_efm_indices.size(); 00344 00345 vector< vector<double> >& efm_yields=this->metab_network->get_efm_yields(); 00346 //find max yield for all target reactions among modes in remain_ineff_efm_indices 00347 int target_cnt=0; 00348 map<string,double>& max_yields=this->metab_network->get_max_yields(); 00349 for (map<string,double>::iterator it=max_yields.begin();it!=max_yields.end();it++,target_cnt++) { 00350 //it->second is the index of yield reaction in efms 00351 double curr_min_yield=it->second; 00352 vector<long>::iterator ip; 00353 for (ip=this->uncollapsed_eff_efm_indices.begin();ip!=this->uncollapsed_eff_efm_indices.end();ip++) { 00354 //*ip index of mode in efms 00355 if (efm_yields[target_cnt][*ip]<curr_min_yield) 00356 curr_min_yield=efm_yields[target_cnt][*ip]; 00357 00358 } 00359 min_yields.push_back(curr_min_yield); 00360 } 00361 00362 vector<long>::iterator ip; 00363 vector<string>& reacs_names=this->metab_network->get_reacs_names(); 00364 this->max_path_length=0;this->min_path_length=reacs_names.size(); 00365 00366 00367 this->avg_path_length=0; 00368 00369 for (ip=this->uncollapsed_eff_efm_indices.begin();ip!=this->uncollapsed_eff_efm_indices.end();ip++) { 00370 int curr_path_length=0; 00371 for (int i=0;i<reacs_names.size();i++) { 00372 int is_zero; 00373 this->metab_network->is_efm_elem_zero(*ip,i, is_zero); 00374 if (!is_zero) 00375 curr_path_length++; 00376 } 00377 if (this->min_path_length>curr_path_length) 00378 this->min_path_length=curr_path_length; 00379 if (this->max_path_length<curr_path_length) 00380 this->max_path_length=curr_path_length; 00381 this->avg_path_length+=curr_path_length; 00382 } 00383 00384 for (int i=0;i<reacs_names.size();i++) { 00385 //determine if i-th reaction is inactive, but not in knock_reacs 00386 map<int,string>::iterator mis=knock_reacs.find(i); 00387 if (mis!=knock_reacs.end()) 00388 continue; 00389 int all_zero=1; 00390 for (ip=this->uncollapsed_eff_efm_indices.begin();ip!=this->uncollapsed_eff_efm_indices.end();ip++) { 00391 int is_zero; 00392 this->metab_network->is_efm_elem_zero(*ip,i, is_zero); 00393 if (!is_zero) { 00394 all_zero=0; 00395 } 00396 } 00397 if (all_zero) 00398 this->inactive_reacs.push_back(i); 00399 } 00400 assert(this->uncollapsed_eff_efm_indices.size()>0); 00401 00402 this->avg_path_length/=this->uncollapsed_eff_efm_indices.size(); 00403 return 0; 00404 } 00405 00406 ostream& operator<<(ostream& out, const RK& rk) { 00407 RK temp_rk=rk; 00408 map<string,int> transport_names=rk.metab_network->get_transport_names(); 00409 00410 for (map<int,string>::iterator it=temp_rk.get_knock_reacs().begin();it!=temp_rk.get_knock_reacs().end();it++) { 00411 //check if it->second is transport reaction 00412 00413 map<string,int>::iterator mpi=transport_names.find(it->second); 00414 if (mpi==transport_names.end()) { 00415 out << it->second << " "; 00416 } else 00417 out << "t"<<it->second << " "; 00418 } 00419 //find inactive reactions in all modes remain_eff_efm_indices modes and print those which don't appear in rk.get_knock_reacs() 00420 00421 out << "\t"; 00422 00423 vector<string>& reacs_names=rk.metab_network->get_reacs_names(); 00424 for (int i=0;i<rk.inactive_reacs.size();i++) { 00425 out << reacs_names[rk.inactive_reacs[i]]<<" "; 00426 } 00427 00428 return out; 00429 00430 } 00431 int RK::is_core_collapsed(int &cnt_not_collapsed) { 00432 //does knock_reacs collapse all modes in this->metab_network->get_core_efm_indices(); 00433 00434 vector< vector<double> >& core_efms=this->metab_network->get_core_efms(); 00435 map<int,string>::iterator it; 00436 cnt_not_collapsed=0; 00437 00438 for (long i=0;i<core_efms[0].size();i++) { 00439 int not_collapsed=1; 00440 for (it=knock_reacs.begin();it!=knock_reacs.end();it++) { 00441 if (core_efms[it->first][i]!=0) { 00442 not_collapsed=0; 00443 break; 00444 } 00445 } 00446 if (not_collapsed) 00447 cnt_not_collapsed++; 00448 00449 } 00450 00451 return cnt_not_collapsed==0; 00452 } 00453 00454 int find_common_efm(vector<RK> rks, int &num_shared_efms) { 00455 00456 00457 vector<long> common_efm=rks[0].get_uncollapsed_eff_efm_indices(); 00458 00459 00460 for (vector<RK>::iterator it=rks.begin()+1;it!=rks.end();it++) { 00461 vector<long> remain_efm_ind=(*it).get_uncollapsed_eff_efm_indices(); 00462 sort(remain_efm_ind.begin(),remain_efm_ind.end()); 00463 sort(common_efm.begin(),common_efm.end()); 00464 vector<long> vec2; 00465 std::set_intersection(common_efm.begin(),common_efm.end(),remain_efm_ind.begin(),remain_efm_ind.end(),std::back_inserter(vec2)); 00466 common_efm=vec2; 00467 } 00468 00469 num_shared_efms=common_efm.size(); 00470 return 0; 00471 }