CMS 3D CMS Logo

HLTPMMassFilter.cc
Go to the documentation of this file.
1 
10 
11 #include "HLTPMMassFilter.h"
12 
13 //
14 // constructors and destructor
15 //
17 {
18  candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
19  beamSpot_ = iConfig.getParameter< edm::InputTag > ("beamSpot");
20  l1EGTag_ = iConfig.getParameter< edm::InputTag > ("l1EGCand");
21 
22  lowerMassCut_ = iConfig.getParameter<double> ("lowerMassCut");
23  upperMassCut_ = iConfig.getParameter<double> ("upperMassCut");
24  nZcandcut_ = iConfig.getParameter<int> ("nZcandcut");
25  reqOppCharge_ = iConfig.getUntrackedParameter<bool> ("reqOppCharge",false);
26  isElectron1_ = iConfig.getUntrackedParameter<bool> ("isElectron1", true) ;
27  isElectron2_ = iConfig.getUntrackedParameter<bool> ("isElectron2", true) ;
28 
29  candToken_ = consumes<trigger::TriggerFilterObjectWithRefs> (candTag_);
30  beamSpotToken_ = consumes<reco::BeamSpot> (beamSpot_);
31 }
32 
34 
35 void
39  desc.add<edm::InputTag>("candTag", edm::InputTag("hltL1NonIsoDoublePhotonEt5UpsHcalIsolFilter"));
40  desc.add<edm::InputTag>("beamSpot", edm::InputTag("hltOfflineBeamSpot"));
41  desc.add<double>("lowerMassCut", 8.0);
42  desc.add<double>("upperMassCut", 11.0);
43  desc.add<int>("nZcandcut", 1);
44  desc.addUntracked<bool>("reqOppCharge", true);
45  desc.addUntracked<bool>("isElectron1", false);
46  desc.addUntracked<bool>("isElectron2", false);
47  desc.add<edm::InputTag>("l1EGCand", edm::InputTag("hltL1IsoRecoEcalCandidate"));
48  descriptions.add("hltPMMassFilter", desc);
49 }
50 
51 // ------------ method called to produce the data ------------
52 bool
54 {
55  using namespace std;
56  using namespace edm;
57  using namespace reco;
58  using namespace trigger;
59 
60  // The filter object
61  if (saveTags()) {
62  filterproduct.addCollectionTag(l1EGTag_);
63  }
64 
65  edm::ESHandle<MagneticField> theMagField;
66  iSetup.get<IdealMagneticFieldRecord>().get(theMagField);
67 
69  iEvent.getByToken (candToken_, PrevFilterOutput);
70 
71  // beam spot
72  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
73  iEvent.getByToken(beamSpotToken_,recoBeamSpotHandle);
74  // gets its position
75  const GlobalPoint vertexPos(recoBeamSpotHandle->position().x(),
76  recoBeamSpotHandle->position().y(),
77  recoBeamSpotHandle->position().z());
78 
79  int n = 0;
80 
81  // REMOVED USAGE OF STATIC ARRAYS
82  // double px[66];
83  // double py[66];
84  // double pz[66];
85  // double energy[66];
86  std::vector<TLorentzVector> pEleCh1;
87  std::vector<TLorentzVector> pEleCh2;
88  std::vector<double> charge;
89  std::vector<double> etaOrig;
90 
91  if (isElectron1_ && isElectron2_) {
92 
94 
95  vector< Ref< ElectronCollection > > electrons;
96  PrevFilterOutput->getObjects(TriggerElectron, electrons);
97 
98  for (auto & electron : electrons) {
99 
100  refele = electron;
101 
102  TLorentzVector pThisEle(refele->px(), refele->py(),
103  refele->pz(), refele->energy() );
104  pEleCh1.push_back( pThisEle );
105  charge.push_back( refele->charge() );
106  }
107 
108  for(unsigned int jj=0;jj<electrons.size();jj++){
109 
110  TLorentzVector p1Ele = pEleCh1.at(jj);
111  for(unsigned int ii=jj+1;ii<electrons.size();ii++){
112 
113  TLorentzVector p2Ele = pEleCh1.at(ii);
114 
115  if(fabs(p1Ele.E() - p2Ele.E()) < 0.00001) continue;
116  if(reqOppCharge_ && charge[jj]*charge[ii] > 0) continue;
117 
118  TLorentzVector pTot = p1Ele + p2Ele;
119  double mass = pTot.M();
120 
121  if(mass>=lowerMassCut_ && mass<=upperMassCut_){
122  n++;
123  refele = electrons[ii];
124  filterproduct.addObject(TriggerElectron, refele);
125  refele = electrons[jj];
126  filterproduct.addObject(TriggerElectron, refele);
127  }
128  }
129  }
130 
131  } else {
132 
134 
135  vector< Ref< RecoEcalCandidateCollection > > scs;
136  PrevFilterOutput->getObjects(TriggerCluster, scs);
137  if(scs.empty()) PrevFilterOutput->getObjects(TriggerPhoton, scs); //we dont know if its type trigger cluster or trigger photon
138 
139  for (auto & i : scs) {
140 
141  refsc = i;
142  const reco::SuperClusterRef sc = refsc->superCluster();
143  TLorentzVector pscPos = approxMomAtVtx(theMagField.product(), vertexPos, sc, 1);
144  pEleCh1.push_back( pscPos );
145 
146  TLorentzVector pscEle = approxMomAtVtx(theMagField.product(), vertexPos, sc, -1);
147  pEleCh2.push_back( pscEle );
148  etaOrig.push_back( sc->eta() );
149 
150  }
151 
152  for(unsigned int jj=0;jj<scs.size();jj++){
153 
154  TLorentzVector p1Ele = pEleCh1.at(jj);
155  for(unsigned int ii=0;ii<scs.size();ii++){
156 
157  TLorentzVector p2Ele = pEleCh2.at(ii);
158 
159  if(fabs(p1Ele.E() - p2Ele.E()) < 0.00001) continue;
160 
161  TLorentzVector pTot = p1Ele + p2Ele;
162  double mass = pTot.M();
163 
164  if(mass>= lowerMassCut_ && mass<=upperMassCut_){
165  n++;
166  refsc = scs[ii];
167  filterproduct.addObject(TriggerCluster, refsc);
168  refsc = scs[jj];
169  filterproduct.addObject(TriggerCluster, refsc);
170  }
171  }
172  }
173  }
174 
175 
176  // filter decision
177  bool accept(n>=nZcandcut_);
178  // if (accept) std::cout << "n size = " << n << std::endl;
179 
180  return accept;
181 }
182 
183 TLorentzVector HLTPMMassFilter::approxMomAtVtx( const MagneticField *magField, const GlobalPoint& xvert, const reco::SuperClusterRef sc, int charge) const
184 {
185  GlobalPoint xsc(sc->position().x(),
186  sc->position().y(),
187  sc->position().z());
188  float energy = sc->energy();
189  FreeTrajectoryState theFTS = FTSFromVertexToPointFactory::get(*magField, xsc, xvert, energy, charge);
190  float theApproxMomMod = theFTS.momentum().x()*theFTS.momentum().x() +
191  theFTS.momentum().y()*theFTS.momentum().y() +
192  theFTS.momentum().z()*theFTS.momentum().z();
193  TLorentzVector theApproxMom(theFTS.momentum().x(),
194  theFTS.momentum().y(),
195  theFTS.momentum().z(),
196  sqrt(theApproxMomMod + 2.61121E-7));
197  return theApproxMom ;
198 }
199 
200 // declare this class as a framework plugin
T getParameter(std::string const &) const
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
T getUntrackedParameter(std::string const &, T const &) const
edm::InputTag candTag_
static FreeTrajectoryState get(MagneticField const &magField, GlobalPoint const &xmeas, GlobalPoint const &xvert, float momentum, TrackCharge charge)
edm::InputTag beamSpot_
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
~HLTPMMassFilter() override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
T y() const
Definition: PV3DBase.h:63
HLTPMMassFilter(const edm::ParameterSet &)
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
ParameterDescriptionBase * add(U const &iLabel, T const &value)
GlobalVector momentum() const
ii
Definition: cuy.py:590
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > candToken_
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::InputTag l1EGTag_
fixed size matrix
bool saveTags() const
Definition: HLTFilter.h:45
HLT enums.
T get() const
Definition: EventSetup.h:71
const Point & position() const
position
Definition: BeamSpot.h:62
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
TLorentzVector approxMomAtVtx(const MagneticField *magField, const GlobalPoint &xvert, const reco::SuperClusterRef sc, int charge) const