9 #include "UTIL/LCRelationNavigator.h"
10 #include <EVENT/LCCollection.h>
11 #include <EVENT/MCParticle.h>
12 #include <EVENT/ReconstructedParticle.h>
13 #include <gearimpl/Vector3D.h>
15 #ifdef MARLIN_USE_AIDA
16 #include <marlin/AIDAProcessor.h>
19 using namespace lcio ;
20 using namespace marlin ;
28 _description =
"MCTruthJetEnergy calculates the MC truth jet energy of the MCParticles "
29 "associated to the reconstructed particles in the jet" ;
35 jCols.push_back(
"FTSelected_2Jets") ;
36 jCols.push_back(
"FTSelected_3Jets") ;
37 jCols.push_back(
"FTSelected_4Jets") ;
38 jCols.push_back(
"FTSelected_5Jets") ;
39 jCols.push_back(
"FTSelected_6Jets") ;
42 registerInputCollections( LCIO::RECONSTRUCTEDPARTICLE,
43 "JetCollectionNames" ,
44 "Names of the Jet collections" ,
48 registerInputCollection( LCIO::LCRELATION,
49 "MCTruthRelationName" ,
50 "Name of the ReconstructedParticle-MCParticle relation collection" ,
52 std::string(
"RecoMCTruthLink") ) ;
67 #ifdef MARLIN_USE_AIDA
73 _jetEnergyHists.resize( nCol ) ;
75 for(
int i=0 ; i < nCol ; i++ ) {
77 std::stringstream str ;
80 _jetEnergyHists[ i ] = AIDAProcessor::histogramFactory(
this)->
81 createHistogram1D( str.str().c_str() ,
"jet energy / Gev ] ", 50 , 0. , 500. ) ;
86 _jetEnergyTruthReco = AIDAProcessor::histogramFactory(
this)->
87 createHistogram2D(
"EJetTruthVsRec ",
" jet energy Reconstructed vs MCTruth",
106 for(
int i=0 ; i < nCol ; ++i ){
108 LCCollection* jetcol = 0 ;
115 catch( lcio::DataNotAvailableException& ){
117 streamlog_out( WARNING ) <<
" collection " <<
_jetcolNames[i] <<
" not found ! " << std::endl ;
123 LCCollection* relcol = evt->getCollection(
_relName ) ;
126 int nJETS = jetcol->getNumberOfElements() ;
128 streamlog_out(DEBUG1) <<
" found " << nJETS <<
" jets in event "
129 << evt->getEventNumber() <<
" in run " << evt->getRunNumber()
133 LCRelationNavigator rel(relcol) ;
138 FloatVec jetEnergies ;
140 for(
int j=0; j< nJETS ; j++){
142 ReconstructedParticle* jet =
dynamic_cast<ReconstructedParticle*
>( jetcol->getElementAt( j ) ) ;
145 streamlog_out(DEBUG0) <<
" jet energy = " << jet->getEnergy() << std::endl ;
147 int nPart = jet->getParticles().size();
151 std::set< MCParticle* > mcpset;
152 std::set< MCParticle* >::iterator mcpsetiter;
154 for(
int k=0;
k< nPart ;
k++){
156 const LCObjectVec& mcpvec = rel.getRelatedToObjects( jet->getParticles()[
k] ) ;
159 if( mcpvec.size() > 0 && mcpvec[0] != 0 ){
161 MCParticle* mcp =
dynamic_cast<MCParticle*
>( mcpvec[0] ) ;
164 mcpset.insert( mcp );
168 ReconstructedParticle* p =
dynamic_cast<ReconstructedParticle*
>( jet->getParticles()[
k] ) ;
170 gear::Vector3D v( p->getMomentum()[0] , p->getMomentum()[1] , p->getMomentum()[2] ) ;
172 streamlog_out(DEBUG) <<
" found broken MCParticle link for particle [E:"
173 << p->getEnergy() <<
"]"
174 <<
" theta: " << ( v.theta() * 180. / 3.141592 )
175 <<
" charge: " << p->getCharge()
176 <<
" nDaught: " << p->getParticles().size()
183 double mcJetEnergy = 0;
185 for ( mcpsetiter = mcpset.begin( ); mcpsetiter != mcpset.end( ); mcpsetiter++ ){
187 mcJetEnergy += (*mcpsetiter)->getEnergy();
190 streamlog_out(DEBUG0) <<
"MC particle jet energy:" << mcJetEnergy << std::endl ;
192 jetEnergies.push_back( mcJetEnergy ) ;
198 jetcol->parameters().setValues(
"MCTruthJetEnergies", jetEnergies ) ;
203 if (
_nEvt % 100 == 0){
205 streamlog_out(MESSAGE2) <<
"processed event/run " << evt->getEventNumber()
206 <<
" / " << evt->getRunNumber()
218 #ifdef MARLIN_USE_AIDA
226 for(
int i=0 ; i < nCol ; ++i ) {
228 LCCollection* jetcol = 0 ;
235 catch( lcio::DataNotAvailableException& ){
237 streamlog_out( WARNING ) <<
" collection " <<
_jetcolNames[i] <<
" not found ! " << std::endl ;
245 FloatVec jetEnergies ;
246 jetcol->getParameters().getFloatVals(
"MCTruthJetEnergies" , jetEnergies) ;
248 int nJETS = jetcol->getNumberOfElements() ;
250 if( jetEnergies.size() != unsigned( nJETS ) ){
252 streamlog_out( WARNING ) <<
" wrong number of jet energy values in 'MCTruthJetEnergies' : "
253 << jetEnergies.size() <<
" with " << nJETS <<
" jets in the collection ! "
259 for(
int j=0; j< nJETS ; j++){
261 ReconstructedParticle* jet =
dynamic_cast<ReconstructedParticle*
>( jetcol->getElementAt( j ) ) ;
264 _jetEnergyHists[ i ]->fill( jet->getEnergy() ) ;
266 _jetEnergyTruthReco->fill( jetEnergies[j] , jet->getEnergy() ) ;
virtual void check(LCEvent *evt)
CLHEP::Hep3Vector Vector3D
virtual void processEvent(LCEvent *evt)
Called for every event - the working horse.
Calculates the true jet energy from MCParticles.
MCTruthJetEnergy aMCTruthJetEnergy
StringVec _jetcolNames
Input collection name.
virtual void end()
Called after data processing for clean up.
virtual void processRunHeader(LCRunHeader *run)
Called for every run.
virtual void init()
Called at the begin of the job before anything is read.
std::vector< std::string > StringVec