'ElMo-Knock'

rk.cpp

Go to the documentation of this file.
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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines