ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/ParticleTreeDrawer.cc
(Generate patch)

Comparing UserCode/Morgan/src/ParticleTreeDrawer.cc (file contents):
Revision 1.5 by lethuill, Wed Mar 11 12:44:56 2009 UTC vs.
Revision 1.6 by lethuill, Wed Jun 10 11:17:06 2009 UTC

# Line 6 | Line 6 | using namespace reco;
6   //using namespace HepMC;
7  
8  
9 < ParticleTreeDrawer::ParticleTreeDrawer(const edm::ParameterSet & cfg, const edm::ParameterSet & producers) :
10 <        src_( producers.getParameter<InputTag>( "genParticlesProducer" ) ),
11 <        printP4_( cfg.getUntrackedParameter<bool>( "mcTreePrintP4", false ) ),
12 <        printPtEtaPhi_( cfg.getUntrackedParameter<bool>( "mcTreePrintPtEtaPhi", false ) ),
13 <        printVertex_( cfg.getUntrackedParameter<bool>( "mcTreePrintVertex", false ) ),
14 <        printStatus_( cfg.getUntrackedParameter<bool>( "mcTreePrintStatus", false ) ),
15 <        printIndex_( cfg.getUntrackedParameter<bool>( "mcTreePrintIndex", false ) ),
16 <        status_( cfg.getUntrackedParameter<vint>( "mcTreeStatus", vint() ) )
17 < {
18 < }
19 <
20 <
21 < bool ParticleTreeDrawer::accept( const reco::Candidate & c ) const {
22 <  if ( status_.size() == 0 ) return true;
23 <  return find( status_.begin(), status_.end(), c.status() ) != status_.end();
24 < }
25 <
26 <
27 < bool ParticleTreeDrawer::hasValidDaughters( const reco::Candidate & c ) const {
28 <  size_t ndau = c.numberOfDaughters();
29 <  for( size_t i = 0; i < ndau; ++ i )
30 <    if ( accept( * c.daughter( i ) ) )
31 <      return true;
32 <  return false;
33 < }
34 <
35 <
36 < void ParticleTreeDrawer::analyze( const Event & event, const EventSetup & es ) {  
37 <  es.getData( pdt_ );
38 <  Handle<View<Candidate> > particles;
39 <  event.getByLabel( src_, particles );
40 <  cands_.clear();
41 <  for( View<Candidate>::const_iterator p = particles->begin();
42 <       p != particles->end(); ++ p ) {
43 <    cands_.push_back( & * p );
44 <  }
45 <  for( View<Candidate>::const_iterator p = particles->begin();
46 <       p != particles->end(); ++ p ) {
47 <    if ( accept( * p ) ) {
48 <      if ( p->mother() == 0 ) {
49 <        cout << "-- decay tree: --" << endl;
50 <        printDecay( * p, "" );
51 <      }
52 <    }
53 <  }
54 < }
55 <
56 <
57 <
58 < void ParticleTreeDrawer::printInfo( const Candidate & c ) const {
59 <  if ( printP4_ ) cout << " (" << c.px() << ", " << c.py() << ", " << c.pz() << "; " << c.energy() << ")";
60 <  if ( printPtEtaPhi_ ) cout << " [" << c.pt() << ": " << c.eta() << ", " << c.phi() << "]";
61 <  if ( printVertex_ ) cout << " {" << c.vx() << ", " << c.vy() << ", " << c.vz() << "}";
62 <  if ( printStatus_ ) cout << "{status: " << c.status() << "}";
63 <  if ( printIndex_ ) {
64 <    int idx = -1;
65 <    vector<const Candidate *>::const_iterator found = find( cands_.begin(), cands_.end(), & c );
66 <    if ( found != cands_.end() ) {
67 <      idx = found - cands_.begin();
68 <      cout << " <idx: " << idx << ">";
69 <    }
70 <  }
71 < }
72 <
73 < void ParticleTreeDrawer::printDecay( const Candidate & c, const string & pre ) const {
74 <  int id = c.pdgId();
75 <  const ParticleData * pd = pdt_->particle( id );  
76 <  cout << (pd != 0? pd->name():"???");
77 <  //cout << endl;
78 <  printInfo( c );
79 <  cout << endl;
80 <
81 <  size_t ndau = c.numberOfDaughters(), validDau = 0;
82 <  for( size_t i = 0; i < ndau; ++ i )
83 <    if ( accept( * c.daughter( i ) ) )
84 <      ++ validDau;
85 <    if ( validDau == 0 ) return;
86 <  
87 <  bool lastLevel = true;
88 <  for( size_t i = 0; i < ndau; ++ i ) {
89 <    if ( hasValidDaughters( * c.daughter( i ) ) ) {
90 <      lastLevel = false;
91 <      break;
92 <    }      
93 <  }
94 <  
95 <  if ( lastLevel ) {
96 <    cout << pre << "+-> ";
97 <    size_t vd = 0;
98 <    for( size_t i = 0; i < ndau; ++ i ) {
99 <      const Candidate * d = c.daughter( i );
100 <      if ( accept( * d ) ) {
101 <        const ParticleData * pd = pdt_->particle( d->pdgId() );  
102 <        cout << (pd != 0? pd->name():"???") << endl;
103 <        printInfo( * d );
104 <        if ( vd != validDau - 1 )
105 <          cout << " ";
106 <        vd ++;
107 <      }
108 <    }
109 <    cout << endl;
110 <    return;
111 <  }
112 <
113 <  for( size_t i = 0; i < ndau; ++i ) {
114 <    const Candidate * d = c.daughter( i );
115 <    assert( d != 0 );
116 <    if ( accept( * d ) ) {
117 <      cout << pre << "+-> ";
118 <      string prepre( pre );
119 <      if ( i == ndau - 1 ) prepre += "    ";
120 <      else prepre += "|   ";
121 <      printDecay( * d, prepre );
122 <    }
123 <  }
9 > ParticleTreeDrawer::ParticleTreeDrawer(const edm::ParameterSet & config, const edm::ParameterSet & producersNames) :
10 >   allowMissingCollection_(producersNames.getUntrackedParameter<bool>("allowMissingCollection", false) ),
11 >   src_( producersNames.getParameter<InputTag>( "genParticlesProducer" ) ),
12 >   printP4_( config.getUntrackedParameter<bool>( "mcTreePrintP4", false ) ),
13 >   printPtEtaPhi_( config.getUntrackedParameter<bool>( "mcTreePrintPtEtaPhi", false ) ),
14 >   printVertex_( config.getUntrackedParameter<bool>( "mcTreePrintVertex", false ) ),
15 >   printStatus_( config.getUntrackedParameter<bool>( "mcTreePrintStatus", false ) ),
16 >   printIndex_( config.getUntrackedParameter<bool>( "mcTreePrintIndex", false ) ),
17 >   status_( config.getUntrackedParameter<vint>( "mcTreeStatus", vint() ) )
18 > {
19 > }
20 >
21 >
22 > bool ParticleTreeDrawer::accept( const reco::Candidate & c ) const
23 > {
24 >   if ( status_.size() == 0 ) return true;
25 >   return find( status_.begin(), status_.end(), c.status() ) != status_.end();
26 > }
27 >
28 >
29 > bool ParticleTreeDrawer::hasValidDaughters( const reco::Candidate & c ) const
30 > {
31 >   size_t ndau = c.numberOfDaughters();
32 >   for( size_t i = 0; i < ndau; ++ i )
33 >   {
34 >      if ( accept( * c.daughter( i ) ) ) return true;
35 >   }
36 >   return false;
37   }
38  
39 +
40 + bool ParticleTreeDrawer::analyze( const Event & event, const EventSetup & es )
41 + {
42 +   try
43 +   {
44 +      es.getData( pdt_ );
45 +      edm::Handle<View<Candidate> > particles;
46 +      event.getByLabel( src_, particles );
47 +      cands_.clear();
48 +      for( View<Candidate>::const_iterator p = particles->begin(); p != particles->end(); ++ p )
49 +      {
50 +         cands_.push_back( & * p );
51 +      }
52 +      for( View<Candidate>::const_iterator p = particles->begin(); p != particles->end(); ++ p )
53 +      {
54 +         if ( accept( * p ) )
55 +         {
56 +            if ( p->mother() == 0 )
57 +            {
58 +               cout << "-- decay tree: --" << endl;
59 +               printDecay( * p, "" );
60 +            }
61 +         }
62 +      }
63 +   }
64 +   catch (cms::Exception& exception)
65 +   {
66 +      if ( !allowMissingCollection_ )
67 +      {
68 +         cout << "  ##### ERROR IN  ParticleTreeDrawer::analyze => No genParticles #####"<<endl;
69 +         throw exception;
70 +      }
71 +      return false;
72 +   }
73 +  
74 +   return true;
75 + }
76 +
77 +
78 + void ParticleTreeDrawer::printInfo( const Candidate & c ) const
79 + {
80 +   if ( printP4_ ) cout << " (" << c.px() << ", " << c.py() << ", " << c.pz() << "; " << c.energy() << ")";
81 +   if ( printPtEtaPhi_ ) cout << " [" << c.pt() << ": " << c.eta() << ", " << c.phi() << "]";
82 +   if ( printVertex_ ) cout << " {" << c.vx() << ", " << c.vy() << ", " << c.vz() << "}";
83 +   if ( printStatus_ ) cout << "{status: " << c.status() << "}";
84 +   if ( printIndex_ ) {
85 +      int idx = -1;
86 +      vector<const Candidate *>::const_iterator found = find( cands_.begin(), cands_.end(), & c );
87 +      if ( found != cands_.end() )
88 +      {
89 +         idx = found - cands_.begin();
90 +         cout << " <idx: " << idx << ">";
91 +      }
92 +   }
93 + }
94 +
95 +
96 + void ParticleTreeDrawer::printDecay( const Candidate & c, const string & pre ) const
97 + {
98 +   int id = c.pdgId();
99 +   const ParticleData * pd = pdt_->particle( id );
100 +   cout << (pd != 0? pd->name():"???");
101 +   printInfo( c );
102 +   cout << endl;
103 +  
104 +   size_t ndau = c.numberOfDaughters(), validDau = 0;
105 +   for( size_t i = 0; i < ndau; ++ i )
106 +   {
107 +      if ( accept( * c.daughter( i ) ) ) ++ validDau;
108 +   }
109 +   if ( validDau == 0 ) return;
110 +  
111 +   bool lastLevel = true;
112 +   for( size_t i = 0; i < ndau; ++ i )
113 +   {
114 +      if ( hasValidDaughters( * c.daughter( i ) ) )
115 +      {
116 +         lastLevel = false;
117 +         break;
118 +      }
119 +   }
120 +  
121 +   if ( lastLevel )
122 +   {
123 +      cout << pre << "+-> ";
124 +      size_t vd = 0;
125 +      for( size_t i = 0; i < ndau; ++ i )
126 +      {
127 +         const Candidate * d = c.daughter( i );
128 +         if ( accept( * d ) )
129 +         {
130 +            const ParticleData * pd = pdt_->particle( d->pdgId() );
131 +            cout << (pd != 0? pd->name():"???") << endl;
132 +            printInfo( * d );
133 +            if ( vd != validDau - 1 ) cout << " ";
134 +            vd ++;
135 +         }
136 +      }
137 +      cout << endl;
138 +      return;
139 +   }
140 +  
141 +   for( size_t i = 0; i < ndau; ++i )
142 +   {
143 +      const Candidate * d = c.daughter( i );
144 +      assert( d != 0 );
145 +      if ( accept( * d ) )
146 +      {
147 +         cout << pre << "+-> ";
148 +         string prepre( pre );
149 +         if ( i == ndau - 1 ) prepre += "    ";
150 +         else prepre += "|   ";
151 +         printDecay( * d, prepre );
152 +      }
153 +   }
154 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines