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.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 |
|