CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/HLTrigger/Egamma/src/HLTPMDocaFilter.cc

Go to the documentation of this file.
00001 
00010 #include "HLTrigger/Egamma/interface/HLTPMDocaFilter.h"
00011 
00012 #include "DataFormats/Common/interface/Handle.h"
00013 
00014 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
00015 
00016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00017 
00018 #include "DataFormats/EgammaCandidates/interface/Electron.h"
00019 #include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
00020 
00021 //
00022 // constructors and destructor
00023 //
00024 HLTPMDocaFilter::HLTPMDocaFilter(const edm::ParameterSet& iConfig)
00025 {
00026   candTag_            = iConfig.getParameter< edm::InputTag > ("candTag");
00027   docaDiffPerpCutHigh_     = iConfig.getParameter<double> ("docaDiffPerpCutHigh");
00028   docaDiffPerpCutLow_     = iConfig.getParameter<double> ("docaDiffPerpCutLow");
00029   nZcandcut_           = iConfig.getParameter<int> ("nZcandcut");
00030 
00031    //register your products
00032   produces<trigger::TriggerFilterObjectWithRefs>();
00033 }
00034 
00035 HLTPMDocaFilter::~HLTPMDocaFilter(){}
00036 
00037 
00038 // ------------ method called to produce the data  ------------
00039 bool
00040 HLTPMDocaFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00041 {
00042 
00043   using namespace std;
00044   using namespace edm;
00045   using namespace reco;
00046 
00047   // The filter object
00048   using namespace trigger;
00049   std::auto_ptr<trigger::TriggerFilterObjectWithRefs> filterproduct (new trigger::TriggerFilterObjectWithRefs(path(),module()));
00050   // Ref to Candidate object to be recorded in filter object
00051   edm::Ref<reco::ElectronCollection> ref;
00052   
00053 
00054   edm::Handle<trigger::TriggerFilterObjectWithRefs> PrevFilterOutput;
00055 
00056   iEvent.getByLabel (candTag_,PrevFilterOutput);
00057   
00058   std::vector<edm::Ref<reco::ElectronCollection> > electrons;
00059   PrevFilterOutput->getObjects(TriggerElectron, electrons);
00060   
00061  
00062   int n = 0;
00063 
00064   double vx[66];
00065   double vy[66];
00066   double vz[66];
00067 
00068   unsigned int size = electrons.size();
00069   if(size>66) size=66;
00070 
00071   for (unsigned int i=0; i< size; i++) {
00072     
00073     ref = electrons[i];
00074 
00075     vx[i]=ref->vx();
00076     vy[i]=ref->vy();
00077     vz[i]=ref->vz();
00078     
00079   }
00080 
00081   for(unsigned int jj=0;jj<size;jj++){
00082      for(unsigned int ii=jj+1;ii<size;ii++){
00083          double docaDiffPerp = sqrt( (vx[jj]-vx[ii])*(vx[jj]-vx[ii])+(vy[jj]-vy[ii])*(vy[jj]-vy[ii]));
00084          // std::cout<<"docaDiffPerp= "<<docaDiffPerp<<std::endl;
00085          if((docaDiffPerp>=docaDiffPerpCutLow_) && (docaDiffPerp<= docaDiffPerpCutHigh_)){
00086            n++;
00087            ref = electrons[ii];
00088            filterproduct->addObject(TriggerElectron, ref);
00089            ref = electrons[jj];
00090            filterproduct->addObject(TriggerElectron, ref);
00091 
00092          }
00093      }
00094   }
00095   
00096 
00097   // filter decision
00098   bool accept(n>=nZcandcut_);
00099   
00100   // put filter object into the Event
00101   iEvent.put(filterproduct);
00102   
00103   return accept;
00104 }
00105