ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/ParticleTreeDrawer.cc
Revision: 1.6
Committed: Wed Jun 10 11:17:06 2009 UTC (15 years, 10 months ago) by lethuill
Content type: text/plain
Branch: MAIN
CVS Tags: all_3_3_2_01, all_3_2_5_02, all_3_2_5_01, all_2_2_9_03, all_2_2_9_02, all_2_2_9_01, HEAD
Branch point for: CMSSW_2_2_X_br
Changes since 1.5: +144 -115 lines
Log Message:
Better protection against missing collection / Cleaning data format selection / Last iteration for migration to PAT of Photons

File Contents

# User Rev Content
1 lethuill 1.4 #include "../interface/ParticleTreeDrawer.h"
2 mlethuil 1.1
3     using namespace std;
4     using namespace edm;
5     using namespace reco;
6 lethuill 1.5 //using namespace HepMC;
7 mlethuil 1.1
8    
9 lethuill 1.6 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 lethuill 1.3 const Candidate * d = c.daughter( i );
144 lethuill 1.6 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 lethuill 1.3 }