Go to the documentation of this file.00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <memory>
00023
00024
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
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 JetPlusTrackProducer::JetPlusTrackProducer(const edm::ParameterSet& iConfig)
00064 {
00065
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
00084
00085
00086 }
00087
00088
00089
00090
00091
00092
00093
00094 void
00095 JetPlusTrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00096 {
00097 using namespace edm;
00098
00099
00100
00101
00102
00103
00104 edm::Handle <edm::View <reco::CaloJet> > jets_h;
00105 iEvent.getByLabel (src, jets_h);
00106
00107
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
00117
00118 double factorZSP = 1.;
00119 if(useZSP) factorZSP = mZSPalgo->correction(corrected, iEvent, iSetup);
00120
00121 corrected.scaleEnergy (factorZSP);
00122
00123
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
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
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
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
00261
00262
00263
00264
00265 reco::Particle::Point vertex_=reco::Jet::Point(0,0,0);
00266
00267
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
00275
00276
00277 if(fJet.pt()>ptCUT) pOut->push_back(fJet);
00278
00279 }
00280
00281 iEvent.put(pOut);
00282
00283 }
00284
00285
00286 void
00287 JetPlusTrackProducer::beginJob()
00288 {
00289 }
00290
00291
00292 void
00293 JetPlusTrackProducer::endJob() {
00294 }
00295
00296
00297