ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Morgan/src/ParticleTreeDrawer.cc
Revision: 1.3
Committed: Wed Nov 19 19:03:16 2008 UTC (16 years, 5 months ago) by lethuill
Content type: text/plain
Branch: MAIN
CVS Tags: Common-2008_11_24, Common-2008_11_19
Changes since 1.2: +102 -91 lines
Log Message:
First skeleton for common code

File Contents

# User Rev Content
1 mlethuil 1.1 #include "UserCode/Morgan/interface/ParticleTreeDrawer.h"
2    
3     using namespace std;
4     using namespace edm;
5     using namespace reco;
6     using namespace HepMC;
7    
8    
9 lethuill 1.3 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 mlethuil 1.1 {
18     }
19    
20 lethuill 1.3
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 mlethuil 1.1 }
25    
26    
27 lethuill 1.3 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 mlethuil 1.1
35    
36 lethuill 1.3 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 mlethuil 1.1 }
53 lethuill 1.3 }
54     }
55    
56 mlethuil 1.1
57 lethuill 1.3
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 mlethuil 1.1 }
70 lethuill 1.3 }
71 mlethuil 1.1 }
72    
73 lethuill 1.3 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 mlethuil 1.1
113 lethuill 1.3 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 mlethuil 1.1