Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-03 08:19:41

0001 #include <iostream>
0002 
0003 #include <GTL/graph.h>
0004 #include <GTL/bellman_ford.h>
0005 #include <GTL/edge_map.h>
0006 #include <GTL/node_map.h>
0007 #include <GTL/dfs.h>
0008 #include <memory>
0009 #include <list>
0010 
0011 class my_graph : public graph {
0012 
0013 public:
0014 
0015   my_graph() : graph () {}
0016 
0017   node new_vertex(int x) {node n=graph::new_node();X[n]=x; return n;}
0018   void new_parton(node s, node t, int p) {edge e=graph::new_edge(s,t) ;P[e]=p;} //; return e;}
0019 
0020   void save_node_info_handler (ostream *o, node n) const { *o<<"Value = "<<X[n]<<endl;}
0021   void save_edge_info_handler (ostream *o, edge n) const { *o<<"Value = "<<P[n]<<endl;}
0022 
0023   int GetNodeValue(node n) const {return X[n];}
0024   int GetEdgeValue(edge n) const {return P[n];}
0025   
0026 private:
0027  
0028   node_map<int> X;
0029   edge_map<int> P;
0030   
0031 };
0032 
0033 
0034 class parton {
0035 
0036 public:
0037   
0038   parton() {};
0039   parton (double mpt, double meta, double mphi, double me, bool mfinal) {pt=mpt;eta=meta;phi=mphi;e=me;final=mfinal;}
0040   ~parton() {cout<<" Parton Destructor ..."<<endl;}
0041 
0042   bool isFinal() {return final;}
0043        
0044   double pt, eta, phi, e;
0045   bool final;
0046 };
0047 
0048 class shower : public graph {
0049 
0050 public:
0051   
0052   shower() : graph() {cout<<"Shower Constrcutor ..."<<endl;}
0053   ~shower() {cout<<"Shower Detrcutor ..."<<endl;}
0054   
0055   node new_vertex(int x) {node n=graph::new_node();XX[n]=x; return n;}
0056   void new_parton(node s, node t, parton p) {edge e=graph::new_edge(s,t) ;PP[e]=p;} //; return e;}
0057   int GetNodeValue(node n) const {return XX[n];}
0058   void save_edge_info_handler (ostream *o, edge n) const { *o<<"Value = "<<PP[n].pt<<endl;}
0059   double GetEdgeValue(edge n) const {return PP[n].pt;}
0060   
0061  private:
0062  
0063   node_map<int> XX;
0064   edge_map<parton> PP;
0065   
0066 };
0067 
0068 class shower2 : public graph {
0069 
0070 public:
0071   
0072   shower2() : graph() {cout<<"Shower2 Constrcutor ..."<<endl;}
0073   virtual ~shower2() {cout<<"Shower2 Detrcutor ..."<<endl;}
0074   
0075   node new_vertex(int x) {node n=graph::new_node();XX[n]=x; return n;}
0076   //void new_parton(node s, node t, shared_ptr<parton> p) {edge e=graph::new_edge(s,t);PP[e]=p;}//std::move(p);} //; return e;}
0077   void new_parton(node s, node t, unique_ptr<parton> p) {edge e=graph::new_edge(s,t);PP[e]=std::move(p);}
0078   
0079   //int GetNodeValue(node n) const {return XX[n];}
0080   void save_edge_info_handler (ostream *o, edge n) const { *o<<"Value = "<<PP[n]->pt<<endl;}
0081   double GetEdgeValue(edge n) const {return PP[n]->pt;}
0082   int GetNodeValue(node n) const {return XX[n];}
0083   bool GetFinal(edge e) const {return PP[e]->final;}
0084   //void pre_new_edge_handler(node s,node t) {};
0085   void post_new_edge_handler(edge e) {};
0086   void pre_clear_handler() {
0087     edge_iterator git3, gend3;    
0088     for (git3 = edges_begin(), gend3 = edges_end(); git3 != gend3; ++git3)      
0089       {
0090     //cout<<*git3<<" "<<mS->GetEdgeValue(*git3)<<endl;
0091     PP[*git3]=nullptr;
0092       }
0093   }
0094   
0095  private:
0096  
0097   node_map<int> XX;
0098   edge_map<shared_ptr<parton>> PP; //unique_ptr not working !???
0099   
0100 };
0101 
0102 int main (int argc, char* argv[])
0103 {
0104     graph G;
0105     G.make_directed();
0106     node n1 = G.new_node();
0107     node n2 = G.new_node();
0108 
0109     edge e1 = G.new_edge(n1,n2);
0110     
0111     
0112     node_map<int> n(G,1);
0113     edge_map<int> e(G,10);
0114 
0115     //edge_map<int> e1(n1,n2,10);
0116 
0117     //G.save();
0118 
0119     my_graph S;
0120     
0121     node n11=S.new_vertex(0);
0122     node n22=S.new_vertex(1);
0123     node n33=S.new_vertex(2);
0124     node n44=S.new_vertex(3);
0125     node n55=S.new_vertex(5);
0126 
0127     //edge e11=S.new_parton(n11,n22,10);
0128     S.new_parton(n11,n22,10);
0129     S.new_parton(n11,n33,11);
0130     S.new_parton(n33,n44,20);
0131     S.new_parton(n33,n55,21);
0132     
0133     //S.save();
0134     //S.insert_reverse_edges();
0135     
0136     graph::node_iterator it, end;
0137     
0138     for (it = S.nodes_begin(), end = S.nodes_end(); it != end; ++it)      
0139       {
0140     cout<<*it<<" "<<S.GetNodeValue((node) *it)<<endl;
0141       }
0142 
0143     graph::edge_iterator it2, end2;
0144     
0145     for (it2 = S.edges_begin(), end2 = S.edges_end(); it2 != end2; ++it2)      
0146       {
0147     cout<<*it2<<" "<<S.GetEdgeValue((edge) *it2)<<endl;
0148       }
0149 
0150     cout<<endl;
0151     
0152     shower gS;
0153 
0154     cout<<endl;
0155     
0156     node nn11=gS.new_vertex(0);
0157     node nn22=gS.new_vertex(1);
0158     node nn33=gS.new_vertex(1);
0159     node nn44=gS.new_vertex(2);
0160     node nn55=gS.new_vertex(2);
0161 
0162     //parton p(100,0,0,100,false);
0163     
0164     gS.new_parton(nn11,nn22,parton(100,0,0,100,false));
0165     gS.new_parton(nn11,nn33,parton(200,0,0,200,false));
0166     gS.new_parton(nn33,nn44,parton(50,0,0,50,true));
0167     gS.new_parton(nn33,nn55,parton(150,0,0,150,true));
0168 
0169     shower::node_iterator git, gend;
0170     
0171     for (git = gS.nodes_begin(), gend = gS.nodes_end(); git != gend; ++git)      
0172       {
0173     cout<<*git<<" "<<gS.GetNodeValue(*git)<<endl;
0174       }
0175 
0176     shower::edge_iterator git2, gend2;
0177     
0178     for (git2 = gS.edges_begin(), gend2 = gS.edges_end(); git2 != gend2; ++git2)      
0179       {
0180     cout<<*git2<<" "<<gS.GetEdgeValue(*git2)<<endl;
0181       }
0182 
0183     //shower *mS=new shower();
0184     cout<<endl;
0185     auto mS=make_shared<shower2>();
0186     mS->make_directed();
0187     
0188     node nnn11=mS->new_vertex(0);
0189     node nnn22=mS->new_vertex(1);
0190     node nnn33=mS->new_vertex(1);
0191     node nnn44=mS->new_vertex(2);
0192     node nnn55=mS->new_vertex(2);
0193     node nnn66=mS->new_vertex(3);
0194     node nnn77=mS->new_vertex(3);
0195     node nnn88=mS->new_vertex(4);
0196     
0197     mS->new_parton(nnn11,nnn22,unique_ptr<parton>(new parton(100,0,0,100,false)));
0198     mS->new_parton(nnn11,nnn33,unique_ptr<parton>(new parton(200,0,0,200,false)));
0199     mS->new_parton(nnn33,nnn44,unique_ptr<parton>(new parton(50,0,0,50,true)));
0200     mS->new_parton(nnn33,nnn55,unique_ptr<parton>(new parton(150,0,0,150,false)));
0201     mS->new_parton(nnn55,nnn66,unique_ptr<parton>(new parton(80,0,0,80,true)));
0202     mS->new_parton(nnn55,nnn77,unique_ptr<parton>(new parton(70,0,0,70,false)));
0203     mS->new_parton(nnn77,nnn88,unique_ptr<parton>(new parton(60,0,0,60,true)));
0204 
0205     //reverse changes all counts --> new inverse graph ... ? (shared pointers ...)
0206     /*
0207     mS->new_parton(nnn22,nnn11,unique_ptr<parton>(new parton(100,0,0,100,false)));
0208     mS->new_parton(nnn33,nnn11,unique_ptr<parton>(new parton(200,0,0,200,false)));
0209     mS->new_parton(nnn44,nnn33,unique_ptr<parton>(new parton(50,0,0,50,true)));
0210     mS->new_parton(nnn55,nnn33,unique_ptr<parton>(new parton(150,0,0,150,false)));
0211     mS->new_parton(nnn66,nnn55,unique_ptr<parton>(new parton(80,0,0,80,true)));
0212     mS->new_parton(nnn77,nnn55,unique_ptr<parton>(new parton(70,0,0,70,true)));
0213     */
0214     
0215     //mS->new_parton(nnn11,nnn22,make_shared<parton>(100,0,0,100,false));
0216     //mS->save();
0217 
0218     //mS->insert_reverse_edges(); //problem with new parton creation .... so post/pre handler
0219     // not really doing the trick
0220     
0221     shower2::node_iterator git0, gend0;
0222     
0223     for (git0 = mS->nodes_begin(), gend0 = mS->nodes_end(); git0 != gend0; ++git0)      
0224       {
0225     cout<<*git0<<" "<<mS->GetNodeValue(*git0)<<" "<<git0->indeg()<<" "<<git0->outdeg()<<endl;
0226       }
0227     
0228     shower2::edge_iterator git3, gend3;
0229     
0230     for (git3 = mS->edges_begin(), gend3 = mS->edges_end(); git3 != gend3; ++git3)      
0231       {
0232     cout<<*git3<<" "<<mS->GetEdgeValue(*git3)<<endl;
0233       }
0234 
0235     list<node> ln=mS->all_nodes();
0236     cout<<ln.size()<<endl;
0237 
0238     list<edge> le=mS->all_edges(); 
0239     cout<<le.size()<<endl;
0240     //le.remove_if( // hmmm, not with parton in graph (inheritence !??) Check ..
0241 
0242     dfs search;
0243     search.start_node(nnn11);
0244     search.run(*mS);
0245     cout<< search.number_of_reached_nodes () <<endl;
0246 
0247     dfs::dfs_iterator itt2, endt2;
0248     for (itt2 = search.begin(), endt2=search.end(); itt2 !=endt2; ++itt2)
0249       {
0250     cout<<*itt2<<endl;
0251       }
0252     
0253     dfs::tree_edges_iterator itt, endt;
0254     for (itt = search.tree_edges_begin(), endt=search.tree_edges_end(); itt !=endt; ++itt)
0255       {
0256     cout<<*itt<<endl;
0257       }
0258     
0259     mS->clear(); //does not call parton destructor but with handler it does  ...
0260     cout<<" mS->clear()"<<endl;
0261     //mS->save();
0262     
0263     mS=0;
0264     cout<<"Done .."<<endl;
0265 }