CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/RecoParticleFlow/PFRootEvent/src/PFRootEventManagerColin.cc

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   //   readOptions(file, false, false);
00019   
00020   // book histos here
00021   //   neutralEvent_ = new NeutralEvent();  
00022 
00023 
00024   //   tauEvent_ = new TauEvent();  
00025   //   outTree_ = new TTree("Tau","");
00026   //   outTree_->Branch("event","TauEvent", &tauEvent_,32000,2);
00027 
00028   readSpecificOptions(file);
00029 
00030 }
00031 
00032 PFRootEventManagerColin::~PFRootEventManagerColin() {
00033 
00034   //   delete event_;
00035   //   delete outTree_;
00036 }
00037 
00038 
00039 void PFRootEventManagerColin::readSpecificOptions(const char* file) {
00040 
00041 
00042 
00043   cout<<"calling PFRootEventManagerColin::readSpecificOptions"<<endl; 
00044   //   PFRootEventManager::readOptions(file, refresh, reconnect);
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     // cerr<<"event was not accepted"<<endl;
00083     // print();
00084     tauEvent_->rCode = 10;
00085     return false; // event not accepted
00086   }
00087 
00088   bool rvalue = false;
00089   switch(mode_) {
00090   case Neutral:
00091     // cout<<"colin: process Neutral"<<endl;
00092     rvalue = processNeutral();
00093     break;
00094   case HIGH_E_TAUS:
00095     // cout<<"colin: process highETaus"<<endl;
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   //   else {
00119   //     cerr<<"event accepted"<<endl;
00120   //   }
00121   
00122   //   if( ! ( (*clustersECAL_).size() <= 1 && 
00123   //      (*clustersHCAL_).size() <= 1 ) ) {
00124   //     cerr<<"wrong number of ECAL or HCAL clusters :"
00125   //    <<(*clustersECAL_).size()<<","<<(*clustersHCAL_).size()<<endl;
00126   //     return false; 
00127   //   }
00128   // 1 HCAL cluster
00129   
00130   neutralEvent_->reset();
00131   
00132   // particle
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   // take first particle  
00146   const HepMC::GenParticle* particle = *(myGenEvent->particles_begin() );
00147   
00148   // and check that it's a K0L 
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   // look for the closest ECAL cluster from the particle.
00164 
00165   double minDist2 = 9999999;
00166   // int iClosest = -1;
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   // true info 
00196   // 1 charged hadron, 2 photons
00197   // save charged part mom, save sum E photons
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     // cout<<i<<" "<<part<<endl;
00223   }
00224 
00225 
00226   // one has to select 1 charged and 2 photons 
00227   // to use this function.
00228 
00229   // even after filtering events with one stable charged particle,
00230   // this particle can be a lepton (eg leptonic pion decay)
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   //  tauEvent_->eEcalHadron = trueParticles_[iHadron].ecalEnergy();
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   //   if( tauEvent_->eNeutral > 0.1* tauEvent_->pHadron ) {
00254   //     print();
00255   //   }
00256 
00257 
00258   // check that there is 
00259   // only one track
00260   // 0 or 1 ecal cluster
00261   // 0 or 1 hcal cluster
00262 
00263   if( recTracks_.size() != 1 ) {
00264     //     cout<<"more than 1 track"<<endl;
00265     tauEvent_->rCode = 1;
00266     return false;
00267   }
00268   if( clustersECAL_->size() > 1 ) {
00269     //     cout<<"more than 1 ecal cluster"<<endl;
00270     tauEvent_->rCode = 2;
00271     // return false;
00272   }
00273   if( clustersHCAL_->size() > 1 ) {
00274     //     cout<<"more than 1 hcal cluster"<<endl;
00275     tauEvent_->rCode = 3;
00276     return false;
00277   }
00278   // save track mom + neutral info.
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   // access blocks
00285 
00286   // take the track block
00287 
00288   // look for the closest associated ecal and hcal clusters
00289 
00290   // fill the tree
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     // look for the track
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; // no track, or too many tracks in the block
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 ) { // closest ecal
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 ) { // closest hcal
00348           assert( !clusterRef.isNull() );
00349           tauEvent_->eHCAL = clusterRef->energy();
00350           tauEvent_->etaHCAL = clusterRef->position().Eta();
00351           tauEvent_->nHCAL++;
00352         }
00353       } 
00354     } // eles associated to the track
00355   } // blocks
00356 
00357 
00358 
00359 
00360   return false;    
00361 }
00362 
00363 
00364 
00365 
00366 void PFRootEventManagerColin::write() {
00367   // write histos here
00368   outFile_->cd();
00369   outTreeMy_->Write();
00370 
00371   PFRootEventManager::write();
00372 }
00373