CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/HLTrigger/JetMET/src/HLTJetCollectionsForElePlusJets.cc

Go to the documentation of this file.
00001 #include "HLTrigger/JetMET/interface/HLTJetCollectionsForElePlusJets.h"
00002 
00003 #include "FWCore/Framework/interface/MakerMacros.h"
00004 
00005 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00006 #include "DataFormats/EgammaCandidates/interface/Electron.h"
00007 #include "DataFormats/JetReco/interface/CaloJetCollection.h"
00008 
00009 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00010 
00011 #include "DataFormats/Common/interface/Handle.h"
00012 
00013 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
00014 
00015 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00016 #include "TVector3.h"
00017 
00018 typedef std::vector<edm::RefVector<std::vector<reco::CaloJet>,reco::CaloJet,edm::refhelper::FindUsingAdvance<std::vector<reco::CaloJet>,reco::CaloJet> > > JetCollectionVector;
00019 
00020 HLTJetCollectionsForElePlusJets::HLTJetCollectionsForElePlusJets(const edm::ParameterSet& iConfig):
00021   hltElectronTag(iConfig.getParameter< edm::InputTag > ("HltElectronTag")),
00022   sourceJetTag(iConfig.getParameter< edm::InputTag > ("SourceJetTag")),
00023   //minJetPt_(iConfig.getParameter<double> ("MinJetPt")),
00024   //maxAbsJetEta_(iConfig.getParameter<double> ("MaxAbsJetEta")),
00025   //minNJets_(iConfig.getParameter<unsigned int> ("MinNJets")),
00026   minDeltaR_(iConfig.getParameter< double > ("minDeltaR"))
00027   //Only for VBF
00028   //minSoftJetPt_(iConfig.getParameter< double > ("MinSoftJetPt")),
00029   //minDeltaEta_(iConfig.getParameter< double > ("MinDeltaEta"))
00030 {
00031   produces<JetCollectionVector> ();
00032 }
00033 
00034 
00035 HLTJetCollectionsForElePlusJets::~HLTJetCollectionsForElePlusJets()
00036 {
00037    // do anything here that needs to be done at desctruction time
00038    // (e.g. close files, deallocate resources etc.)
00039 
00040 }
00041 
00042 void HLTJetCollectionsForElePlusJets::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
00043     edm::ParameterSetDescription desc;
00044     desc.add<edm::InputTag> ("HltElectronTag", edm::InputTag("triggerFilterObjectWithRefs"));
00045     desc.add<edm::InputTag> ("SourceJetTag", edm::InputTag("caloJetCollection"));
00046    // desc.add<double> ("MinJetPt", 30.);
00047    // desc.add<double> ("MaxAbsJetEta", 2.6);
00048    // desc.add<unsigned int> ("MinNJets", 1);
00049     desc.add<double> ("minDeltaR", 0.5);
00050     //Only for VBF
00051    // desc.add<double> ("MinSoftJetPt", 25.);
00052     //desc.add<double> ("MinDeltaEta", -1.);
00053     descriptions.add("hltJetCollectionsForElePlusJets", desc);
00054 }
00055 
00056 //
00057 // member functions
00058 //
00059 
00060 
00061 // ------------ method called to produce the data  ------------
00062 // template <typename T>
00063 void
00064 HLTJetCollectionsForElePlusJets::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00065 {
00066   using namespace edm;
00067   
00068   edm::Handle<trigger::TriggerFilterObjectWithRefs> PrevFilterOutput;
00069   iEvent.getByLabel(hltElectronTag,PrevFilterOutput);
00070  
00071   //its easier on the if statement flow if I try everything at once, shouldnt add to timing
00072   std::vector<edm::Ref<reco::RecoEcalCandidateCollection> > clusCands;
00073   PrevFilterOutput->getObjects(trigger::TriggerCluster,clusCands);
00074 
00075   std::vector<edm::Ref<reco::ElectronCollection> > eleCands;
00076   PrevFilterOutput->getObjects(trigger::TriggerElectron,eleCands);
00077   
00078   //prepare the collection of 3-D vector for electron momenta
00079   std::vector<TVector3> ElePs;
00080 
00081   if(!clusCands.empty()){ //try trigger cluster
00082     for(size_t candNr=0;candNr<clusCands.size();candNr++){
00083       TVector3 positionVector(
00084                   clusCands[candNr]->superCluster()->position().x(),
00085                   clusCands[candNr]->superCluster()->position().y(),
00086                   clusCands[candNr]->superCluster()->position().z());
00087       ElePs.push_back(positionVector);
00088     }
00089   }else if(!eleCands.empty()){ // try trigger electrons
00090     for(size_t candNr=0;candNr<eleCands.size();candNr++){
00091       TVector3 positionVector(
00092                   eleCands[candNr]->superCluster()->position().x(),
00093                   eleCands[candNr]->superCluster()->position().y(),
00094                   eleCands[candNr]->superCluster()->position().z());
00095       ElePs.push_back(positionVector);
00096     }
00097   }
00098   
00099   edm::Handle<reco::CaloJetCollection> theCaloJetCollectionHandle;
00100   iEvent.getByLabel(sourceJetTag, theCaloJetCollectionHandle);
00101   //const reco::CaloJetCollection* theCaloJetCollection = theCaloJetCollectionHandle.product();
00102   
00103   const reco::CaloJetCollection & theCaloJetCollection = *theCaloJetCollectionHandle;
00104   
00105   //std::auto_ptr< reco::CaloJetCollection >  theFilteredCaloJetCollection(new reco::CaloJetCollection);
00106   
00107   std::auto_ptr < JetCollectionVector > allSelections(new JetCollectionVector());
00108   
00109  //bool foundSolution(false);
00110 
00111     for (unsigned int i = 0; i < ElePs.size(); i++) {
00112 
00113        // bool VBFJetPair = false;
00114         //std::vector<int> store_jet;
00115         reco::CaloJetRefVector refVector;
00116 
00117         for (unsigned int j = 0; j < theCaloJetCollection.size(); j++) {
00118             TVector3 JetP(theCaloJetCollection[j].px(), theCaloJetCollection[j].py(), theCaloJetCollection[j].pz());
00119             double DR = ElePs[i].DeltaR(JetP);
00120 
00121             if (DR > minDeltaR_)
00122         refVector.push_back(reco::CaloJetRef(theCaloJetCollectionHandle, j));
00123         }
00124     allSelections->push_back(refVector);
00125     }
00126 
00127     //iEvent.put(theFilteredCaloJetCollection);
00128     iEvent.put(allSelections);
00129   
00130   return;
00131   
00132 }
00133 
00134 // ------------ method called once each job just before starting event loop  ------------
00135 void HLTJetCollectionsForElePlusJets::beginJob() {
00136 }
00137 
00138 // ------------ method called once each job just after ending the event loop  ------------
00139 void HLTJetCollectionsForElePlusJets::endJob() {
00140 }
00141 
00142 //define this as a plug-in
00143 DEFINE_FWK_MODULE(HLTJetCollectionsForElePlusJets);