CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoJets/JetPlusTracks/plugins/JetPlusTrackProducer.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    JetPlusTracks
00004 // Class:      JetPlusTrackProducer
00005 // 
00013 //
00014 // Original Author:  Olga Kodolova,40 R-A12,+41227671273,
00015 //         Created:  Fri Feb 19 10:14:02 CET 2010
00016 // $Id: JetPlusTrackProducer.cc,v 1.9 2013/04/30 09:02:46 kodolova Exp $
00017 //
00018 //
00019 
00020 
00021 // system include files
00022 #include <memory>
00023 
00024 // user include files
00025 #include "FWCore/Framework/interface/Frameworkfwd.h"
00026 #include "FWCore/Framework/interface/EDProducer.h"
00027 
00028 #include "FWCore/Framework/interface/Event.h"
00029 #include "FWCore/Framework/interface/MakerMacros.h"
00030 
00031 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00032 
00033 #include "RecoJets/JetPlusTracks/plugins/JetPlusTrackProducer.h"
00034 #include "DataFormats/JetReco/interface/CaloJetCollection.h"
00035 #include "DataFormats/JetReco/interface/CaloJet.h"
00036 #include "DataFormats/JetReco/interface/JPTJetCollection.h"
00037 #include "DataFormats/JetReco/interface/JPTJet.h"
00038 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00039 #include "DataFormats/TrackReco/interface/Track.h"
00040 #include "DataFormats/JetReco/interface/Jet.h"
00041 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00042 #include "DataFormats/VertexReco/interface/Vertex.h"
00043 #include "DataFormats/Math/interface/deltaPhi.h"
00044 #include "DataFormats/Math/interface/deltaR.h"
00045 
00046 #include <string>
00047 
00048 using namespace std;
00049 using namespace jpt;
00050 
00051 //
00052 // constants, enums and typedefs
00053 //
00054 
00055 
00056 //
00057 // static data member definitions
00058 //
00059 
00060 //
00061 // constructors and destructor
00062 //
00063 JetPlusTrackProducer::JetPlusTrackProducer(const edm::ParameterSet& iConfig)
00064 {
00065    //register your products
00066    src = iConfig.getParameter<edm::InputTag>("src");
00067    alias = iConfig.getUntrackedParameter<string>("alias");
00068    srcPVs_ = iConfig.getParameter<edm::InputTag>("srcPVs");
00069    vectorial_ = iConfig.getParameter<bool>("VectorialCorrection");
00070    useZSP = iConfig.getParameter<bool>("UseZSP");
00071    ptCUT = iConfig.getParameter<double>("ptCUT");
00072    mJPTalgo  = new JetPlusTrackCorrector(iConfig);
00073    if(useZSP) mZSPalgo  = new ZSPJPTJetCorrector(iConfig);
00074  
00075    produces<reco::JPTJetCollection>().setBranchAlias(alias); 
00076    
00077 }
00078 
00079 
00080 JetPlusTrackProducer::~JetPlusTrackProducer()
00081 {
00082  
00083    // do anything here that needs to be done at desctruction time
00084    // (e.g. close files, deallocate resources etc.)
00085 
00086 }
00087 
00088 
00089 //
00090 // member functions
00091 //
00092 
00093 // ------------ method called to produce the data  ------------
00094 void
00095 JetPlusTrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00096 {
00097    using namespace edm; 
00098 
00099 
00100 //  std::cout<<" RecoJets::JetPlusTrackProducer::produce "<<std::endl;
00101 
00102 
00103 // get stuff from Event
00104   edm::Handle <edm::View <reco::CaloJet> > jets_h;
00105   iEvent.getByLabel (src, jets_h);
00106 
00107 //  std::auto_ptr<reco::CaloJetCollection> pOut(new reco::CaloJetCollection());
00108   std::auto_ptr<reco::JPTJetCollection> pOut(new reco::JPTJetCollection());
00109 
00110   for (unsigned i = 0; i < jets_h->size(); ++i) {
00111 
00112    const reco::CaloJet* oldjet = &(*(jets_h->refAt(i)));
00113    
00114    reco::CaloJet corrected = *oldjet; 
00115    
00116 // ZSP corrections    
00117 
00118    double factorZSP = 1.;
00119    if(useZSP) factorZSP = mZSPalgo->correction(corrected, iEvent, iSetup);
00120 
00121    corrected.scaleEnergy (factorZSP);
00122 
00123 // JPT corrections 
00124 
00125    double scaleJPT = 1.; 
00126 
00127    math::XYZTLorentzVector p4;
00128 
00129   jpt::MatchedTracks pions;
00130   jpt::MatchedTracks muons;
00131   jpt::MatchedTracks elecs;
00132   bool ok=false;
00133 
00134    if ( !vectorial_ ) {
00135             
00136      scaleJPT = mJPTalgo->correction ( corrected, *oldjet, iEvent, iSetup, pions, muons, elecs,ok );
00137    p4 = math::XYZTLorentzVector( corrected.px()*scaleJPT, 
00138                                  corrected.py()*scaleJPT,
00139                                  corrected.pz()*scaleJPT, 
00140                                  corrected.energy()*scaleJPT );
00141    } else {
00142      scaleJPT = mJPTalgo->correction( corrected, *oldjet, iEvent, iSetup, p4, pions, muons, elecs,ok );
00143   }         
00144 
00145    
00146   reco::JPTJet::Specific specific;
00147 
00148   if(ok) {
00149     specific.pionsInVertexInCalo = pions.inVertexInCalo_;
00150     specific.pionsInVertexOutCalo = pions.inVertexOutOfCalo_;
00151     specific.pionsOutVertexInCalo = pions.outOfVertexInCalo_;
00152     specific.muonsInVertexInCalo = muons.inVertexInCalo_;
00153     specific.muonsInVertexOutCalo = muons.inVertexOutOfCalo_;
00154     specific.muonsOutVertexInCalo = muons.outOfVertexInCalo_;
00155     specific.elecsInVertexInCalo = elecs.inVertexInCalo_;
00156     specific.elecsInVertexOutCalo = elecs.inVertexOutOfCalo_;
00157     specific.elecsOutVertexInCalo = elecs.outOfVertexInCalo_;
00158   }
00159 
00160 // Fill JPT Specific
00161     edm::RefToBase<reco::Jet> myjet = (edm::RefToBase<reco::Jet>)jets_h->refAt(i);
00162     specific.theCaloJetRef = myjet;
00163     specific.mZSPCor = factorZSP;
00164     specific.mResponseOfChargedWithEff = (float)mJPTalgo->getResponseOfChargedWithEff();
00165     specific.mResponseOfChargedWithoutEff = (float)mJPTalgo->getResponseOfChargedWithoutEff();
00166     specific.mSumPtOfChargedWithEff = (float)mJPTalgo->getSumPtWithEff();
00167     specific.mSumPtOfChargedWithoutEff = (float)mJPTalgo->getSumPtWithoutEff();
00168     specific.mSumEnergyOfChargedWithEff = (float)mJPTalgo->getSumEnergyWithEff();
00169     specific.mSumEnergyOfChargedWithoutEff = (float)mJPTalgo->getSumEnergyWithoutEff();
00170     specific.mChargedHadronEnergy = (float)mJPTalgo->getSumEnergyWithoutEff();
00171 
00172 // Fill Charged Jet shape parameters
00173    double deR2Tr = 0.;
00174    double deEta2Tr = 0.;
00175    double dePhi2Tr = 0.;
00176    double Zch = 0.;
00177    double Pout2 = 0.;
00178    double Pout = 0.;
00179    double denominator_tracks = 0.;
00180    int ntracks = 0;
00181 
00182    for( reco::TrackRefVector::const_iterator it = pions.inVertexInCalo_.begin(); it != pions.inVertexInCalo_.end(); it++) { 
00183     double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
00184     double deEta = (*it)->eta() - p4.eta();
00185     double dePhi = deltaPhi((*it)->phi(), p4.phi());
00186      if((**it).ptError()/(**it).pt() < 0.1) {
00187        deR2Tr   =  deR2Tr + deR*deR*(*it)->pt();
00188        deEta2Tr = deEta2Tr + deEta*deEta*(*it)->pt();
00189        dePhi2Tr = dePhi2Tr + dePhi*dePhi*(*it)->pt();
00190        denominator_tracks = denominator_tracks + (*it)->pt();
00191        Zch    =  Zch + (*it)->pt();
00192        
00193        Pout2 = Pout2 + (**it).p()*(**it).p() - (Zch*p4.P())*(Zch*p4.P());
00194        ntracks++;
00195      }
00196    }
00197 
00198 
00199 
00200    for( reco::TrackRefVector::const_iterator it = muons.inVertexInCalo_.begin(); it != muons.inVertexInCalo_.end(); it++) {
00201     double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
00202     double deEta = (*it)->eta() - p4.eta();
00203     double dePhi = deltaPhi((*it)->phi(), p4.phi());
00204      if((**it).ptError()/(**it).pt() < 0.1) {
00205        deR2Tr   =  deR2Tr + deR*deR*(*it)->pt();
00206        deEta2Tr = deEta2Tr + deEta*deEta*(*it)->pt();
00207        dePhi2Tr = dePhi2Tr + dePhi*dePhi*(*it)->pt();
00208        denominator_tracks = denominator_tracks + (*it)->pt();
00209        Zch    = Zch + (*it)->pt();
00210        
00211        Pout2 = Pout2 + (**it).p()*(**it).p() - (Zch*p4.P())*(Zch*p4.P());
00212        ntracks++;
00213      }
00214    }
00215    for( reco::TrackRefVector::const_iterator it = elecs.inVertexInCalo_.begin(); it != elecs.inVertexInCalo_.end(); it++) {
00216     double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
00217     double deEta = (*it)->eta() - p4.eta();
00218     double dePhi = deltaPhi((*it)->phi(), p4.phi());
00219      if((**it).ptError()/(**it).pt() < 0.1) {
00220        deR2Tr   =  deR2Tr + deR*deR*(*it)->pt();
00221        deEta2Tr = deEta2Tr + deEta*deEta*(*it)->pt();
00222        dePhi2Tr = dePhi2Tr + dePhi*dePhi*(*it)->pt();
00223        denominator_tracks = denominator_tracks + (*it)->pt();
00224        Zch    = Zch + (*it)->pt();
00225        
00226        Pout2 = Pout2 + (**it).p()*(**it).p() - (Zch*p4.P())*(Zch*p4.P());
00227        ntracks++;
00228      }
00229    }
00230    for( reco::TrackRefVector::const_iterator it = pions.inVertexOutOfCalo_.begin(); it != pions.inVertexOutOfCalo_.end(); it++) { 
00231      Zch    =  Zch + (*it)->pt();
00232    }
00233    for( reco::TrackRefVector::const_iterator it = muons.inVertexOutOfCalo_.begin(); it != muons.inVertexOutOfCalo_.end(); it++) { 
00234      Zch    =  Zch + (*it)->pt();
00235    }
00236    for( reco::TrackRefVector::const_iterator it = elecs.inVertexOutOfCalo_.begin(); it != elecs.inVertexOutOfCalo_.end(); it++) { 
00237      Zch    =  Zch + (*it)->pt();
00238    }
00239 
00240      if(mJPTalgo->getSumPtForBeta()> 0.) Zch = Zch/mJPTalgo->getSumPtForBeta();
00241 
00242 //     std::cout<<" Zch "<< Zch<<" "<<mJPTalgo->getSumPtForBeta()<<std::endl;
00243 
00244         if(ntracks > 0) {
00245           Pout   = sqrt(fabs(Pout2))/ntracks;          
00246         }
00247           if (denominator_tracks!=0){
00248             deR2Tr  = deR2Tr/denominator_tracks;
00249             deEta2Tr= deEta2Tr/denominator_tracks;
00250             dePhi2Tr= dePhi2Tr/denominator_tracks;
00251           }
00252    
00253       specific.R2momtr = deR2Tr;
00254       specific.Eta2momtr = deEta2Tr;
00255       specific.Phi2momtr = dePhi2Tr;
00256       specific.Pout = Pout;
00257       specific.Zch = Zch;
00258 
00259 
00260 //       std::cout<<" Moments for charged component "<<deR2_Tr<<" "<<deEta2_Tr<<" "<<dePhi2_Tr<<std::endl;
00261 
00262 
00263 // Create JPT jet
00264 
00265    reco::Particle::Point vertex_=reco::Jet::Point(0,0,0);
00266    
00267 // If we add primary vertex
00268    edm::Handle<reco::VertexCollection> pvCollection;
00269    iEvent.getByLabel(srcPVs_,pvCollection);
00270    if ( pvCollection.isValid() && pvCollection->size()>0 ) vertex_=pvCollection->begin()->position();
00271 
00272    reco::JPTJet fJet(p4, vertex_, specific, corrected.getJetConstituents()); 
00273 
00274    //   fJet.printJet();
00275 
00276 // Output module
00277     if(fJet.pt()>ptCUT) pOut->push_back(fJet); 
00278           
00279   }
00280   
00281   iEvent.put(pOut);
00282    
00283 }
00284 
00285 // ------------ method called once each job just before starting event loop  ------------
00286 void 
00287 JetPlusTrackProducer::beginJob()
00288 {
00289 }
00290 
00291 // ------------ method called once each job just after ending the event loop  ------------
00292 void 
00293 JetPlusTrackProducer::endJob() {
00294 }
00295 
00296 //define this as a plug-in
00297 //DEFINE_FWK_MODULE(JetPlusTrackProducer);