Go to the documentation of this file.00001 #include "RecoParticleFlow/PFRootEvent/interface/PFRootEventManagerColin.h"
00002 #include "RecoParticleFlow/PFRootEvent/interface/IO.h"
00003
00004 #include "TTree.h"
00005 #include "TFile.h"
00006
00007 #include <iostream>
00008
00009 using namespace std;
00010
00011 PFRootEventManagerColin::PFRootEventManagerColin(const char* file)
00012 : PFRootEventManager(file) {
00013
00014 tauEvent_ = 0;
00015 neutralEvent_ = 0;
00016 outTreeMy_ = 0;
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 readSpecificOptions(file);
00029
00030 }
00031
00032 PFRootEventManagerColin::~PFRootEventManagerColin() {
00033
00034
00035
00036 }
00037
00038
00039 void PFRootEventManagerColin::readSpecificOptions(const char* file) {
00040
00041
00042
00043 cout<<"calling PFRootEventManagerColin::readSpecificOptions"<<endl;
00044
00045
00046
00047 options_->GetOpt("colin", "mode", mode_);
00048
00049 if(outTreeMy_) delete outTreeMy_;
00050
00051 outFile_->cd();
00052 switch(mode_) {
00053 case Neutral:
00054 cout<<"colin: Neutral mode"<<endl;
00055 neutralEvent_ = new NeutralEvent();
00056 outTreeMy_ = new TTree("Neutral","");
00057 outTreeMy_->Branch("event","NeutralEvent", &neutralEvent_,32000,2);
00058 gDirectory->ls();
00059 break;
00060 case HIGH_E_TAUS:
00061 cout<<"colin: highETaus mode"<<endl;
00062 tauEvent_ = new TauEvent();
00063 outTreeMy_ = new TTree("Tau","");
00064 outTreeMy_->Branch("event","TauEvent", &tauEvent_,32000,2);
00065 gDirectory->ls();
00066 break;
00067 default:
00068 cerr<<"colin: undefined mode"<<endl;
00069 exit(1);
00070 }
00071 }
00072
00073
00074
00075
00076
00077 bool PFRootEventManagerColin::processEntry(int entry) {
00078
00079 tauEvent_->reset();
00080
00081 if( ! PFRootEventManager::processEntry(entry) ) {
00082
00083
00084 tauEvent_->rCode = 10;
00085 return false;
00086 }
00087
00088 bool rvalue = false;
00089 switch(mode_) {
00090 case Neutral:
00091
00092 rvalue = processNeutral();
00093 break;
00094 case HIGH_E_TAUS:
00095
00096 rvalue = processHIGH_E_TAUS();
00097 break;
00098 default:
00099 cerr<<"colin: undefined mode"<<endl;
00100 assert(0);
00101 }
00102 outTreeMy_->Fill();
00103
00104
00105 outTreeMy_->Fill();
00106
00107
00108 outTreeMy_->Fill();
00109
00110
00111 return rvalue;
00112 }
00113
00114
00115
00116
00117 bool PFRootEventManagerColin::processNeutral() {
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 neutralEvent_->reset();
00131
00132
00133
00134 const HepMC::GenEvent* myGenEvent = MCTruth_.GetEvent();
00135 if(!myGenEvent) {
00136 assert(0);
00137 }
00138
00139 if( myGenEvent->particles_size() != 1 ) {
00140 cerr<<"wrong number of particles:"
00141 <<myGenEvent->particles_size()<<endl;
00142 return 0;
00143 }
00144
00145
00146 const HepMC::GenParticle* particle = *(myGenEvent->particles_begin() );
00147
00148
00149 if( particle->pdg_id() != 130 ) {
00150 cerr<<"not a K0L : "<<particle->pdg_id()<<endl;
00151 return false;
00152 }
00153
00154 neutralEvent_->eNeutral = particle->momentum().e();
00155
00156 double eta = particle->momentum().eta();
00157 double phi = particle->momentum().phi();
00158 neutralEvent_->etaNeutral = eta;
00159
00160
00161 neutralEvent_->nECAL = (*clustersECAL_).size();
00162
00163
00164
00165 double minDist2 = 9999999;
00166
00167 for( unsigned i=0; i<(*clustersECAL_).size(); ++i) {
00168 double deta = (*clustersECAL_)[i].position().Eta() - eta;
00169 double dphi = (*clustersECAL_)[i].position().Phi() - phi;
00170 double dist2 = deta*deta + dphi*dphi;
00171 if(dist2 < minDist2) {
00172 minDist2 = dist2;
00173 neutralEvent_->eECAL = (*clustersECAL_)[i].energy();
00174 }
00175 }
00176
00177
00178 neutralEvent_->nHCAL = (*clustersHCAL_).size();
00179 if( (*clustersHCAL_).size() == 1 ) {
00180 neutralEvent_->eHCAL = (*clustersHCAL_)[0].energy();
00181 }
00182
00183
00184 outTreeMy_->Fill();
00185
00186 if( neutralEvent_->nECAL<1 && neutralEvent_->eNeutral<1 )
00187 return true;
00188 else return false;
00189 }
00190
00191
00192 bool PFRootEventManagerColin::processHIGH_E_TAUS() {
00193
00194
00195
00196
00197
00198
00199
00200 int iHadron = -1;
00201 int iPi0 = -1;
00202 unsigned nStableChargedHadrons=0;
00203 unsigned nPi0=0;
00204 for(unsigned i=0; i<trueParticles_.size(); i++) {
00205
00206 const reco::PFSimParticle& part = trueParticles_[i];
00207
00208 int pdgCode = part.pdgCode();
00209 double charge = part.charge();
00210
00211 if( std::abs(pdgCode) > 100 &&
00212 charge !=0 &&
00213 part.daughterIds().empty() ) {
00214 nStableChargedHadrons++;
00215 iHadron = i;
00216 }
00217 else if( std::abs(pdgCode)==111) {
00218 nPi0++;
00219 iPi0 = i;
00220 }
00221
00222
00223 }
00224
00225
00226
00227
00228
00229
00230
00231 if( nStableChargedHadrons==0 ) {
00232 tauEvent_->rCode = 4;
00233 return false;
00234 }
00235 assert( nStableChargedHadrons==1 );
00236
00237
00238
00239 double pHadron = trueParticles_[iHadron].extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach ).momentum().P();
00240 tauEvent_->pHadron = pHadron;
00241
00242
00243
00244 if(nPi0 == 1) {
00245 math::XYZTLorentzVector pi0mom = trueParticles_[iPi0].extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach ).momentum();
00246 tauEvent_->eNeutral = pi0mom.E();
00247 tauEvent_->etaNeutral = pi0mom.Eta();
00248 }
00249 else {
00250 tauEvent_->eNeutral = 0;
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 if( recTracks_.size() != 1 ) {
00264
00265 tauEvent_->rCode = 1;
00266 return false;
00267 }
00268 if( clustersECAL_->size() > 1 ) {
00269
00270 tauEvent_->rCode = 2;
00271
00272 }
00273 if( clustersHCAL_->size() > 1 ) {
00274
00275 tauEvent_->rCode = 3;
00276 return false;
00277 }
00278
00279
00280 tauEvent_->pTrack = recTracks_[0].extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach ).momentum().P();
00281 tauEvent_->ptTrack = recTracks_[0].extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach ).momentum().Pt();
00282 tauEvent_->etaTrack = recTracks_[0].extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach ).momentum().Eta();
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295 for(unsigned i=0; i<pfBlocks_->size(); i++) {
00296 const reco::PFBlock& block = (*pfBlocks_)[i];
00297
00298 const edm::OwnVector< reco::PFBlockElement >&
00299 elements = block.elements();
00300
00301
00302 int iTrack = -1;
00303 unsigned nTracks = 0;
00304 for(unsigned ie=0; ie<elements.size(); ie++) {
00305 if(elements[ie].type() == reco::PFBlockElement::TRACK ) {
00306 iTrack = ie;
00307 nTracks++;
00308 }
00309 }
00310
00311 if(nTracks!=1) continue;
00312
00313 std::multimap<double, unsigned> sortedElems;
00314 block.associatedElements( iTrack,
00315 block.linkData(),
00316 sortedElems );
00317
00318 tauEvent_->nECAL=0;
00319 tauEvent_->nHCAL=0;
00320
00321 typedef std::multimap<double, unsigned>::iterator IE;
00322 for(IE ie = sortedElems.begin(); ie != sortedElems.end(); ++ie ) {
00323
00324
00325 double chi2 = ie->first;
00326 unsigned index = ie->second;
00327
00328 reco::PFBlockElement::Type type = elements[index].type();
00329
00330 reco::PFClusterRef clusterRef = elements[index].clusterRef();
00331
00332
00333
00334
00335 if( type == reco::PFBlockElement::ECAL ) {
00336 if(!tauEvent_->nECAL ) {
00337 assert( !clusterRef.isNull() );
00338 tauEvent_->eECAL = clusterRef->energy();
00339 tauEvent_->etaECAL = clusterRef->position().Eta();
00340 tauEvent_->chi2ECAL = chi2;
00341 tauEvent_->nECAL++;
00342 }
00343 }
00344
00345
00346 else if( type == reco::PFBlockElement::HCAL ) {
00347 if(!tauEvent_->nHCAL ) {
00348 assert( !clusterRef.isNull() );
00349 tauEvent_->eHCAL = clusterRef->energy();
00350 tauEvent_->etaHCAL = clusterRef->position().Eta();
00351 tauEvent_->nHCAL++;
00352 }
00353 }
00354 }
00355 }
00356
00357
00358
00359
00360 return false;
00361 }
00362
00363
00364
00365
00366 void PFRootEventManagerColin::write() {
00367
00368 outFile_->cd();
00369 outTreeMy_->Write();
00370
00371 PFRootEventManager::write();
00372 }
00373