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