CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TCTauAlgorithm.cc
Go to the documentation of this file.
2 
7 
9 
10 #include "Math/VectorUtil.h"
11 using namespace ROOT::Math;
12 
13 using namespace reco;
14 
16  init();
17 }
18 
20  init();
21  inputConfig(iConfig, iC);
22 }
23 
25 
27 
28  event = 0;
29  setup = 0;
30 
31  trackAssociator = new TrackDetectorAssociator();
32  trackAssociator->useDefaultPropagator();
33 
34  all = 0;
35  passed = 0;
36  prongs = -1;
37  algoComponentUsed = 0;
38 }
39 
41 
42  etCaloOverTrackMin = iConfig.getParameter<double>("EtCaloOverTrackMin");
43  etCaloOverTrackMax = iConfig.getParameter<double>("EtCaloOverTrackMax");
44  etHcalOverTrackMin = iConfig.getParameter<double>("EtHcalOverTrackMin");
45  etHcalOverTrackMax = iConfig.getParameter<double>("EtHcalOverTrackMax");
46 
47  signalCone = iConfig.getParameter<double>("SignalConeSize");
48  ecalCone = iConfig.getParameter<double>("EcalConeSize");
49 
50  EcalRecHitsEB_input= iConfig.getParameter<edm::InputTag>("EBRecHitCollection");
51  EcalRecHitsEE_input= iConfig.getParameter<edm::InputTag>("EERecHitCollection");
52  HBHERecHits_input = iConfig.getParameter<edm::InputTag>("HBHERecHitCollection");
53  HORecHits_input = iConfig.getParameter<edm::InputTag>("HORecHitCollection");
54  HFRecHits_input = iConfig.getParameter<edm::InputTag>("HFRecHitCollection");
55 
56  edm::ParameterSet pset = iConfig.getParameter<edm::ParameterSet>("TrackAssociatorParameters");
57  trackAssociatorParameters.loadParameters( pset, iC );
58 
59  dropCaloJets = iConfig.getUntrackedParameter<bool>("DropCaloJets",false);
60  dropRejected = iConfig.getUntrackedParameter<bool>("DropRejectedJets",true);
61 }
62 
63 
65  return double(passed)/all;
66 }
67 
69  return passed;
70 }
71 
73  return all;
74 }
75 
77  return algoComponentUsed;
78 }
79 
81 
82  event = &iEvent;
83  setup = &iSetup;
84 
86  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",builder);
87  transientTrackBuilder = builder.product();
88 
89  // geometry initialization
91  iSetup.get<CaloGeometryRecord>().get(geometry);
92 
93 
94  EB = geometry->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
95  EE = geometry->getSubdetectorGeometry(DetId::Ecal,EcalEndcap);
96  HB = geometry->getSubdetectorGeometry(DetId::Hcal,HcalBarrel);
97  HE = geometry->getSubdetectorGeometry(DetId::Hcal,HcalEndcap);
98  HO = geometry->getSubdetectorGeometry(DetId::Hcal,HcalOuter);
99  HF = geometry->getSubdetectorGeometry(DetId::Hcal,HcalForward);
100 
101  //hits
102  iEvent.getByLabel( EcalRecHitsEB_input, EBRecHits );
103  iEvent.getByLabel( EcalRecHitsEE_input, EERecHits );
104 
105  iEvent.getByLabel( HBHERecHits_input, HBHERecHits );
106  iEvent.getByLabel( HORecHits_input, HORecHits );
107  iEvent.getByLabel( HFRecHits_input, HFRecHits );
108 }
109 
110 
112 
113  const TrackRef& leadTk = jet.leadTrack();
114 
115  const TrackRefVector associatedTracks = jet.caloTauTagInfoRef()->Tracks();
116 
117  const CaloJet* cJet = jet.caloTauTagInfoRef()->calojetRef().get();
118  CaloJet caloJet = *cJet;
119  caloJet.setP4(jet.p4());
120 
121  return recalculateEnergy(caloJet,leadTk,associatedTracks);
122 }
123 
125 
126  all++;
127 
128  math::XYZTLorentzVector p4(0,0,0,0);
129  algoComponentUsed = TCAlgoUndetermined;
130 
131  //if(!dropRejected)
132  p4 = caloJet.p4();
133 
134  if(leadTk.isNull()) return p4;
135 
136  XYZVector momentum(0,0,0);
137  int prongCounter = 0;
139  for(iTrack = associatedTracks.begin(); iTrack!= associatedTracks.end(); ++iTrack){
140  double DR = ROOT::Math::VectorUtil::DeltaR(leadTk->momentum(),(*iTrack)->momentum());
141  if(DR < signalCone) {
142  momentum+=(*iTrack)->momentum();
143  prongCounter++;
144  }
145  }
146  if(momentum.Rho() == 0) return p4;
147 
148  XYZVector ltrackEcalHitPoint = trackEcalHitPoint(*leadTk);
149 
150  if(! (ltrackEcalHitPoint.Rho() > 0 && ltrackEcalHitPoint.Rho() < 9999) ) return p4;
151 
152  std::pair<XYZVector,XYZVector> caloClusters = getClusterEnergy(caloJet,ltrackEcalHitPoint,signalCone);
153  XYZVector EcalCluster = caloClusters.first;
154  XYZVector HcalCluster = caloClusters.second;
155 
156  double eCaloOverTrack = (EcalCluster.R()+HcalCluster.R()-momentum.R())/momentum.R();
157 
158  std::pair<XYZVector,XYZVector> caloClustersPhoton = getClusterEnergy(caloJet,ltrackEcalHitPoint,ecalCone);
159  XYZVector EcalClusterPhoton = caloClustersPhoton.first;
160 
161  math::XYZTLorentzVector p4photons(0,0,0,EcalClusterPhoton.R() - EcalCluster.R());
162 
163  if( eCaloOverTrack > etCaloOverTrackMin && eCaloOverTrack < etCaloOverTrackMax ) {
164 
165  double eHcalOverTrack = (HcalCluster.R()-momentum.R())/momentum.R();
166 
167  if ( eHcalOverTrack > etHcalOverTrackMin && eHcalOverTrack < etHcalOverTrackMax ) {
168  p4.SetXYZT(EcalCluster.X() + momentum.X(),
169  EcalCluster.Y() + momentum.Y(),
170  EcalCluster.Z() + momentum.Z(),
171  EcalCluster.R() + momentum.R());
172  p4 += p4photons;
173  algoComponentUsed = TCAlgoMomentumECAL;
174  }else{
175  p4.SetXYZT(momentum.X(),
176  momentum.Y(),
177  momentum.Z(),
178  momentum.R());
179  algoComponentUsed = TCAlgoMomentum;
180  }
181  }
182  if( eCaloOverTrack > etCaloOverTrackMax ) {
183  double eHcalOverTrack = (HcalCluster.R()-momentum.R())/momentum.R();
184 
185  if ( eHcalOverTrack > etHcalOverTrackMin && eHcalOverTrack < etHcalOverTrackMax ) {
186  p4.SetXYZT(EcalCluster.X() + momentum.X(),
187  EcalCluster.Y() + momentum.Y(),
188  EcalCluster.Z() + momentum.Z(),
189  EcalCluster.R() + momentum.R());
190  p4 += p4photons;
191  algoComponentUsed = TCAlgoMomentumECAL;
192  }
193  if ( eHcalOverTrack < etHcalOverTrackMin ) {
194  if(!dropCaloJets) p4.SetXYZT(caloJet.px(),caloJet.py(),caloJet.pz(),caloJet.energy());
195  else p4.SetXYZT(0,0,0,0);
196  algoComponentUsed = TCAlgoCaloJet;
197  }
198  if ( eHcalOverTrack > etHcalOverTrackMax ) {
199  algoComponentUsed = TCAlgoHadronicJet; // reject
200  if(!dropRejected) p4.SetXYZT(caloJet.px(),caloJet.py(),caloJet.pz(),caloJet.energy());
201  else p4.SetXYZT(0,0,0,0);
202  }
203  }
204  if( eCaloOverTrack < etCaloOverTrackMin ) {
205  algoComponentUsed = TCAlgoTrackProblem; // reject
206  if(!dropRejected) p4.SetXYZT(caloJet.px(),caloJet.py(),caloJet.pz(),caloJet.energy());
207  }
208 
209  if(p4.Et() > 0) passed++;
210 
211  return p4;
212 }
213 
214 
216 
217 
218  GlobalPoint ecalHitPosition(0,0,0);
219 
220  double maxTowerEt = 0;
221  std::vector<CaloTowerPtr> towers = caloJet.getCaloConstituents();
222  for(std::vector<CaloTowerPtr>::const_iterator iTower = towers.begin();
223  iTower!= towers.end(); ++iTower){
224  if((*iTower)->et() > maxTowerEt){
225  maxTowerEt = (*iTower)->et();
226  ecalHitPosition = (*iTower)->emPosition();
227  }
228  }
229 
230 
231  XYZVector ecalHitPoint(0,0,0);
232 
233  GlobalPoint trackEcalHitPoint = transientTrack.stateOnSurface(ecalHitPosition).globalPosition();
234 
235  ecalHitPoint.SetXYZ(trackEcalHitPoint.x(),
236  trackEcalHitPoint.y(),
237  trackEcalHitPoint.z());
238 
239  return ecalHitPoint;
240 }
241 
243 
244  const FreeTrajectoryState fts = trackAssociator->getFreeTrajectoryState(*setup,track);
245  TrackDetMatchInfo info = trackAssociator->associate(*event, *setup, fts, trackAssociatorParameters);
246  if( info.isGoodEcal != 0 ) {
247  return XYZVector(info.trkGlobPosAtEcal.x(),info.trkGlobPosAtEcal.y(),info.trkGlobPosAtEcal.z());
248  }
249  return XYZVector(0,0,0);
250 }
251 
252 std::pair<XYZVector,XYZVector> TCTauAlgorithm::getClusterEnergy(const CaloJet& caloJet,XYZVector& trackEcalHitPoint,double cone){
253 
254  XYZVector ecalCluster(0,0,0);
255  XYZVector hcalCluster(0,0,0);
256 
257  std::vector<CaloTowerPtr> towers = caloJet.getCaloConstituents();
258 
259  for(std::vector<CaloTowerPtr>::const_iterator iTower = towers.begin();
260  iTower!= towers.end(); ++iTower){
261  std::vector<XYZVector> ECALCells;
262  std::vector<XYZVector> HCALCells;
263 
264  size_t numRecHits = (**iTower).constituentsSize();
265 
266  // access CaloRecHits
267  for(size_t j = 0; j < numRecHits; j++) {
268  DetId recHitDetID = (**iTower).constituent(j);
269  //DetId::Detector detNum=recHitDetID.det();
270  if( recHitDetID.det() == DetId::Ecal ){
271  if( recHitDetID.subdetId() == 1 ){ // Ecal Barrel
272  EBDetId ecalID = recHitDetID;
273  EBRecHitCollection::const_iterator theRecHit = EBRecHits->find(ecalID);
274  if(theRecHit != EBRecHits->end()){
275  DetId id = theRecHit->detid();
276  const CaloCellGeometry* this_cell = EB->getGeometry(id);
277  double energy = theRecHit->energy();
278  ECALCells.push_back(getCellMomentum(this_cell,energy));
279  }
280  }
281  if( recHitDetID.subdetId() == 2 ){ // Ecal Endcap
282  EEDetId ecalID = recHitDetID;
283  EERecHitCollection::const_iterator theRecHit = EERecHits->find(ecalID);
284  if(theRecHit != EERecHits->end()){
285  DetId id = theRecHit->detid();
286  const CaloCellGeometry* this_cell = EE->getGeometry(id);
287  double energy = theRecHit->energy();
288  ECALCells.push_back(getCellMomentum(this_cell,energy));
289  }
290  }
291  }
292  if( recHitDetID.det() == DetId::Hcal ){
293  HcalDetId hcalID = recHitDetID;
294  if( recHitDetID.subdetId() == HcalBarrel ){
295  //int depth = hcalID.depth();
296  //if (depth==1){
297  HBHERecHitCollection::const_iterator theRecHit=HBHERecHits->find(hcalID);
298  if(theRecHit != HBHERecHits->end()){
299  DetId id = theRecHit->detid();
300  const CaloCellGeometry* this_cell = HB->getGeometry(id);
301  double energy = theRecHit->energy();
302  HCALCells.push_back(getCellMomentum(this_cell,energy));
303  }
304  //}
305  }
306  if( recHitDetID.subdetId() == HcalEndcap ){
307  //int depth = hcalID.depth();
308  //if (depth==1){
309  HBHERecHitCollection::const_iterator theRecHit=HBHERecHits->find(hcalID);
310  if(theRecHit != HBHERecHits->end()){
311  DetId id = theRecHit->detid();
312  const CaloCellGeometry* this_cell = HE->getGeometry(id);
313  double energy = theRecHit->energy();
314  HCALCells.push_back(getCellMomentum(this_cell,energy));
315  }
316  //}
317  }
318  if( recHitDetID.subdetId() == HcalOuter ){
319  HORecHitCollection::const_iterator theRecHit=HORecHits->find(hcalID);
320  if(theRecHit != HORecHits->end()){
321  DetId id = theRecHit->detid();
322  const CaloCellGeometry* this_cell = HO->getGeometry(id);
323  double energy = theRecHit->energy();
324  HCALCells.push_back(getCellMomentum(this_cell,energy));
325  }
326  }
327  if( recHitDetID.subdetId() == HcalForward ){
328  HFRecHitCollection::const_iterator theRecHit=HFRecHits->find(hcalID);
329  if(theRecHit != HFRecHits->end()){
330  DetId id = theRecHit->detid();
331  const CaloCellGeometry* this_cell = HF->getGeometry(id);
332  double energy = theRecHit->energy();
333  HCALCells.push_back(getCellMomentum(this_cell,energy));
334  }
335  }
336  }
337  }
338 
339  std::vector<XYZVector>::const_iterator i;
340  for(i = ECALCells.begin(); i != ECALCells.end(); ++i) {
341  double DR = ROOT::Math::VectorUtil::DeltaR(trackEcalHitPoint,*i);
342  if( DR < cone ) ecalCluster += *i;
343  }
344  for(i = HCALCells.begin(); i != HCALCells.end(); ++i) {
345  double DR = ROOT::Math::VectorUtil::DeltaR(trackEcalHitPoint,*i);
346  if( DR < cone ) hcalCluster += *i;
347  }
348  }
349  return std::pair<XYZVector,XYZVector> (ecalCluster,hcalCluster);
350 }
351 
353  XYZVector momentum(0,0,0);
354  if(cell){
355  GlobalPoint hitPosition = cell->getPosition();
356 
357  double phi = hitPosition.phi();
358  double theta = hitPosition.theta();
359  if(theta > 3.14159) theta = 2*3.14159 - theta;
360  double px = energy * sin(theta)*cos(phi);
361  double py = energy * sin(theta)*sin(phi);
362  double pz = energy * cos(theta);
363 
364  momentum = XYZVector(px,py,pz);
365  }
366  return momentum;
367 }
T getParameter(std::string const &) const
void eventSetup(const edm::Event &, const edm::EventSetup &)
T getUntrackedParameter(std::string const &, T const &) const
virtual reco::TrackRef leadTrack() const
Definition: BaseTau.cc:26
int i
Definition: DBlmapReader.cc:9
static const TGPicture * info(bool iBackgroundIsBlack)
Jets made from CaloTowers.
Definition: CaloJet.h:29
double efficiency()
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
int init
Definition: HydjetWrapper.h:62
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
std::vector< EcalRecHit >::const_iterator const_iterator
Geom::Theta< T > theta() const
T y() const
Definition: PV3DBase.h:63
virtual void setP4(const LorentzVector &p4)
set 4-momentum
GlobalPoint globalPosition() const
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:249
virtual std::vector< CaloTowerPtr > getCaloConstituents() const
get all constituents
Definition: CaloJet.cc:93
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:244
math::XYZVector trackEcalHitPoint(const reco::TransientTrack &, const reco::CaloJet &)
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
std::pair< math::XYZVector, math::XYZVector > getClusterEnergy(const reco::CaloJet &, math::XYZVector &, double)
virtual double energy() const
energy
int iEvent
Definition: GenABIO.cc:230
bool isNull() const
Checks for null.
Definition: Ref.h:247
double p4[4]
Definition: TauolaWrapper.h:92
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
math::XYZTLorentzVector recalculateEnergy(const reco::CaloTau &)
int j
Definition: DBlmapReader.cc:9
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:390
EcalLogicID ecalID()
math::XYZVector getCellMomentum(const CaloCellGeometry *, double &)
Definition: DetId.h:18
Transform3DPJ::Vector XYZVector
virtual double px() const
x coordinate of momentum vector
const CaloTauTagInfoRef & caloTauTagInfoRef() const
Definition: CaloTau.cc:29
void inputConfig(const edm::ParameterSet &iConfig, edm::ConsumesCollector &iC)
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
virtual double pz() const
z coordinate of momentum vector
ESHandle< TrackerGeometry > geometry
TrajectoryStateOnSurface stateOnSurface(const GlobalPoint &point) const
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:242
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
T x() const
Definition: PV3DBase.h:62
virtual const LorentzVector & p4() const
four-momentum Lorentz vector
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
virtual double py() const
y coordinate of momentum vector
Definition: DDAxes.h:10