![]() |
![]() |
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