00001
00002
00003
00004
00005
00054 #ifndef ZeeCandidateFilter_H
00055 #define ZeeCandidateFilter_H
00056
00057
00058 #include <memory>
00059
00060
00061 #include "FWCore/Framework/interface/Frameworkfwd.h"
00062 #include "FWCore/Framework/interface/EDFilter.h"
00063
00064 #include "FWCore/Framework/interface/Event.h"
00065 #include "FWCore/Framework/interface/MakerMacros.h"
00066
00067 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00068
00069 #include <vector>
00070 #include <iostream>
00071 #include "FWCore/Utilities/interface/InputTag.h"
00072 #include "DataFormats/PatCandidates/interface/Electron.h"
00073 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
00074 #include "DataFormats/Common/interface/TriggerResults.h"
00075 #include "FWCore/Common/interface/TriggerNames.h"
00076
00077 #include "TString.h"
00078 #include "TMath.h"
00079 #include "DataFormats/PatCandidates/interface/MET.h"
00080 #include "DataFormats/PatCandidates/interface/CompositeCandidate.h"
00081 #include "DataFormats/PatCandidates/interface/TriggerObject.h"
00082
00083
00084 #include "RecoEgamma/EgammaTools/interface/ConversionFinder.h"
00085 #include "FWCore/Framework/interface/ESHandle.h"
00086 #include "MagneticField/Engine/interface/MagneticField.h"
00087 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00088 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00089
00090 #include "DataFormats/Scalers/interface/DcsStatus.h"
00091 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00092
00093 #include "RecoEcal/EgammaCoreTools/interface/EcalTools.h"
00094 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
00095 #include "DataFormats/VertexReco/interface/Vertex.h"
00096
00097
00098
00099
00100
00101 class ZeeCandidateFilter : public edm::EDFilter {
00102
00103 public:
00104
00105 explicit ZeeCandidateFilter(const edm::ParameterSet&);
00106
00107 ~ZeeCandidateFilter();
00108
00109 private:
00110
00111 virtual Bool_t filter(edm::Event&, const edm::EventSetup&);
00112
00113 virtual void endJob() ;
00114
00115 Bool_t isInFiducial(Double_t eta);
00116
00117
00118
00119
00120
00121 Double_t ETCut_ ;
00122 Double_t METCut_ ;
00123
00124 Bool_t useEcalDrivenElectrons_ ;
00125
00126
00127 Bool_t useValidFirstPXBHit1_ ;
00128 Bool_t calculateValidFirstPXBHit1_ ;
00129 Bool_t useConversionRejection1_ ;
00130 Bool_t calculateConversionRejection1_ ;
00131 Bool_t useExpectedMissingHits1_ ;
00132 Bool_t calculateExpectedMissingHits1_ ;
00133 Int_t maxNumberOfExpectedMissingHits1_ ;
00134
00135
00136 Bool_t useValidFirstPXBHit2_ ;
00137 Bool_t calculateValidFirstPXBHit2_ ;
00138 Bool_t useConversionRejection2_ ;
00139 Bool_t calculateConversionRejection2_ ;
00140 Bool_t useExpectedMissingHits2_ ;
00141 Bool_t calculateExpectedMissingHits2_ ;
00142 Int_t maxNumberOfExpectedMissingHits2_ ;
00143
00144
00145 Double_t dist1_ ;
00146 Double_t dcot1_ ;
00147
00148
00149 Double_t dist2_ ;
00150 Double_t dcot2_ ;
00151
00152 Bool_t dataMagneticFieldSetUp_ ;
00153
00154 edm::InputTag dcsTag_ ;
00155
00156 Double_t BarrelMaxEta_ ;
00157 Double_t EndCapMaxEta_ ;
00158 Double_t EndCapMinEta_ ;
00159
00160 std::string hltpath_ ;
00161 edm::InputTag triggerCollectionTag_ ;
00162 edm::InputTag triggerEventTag_ ;
00163 edm::InputTag hltpathFilter_ ;
00164 Bool_t useHLTObjectETCut_ ;
00165
00166 Double_t hltObjectETCut_ ;
00167
00168 Bool_t useExtraTrigger_ ;
00169
00170 std::vector<std::string> vHltpathExtra_ ;
00171 std::vector<edm::InputTag> vHltpathFilterExtra_ ;
00172
00173 Bool_t useTriggerInfo_ ;
00174 Bool_t electronMatched2HLT_ ;
00175 Double_t electronMatched2HLT_DR_ ;
00176
00177 edm::InputTag electronCollectionTag_ ;
00178
00179 edm::InputTag metCollectionTag_ ;
00180 edm::InputTag pfMetCollectionTag_ ;
00181 edm::InputTag tcMetCollectionTag_ ;
00182
00183 edm::InputTag PrimaryVerticesCollection_ ;
00184
00185 edm::InputTag ebRecHits_ ;
00186
00187
00188 Bool_t useSpikeRejection_ ;
00189
00190 Double_t spikeCleaningSwissCrossCut_ ;
00191
00192 };
00193
00194 #endif
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 ZeeCandidateFilter::ZeeCandidateFilter(const edm::ParameterSet& iConfig)
00208 {
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 ETCut_ = iConfig.getUntrackedParameter<Double_t>("ETCut");
00219 METCut_ = iConfig.getUntrackedParameter<Double_t>("METCut");
00220
00221 useEcalDrivenElectrons_ = iConfig.getUntrackedParameter<Bool_t>("useEcalDrivenElectrons", false);
00222
00223
00224
00225
00226
00227
00228
00229 useValidFirstPXBHit1_ = iConfig.getUntrackedParameter<Bool_t>("useValidFirstPXBHit1",false);
00230 calculateValidFirstPXBHit1_ = iConfig.getUntrackedParameter<Bool_t>("calculateValidFirstPXBHit1",false);
00231 useConversionRejection1_ = iConfig.getUntrackedParameter<Bool_t>("useConversionRejection1",false);
00232 calculateConversionRejection1_ = iConfig.getUntrackedParameter<Bool_t>("calculateConversionRejection1",false);
00233 useExpectedMissingHits1_ = iConfig.getUntrackedParameter<Bool_t>("useExpectedMissingHits1",false);
00234 calculateExpectedMissingHits1_ = iConfig.getUntrackedParameter<Bool_t>("calculateExpectedMissingHits1",false);
00235 maxNumberOfExpectedMissingHits1_ = iConfig.getUntrackedParameter<Int_t>("maxNumberOfExpectedMissingHits1",1);
00236
00237
00238 useValidFirstPXBHit2_ = iConfig.getUntrackedParameter<Bool_t>("useValidFirstPXBHit2",false);
00239 calculateValidFirstPXBHit2_ = iConfig.getUntrackedParameter<Bool_t>("calculateValidFirstPXBHit2",false);
00240 useConversionRejection2_ = iConfig.getUntrackedParameter<Bool_t>("useConversionRejection2",false);
00241 calculateConversionRejection2_ = iConfig.getUntrackedParameter<Bool_t>("calculateConversionRejection2",false);
00242 useExpectedMissingHits2_ = iConfig.getUntrackedParameter<Bool_t>("useExpectedMissingHits2",false);
00243 calculateExpectedMissingHits2_ = iConfig.getUntrackedParameter<Bool_t>("calculateExpectedMissingHits2",false);
00244 maxNumberOfExpectedMissingHits2_ = iConfig.getUntrackedParameter<Int_t>("maxNumberOfExpectedMissingHits2",1);
00245
00246
00247
00248
00249
00250
00251
00252 Double_t dist1_D = 0.02 ;
00253 Double_t dcot1_D = 0.02 ;
00254
00255 dist1_ = iConfig.getUntrackedParameter<Double_t>("conversionRejectionDist1", dist1_D);
00256 dcot1_ = iConfig.getUntrackedParameter<Double_t>("conversionRejectionDcot1", dcot1_D);
00257
00258
00259 Double_t dist2_D = 0.02 ;
00260 Double_t dcot2_D = 0.02 ;
00261
00262 dist2_ = iConfig.getUntrackedParameter<Double_t>("conversionRejectionDist2", dist2_D);
00263 dcot2_ = iConfig.getUntrackedParameter<Double_t>("conversionRejectionDcot2", dcot2_D);
00264
00265
00266
00267
00268
00269
00270 dataMagneticFieldSetUp_ = iConfig.getUntrackedParameter<Bool_t>("dataMagneticFieldSetUp",false);
00271
00272 if ( dataMagneticFieldSetUp_ ) {
00273 dcsTag_ = iConfig.getUntrackedParameter<edm::InputTag>("dcsTag");
00274 }
00275
00276
00277
00278
00279
00280
00281 Double_t BarrelMaxEta_D = 1.4442 ;
00282 Double_t EndCapMinEta_D = 1.5660 ;
00283 Double_t EndCapMaxEta_D = 2.5000 ;
00284
00285 BarrelMaxEta_ = iConfig.getUntrackedParameter<Double_t>("BarrelMaxEta", BarrelMaxEta_D);
00286 EndCapMaxEta_ = iConfig.getUntrackedParameter<Double_t>("EndCapMaxEta", EndCapMaxEta_D);
00287 EndCapMinEta_ = iConfig.getUntrackedParameter<Double_t>("EndCapMinEta", EndCapMinEta_D);
00288
00289
00290
00291
00292
00293
00294 hltpath_ = iConfig.getUntrackedParameter<std::string>("hltpath");
00295 triggerCollectionTag_ = iConfig.getUntrackedParameter<edm::InputTag>("triggerCollectionTag");
00296 triggerEventTag_ = iConfig.getUntrackedParameter<edm::InputTag>("triggerEventTag");
00297 hltpathFilter_ = iConfig.getUntrackedParameter<edm::InputTag>("hltpathFilter");
00298 useHLTObjectETCut_ = iConfig.getUntrackedParameter<Bool_t>("useHLTObjectETCut", false);
00299
00300 if ( useHLTObjectETCut_ ) {
00301 hltObjectETCut_ = iConfig.getUntrackedParameter<Double_t>("hltObjectETCut");
00302 }
00303
00304
00305 useExtraTrigger_ = iConfig.getUntrackedParameter<Bool_t>("useExtraTrigger");
00306
00307 if ( useExtraTrigger_ ) {
00308
00309 vHltpathExtra_ = iConfig.getUntrackedParameter< std::vector<std::string> >("vHltpathExtra");
00310 vHltpathFilterExtra_ = iConfig.getUntrackedParameter< std::vector<edm::InputTag> >("vHltpathFilterExtra");
00311
00312 if ( Int_t(vHltpathExtra_.size()) != Int_t(vHltpathFilterExtra_.size()) ) {
00313 std::cout << "ZeeCandidateFilter: ERROR IN Configuration: vHltpathExtra and vHltpathFilterExtra" << " should have the same dimensions " << std::endl;
00314 }
00315 }
00316
00317
00318
00319
00320
00321
00322 useTriggerInfo_ = iConfig.getUntrackedParameter<Bool_t>("useTriggerInfo",true);
00323 electronMatched2HLT_ = iConfig.getUntrackedParameter<Bool_t>("electronMatched2HLT");
00324 electronMatched2HLT_DR_ = iConfig.getUntrackedParameter<Double_t>("electronMatched2HLT_DR");
00325
00326
00327
00328
00329
00330
00331 electronCollectionTag_ = iConfig.getUntrackedParameter<edm::InputTag>("electronCollectionTag");
00332
00333 metCollectionTag_ = iConfig.getUntrackedParameter<edm::InputTag>("metCollectionTag");
00334 pfMetCollectionTag_ = iConfig.getUntrackedParameter<edm::InputTag>("pfMetCollectionTag");
00335 tcMetCollectionTag_ = iConfig.getUntrackedParameter<edm::InputTag>("tcMetCollectionTag");
00336
00337 PrimaryVerticesCollection_ = iConfig.getUntrackedParameter<edm::InputTag>("PrimaryVerticesCollection");
00338
00339 ebRecHits_ = iConfig.getUntrackedParameter<edm::InputTag>("ebRecHits");
00340
00341
00342
00343
00344
00345
00346
00347 useSpikeRejection_ = iConfig.getUntrackedParameter<Bool_t>("useSpikeRejection");
00348
00349 if ( useSpikeRejection_ ) {
00350 spikeCleaningSwissCrossCut_ = iConfig.getUntrackedParameter<Double_t>("spikeCleaningSwissCrossCut");
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 std::cout << "ZeeCandidateFilter: Running Zee Filter..." << std::endl;
00362
00363 if ( useTriggerInfo_ ) {
00364 std::cout << "ZeeCandidateFilter: HLT Path " << hltpath_ << std::endl;
00365 std::cout << "ZeeCandidateFilter: HLT Filter " << hltpathFilter_ << std::endl;
00366
00367 if ( useExtraTrigger_ ) {
00368 for (Int_t itrig=0; itrig < (Int_t)vHltpathExtra_.size(); ++itrig ) {
00369
00370 std::cout << "ZeeCandidateFilter: OR " << vHltpathExtra_[itrig] << " with filter: " << vHltpathFilterExtra_[itrig] << std::endl;
00371 }
00372 }
00373 }
00374 else {
00375 std::cout << "ZeeCandidateFilter: Trigger info will not be used here" << std::endl;
00376 }
00377
00378 std::cout << "ZeeCandidateFilter: ET > " << ETCut_ << std::endl;
00379 std::cout << "ZeeCandidateFilter: MET > " << METCut_ << std::endl;
00380
00381
00382 if ( useEcalDrivenElectrons_ ) {
00383 std::cout << "ZeeCandidateFilter: Electron Candidate(s) is required to be ecal driven" << std::endl;
00384 }
00385
00386 if ( electronMatched2HLT_ && useTriggerInfo_ ) {
00387 std::cout << "ZeeCandidateFilter: At least one electron is required to match an HLT object with DR < " << electronMatched2HLT_DR_ << std::endl;
00388 }
00389 else {
00390 std::cout << "ZeeCandidateFilter: Electron Candidates NOT required to match HLT object " << std::endl;
00391 }
00392
00393 if ( useValidFirstPXBHit1_ ) {
00394 std::cout << "ZeeCandidateFilter: Electron Candidate #1 required to have a valid hit in 1st PXB layer " << std::endl;
00395 }
00396
00397 if ( useValidFirstPXBHit2_ ) {
00398 std::cout << "ZeeCandidateFilter: Electron Candidate #2 required to have a valid hit in 1st PXB layer " << std::endl;
00399 }
00400
00401 if ( calculateValidFirstPXBHit1_ ) {
00402 std::cout << "ZeeCandidateFilter: Info about whether there is a valid 1st layer PXB hit for electron candidate #1 will be stored: you can access that later by myElec.userInt(\"PassValidFirstPXBHit\")==1" << std::endl;
00403 }
00404
00405 if ( calculateValidFirstPXBHit2_ ) {
00406 std::cout << "ZeeCandidateFilter: Info about whether there is a valid 1st layer PXB hit for electron candidate #2 will be stored: you can access that later by myElec.userInt(\"PassValidFirstPXBHit\")==1" << std::endl;
00407 }
00408
00409 if ( useExpectedMissingHits1_ ) {
00410 std::cout << "ZeeCandidateFilter: Electron Candidate #1 is required to have less than " << maxNumberOfExpectedMissingHits1_ << " expected hits missing " << std::endl;
00411 }
00412
00413 if ( useExpectedMissingHits2_ ) {
00414 std::cout << "ZeeCandidateFilter: Electron Candidate #2 is required to have less than " << maxNumberOfExpectedMissingHits2_ << " expected hits missing " << std::endl;
00415 }
00416
00417 if ( calculateExpectedMissingHits1_ ) {
00418 std::cout << "ZeeCandidateFilter: Missing Hits from expected inner layers for electron candidate #1 will be calculated and stored: you can access them later by myElec.userInt(\"NumberOfExpectedMissingHits\")" << std::endl;
00419 }
00420
00421 if ( calculateExpectedMissingHits2_ ) {
00422 std::cout << "ZeeCandidateFilter: Missing Hits from expected inner layers for electron candidate #2 will be calculated and stored: you can access them later by myElec.userInt(\"NumberOfExpectedMissingHits\")" << std::endl;
00423 }
00424
00425 if ( useConversionRejection1_ ) {
00426 std::cout << "ZeeCandidateFilter: Electron Candidate #1 is required to pass EGAMMA Conversion Rejection criteria" << std::endl;
00427 }
00428
00429 if ( useConversionRejection2_ ) {
00430 std::cout << "ZeeCandidateFilter: Electron Candidate #2 is required to pass EGAMMA Conversion Rejection criteria" << std::endl;
00431 }
00432
00433 if ( calculateConversionRejection1_ ) {
00434 std::cout << "ZeeCandidateFilter: EGAMMA Conversion Rejection criteria for electron candidate #1 will be calculated and stored: you can access them later by demanding for a successful electron myElec.userInt(\"PassConversionRejection\")==1" << std::endl;
00435 }
00436
00437 if ( calculateConversionRejection2_ ) {
00438 std::cout << "ZeeCandidateFilter: EGAMMA Conversion Rejection criteria for electron candidate #2 will be calculated and stored: you can access them later by demanding for a successful electron myElec.userInt(\"PassConversionRejection\")==1" << std::endl;
00439 }
00440
00441 if ( dataMagneticFieldSetUp_ ) {
00442 std::cout << "ZeeCandidateFilter: Data Configuration for Magnetic Field DCS tag " << dcsTag_ << std::endl;
00443 }
00444
00445 if ( useSpikeRejection_ ) {
00446 std::cout << "ZeeCandidateFilter: Spike Cleaning will be done with the Swiss Cross Criterion cutting at " << spikeCleaningSwissCrossCut_ << std::endl;
00447 }
00448
00449 std::cout << "ZeeCandidateFilter: Fiducial Cut: " << std::endl;
00450 std::cout << "ZeeCandidateFilter: BarrelMax: " << BarrelMaxEta_ << std::endl;
00451 std::cout << "ZeeCandidateFilter: EndcapMin: " << EndCapMinEta_ << " EndcapMax: " << EndCapMaxEta_ << std::endl;
00452
00453
00454
00455
00456
00457
00458 produces<pat::CompositeCandidateCollection>("selectedZeeCandidates").setBranchAlias("selectedZeeCandidates");
00459
00460 }
00461
00462
00463 ZeeCandidateFilter::~ZeeCandidateFilter()
00464 {
00465
00466
00467 }
00468
00469
00470
00471
00472
00473
00474
00475 Bool_t ZeeCandidateFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00476 {
00477 using namespace edm;
00478 using namespace std;
00479 using namespace pat;
00480
00481
00482 std::cout << "FILTER-MSG: Begin Processing ... "
00483 << "Run = " << iEvent.run() << " "
00484 << "Lumi = " << (Int_t) iEvent.luminosityBlock() << " "
00485 << "Event = " << iEvent.eventAuxiliary().event() << " "
00486 << std::endl;
00487
00488
00489
00490
00491 edm::Handle<edm::TriggerResults> HLTResults;
00492 iEvent.getByLabel(triggerCollectionTag_, HLTResults);
00493
00494 Int_t passTrigger = 0;
00495
00496 if ( HLTResults.isValid() ) {
00497
00498 const edm::TriggerNames & triggerNames = iEvent.triggerNames(*HLTResults);
00499
00500 UInt_t trigger_size = HLTResults->size();
00501 UInt_t trigger_position = triggerNames.triggerIndex(hltpath_);
00502 UInt_t trigger_position_extra;
00503
00504 if ( trigger_position < trigger_size ) {
00505 passTrigger = (Int_t)HLTResults->accept(trigger_position);
00506 }
00507
00508
00509 std::cout << "SK_HLT_INFO"
00510 << " | " << "trigger_size = " << trigger_size
00511 << " | " << "hltpath_ = " << hltpath_
00512 << " | " << "trigger_position = " << trigger_position
00513 << " | " << "passTrigger = " << passTrigger
00514 << std::endl;
00515
00516 if ( useExtraTrigger_ && passTrigger==0 ) {
00517 for (Int_t itrig=0; itrig < (Int_t)vHltpathExtra_.size(); ++itrig ) {
00518 trigger_position_extra = triggerNames.triggerIndex(vHltpathExtra_[itrig]);
00519
00520 if ( trigger_position_extra < trigger_size ) {
00521 passTrigger = (Int_t)HLTResults->accept(trigger_position_extra);
00522 }
00523
00524
00525 std::cout << "SK_HLT_INFO"
00526 << " | " << "vHltpathExtra_[" << itrig << "] = " << vHltpathExtra_[itrig]
00527 << " | " << "trigger_position_extra = " << trigger_position_extra
00528 << " | " << "passTrigger = " << passTrigger
00529 << " | " << "vHltpathExtra_.size() = " << vHltpathExtra_.size()
00530 << std::endl;
00531
00532 if ( passTrigger > 0 ) { break ; }
00533
00534 }
00535
00536 }
00537
00538 }
00539 else { std::cout << "TriggerResults are missing from this event.." << std::endl;
00540 if ( useTriggerInfo_ ) {
00541 return false;
00542 }
00543 }
00544
00545 if ( passTrigger == 0 && useTriggerInfo_ ) { std::cout << "No HLT Path is firing in this event" << std::endl;
00546 return false;
00547 }
00548
00549
00550 edm::Handle<trigger::TriggerEvent> pHLT;
00551 iEvent.getByLabel(triggerEventTag_, pHLT);
00552
00553 const Int_t nF(pHLT->sizeFilters());
00554 const Int_t filterInd = pHLT->filterIndex(hltpathFilter_);
00555
00556 std::vector<Int_t> filterIndExtra;
00557
00558 if ( useExtraTrigger_ ) {
00559 for (Int_t itrig =0; itrig < (Int_t)vHltpathFilterExtra_.size(); ++itrig ) { std::cout << "working on #" << itrig << std::endl; std::cout << " ---> " << vHltpathFilterExtra_[itrig] << std::endl;
00560 filterIndExtra.push_back( pHLT->filterIndex(vHltpathFilterExtra_[itrig]) );
00561 }
00562 }
00563
00564 Bool_t finalpathfound = false;
00565
00566 if ( nF != filterInd ) {
00567 finalpathfound = true;
00568 }
00569 else {
00570 for (Int_t itrig=0; itrig < (Int_t)filterIndExtra.size(); ++itrig ) { std::cout << "working on #" << itrig << std::endl; std::cout << " ---> " << filterIndExtra[itrig] << std::endl;
00571 if ( nF != filterIndExtra[itrig] ) {
00572 finalpathfound = true;
00573 break;
00574 }
00575 }
00576 }
00577
00578 if ( ! finalpathfound ) { std::cout << "No HLT Filter was not found in this event..." << std::endl;
00579 if ( useTriggerInfo_ ) {
00580 return false;
00581 }
00582 }
00583
00584 const trigger::TriggerObjectCollection& TOC(pHLT->getObjects());
00585
00586
00587
00588
00589 edm::Handle<pat::ElectronCollection> patElectron;
00590 iEvent.getByLabel(electronCollectionTag_, patElectron);
00591
00592 if ( ! patElectron.isValid() ) { std::cout << "No electrons found in this event with tag " << electronCollectionTag_ << std::endl;
00593 return false;
00594 }
00595
00596 const pat::ElectronCollection *pElecs = patElectron.product();
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617 const Int_t Nelecs = pElecs->size();
00618
00619 if ( Nelecs <= 1 ) { std::cout << "No more than 1 electrons found in this event" << std::endl;
00620 return false;
00621 }
00622
00623
00624 Int_t counter = 0;
00625 std::vector<Int_t> indices;
00626 std::vector<Double_t> ETs;
00627 pat::ElectronCollection myElectrons;
00628
00629 for (pat::ElectronCollection::const_iterator elec = pElecs->begin(); elec != pElecs->end(); ++elec) {
00630 Double_t sc_et = elec->caloEnergy()/TMath::CosH(elec->gsfTrack()->eta());
00631 indices.push_back(counter);
00632 ETs.push_back(sc_et);
00633 myElectrons.push_back(*elec);
00634 ++counter;
00635 }
00636
00637 const Int_t event_elec_number = (Int_t)indices.size();
00638
00639 if ( event_elec_number <= 1 ) { std::cout << "No more than 1 electrons in fiducial were found" << std::endl;
00640 return false;
00641 }
00642
00643
00644 Int_t *sorted = new Int_t[event_elec_number];
00645 Double_t *et = new Double_t[event_elec_number];
00646
00647 for (Int_t i=0; i<event_elec_number; ++i ) {
00648 et[i] = ETs[i];
00649 }
00650
00651
00652 TMath::Sort(event_elec_number, et, sorted, true);
00653
00654
00655 Int_t max_et_index1 = sorted[0];
00656 Int_t max_et_index2 = sorted[1];
00657
00658 if ( ( ETs[max_et_index1] < ETCut_ ) || ( ETs[max_et_index2] < ETCut_ ) ) {
00659 delete [] sorted;
00660 delete [] et;
00661 return false;
00662 }
00663
00664
00665 pat::Electron maxETelec1 = myElectrons[max_et_index1];
00666 pat::Electron maxETelec2 = myElectrons[max_et_index2];
00667
00668
00669 if ( ! isInFiducial(maxETelec1.caloPosition().eta()) ) {
00670 delete [] sorted;
00671 delete [] et;
00672 return false;
00673 }
00674
00675 if ( ! isInFiducial(maxETelec2.caloPosition().eta()) ) {
00676 delete [] sorted;
00677 delete [] et;
00678 return false;
00679 }
00680
00681
00682 if ( useEcalDrivenElectrons_ ) {
00683 if ( ( ! maxETelec1.ecalDrivenSeed() ) || ( ! maxETelec2.ecalDrivenSeed() ) ) {
00684 delete [] sorted;
00685 delete [] et;
00686 return false;
00687 }
00688 }
00689
00690
00691 if ( useSpikeRejection_ && maxETelec1.isEB() ) {
00692
00693 edm::Handle<EcalRecHitCollection> recHits;
00694
00695
00696
00697
00698
00699
00700
00701
00702 iEvent.getByLabel(ebRecHits_, recHits);
00703
00704 const EcalRecHitCollection *myRecHits = recHits.product();
00705 const DetId seedId = maxETelec1.superCluster()->seed()->seed();
00706
00707 Double_t swissCross = EcalTools::swissCross(seedId, *myRecHits,0.);
00708
00709 if ( swissCross > spikeCleaningSwissCrossCut_ ) {
00710 delete [] sorted;
00711 delete [] et;
00712 return false;
00713 }
00714 }
00715
00716 if ( useSpikeRejection_ && maxETelec2.isEB() ) {
00717
00718 edm::Handle<EcalRecHitCollection> recHits;
00719
00720
00721
00722
00723
00724
00725
00726
00727 iEvent.getByLabel(ebRecHits_, recHits);
00728
00729 const EcalRecHitCollection *myRecHits = recHits.product();
00730 const DetId seedId = maxETelec2.superCluster()->seed()->seed();
00731
00732 Double_t swissCross = EcalTools::swissCross(seedId, *myRecHits,0.);
00733
00734 if ( swissCross > spikeCleaningSwissCrossCut_ ) {
00735 delete [] sorted;
00736 delete [] et;
00737 return false;
00738 }
00739 }
00740
00741
00742 edm::Handle< std::vector<reco::Vertex> > pVtx;
00743 iEvent.getByLabel(PrimaryVerticesCollection_, pVtx);
00744
00745 const std::vector<reco::Vertex> Vtx = *(pVtx.product());
00746
00747 Double_t pv_x = -999999.;
00748 Double_t pv_y = -999999.;
00749 Double_t pv_z = -999999.;
00750
00751 Double_t ele_tip_pv1 = -999999.;
00752 Double_t ele_tip_pv2 = -999999.;
00753
00754 if ( Vtx.size() >=1 ) {
00755 pv_x = Vtx[0].position().x();
00756 pv_y = Vtx[0].position().y();
00757 pv_z = Vtx[0].position().z();
00758 ele_tip_pv1 = (-1.0) * ( maxETelec1.gsfTrack()->dxy(Vtx[0].position()) ) ;
00759 ele_tip_pv2 = (-1.0) * ( maxETelec2.gsfTrack()->dxy(Vtx[0].position()) ) ;
00760 }
00761
00762 maxETelec1.addUserFloat("pv_x", Float_t(pv_x));
00763 maxETelec1.addUserFloat("pv_x", Float_t(pv_y));
00764 maxETelec1.addUserFloat("pv_z", Float_t(pv_z));
00765 maxETelec1.addUserFloat("ele_tip_pv", Float_t(ele_tip_pv1));
00766
00767 maxETelec2.addUserFloat("pv_x", Float_t(pv_x));
00768 maxETelec2.addUserFloat("pv_x", Float_t(pv_y));
00769 maxETelec2.addUserFloat("pv_z", Float_t(pv_z));
00770 maxETelec2.addUserFloat("ele_tip_pv", Float_t(ele_tip_pv2));
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814 if ( useValidFirstPXBHit1_ || calculateValidFirstPXBHit1_ ) {
00815
00816 Bool_t fail = ( ! maxETelec1.gsfTrack()->hitPattern().hasValidHitInFirstPixelBarrel() ) ;
00817
00818 if ( useValidFirstPXBHit1_ && fail ) { std::cout << "Filter: there is no valid hit for electron #1 in 1st layer PXB" << std::endl;
00819 delete [] sorted;
00820 delete [] et;
00821 return false;
00822 }
00823
00824 if ( calculateValidFirstPXBHit1_ ) {
00825
00826 std::string vfpx("PassValidFirstPXBHit");
00827
00828 if ( fail ) {
00829 maxETelec1.addUserInt(vfpx,0);
00830 }
00831 else {
00832 maxETelec1.addUserInt(vfpx,1);
00833 }
00834
00835 }
00836
00837 }
00838
00839 if ( useValidFirstPXBHit2_ || calculateValidFirstPXBHit2_ ) {
00840
00841 Bool_t fail = ( ! maxETelec2.gsfTrack()->hitPattern().hasValidHitInFirstPixelBarrel() );
00842
00843 if ( useValidFirstPXBHit2_ && fail ) { std::cout << "Filter: there is no valid hit for electron #1 in 1st layer PXB" << std::endl;
00844 delete [] sorted;
00845 delete [] et;
00846 return false;
00847 }
00848
00849 if ( calculateValidFirstPXBHit2_ ) {
00850
00851 std::string vfpx("PassValidFirstPXBHit");
00852
00853 if ( fail ) {
00854 maxETelec2.addUserInt(vfpx,0);
00855 }
00856 else {
00857 maxETelec2.addUserInt(vfpx,1);
00858 }
00859
00860 }
00861
00862 }
00863
00864 if ( useExpectedMissingHits1_ || calculateExpectedMissingHits1_ ) {
00865
00866 Int_t numberOfInnerHits = (Int_t)( maxETelec1.gsfTrack()->trackerExpectedHitsInner().numberOfHits() );
00867
00868 if ( ( numberOfInnerHits > maxNumberOfExpectedMissingHits1_ ) && useExpectedMissingHits1_ ) {
00869 delete [] sorted;
00870 delete [] et;
00871 return false;
00872 }
00873
00874 if ( calculateExpectedMissingHits1_ ) {
00875 maxETelec1.addUserInt("NumberOfExpectedMissingHits",numberOfInnerHits);
00876 }
00877
00878 }
00879
00880 if ( useExpectedMissingHits2_ || calculateExpectedMissingHits2_ ) {
00881
00882 Int_t numberOfInnerHits = (Int_t)( maxETelec2.gsfTrack()->trackerExpectedHitsInner().numberOfHits() );
00883
00884 if ( ( numberOfInnerHits > maxNumberOfExpectedMissingHits2_ ) && useExpectedMissingHits2_ ) {
00885 delete [] sorted;
00886 delete [] et;
00887 return false;
00888 }
00889
00890 if ( calculateExpectedMissingHits2_ ) {
00891 maxETelec2.addUserInt("NumberOfExpectedMissingHits",numberOfInnerHits);
00892 }
00893 }
00894
00895 if ( useConversionRejection1_ || calculateConversionRejection1_ ) {
00896
00897
00898
00899
00900
00901 Double_t bfield;
00902
00903 if ( dataMagneticFieldSetUp_ ) {
00904
00905 edm::Handle<DcsStatusCollection> dcsHandle;
00906 iEvent.getByLabel(dcsTag_, dcsHandle);
00907
00908
00909
00910 Double_t currentToBFieldScaleFactor = 2.09237036221512717e-04;
00911 Double_t current = (*dcsHandle)[0].magnetCurrent();
00912 bfield = current*currentToBFieldScaleFactor;
00913
00914 } else {
00915
00916 edm::ESHandle<MagneticField> magneticField;
00917 iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
00918 const MagneticField *mField = magneticField.product();
00919 bfield = mField->inTesla(GlobalPoint(0.0,0.0,0.0)).z();
00920
00921 }
00922
00923 edm::Handle<reco::TrackCollection> ctfTracks;
00924
00925 if ( iEvent.getByLabel("generalTracks", ctfTracks) ) {
00926
00927 ConversionFinder convFinder;
00928 ConversionInfo convInfo = convFinder.getConversionInfo(maxETelec1, ctfTracks, bfield);
00929
00930 Float_t dist = convInfo.dist();
00931 Float_t dcot = convInfo.dcot();
00932
00933 Bool_t isConv = ( ( TMath::Abs(dist) < dist1_ ) && ( TMath::Abs(dcot) < dcot1_ ) ) ;
00934
00935 std::cout << "Filter: for electron #1 the conversion says " << isConv << std::endl;
00936
00937 if ( isConv && useConversionRejection1_ ) {
00938 delete [] sorted;
00939 delete [] et;
00940 return false;
00941 }
00942
00943 if ( calculateConversionRejection1_ ) {
00944
00945 maxETelec1.addUserFloat("Dist", Float_t(dist));
00946 maxETelec1.addUserFloat("Dcot", Float_t(dcot));
00947
00948 if ( isConv ) {
00949 maxETelec1.addUserInt("PassConversionRejection",0);
00950 }
00951 else {
00952 maxETelec1.addUserInt("PassConversionRejection",1);
00953 }
00954
00955 }
00956
00957 }
00958 else {
00959 std::cout << "WARNING! Track Collection with input name: generalTracks was not found. Conversion Rejection for electron #1 is not going to be applied!!!" << std::endl;
00960 }
00961
00962 }
00963
00964 if ( useConversionRejection2_ || calculateConversionRejection2_ ) {
00965
00966
00967
00968
00969
00970 Double_t bfield;
00971
00972 if ( dataMagneticFieldSetUp_ ) {
00973
00974 edm::Handle<DcsStatusCollection> dcsHandle;
00975 iEvent.getByLabel(dcsTag_, dcsHandle);
00976
00977
00978
00979
00980
00981 Double_t currentToBFieldScaleFactor = 2.09237036221512717e-04;
00982 Double_t current = (*dcsHandle)[0].magnetCurrent();
00983 bfield = current*currentToBFieldScaleFactor;
00984
00985 } else {
00986
00987 edm::ESHandle<MagneticField> magneticField;
00988 iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
00989 const MagneticField *mField = magneticField.product();
00990 bfield = mField->inTesla(GlobalPoint(0.0,0.0,0.0)).z();
00991
00992 }
00993
00994 edm::Handle<reco::TrackCollection> ctfTracks;
00995
00996 if ( iEvent.getByLabel("generalTracks", ctfTracks) ) {
00997
00998 ConversionFinder convFinder;
00999 ConversionInfo convInfo = convFinder.getConversionInfo(maxETelec2, ctfTracks, bfield);
01000
01001 Float_t dist = convInfo.dist();
01002 Float_t dcot = convInfo.dcot();
01003
01004 Bool_t isConv = ( ( TMath::Abs(dist) < dist2_ ) && ( TMath::Abs(dcot) < dcot2_ ) ) ;
01005
01006 std::cout << "Filter: for electron #2 the conversion says " << isConv << std::endl;
01007
01008 if ( isConv && useConversionRejection2_ ) {
01009 delete [] sorted;
01010 delete [] et;
01011 return false;
01012 }
01013
01014 if ( calculateConversionRejection2_ ) {
01015
01016 maxETelec2.addUserFloat("Dist", Float_t(dist));
01017 maxETelec2.addUserFloat("Dcot", Float_t(dcot));
01018
01019 if ( isConv ) {
01020 maxETelec2.addUserInt("PassConversionRejection",0);
01021 }
01022 else {
01023 maxETelec2.addUserInt("PassConversionRejection",1);
01024 }
01025
01026 }
01027
01028 }
01029 else {
01030 std::cout << "WARNING! Track Collection with input name: generalTracks was not found. Conversion Rejection for electron #2 is not going to be applied!!!" << std::endl;
01031 }
01032
01033 }
01034
01035 std::cout << "HLT matching starts" << std::endl;
01036
01037 if ( electronMatched2HLT_ && useTriggerInfo_ ) {
01038
01039 Double_t matched_dr_distance1 = 999999.;
01040 Int_t trigger_int_probe1 = 0;
01041
01042 Double_t matched_dr_distance2 = 999999.;
01043 Int_t trigger_int_probe2 = 0;
01044
01045 if ( finalpathfound ) {
01046
01047 if ( nF != filterInd ) {
01048
01049 const trigger::Keys& KEYS(pHLT->filterKeys(filterInd));
01050 const Int_t nK(KEYS.size());
01051
01052 std::cout << "Found trig objects #" << nK << std::endl;
01053
01054 for ( Int_t iTrig = 0; iTrig < nK; ++iTrig ) {
01055
01056 const trigger::TriggerObject& TO(TOC[KEYS[iTrig]]);
01057
01058 if ( useHLTObjectETCut_ ) {
01059 if ( TO.et() < hltObjectETCut_ ) {
01060 continue;
01061 }
01062 }
01063
01064 Double_t dr_ele_HLT1 = reco::deltaR(maxETelec1.superCluster()->eta(),maxETelec1.superCluster()->phi(),TO.eta(),TO.phi());
01065 Double_t dr_ele_HLT2 = reco::deltaR(maxETelec2.superCluster()->eta(),maxETelec2.superCluster()->phi(),TO.eta(),TO.phi());
01066
01067
01068
01069 if ( TMath::Abs(dr_ele_HLT1) < matched_dr_distance1 ) {
01070 matched_dr_distance1 = dr_ele_HLT1;
01071 }
01072
01073 if ( TMath::Abs(dr_ele_HLT2) < matched_dr_distance2 ) {
01074 matched_dr_distance2 = dr_ele_HLT2;
01075 }
01076
01077 }
01078
01079 }
01080
01081 if ( useExtraTrigger_ ) {
01082
01083 for (Int_t itrig=0; itrig < (Int_t) filterIndExtra.size(); ++itrig ) {
01084
01085 if ( filterIndExtra[itrig] == nF ) {
01086 continue;
01087 }
01088
01089 std::cout << "working on #" << itrig << std::endl; std::cout << " ---> " << filterIndExtra[itrig] << std::endl;
01090
01091 const trigger::Keys& KEYS(pHLT->filterKeys(filterIndExtra[itrig]));
01092 const Int_t nK(KEYS.size());
01093
01094 std::cout << "Found trig objects #" << nK << std::endl;
01095
01096 for (Int_t iTrig = 0; iTrig <nK; ++iTrig ) {
01097
01098 const trigger::TriggerObject& TO(TOC[KEYS[iTrig]]);
01099
01100 Double_t dr_ele_HLT1 = reco::deltaR(maxETelec1.eta(),maxETelec1.phi(),TO.eta(),TO.phi());
01101 Double_t dr_ele_HLT2 = reco::deltaR(maxETelec2.eta(),maxETelec2.phi(),TO.eta(),TO.phi());
01102
01103
01104
01105 if ( TMath::Abs(dr_ele_HLT1) < matched_dr_distance1 ) {
01106 matched_dr_distance1 = dr_ele_HLT1;
01107 }
01108
01109 if ( TMath::Abs(dr_ele_HLT2) < matched_dr_distance2 ) {
01110 matched_dr_distance2 = dr_ele_HLT2;
01111 }
01112 }
01113 }
01114 }
01115
01116 if ( matched_dr_distance1 < electronMatched2HLT_DR_ ) {
01117 ++trigger_int_probe1;
01118 }
01119
01120 if ( matched_dr_distance2 < electronMatched2HLT_DR_ ) {
01121 ++trigger_int_probe2;
01122 }
01123
01124 if ( ( trigger_int_probe1 == 0 ) && ( trigger_int_probe2 == 0 ) ) { std::cout << "No electron could be matched to an HLT object with " << std::endl;
01125
01126 delete [] sorted;
01127 delete [] et;
01128
01129 return false;
01130 }
01131
01132 maxETelec1.addUserFloat("HLTMatchingDR", Float_t(matched_dr_distance1));
01133 maxETelec2.addUserFloat("HLTMatchingDR", Float_t(matched_dr_distance2));
01134
01135 }
01136 else {
01137
01138 delete [] sorted;
01139 delete [] et;
01140
01141 return false;
01142 }
01143 }
01144
01145 std::cout << "HLT matching has finished" << std::endl;
01146
01147
01148
01149
01150
01151
01152
01153 if ( HLTResults.isValid() ) {
01154
01155 const std::string process = triggerCollectionTag_.process();
01156
01157 std::string HLTPath[18];
01158 HLTPath[0 ] = "HLT_Photon10_L1R" ;
01159 HLTPath[1 ] = "HLT_Photon15_L1R" ;
01160 HLTPath[2 ] = "HLT_Photon20_L1R" ;
01161 HLTPath[3 ] = "HLT_Photon15_TrackIso_L1R" ;
01162 HLTPath[4 ] = "HLT_Photon15_LooseEcalIso_L1R" ;
01163 HLTPath[5 ] = "HLT_Photon30_L1R_8E29" ;
01164 HLTPath[6 ] = "HLT_Photon30_L1R_8E29" ;
01165 HLTPath[7 ] = "HLT_Ele10_LW_L1R" ;
01166 HLTPath[8 ] = "HLT_Ele15_LW_L1R" ;
01167 HLTPath[9 ] = "HLT_Ele20_LW_L1R" ;
01168 HLTPath[10] = "HLT_Ele10_LW_EleId_L1R" ;
01169 HLTPath[11] = "HLT_Ele15_SiStrip_L1R" ;
01170 HLTPath[12] = "HLT_IsoTrackHB_8E29" ;
01171 HLTPath[13] = "HLT_IsoTrackHE_8E29" ;
01172 HLTPath[14] = "HLT_DiJetAve15U_8E29" ;
01173 HLTPath[15] = "HLT_MET45" ;
01174 HLTPath[16] = "HLT_L1MET20" ;
01175 HLTPath[17] = "HLT_MET100" ;
01176
01177 edm::InputTag HLTFilterType[15];
01178 HLTFilterType[0 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSinglePhotonEt10HcalIsolFilter","",process) ;
01179 HLTFilterType[1 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSinglePhotonEt15HcalIsolFilter" ,"",process) ;
01180 HLTFilterType[2 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSinglePhotonEt20HcalIsolFilter" ,"",process) ;
01181 HLTFilterType[3 ]= edm::InputTag("hltL1NonIsoSinglePhotonEt15HTITrackIsolFilter","",process) ;
01182 HLTFilterType[4 ]= edm::InputTag("hltL1NonIsoSinglePhotonEt15LEIHcalIsolFilter","",process) ;
01183 HLTFilterType[5 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSinglePhotonEt15EtFilterESet308E29","",process) ;
01184 HLTFilterType[6 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSinglePhotonEt15HcalIsolFilter","",process) ;
01185 HLTFilterType[7 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSingleElectronLWEt10PixelMatchFilter","",process) ;
01186 HLTFilterType[8 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSingleElectronLWEt15PixelMatchFilter","",process) ;
01187 HLTFilterType[9 ]= edm::InputTag("hltL1NonIsoHLTNonIsoSingleElectronLWEt15EtFilterESet20","",process) ;
01188 HLTFilterType[10]= edm::InputTag("hltL1NonIsoHLTNonIsoSingleElectronLWEt10EleIdDphiFilter","",process) ;
01189 HLTFilterType[11]= edm::InputTag("hltL1NonIsoHLTNonIsoSingleElectronSiStripEt15PixelMatchFilter","",process) ;
01190 HLTFilterType[12]= edm::InputTag("hltIsolPixelTrackL3FilterHB8E29","",process) ;
01191 HLTFilterType[13]= edm::InputTag("hltIsolPixelTrackL2FilterHE8E29","",process) ;
01192 HLTFilterType[14]= edm::InputTag("hltL1sDiJetAve15U8E29","",process) ;
01193
01194 Int_t triggerDecision = 0;
01195 UInt_t trigger_size = HLTResults->size();
01196
01197 for (Int_t i=0; i<18; ++i ) {
01198
01199 const edm::TriggerNames & triggerNames = iEvent.triggerNames(*HLTResults);
01200 UInt_t trigger_position = triggerNames.triggerIndex(HLTPath[i]);
01201 Int_t passTrigger = 0;
01202
01203 if ( trigger_position < trigger_size ) {
01204 passTrigger = (Int_t)HLTResults->accept(trigger_position);
01205 }
01206
01207 if ( passTrigger > 0 ) {
01208 if ( i >= 15 ) {
01209 triggerDecision += (Int_t)(TMath::Power(2,i));
01210 }
01211 else {
01212 const Int_t myfilterInd = pHLT->filterIndex(HLTFilterType[i]);
01213 if ( myfilterInd != nF ) {
01214 triggerDecision += (Int_t)(TMath::Power(2,i));
01215 }
01216 }
01217 }
01218 }
01219
01220
01221 maxETelec1.addUserInt("triggerDecision",triggerDecision);
01222 maxETelec2.addUserInt("triggerDecision",triggerDecision);
01223 }
01224
01225
01226
01227
01228
01229 edm::Handle<pat::METCollection> patMET;
01230 iEvent.getByLabel(metCollectionTag_, patMET);
01231
01232 edm::Handle<pat::METCollection> patpfMET;
01233 iEvent.getByLabel(pfMetCollectionTag_, patpfMET);
01234
01235 edm::Handle<pat::METCollection> pattcMET;
01236 iEvent.getByLabel(tcMetCollectionTag_, pattcMET);
01237
01238 const pat::METCollection *pMet = patMET.product();
01239 const pat::METCollection::const_iterator met = pMet->begin();
01240 const pat::MET theMET = *met;
01241
01242 const pat::METCollection *pPfMet = patpfMET.product();
01243 const pat::METCollection::const_iterator pfmet = pPfMet->begin();
01244 const pat::MET thePfMET = *pfmet;
01245
01246 const pat::METCollection *pTcMet = pattcMET.product();
01247 const pat::METCollection::const_iterator tcmet = pTcMet->begin();
01248 const pat::MET theTcMET = *tcmet;
01249
01250 Double_t metEt = met->et();
01251
01252
01253
01254
01255
01256
01257
01258 if ( metEt < METCut_ ) { std::cout << "MET is " << metEt << std::endl;
01259
01260 delete [] sorted;
01261 delete [] et;
01262
01263 return false;
01264 }
01265
01266
01267
01268
01269 pat::CompositeCandidate zeeCandidate;
01270
01271 zeeCandidate.addDaughter(maxETelec1, "electron1");
01272 zeeCandidate.addDaughter(maxETelec2, "electron2");
01273
01274 zeeCandidate.addDaughter(theMET, "met");
01275 zeeCandidate.addDaughter(thePfMET, "pfmet");
01276 zeeCandidate.addDaughter(theTcMET, "tcmet");
01277
01278 auto_ptr<pat::CompositeCandidateCollection>selectedZeeCandidates(new pat::CompositeCandidateCollection);
01279
01280 selectedZeeCandidates->push_back(zeeCandidate);
01281
01282 iEvent.put(selectedZeeCandidates, "selectedZeeCandidates");
01283
01284
01285 delete [] sorted;
01286 delete [] et;
01287
01288 std::cout << "Run = " << iEvent.run() << " "
01289 << "Lumi = " << (Int_t)iEvent.luminosityBlock() << " "
01290 << "Event = " << iEvent.eventAuxiliary().event() << " "
01291 << "FILTER-MSG: Event Accepted for Z Candidate"
01292 << std::endl;
01293
01294 return true;
01295
01296 }
01297
01298
01299 void ZeeCandidateFilter::endJob() {}
01300
01301 Bool_t ZeeCandidateFilter::isInFiducial(Double_t eta)
01302 {
01303 if ( TMath::Abs(eta) < BarrelMaxEta_ ) {
01304 return true;
01305 }
01306 else if ( ( TMath::Abs(eta) < EndCapMaxEta_ ) && ( TMath::Abs(eta) > EndCapMinEta_ ) ) {
01307 return true;
01308 }
01309
01310 return false;
01311
01312 }
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341 DEFINE_FWK_MODULE(ZeeCandidateFilter);