CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTPMMassFilter.cc
Go to the documentation of this file.
1 
10 
11 //
12 // constructors and destructor
13 //
15 {
16  candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
17  beamSpot_ = iConfig.getParameter< edm::InputTag > ("beamSpot");
18  lowerMassCut_ = iConfig.getParameter<double> ("lowerMassCut");
19  upperMassCut_ = iConfig.getParameter<double> ("upperMassCut");
20  nZcandcut_ = iConfig.getParameter<int> ("nZcandcut");
21  reqOppCharge_ = iConfig.getUntrackedParameter<bool> ("reqOppCharge",false);
22  isElectron1_ = iConfig.getUntrackedParameter<bool> ("isElectron1",true) ;
23  isElectron2_ = iConfig.getUntrackedParameter<bool> ("isElectron2",true) ;
24  relaxed_ = iConfig.getUntrackedParameter<bool> ("relaxed",true) ;
25  L1IsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1IsoCand");
26  L1NonIsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1NonIsoCand");
27 }
28 
30 
31 
32 // ------------ method called to produce the data ------------
33 bool
35 {
36  using namespace std;
37  using namespace edm;
38  using namespace reco;
39  using namespace trigger;
40 
41  // The filter object
42  if (saveTags()) {
43  filterproduct.addCollectionTag(L1IsoCollTag_);
44  if (relaxed_) filterproduct.addCollectionTag(L1NonIsoCollTag_);
45  }
46 
48 
50  iEvent.getByLabel (candTag_,PrevFilterOutput);
51 
52  // beam spot
53  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
54  iEvent.getByLabel(beamSpot_,recoBeamSpotHandle);
55  // gets its position
56  const GlobalPoint vertexPos(recoBeamSpotHandle->position().x(),
57  recoBeamSpotHandle->position().y(),
58  recoBeamSpotHandle->position().z());
59 
60  int n = 0;
61 
62  // REMOVED USAGE OF STATIC ARRAYS
63  // double px[66];
64  // double py[66];
65  // double pz[66];
66  // double energy[66];
67  std::vector<TLorentzVector> pEleCh1;
68  std::vector<TLorentzVector> pEleCh2;
69  std::vector<double> charge;
70  std::vector<double> etaOrig;
71 
72  if (isElectron1_ && isElectron2_) {
73 
75 
76  vector< Ref< ElectronCollection > > electrons;
77  PrevFilterOutput->getObjects(TriggerElectron, electrons);
78 
79  for (unsigned int i=0; i<electrons.size(); i++) {
80 
81  refele = electrons[i];
82 
83  TLorentzVector pThisEle(refele->px(), refele->py(),
84  refele->pz(), refele->energy() );
85  pEleCh1.push_back( pThisEle );
86  charge.push_back( refele->charge() );
87  }
88 
89  for(unsigned int jj=0;jj<electrons.size();jj++){
90 
91  TLorentzVector p1Ele = pEleCh1.at(jj);
92  for(unsigned int ii=jj+1;ii<electrons.size();ii++){
93 
94  TLorentzVector p2Ele = pEleCh1.at(ii);
95 
96  if(fabs(p1Ele.E() - p2Ele.E()) < 0.00001) continue;
97  if(reqOppCharge_ && charge[jj]*charge[ii] > 0) continue;
98 
99  TLorentzVector pTot = p1Ele + p2Ele;
100  double mass = pTot.M();
101 
102  if(mass>=lowerMassCut_ && mass<=upperMassCut_){
103  n++;
104  refele = electrons[ii];
105  filterproduct.addObject(TriggerElectron, refele);
106  refele = electrons[jj];
107  filterproduct.addObject(TriggerElectron, refele);
108  }
109  }
110  }
111 
112  } else {
113 
115 
116  vector< Ref< RecoEcalCandidateCollection > > scs;
117  PrevFilterOutput->getObjects(TriggerCluster, scs);
118 
119  for (unsigned int i=0; i<scs.size(); i++) {
120 
121  refsc = scs[i];
122  const reco::SuperClusterRef sc = refsc->superCluster();
123  TLorentzVector pscPos = this->approxMomAtVtx(theMagField.product(),
124  vertexPos,
125  sc,1);
126  pEleCh1.push_back( pscPos );
127 
128  TLorentzVector pscEle = this->approxMomAtVtx(theMagField.product(),
129  vertexPos,
130  sc,-1);
131  pEleCh2.push_back( pscEle );
132  etaOrig.push_back( sc->eta() );
133 
134  }
135 
136  for(unsigned int jj=0;jj<scs.size();jj++){
137 
138  TLorentzVector p1Ele = pEleCh1.at(jj);
139  for(unsigned int ii=0;ii<scs.size();ii++){
140 
141  TLorentzVector p2Ele = pEleCh2.at(ii);
142 
143  if(fabs(p1Ele.E() - p2Ele.E()) < 0.00001) continue;
144 
145  TLorentzVector pTot = p1Ele + p2Ele;
146  double mass = pTot.M();
147 
148  if(mass>= lowerMassCut_ && mass<=upperMassCut_){
149  n++;
150  refsc = scs[ii];
151  filterproduct.addObject(TriggerCluster, refsc);
152  refsc = scs[jj];
153  filterproduct.addObject(TriggerCluster, refsc);
154  }
155  }
156  }
157  }
158 
159 
160  // filter decision
161  bool accept(n>=nZcandcut_);
162  // if (accept) std::cout << "n size = " << n << std::endl;
163 
164  return accept;
165 }
166 
167 TLorentzVector HLTPMMassFilter::approxMomAtVtx( const MagneticField *magField, const GlobalPoint& xvert, const reco::SuperClusterRef sc, int charge)
168 {
169  GlobalPoint xsc(sc->position().x(),
170  sc->position().y(),
171  sc->position().z());
172  float energy = sc->energy();
173  FreeTrajectoryState theFTS = theFTSFactory(magField, xsc, xvert,
174  energy, charge);
175  float theApproxMomMod = theFTS.momentum().x()*theFTS.momentum().x() +
176  theFTS.momentum().y()*theFTS.momentum().y() +
177  theFTS.momentum().z()*theFTS.momentum().z();
178  TLorentzVector theApproxMom(theFTS.momentum().x(),
179  theFTS.momentum().y(),
180  theFTS.momentum().z(),
181  sqrt(theApproxMomMod + 2.61121E-7));
182  return theApproxMom ;
183 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
edm::InputTag candTag_
edm::InputTag beamSpot_
TLorentzVector approxMomAtVtx(const MagneticField *magField, const GlobalPoint &xvert, const reco::SuperClusterRef sc, int charge)
T y() const
Definition: PV3DBase.h:62
HLTPMMassFilter(const edm::ParameterSet &)
edm::InputTag L1IsoCollTag_
edm::InputTag L1NonIsoCollTag_
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:22
double charge(const std::vector< uint8_t > &Ampls)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref&lt;C&gt;)
int iEvent
Definition: GenABIO.cc:243
T sqrt(T t)
Definition: SSEVec.h:46
T z() const
Definition: PV3DBase.h:63
virtual bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
GlobalVector momentum() const
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
bool saveTags() const
Definition: HLTFilter.h:45
tuple mass
Definition: scaleCards.py:27
FTSFromVertexToPointFactory theFTSFactory
T x() const
Definition: PV3DBase.h:61
edm::ESHandle< MagneticField > theMagField