ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/ParticleTreeDrawer.cc
Revision: 1.5
Committed: Wed Mar 11 12:44:56 2009 UTC (16 years, 1 month ago) by lethuill
Content type: text/plain
Branch: MAIN
CVS Tags: JeSuisBeaucoupPlusGrosQunReco_2_2_7_01, RecoPhoton_2_2_7_02, pat_2_2_7_01, RecoPhoton_2_2_7_01, pat_2_2_5_03, pat_2_2_5_02, pat_2_2_5_01
Changes since 1.4: +1 -1 lines
Log Message:
Transition to 2.2.X

File Contents

# Content
1 #include "../interface/ParticleTreeDrawer.h"
2
3 using namespace std;
4 using namespace edm;
5 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 }
124 }
125