CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HitEff.cc
Go to the documentation of this file.
1 // Package: CalibTracker/SiStripHitEfficiency
3 // Class: HitEff
4 // Original Author: Keith Ulmer--University of Colorado
5 // keith.ulmer@colorado.edu
6 //
8 
9 // system include files
10 #include <memory>
11 #include <string>
12 #include <iostream>
13 
17 
57 
60 
61 #include "TMath.h"
62 #include "TH1F.h"
63 
64 //
65 // constructors and destructor
66 //
67 
68 using namespace std;
70  : scalerToken_(consumes<LumiScalersCollection>(conf.getParameter<edm::InputTag>("lumiScalers"))),
71  commonModeToken_(mayConsume<edm::DetSetVector<SiStripRawDigi> >(conf.getParameter<edm::InputTag>("commonMode"))),
72  siStripClusterInfo_(consumesCollector()),
73  combinatorialTracks_token_(
74  consumes<reco::TrackCollection>(conf.getParameter<edm::InputTag>("combinatorialTracks"))),
75  trajectories_token_(consumes<std::vector<Trajectory> >(conf.getParameter<edm::InputTag>("trajectories"))),
76  trajTrackAsso_token_(consumes<TrajTrackAssociationCollection>(conf.getParameter<edm::InputTag>("trajectories"))),
77  clusters_token_(
78  consumes<edmNew::DetSetVector<SiStripCluster> >(conf.getParameter<edm::InputTag>("siStripClusters"))),
79  digis_token_(consumes<DetIdCollection>(conf.getParameter<edm::InputTag>("siStripDigis"))),
80  trackerEvent_token_(consumes<MeasurementTrackerEvent>(conf.getParameter<edm::InputTag>("trackerEvent"))),
81  topoToken_(esConsumes()),
82  geomToken_(esConsumes()),
83  cpeToken_(esConsumes(edm::ESInputTag("", "StripCPEfromTrackAngle"))),
84  siStripQualityToken_(esConsumes()),
85  magFieldToken_(esConsumes()),
86  measurementTkToken_(esConsumes()),
87  chi2MeasurementEstimatorToken_(esConsumes(edm::ESInputTag("", "Chi2"))),
88  propagatorToken_(esConsumes(edm::ESInputTag("", "PropagatorWithMaterial"))),
89  conf_(conf) {
90  compSettings = conf_.getUntrackedParameter<int>("CompressionSettings", -1);
91  layers = conf_.getParameter<int>("Layer");
92  DEBUG = conf_.getParameter<bool>("Debug");
93  addLumi_ = conf_.getUntrackedParameter<bool>("addLumi", false);
94  addCommonMode_ = conf_.getUntrackedParameter<bool>("addCommonMode", false);
95  cutOnTracks_ = conf_.getUntrackedParameter<bool>("cutOnTracks", false);
96  trackMultiplicityCut_ = conf.getUntrackedParameter<unsigned int>("trackMultiplicity", 100);
97  useFirstMeas_ = conf_.getUntrackedParameter<bool>("useFirstMeas", false);
98  useLastMeas_ = conf_.getUntrackedParameter<bool>("useLastMeas", false);
100  conf_.getUntrackedParameter<bool>("useAllHitsFromTracksWithMissingHits", false);
101 }
102 
103 // Virtual destructor needed.
105 
108  if (compSettings > 0) {
109  edm::LogInfo("SiStripHitEfficiency:HitEff") << "the compressions settings are:" << compSettings << std::endl;
110  fs->file().SetCompressionSettings(compSettings);
111  }
112 
113  traj = fs->make<TTree>("traj", "tree of trajectory positions");
114 #ifdef ExtendedCALIBTree
115  traj->Branch("timeDT", &timeDT, "timeDT/F");
116  traj->Branch("timeDTErr", &timeDTErr, "timeDTErr/F");
117  traj->Branch("timeDTDOF", &timeDTDOF, "timeDTDOF/I");
118  traj->Branch("timeECAL", &timeECAL, "timeECAL/F");
119  traj->Branch("dedx", &dedx, "dedx/F");
120  traj->Branch("dedxNOM", &dedxNOM, "dedxNOM/I");
121  traj->Branch("nLostHits", &nLostHits, "nLostHits/I");
122  traj->Branch("chi2", &chi2, "chi2/F");
123  traj->Branch("p", &p, "p/F");
124 #endif
125  traj->Branch("TrajGlbX", &TrajGlbX, "TrajGlbX/F");
126  traj->Branch("TrajGlbY", &TrajGlbY, "TrajGlbY/F");
127  traj->Branch("TrajGlbZ", &TrajGlbZ, "TrajGlbZ/F");
128  traj->Branch("TrajLocX", &TrajLocX, "TrajLocX/F");
129  traj->Branch("TrajLocY", &TrajLocY, "TrajLocY/F");
130  traj->Branch("TrajLocAngleX", &TrajLocAngleX, "TrajLocAngleX/F");
131  traj->Branch("TrajLocAngleY", &TrajLocAngleY, "TrajLocAngleY/F");
132  traj->Branch("TrajLocErrX", &TrajLocErrX, "TrajLocErrX/F");
133  traj->Branch("TrajLocErrY", &TrajLocErrY, "TrajLocErrY/F");
134  traj->Branch("ClusterLocX", &ClusterLocX, "ClusterLocX/F");
135  traj->Branch("ClusterLocY", &ClusterLocY, "ClusterLocY/F");
136  traj->Branch("ClusterLocErrX", &ClusterLocErrX, "ClusterLocErrX/F");
137  traj->Branch("ClusterLocErrY", &ClusterLocErrY, "ClusterLocErrY/F");
138  traj->Branch("ClusterStoN", &ClusterStoN, "ClusterStoN/F");
139  traj->Branch("ResX", &ResX, "ResX/F");
140  traj->Branch("ResXSig", &ResXSig, "ResXSig/F");
141  traj->Branch("ModIsBad", &ModIsBad, "ModIsBad/i");
142  traj->Branch("SiStripQualBad", &SiStripQualBad, "SiStripQualBad/i");
143  traj->Branch("withinAcceptance", &withinAcceptance, "withinAcceptance/O");
144  traj->Branch("nHits", &nHits, "nHits/I");
145  traj->Branch("pT", &pT, "pT/F");
146  traj->Branch("highPurity", &highPurity, "highPurity/O");
147  traj->Branch("trajHitValid", &trajHitValid, "trajHitValid/i");
148  traj->Branch("Id", &Id, "Id/i");
149  traj->Branch("run", &run, "run/i");
150  traj->Branch("event", &event, "event/i");
151  traj->Branch("layer", &whatlayer, "layer/i");
152  traj->Branch("tquality", &tquality, "tquality/I");
153  traj->Branch("bunchx", &bunchx, "bunchx/I");
154  if (addLumi_) {
155  traj->Branch("instLumi", &instLumi, "instLumi/F");
156  traj->Branch("PU", &PU, "PU/F");
157  }
158  if (addCommonMode_)
159  traj->Branch("commonMode", &commonMode, "commonMode/F");
160 
161  events = 0;
162  EventTrackCKF = 0;
163 }
164 
165 void HitEff::analyze(const edm::Event& e, const edm::EventSetup& es) {
166  //Retrieve tracker topology from geometry
167  const TrackerTopology* tTopo = &es.getData(topoToken_);
169 
170  // bool DEBUG = false;
171 
172  LogDebug("SiStripHitEfficiency:HitEff") << "beginning analyze from HitEff" << endl;
173 
174  using namespace edm;
175  using namespace reco;
176  // Step A: Get Inputs
177 
178  int run_nr = e.id().run();
179  int ev_nr = e.id().event();
180  int bunch_nr = e.bunchCrossing();
181 
182  // Luminosity informations
184  instLumi = 0;
185  PU = 0;
186  if (addLumi_) {
187  e.getByToken(scalerToken_, lumiScalers);
188  if (lumiScalers->begin() != lumiScalers->end()) {
189  instLumi = lumiScalers->begin()->instantLumi();
190  PU = lumiScalers->begin()->pileup();
191  }
192  }
193 
194  // CM
196  if (addCommonMode_)
197  e.getByToken(commonModeToken_, commonModeDigis);
198 
199  //CombinatoriaTrack
200  edm::Handle<reco::TrackCollection> trackCollectionCKF;
201  //edm::InputTag TkTagCKF = conf_.getParameter<edm::InputTag>("combinatorialTracks");
202  e.getByToken(combinatorialTracks_token_, trackCollectionCKF);
203 
204  edm::Handle<std::vector<Trajectory> > TrajectoryCollectionCKF;
205  //edm::InputTag TkTrajCKF = conf_.getParameter<edm::InputTag>("trajectories");
206  e.getByToken(trajectories_token_, TrajectoryCollectionCKF);
207 
208  edm::Handle<TrajTrackAssociationCollection> trajTrackAssociationHandle;
209  e.getByToken(trajTrackAsso_token_, trajTrackAssociationHandle);
210 
211  // Clusters
212  // get the SiStripClusters from the event
214  //e.getByLabel("siStripClusters", theClusters);
215  e.getByToken(clusters_token_, theClusters);
216 
217  //get tracker geometry
219  const TrackerGeometry* tkgeom = &(*tracker);
220 
221  //get Cluster Parameter Estimator
222  //std::string cpe = conf_.getParameter<std::string>("StripCPE");
224  const StripClusterParameterEstimator& stripcpe(*parameterestimator);
225 
226  // get the SiStripQuality records
228 
229  const MagneticField* magField_ = &es.getData(magFieldToken_);
230 
231  // get the list of module IDs with FED-detected errors
232  edm::Handle<DetIdCollection> fedErrorIds;
233  //e.getByLabel("siStripDigis", fedErrorIds );
234  e.getByToken(digis_token_, fedErrorIds);
235 
236  ESHandle<MeasurementTracker> measurementTrackerHandle = es.getHandle(measurementTkToken_);
237 
238  edm::Handle<MeasurementTrackerEvent> measurementTrackerEvent;
239  //e.getByLabel("MeasurementTrackerEvent", measurementTrackerEvent);
240  e.getByToken(trackerEvent_token_, measurementTrackerEvent);
241 
243  const Propagator* thePropagator = &es.getData(propagatorToken_);
244 
245  events++;
246 
247  // *************** SiStripCluster Collection
248  const edmNew::DetSetVector<SiStripCluster>& input = *theClusters;
249 
250  //go through clusters to write out global position of good clusters for the layer understudy for comparison
251  // Loop through clusters just to print out locations
252  // Commented out to avoid discussion, should really be deleted.
253  /*
254  for (edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter = input.begin(); DSViter != input.end(); DSViter++) {
255  // DSViter is a vector of SiStripClusters located on a single module
256  unsigned int ClusterId = DSViter->id();
257  DetId ClusterDetId(ClusterId);
258  const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)tkgeom->idToDetUnit(ClusterDetId);
259 
260  edmNew::DetSet<SiStripCluster>::const_iterator begin=DSViter->begin();
261  edmNew::DetSet<SiStripCluster>::const_iterator end =DSViter->end();
262  for(edmNew::DetSet<SiStripCluster>::const_iterator iter=begin;iter!=end;++iter) {
263  //iter is a single SiStripCluster
264  StripClusterParameterEstimator::LocalValues parameters=stripcpe.localParameters(*iter,*stripdet);
265 
266  const Surface* surface;
267  surface = &(tracker->idToDet(ClusterDetId)->surface());
268  LocalPoint lp = parameters.first;
269  GlobalPoint gp = surface->toGlobal(lp);
270  unsigned int layer = checkLayer(ClusterId, tTopo);
271  if(DEBUG) cout << "Found hit in cluster collection layer = " << layer << " with id = " << ClusterId << " local X position = " << lp.x() << " +- " << sqrt(parameters.second.xx()) << " matched/stereo/rphi = " << ((ClusterId & 0x3)==0) << "/" << ((ClusterId & 0x3)==1) << "/" << ((ClusterId & 0x3)==2) << endl;
272  }
273  }
274  */
275 
276  // Tracking
277  const reco::TrackCollection* tracksCKF = trackCollectionCKF.product();
278  LogDebug("SiStripHitEfficiency:HitEff") << "number ckf tracks found = " << tracksCKF->size() << endl;
279  //if (tracksCKF->size() == 1 ){
280  if (!tracksCKF->empty()) {
281  if (cutOnTracks_ && (tracksCKF->size() >= trackMultiplicityCut_))
282  return;
283  if (cutOnTracks_)
284  LogDebug("SiStripHitEfficiency:HitEff")
285  << "starting checking good event with < " << trackMultiplicityCut_ << " tracks" << endl;
286 
287  EventTrackCKF++;
288 
289 #ifdef ExtendedCALIBTree
290  //get dEdx info if available
291  Handle<ValueMap<DeDxData> > dEdxUncalibHandle;
292  if (e.getByLabel("dedxMedianCTF", dEdxUncalibHandle)) {
293  const ValueMap<DeDxData> dEdxTrackUncalib = *dEdxUncalibHandle.product();
294 
295  reco::TrackRef itTrack = reco::TrackRef(trackCollectionCKF, 0);
296  dedx = dEdxTrackUncalib[itTrack].dEdx();
297  dedxNOM = dEdxTrackUncalib[itTrack].numberOfMeasurements();
298  } else {
299  dedx = -999.0;
300  dedxNOM = -999;
301  }
302 
303  //get muon and ecal timing info if available
305  if (e.getByLabel("muonsWitht0Correction", muH)) {
306  const MuonCollection& muonsT0 = *muH.product();
307  if (!muonsT0.empty()) {
308  MuonTime mt0 = muonsT0[0].time();
309  timeDT = mt0.timeAtIpInOut;
310  timeDTErr = mt0.timeAtIpInOutErr;
311  timeDTDOF = mt0.nDof;
312 
313  bool hasCaloEnergyInfo = muonsT0[0].isEnergyValid();
314  if (hasCaloEnergyInfo)
315  timeECAL = muonsT0[0].calEnergy().ecal_time;
316  }
317  } else {
318  timeDT = -999.0;
319  timeDTErr = -999.0;
320  timeDTDOF = -999;
321  timeECAL = -999.0;
322  }
323 
324 #endif
325  // actually should do a loop over all the tracks in the event here
326 
327  // Looping over traj-track associations to be able to get traj & track informations
328  for (TrajTrackAssociationCollection::const_iterator it = trajTrackAssociationHandle->begin();
329  it != trajTrackAssociationHandle->end();
330  it++) {
332  reco::TrackRef itrack = it->val;
333 
334  // for each track, fill some variables such as number of hits and momentum
335  nHits = itraj->foundHits();
336 #ifdef ExtendedCALIBTree
337  nLostHits = itraj->lostHits();
338  chi2 = (itraj->chiSquared() / itraj->ndof());
339  p = itraj->lastMeasurement().updatedState().globalMomentum().mag();
340 #endif
341  pT = sqrt((itraj->lastMeasurement().updatedState().globalMomentum().x() *
342  itraj->lastMeasurement().updatedState().globalMomentum().x()) +
343  (itraj->lastMeasurement().updatedState().globalMomentum().y() *
344  itraj->lastMeasurement().updatedState().globalMomentum().y()));
345 
346  // track quality
347  highPurity = itrack->quality(reco::TrackBase::TrackQuality::highPurity);
348 
349  std::vector<TrajectoryMeasurement> TMeas = itraj->measurements();
350  vector<TrajectoryMeasurement>::iterator itm;
351  double xloc = 0.;
352  double yloc = 0.;
353  double xErr = 0.;
354  double yErr = 0.;
355  double angleX = -999.;
356  double angleY = -999.;
357  double xglob, yglob, zglob;
358 
359  // Check whether the trajectory has some missing hits
360  bool hasMissingHits = false;
361  for (itm = TMeas.begin(); itm != TMeas.end(); itm++) {
362  auto theHit = (*itm).recHit();
363  if (theHit->getType() == TrackingRecHit::Type::missing)
364  hasMissingHits = true;
365  }
366 
367  // Loop on each measurement and take it into consideration
368  //--------------------------------------------------------
369 
370  for (itm = TMeas.begin(); itm != TMeas.end(); itm++) {
371  auto theInHit = (*itm).recHit();
372 
373  LogDebug("SiStripHitEfficiency:HitEff") << "theInHit is valid = " << theInHit->isValid() << endl;
374 
375  unsigned int iidd = theInHit->geographicalId().rawId();
376 
377  unsigned int TKlayers = checkLayer(iidd, tTopo);
378  LogDebug("SiStripHitEfficiency:HitEff") << "TKlayer from trajectory: " << TKlayers << " from module = " << iidd
379  << " matched/stereo/rphi = " << ((iidd & 0x3) == 0) << "/"
380  << ((iidd & 0x3) == 1) << "/" << ((iidd & 0x3) == 2) << endl;
381 
382  // Test first and last points of the trajectory
383  // the list of measurements starts from outer layers !!! This could change -> should add a check
384  bool isFirstMeas = (itm == (TMeas.end() - 1));
385  bool isLastMeas = (itm == (TMeas.begin()));
386 
387  if (!useFirstMeas_ && isFirstMeas)
388  continue;
389  if (!useLastMeas_ && isLastMeas)
390  continue;
391 
392  // In case of missing hit in the track, check whether to use the other hits or not.
393  if (hasMissingHits && theInHit->getType() != TrackingRecHit::Type::missing &&
395  continue;
396 
397  // If Trajectory measurement from TOB 6 or TEC 9, skip it because it's always valid they are filled later
398  if (TKlayers == 10 || TKlayers == 22) {
399  LogDebug("SiStripHitEfficiency:HitEff") << "skipping original TM for TOB 6 or TEC 9" << endl;
400  continue;
401  }
402 
403  // Make vector of TrajectoryAtInvalidHits to hold the trajectories
404  std::vector<TrajectoryAtInvalidHit> TMs;
405 
406  // Make AnalyticalPropagator to use in TAVH constructor
408 
409  // for double sided layers check both sensors--if no hit was found on either sensor surface,
410  // the trajectory measurements only have one invalid hit entry on the matched surface
411  // so get the TrajectoryAtInvalidHit for both surfaces and include them in the study
412  if (isDoubleSided(iidd, tTopo) && ((iidd & 0x3) == 0)) {
413  // do hit eff check twice--once for each sensor
414  //add a TM for each surface
415  TMs.push_back(TrajectoryAtInvalidHit(*itm, tTopo, tkgeom, propagator, 1));
416  TMs.push_back(TrajectoryAtInvalidHit(*itm, tTopo, tkgeom, propagator, 2));
417  } else if (isDoubleSided(iidd, tTopo) && (!check2DPartner(iidd, TMeas))) {
418  // if only one hit was found the trajectory measurement is on that sensor surface, and the other surface from
419  // the matched layer should be added to the study as well
420  TMs.push_back(TrajectoryAtInvalidHit(*itm, tTopo, tkgeom, propagator, 1));
421  TMs.push_back(TrajectoryAtInvalidHit(*itm, tTopo, tkgeom, propagator, 2));
422  LogDebug("SiStripHitEfficiency:HitEff") << " found a hit with a missing partner" << endl;
423  } else {
424  //only add one TM for the single surface and the other will be added in the next iteration
425  TMs.push_back(TrajectoryAtInvalidHit(*itm, tTopo, tkgeom, propagator));
426  }
427 
429  //Now check for tracks at TOB6 and TEC9
430 
431  // to make sure we only propagate on the last TOB5 hit check the next entry isn't also in TOB5
432  // to avoid bias, make sure the TOB5 hit is valid (an invalid hit on TOB5 could only exist with a valid hit on TOB6)
433 
434  bool isValid = theInHit->isValid();
435  bool isLast = (itm == (TMeas.end() - 1));
436  bool isLastTOB5 = true;
437  if (!isLast) {
438  if (checkLayer((++itm)->recHit()->geographicalId().rawId(), tTopo) == 9)
439  isLastTOB5 = false;
440  else
441  isLastTOB5 = true;
442  --itm;
443  }
444 
445  if (TKlayers == 9 && isValid && isLastTOB5) {
446  // if ( TKlayers==9 && itm==TMeas.rbegin()) {
447  // if ( TKlayers==9 && (itm==TMeas.back()) ) { // to check for only the last entry in the trajectory for propagation
448  std::vector<BarrelDetLayer const*> barrelTOBLayers =
449  measurementTrackerHandle->geometricSearchTracker()->tobLayers();
450  const DetLayer* tob6 = barrelTOBLayers[barrelTOBLayers.size() - 1];
451  const LayerMeasurements layerMeasurements{*measurementTrackerHandle, *measurementTrackerEvent};
452  const TrajectoryStateOnSurface tsosTOB5 = itm->updatedState();
453  auto tmp = layerMeasurements.measurements(*tob6, tsosTOB5, *thePropagator, *estimator);
454 
455  if (!tmp.empty()) {
456  LogDebug("SiStripHitEfficiency:HitEff") << "size of TM from propagation = " << tmp.size() << endl;
457 
458  // take the last of the TMs, which is always an invalid hit
459  // if no detId is available, ie detId==0, then no compatible layer was crossed
460  // otherwise, use that TM for the efficiency measurement
461  TrajectoryMeasurement tob6TM(tmp.back());
462  const auto& tob6Hit = tob6TM.recHit();
463 
464  if (tob6Hit->geographicalId().rawId() != 0) {
465  LogDebug("SiStripHitEfficiency:HitEff") << "tob6 hit actually being added to TM vector" << endl;
466  TMs.push_back(TrajectoryAtInvalidHit(tob6TM, tTopo, tkgeom, propagator));
467  }
468  }
469  }
470 
471  bool isLastTEC8 = true;
472  if (!isLast) {
473  if (checkLayer((++itm)->recHit()->geographicalId().rawId(), tTopo) == 21)
474  isLastTEC8 = false;
475  else
476  isLastTEC8 = true;
477  --itm;
478  }
479 
480  if (TKlayers == 21 && isValid && isLastTEC8) {
481  std::vector<const ForwardDetLayer*> posTecLayers =
482  measurementTrackerHandle->geometricSearchTracker()->posTecLayers();
483  const DetLayer* tec9pos = posTecLayers[posTecLayers.size() - 1];
484  std::vector<const ForwardDetLayer*> negTecLayers =
485  measurementTrackerHandle->geometricSearchTracker()->negTecLayers();
486  const DetLayer* tec9neg = negTecLayers[negTecLayers.size() - 1];
487  const LayerMeasurements layerMeasurements{*measurementTrackerHandle, *measurementTrackerEvent};
488  const TrajectoryStateOnSurface tsosTEC9 = itm->updatedState();
489 
490  // check if track on positive or negative z
491  if (!(iidd == StripSubdetector::TEC))
492  LogDebug("SiStripHitEfficiency:HitEff") << "there is a problem with TEC 9 extrapolation" << endl;
493 
494  //cout << " tec9 id = " << iidd << " and side = " << tTopo->tecSide(iidd) << endl;
495  vector<TrajectoryMeasurement> tmp;
496  if (tTopo->tecSide(iidd) == 1) {
497  tmp = layerMeasurements.measurements(*tec9neg, tsosTEC9, *thePropagator, *estimator);
498  //cout << "on negative side" << endl;
499  }
500  if (tTopo->tecSide(iidd) == 2) {
501  tmp = layerMeasurements.measurements(*tec9pos, tsosTEC9, *thePropagator, *estimator);
502  //cout << "on positive side" << endl;
503  }
504 
505  if (!tmp.empty()) {
506  // take the last of the TMs, which is always an invalid hit
507  // if no detId is available, ie detId==0, then no compatible layer was crossed
508  // otherwise, use that TM for the efficiency measurement
509  TrajectoryMeasurement tec9TM(tmp.back());
510  const auto& tec9Hit = tec9TM.recHit();
511 
512  unsigned int tec9id = tec9Hit->geographicalId().rawId();
513  LogDebug("SiStripHitEfficiency:HitEff")
514  << "tec9id = " << tec9id << " is Double sided = " << isDoubleSided(tec9id, tTopo)
515  << " and 0x3 = " << (tec9id & 0x3) << endl;
516 
517  if (tec9Hit->geographicalId().rawId() != 0) {
518  LogDebug("SiStripHitEfficiency:HitEff") << "tec9 hit actually being added to TM vector" << endl;
519  // in tec the hit can be single or doubled sided. whenever the invalid hit at the end of vector of TMs is
520  // double sided it is always on the matched surface, so we need to split it into the true sensor surfaces
521  if (isDoubleSided(tec9id, tTopo)) {
522  TMs.push_back(TrajectoryAtInvalidHit(tec9TM, tTopo, tkgeom, propagator, 1));
523  TMs.push_back(TrajectoryAtInvalidHit(tec9TM, tTopo, tkgeom, propagator, 2));
524  } else
525  TMs.push_back(TrajectoryAtInvalidHit(tec9TM, tTopo, tkgeom, propagator));
526  }
527  } //else cout << "tec9 tmp empty" << endl;
528  }
529 
531 
532  // Modules Constraints
533 
534  for (std::vector<TrajectoryAtInvalidHit>::const_iterator TM = TMs.begin(); TM != TMs.end(); ++TM) {
535  // --> Get trajectory from combinatedState
536  iidd = TM->monodet_id();
537  LogDebug("SiStripHitEfficiency:HitEff") << "setting iidd = " << iidd << " before checking efficiency and ";
538 
539  xloc = TM->localX();
540  yloc = TM->localY();
541 
542  angleX = atan(TM->localDxDz());
543  angleY = atan(TM->localDyDz());
544 
545  TrajLocErrX = 0.0;
546  TrajLocErrY = 0.0;
547 
548  xglob = TM->globalX();
549  yglob = TM->globalY();
550  zglob = TM->globalZ();
551  xErr = TM->localErrorX();
552  yErr = TM->localErrorY();
553 
554  TrajGlbX = 0.0;
555  TrajGlbY = 0.0;
556  TrajGlbZ = 0.0;
557  withinAcceptance = TM->withinAcceptance();
558 
559  trajHitValid = TM->validHit();
560  int TrajStrip = -1;
561 
562  // reget layer from iidd here, to account for TOB 6 and TEC 9 TKlayers being off
563  TKlayers = checkLayer(iidd, tTopo);
564 
565  if ((layers == TKlayers) || (layers == 0)) { // Look at the layer not used to reconstruct the track
566  whatlayer = TKlayers;
567  LogDebug("SiStripHitEfficiency:HitEff") << "Looking at layer under study" << endl;
568  ModIsBad = 2;
569  Id = 0;
570  SiStripQualBad = 0;
571  run = 0;
572  event = 0;
573  TrajLocX = 0.0;
574  TrajLocY = 0.0;
575  TrajLocAngleX = -999.0;
576  TrajLocAngleY = -999.0;
577  ResX = 0.0;
578  ResXSig = 0.0;
579  ClusterLocX = 0.0;
580  ClusterLocY = 0.0;
581  ClusterLocErrX = 0.0;
582  ClusterLocErrY = 0.0;
583  ClusterStoN = 0.0;
584  bunchx = 0;
585  commonMode = -100;
586 
587  // RPhi RecHit Efficiency
588 
589  if (!input.empty()) {
590  LogDebug("SiStripHitEfficiency:HitEff") << "Checking clusters with size = " << input.size() << endl;
591  int nClusters = 0;
592  std::vector<std::vector<float> >
593  VCluster_info; //fill with X residual, X residual pull, local X, sig(X), local Y, sig(Y), StoN
594  for (edmNew::DetSetVector<SiStripCluster>::const_iterator DSViter = input.begin(); DSViter != input.end();
595  DSViter++) {
596  // DSViter is a vector of SiStripClusters located on a single module
597  //if (DEBUG) cout << "the ID from the DSViter = " << DSViter->id() << endl;
598  unsigned int ClusterId = DSViter->id();
599  if (ClusterId == iidd) {
600  LogDebug("SiStripHitEfficiency:HitEff")
601  << "found (ClusterId == iidd) with ClusterId = " << ClusterId << " and iidd = " << iidd << endl;
602  DetId ClusterDetId(ClusterId);
603  const StripGeomDetUnit* stripdet = (const StripGeomDetUnit*)tkgeom->idToDetUnit(ClusterDetId);
604  const StripTopology& Topo = stripdet->specificTopology();
605 
606  float hbedge = 0.0;
607  float htedge = 0.0;
608  float hapoth = 0.0;
609  float uylfac = 0.0;
610  float uxlden = 0.0;
611  if (TKlayers >= 11) {
612  const BoundPlane& plane = stripdet->surface();
613  const TrapezoidalPlaneBounds* trapezoidalBounds(
614  dynamic_cast<const TrapezoidalPlaneBounds*>(&(plane.bounds())));
615  std::array<const float, 4> const& parameterTrap =
616  (*trapezoidalBounds).parameters(); // el bueno aqui
617  hbedge = parameterTrap[0];
618  htedge = parameterTrap[1];
619  hapoth = parameterTrap[3];
620  uylfac = (htedge - hbedge) / (htedge + hbedge) / hapoth;
621  uxlden = 1 + yloc * uylfac;
622  }
623 
624  // Need to know position of trajectory in strip number for selecting the right APV later
625  if (TrajStrip == -1) {
626  int nstrips = Topo.nstrips();
627  float pitch = stripdet->surface().bounds().width() / nstrips;
628  TrajStrip = xloc / pitch + nstrips / 2.0;
629  // Need additionnal corrections for endcap
630  if (TKlayers >= 11) {
631  float TrajLocXMid = xloc / (1 + (htedge - hbedge) * yloc / (htedge + hbedge) /
632  hapoth); // radialy extrapolated x loc position at middle
633  TrajStrip = TrajLocXMid / pitch + nstrips / 2.0;
634  }
635  //cout<<" Layer "<<TKlayers<<" TrajStrip: "<<nstrips<<" "<<pitch<<" "<<TrajStrip<<endl;
636  }
637 
638  for (edmNew::DetSet<SiStripCluster>::const_iterator iter = DSViter->begin(); iter != DSViter->end();
639  ++iter) {
640  //iter is a single SiStripCluster
642  float res = (parameters.first.x() - xloc);
643  float sigma = checkConsistency(parameters, xloc, xErr);
644  // The consistency is probably more accurately measured with the Chi2MeasurementEstimator. To use it
645  // you need a TransientTrackingRecHit instead of the cluster
646  //theEstimator= new Chi2MeasurementEstimator(30);
647  //const Chi2MeasurementEstimator *theEstimator(100);
648  //theEstimator->estimate(TM->tsos(), TransientTrackingRecHit);
649 
650  if (TKlayers >= 11) {
651  res = parameters.first.x() - xloc / uxlden; // radialy extrapolated x loc position at middle
652  sigma = abs(res) /
653  sqrt(parameters.second.xx() + xErr * xErr / uxlden / uxlden +
654  yErr * yErr * xloc * xloc * uylfac * uylfac / uxlden / uxlden / uxlden / uxlden);
655  }
656 
657  siStripClusterInfo_.setCluster(*iter, ClusterId);
658  // signal to noise from SiStripClusterInfo not working in 225. I'll fix this after the interface
659  // redesign in 300 -ku
660  //float cluster_info[7] = {res, sigma, parameters.first.x(), sqrt(parameters.second.xx()), parameters.first.y(), sqrt(parameters.second.yy()), signal_to_noise};
661  std::vector<float> cluster_info;
662  cluster_info.push_back(res);
663  cluster_info.push_back(sigma);
664  cluster_info.push_back(parameters.first.x());
665  cluster_info.push_back(sqrt(parameters.second.xx()));
666  cluster_info.push_back(parameters.first.y());
667  cluster_info.push_back(sqrt(parameters.second.yy()));
668  cluster_info.push_back(siStripClusterInfo_.signalOverNoise());
669  VCluster_info.push_back(cluster_info);
670  nClusters++;
671  LogDebug("SiStripHitEfficiency:HitEff") << "Have ID match. residual = " << VCluster_info.back()[0]
672  << " res sigma = " << VCluster_info.back()[1] << endl;
673  LogDebug("SiStripHitEfficiency:HitEff")
674  << "trajectory measurement compatability estimate = " << (*itm).estimate() << endl;
675  LogDebug("SiStripHitEfficiency:HitEff")
676  << "hit position = " << parameters.first.x() << " hit error = " << sqrt(parameters.second.xx())
677  << " trajectory position = " << xloc << " traj error = " << xErr << endl;
678  }
679  }
680  }
681  float FinalResSig = 1000.0;
682  float FinalCluster[7] = {1000.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0};
683  if (nClusters > 0) {
684  LogDebug("SiStripHitEfficiency:HitEff") << "found clusters > 0" << endl;
685  if (nClusters > 1) {
686  //get the smallest one
687  vector<vector<float> >::iterator ires;
688  for (ires = VCluster_info.begin(); ires != VCluster_info.end(); ires++) {
689  if (abs((*ires)[1]) < abs(FinalResSig)) {
690  FinalResSig = (*ires)[1];
691  for (unsigned int i = 0; i < ires->size(); i++) {
692  LogDebug("SiStripHitEfficiency:HitEff")
693  << "filling final cluster. i = " << i << " before fill FinalCluster[i]=" << FinalCluster[i]
694  << " and (*ires)[i] =" << (*ires)[i] << endl;
695  FinalCluster[i] = (*ires)[i];
696  LogDebug("SiStripHitEfficiency:HitEff")
697  << "filling final cluster. i = " << i << " after fill FinalCluster[i]=" << FinalCluster[i]
698  << " and (*ires)[i] =" << (*ires)[i] << endl;
699  }
700  }
701  LogDebug("SiStripHitEfficiency:HitEff")
702  << "iresidual = " << (*ires)[0] << " isigma = " << (*ires)[1]
703  << " and FinalRes = " << FinalCluster[0] << endl;
704  }
705  } else {
706  FinalResSig = VCluster_info.at(0)[1];
707  for (unsigned int i = 0; i < VCluster_info.at(0).size(); i++) {
708  FinalCluster[i] = VCluster_info.at(0)[i];
709  }
710  }
711  nClusters = 0;
712  VCluster_info.clear();
713  }
714 
715  LogDebug("SiStripHitEfficiency:HitEff")
716  << "Final residual in X = " << FinalCluster[0] << "+-" << (FinalCluster[0] / FinalResSig) << endl;
717  LogDebug("SiStripHitEfficiency:HitEff") << "Checking location of trajectory: abs(yloc) = " << abs(yloc)
718  << " abs(xloc) = " << abs(xloc) << endl;
719  LogDebug("SiStripHitEfficiency:HitEff")
720  << "Checking location of cluster hit: yloc = " << FinalCluster[4] << "+-" << FinalCluster[5]
721  << " xloc = " << FinalCluster[2] << "+-" << FinalCluster[3] << endl;
722  LogDebug("SiStripHitEfficiency:HitEff") << "Final cluster signal to noise = " << FinalCluster[6] << endl;
723 
724  float exclusionWidth = 0.4;
725  float TOBexclusion = 0.0;
726  float TECexRing5 = -0.89;
727  float TECexRing6 = -0.56;
728  float TECexRing7 = 0.60;
729  //Added by Chris Edelmaier to do TEC bonding exclusion
730  int subdetector = ((iidd >> 25) & 0x7);
731  int ringnumber = ((iidd >> 5) & 0x7);
732 
733  //New TOB and TEC bonding region exclusion zone
734  if ((TKlayers >= 5 && TKlayers < 11) ||
735  ((subdetector == 6) && ((ringnumber >= 5) && (ringnumber <= 7)))) {
736  //There are only 2 cases that we need to exclude for
737  float highzone = 0.0;
738  float lowzone = 0.0;
739  float higherr = yloc + 5.0 * yErr;
740  float lowerr = yloc - 5.0 * yErr;
741  if (TKlayers >= 5 && TKlayers < 11) {
742  //TOB zone
743  highzone = TOBexclusion + exclusionWidth;
744  lowzone = TOBexclusion - exclusionWidth;
745  } else if (ringnumber == 5) {
746  //TEC ring 5
747  highzone = TECexRing5 + exclusionWidth;
748  lowzone = TECexRing5 - exclusionWidth;
749  } else if (ringnumber == 6) {
750  //TEC ring 6
751  highzone = TECexRing6 + exclusionWidth;
752  lowzone = TECexRing6 - exclusionWidth;
753  } else if (ringnumber == 7) {
754  //TEC ring 7
755  highzone = TECexRing7 + exclusionWidth;
756  lowzone = TECexRing7 - exclusionWidth;
757  }
758  //Now that we have our exclusion region, we just have to properly identify it
759  if ((highzone <= higherr) && (highzone >= lowerr))
760  withinAcceptance = false;
761  if ((lowzone >= lowerr) && (lowzone <= higherr))
762  withinAcceptance = false;
763  if ((higherr <= highzone) && (higherr >= lowzone))
764  withinAcceptance = false;
765  if ((lowerr >= lowzone) && (lowerr <= highzone))
766  withinAcceptance = false;
767  }
768 
769  // fill ntuple varibles
770  //get global position from module id number iidd
771  TrajGlbX = xglob;
772  TrajGlbY = yglob;
773  TrajGlbZ = zglob;
774 
775  TrajLocErrX = xErr;
776  TrajLocErrY = yErr;
777 
778  Id = iidd;
779  run = run_nr;
780  event = ev_nr;
781  bunchx = bunch_nr;
782  //if ( SiStripQuality_->IsModuleBad(iidd) ) {
783  if (SiStripQuality_->getBadApvs(iidd) != 0) {
784  SiStripQualBad = 1;
785  LogDebug("SiStripHitEfficiency:HitEff") << "strip is bad from SiStripQuality" << endl;
786  } else {
787  SiStripQualBad = 0;
788  LogDebug("SiStripHitEfficiency:HitEff") << "strip is good from SiStripQuality" << endl;
789  }
790 
791  //check for FED-detected errors and include those in SiStripQualBad
792  for (unsigned int ii = 0; ii < fedErrorIds->size(); ii++) {
793  if (iidd == (*fedErrorIds)[ii].rawId())
794  SiStripQualBad = 1;
795  }
796 
797  TrajLocX = xloc;
798  TrajLocY = yloc;
799  TrajLocAngleX = angleX;
800  TrajLocAngleY = angleY;
801  ResX = FinalCluster[0];
802  ResXSig = FinalResSig;
803  if (FinalResSig != FinalCluster[1])
804  LogDebug("SiStripHitEfficiency:HitEff")
805  << "Problem with best cluster selection because FinalResSig = " << FinalResSig
806  << " and FinalCluster[1] = " << FinalCluster[1] << endl;
807  ClusterLocX = FinalCluster[2];
808  ClusterLocY = FinalCluster[4];
809  ClusterLocErrX = FinalCluster[3];
810  ClusterLocErrY = FinalCluster[5];
811  ClusterStoN = FinalCluster[6];
812 
813  // CM of APV crossed by traj
814  if (addCommonMode_)
815  if (commonModeDigis.isValid() && TrajStrip >= 0 && TrajStrip <= 768) {
816  edm::DetSetVector<SiStripRawDigi>::const_iterator digiframe = commonModeDigis->find(iidd);
817  if (digiframe != commonModeDigis->end())
818  if ((unsigned)TrajStrip / 128 < digiframe->data.size())
819  commonMode = digiframe->data.at(TrajStrip / 128).adc();
820  }
821 
822  LogDebug("SiStripHitEfficiency:HitEff") << "before check good" << endl;
823 
824  if (FinalResSig < 999.0) { //could make requirement on track/hit consistency, but for
825  //now take anything with a hit on the module
826  LogDebug("SiStripHitEfficiency:HitEff")
827  << "hit being counted as good " << FinalCluster[0] << " FinalRecHit " << iidd << " TKlayers "
828  << TKlayers << " xloc " << xloc << " yloc " << yloc << " module " << iidd
829  << " matched/stereo/rphi = " << ((iidd & 0x3) == 0) << "/" << ((iidd & 0x3) == 1) << "/"
830  << ((iidd & 0x3) == 2) << endl;
831  ModIsBad = 0;
832  traj->Fill();
833  } else {
834  LogDebug("SiStripHitEfficiency:HitEff")
835  << "hit being counted as bad ######### Invalid RPhi FinalResX " << FinalCluster[0]
836  << " FinalRecHit " << iidd << " TKlayers " << TKlayers << " xloc " << xloc << " yloc " << yloc
837  << " module " << iidd << " matched/stereo/rphi = " << ((iidd & 0x3) == 0) << "/"
838  << ((iidd & 0x3) == 1) << "/" << ((iidd & 0x3) == 2) << endl;
839  ModIsBad = 1;
840  traj->Fill();
841 
842  LogDebug("SiStripHitEfficiency:HitEff") << " RPhi Error " << sqrt(xErr * xErr + yErr * yErr)
843  << " ErrorX " << xErr << " yErr " << yErr << endl;
844  }
845  LogDebug("SiStripHitEfficiency:HitEff") << "after good location check" << endl;
846  }
847  LogDebug("SiStripHitEfficiency:HitEff") << "after list of clusters" << endl;
848  }
849  LogDebug("SiStripHitEfficiency:HitEff") << "After layers=TKLayers if" << endl;
850  }
851  LogDebug("SiStripHitEfficiency:HitEff") << "After looping over TrajAtValidHit list" << endl;
852  }
853  LogDebug("SiStripHitEfficiency:HitEff") << "end TMeasurement loop" << endl;
854  }
855  LogDebug("SiStripHitEfficiency:HitEff") << "end of trajectories loop" << endl;
856  }
857 }
858 
860  traj->GetDirectory()->cd();
861  traj->Write();
862 
863  LogDebug("SiStripHitEfficiency:HitEff") << " Events Analysed " << events << endl;
864  LogDebug("SiStripHitEfficiency:HitEff") << " Number Of Tracked events " << EventTrackCKF << endl;
865 }
866 
868  double error = sqrt(parameters.second.xx() + xerr * xerr);
869  double separation = abs(parameters.first.x() - xx);
870  double consistency = separation / error;
871  return consistency;
872 }
873 
874 bool HitEff::isDoubleSided(unsigned int iidd, const TrackerTopology* tTopo) const {
876  unsigned int subid = strip.subdetId();
877  unsigned int layer = 0;
878  if (subid == StripSubdetector::TIB) {
879  layer = tTopo->tibLayer(iidd);
880  if (layer == 1 || layer == 2)
881  return true;
882  else
883  return false;
884  } else if (subid == StripSubdetector::TOB) {
885  layer = tTopo->tobLayer(iidd) + 4;
886  if (layer == 5 || layer == 6)
887  return true;
888  else
889  return false;
890  } else if (subid == StripSubdetector::TID) {
891  layer = tTopo->tidRing(iidd) + 10;
892  if (layer == 11 || layer == 12)
893  return true;
894  else
895  return false;
896  } else if (subid == StripSubdetector::TEC) {
897  layer = tTopo->tecRing(iidd) + 13;
898  if (layer == 14 || layer == 15 || layer == 18)
899  return true;
900  else
901  return false;
902  } else
903  return false;
904 }
905 
906 bool HitEff::check2DPartner(unsigned int iidd, const std::vector<TrajectoryMeasurement>& traj) {
907  unsigned int partner_iidd = 0;
908  bool found2DPartner = false;
909  // first get the id of the other detector
910  if ((iidd & 0x3) == 1)
911  partner_iidd = iidd + 1;
912  if ((iidd & 0x3) == 2)
913  partner_iidd = iidd - 1;
914  // next look in the trajectory measurements for a measurement from that detector
915  // loop through trajectory measurements to find the partner_iidd
916  for (std::vector<TrajectoryMeasurement>::const_iterator iTM = traj.begin(); iTM != traj.end(); ++iTM) {
917  if (iTM->recHit()->geographicalId().rawId() == partner_iidd) {
918  found2DPartner = true;
919  }
920  }
921  return found2DPartner;
922 }
923 
924 unsigned int HitEff::checkLayer(unsigned int iidd, const TrackerTopology* tTopo) {
926  unsigned int subid = strip.subdetId();
927  if (subid == StripSubdetector::TIB) {
928  return tTopo->tibLayer(iidd);
929  }
930  if (subid == StripSubdetector::TOB) {
931  return tTopo->tobLayer(iidd) + 4;
932  }
933  if (subid == StripSubdetector::TID) {
934  return tTopo->tidWheel(iidd) + 10;
935  }
936  if (subid == StripSubdetector::TEC) {
937  return tTopo->tecWheel(iidd) + 13;
938  }
939  return 0;
940 }
941 
942 //define this as a plug-in
std::pair< LocalPoint, LocalError > LocalValues
RunNumber_t run() const
Definition: EventID.h:38
EventNumber_t event() const
Definition: EventID.h:40
dictionary missing
Definition: combine.py:5
static constexpr auto TEC
virtual int nstrips() const =0
T getUntrackedParameter(std::string const &, T const &) const
tuple propagator
float TrajGlbZ
Definition: HitEff.h:118
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magFieldToken_
Definition: HitEff.h:93
bool check2DPartner(unsigned int iidd, const std::vector< TrajectoryMeasurement > &traj)
Definition: HitEff.cc:906
float ClusterLocErrX
Definition: HitEff.h:121
float ClusterLocErrY
Definition: HitEff.h:121
void endJob() override
Definition: HitEff.cc:859
void setCluster(const SiStripCluster &cluster, int detId)
unsigned int tibLayer(const DetId &id) const
ConstRecHitPointer const & recHit() const
float TrajGlbY
Definition: HitEff.h:118
unsigned int tidRing(const DetId &id) const
const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
Definition: HitEff.h:89
float TrajLocX
Definition: HitEff.h:119
virtual const std::array< const float, 4 > parameters() const
float ResXSig
Definition: HitEff.h:122
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
bool useAllHitsFromTracksWithMissingHits_
Definition: HitEff.h:78
Definition: HitEff.h:51
TString subdetector
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
int compSettings
Definition: HitEff.h:103
unsigned int tecRing(const DetId &id) const
ring id
int ires[2]
float instLumi
Definition: HitEff.h:132
virtual void localParameters(AClusters const &clusters, ALocalValues &retValues, const GeomDetUnit &gd, const LocalTrajectoryParameters &ltp) const
const edm::EDGetTokenT< std::vector< Trajectory > > trajectories_token_
Definition: HitEff.h:81
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
int bunchCrossing() const
Definition: EventBase.h:64
const Bounds & bounds() const
Definition: Surface.h:87
unsigned int tidWheel(const DetId &id) const
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
HitEff(const edm::ParameterSet &conf)
Definition: HitEff.cc:69
SiStripClusterInfo siStripClusterInfo_
Definition: HitEff.h:70
float ClusterStoN
Definition: HitEff.h:121
data_type const * const_iterator
Definition: DetSetNew.h:31
float TrajLocErrX
Definition: HitEff.h:120
key_type key() const
Accessor for product key.
Definition: Ref.h:250
float commonMode
Definition: HitEff.h:133
int ii
Definition: cuy.py:589
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
const edm::ESGetToken< SiStripQuality, SiStripQualityRcd > siStripQualityToken_
Definition: HitEff.h:92
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
bool DEBUG
Definition: HitEff.h:105
const edm::EDGetTokenT< MeasurementTrackerEvent > trackerEvent_token_
Definition: HitEff.h:85
unsigned int bunchx
Definition: HitEff.h:130
constexpr std::array< uint8_t, layerIndexSize > layer
static std::string const input
Definition: EdmProvDump.cc:47
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > geomToken_
Definition: HitEff.h:90
bool getData(T &iHolder) const
Definition: EventSetup.h:128
float signalOverNoise() const
bool isDoubleSided(unsigned int iidd, const TrackerTopology *tTopo) const
Definition: HitEff.cc:874
void analyze(const edm::Event &e, const edm::EventSetup &c) override
Definition: HitEff.cc:165
bool highPurity
Definition: HitEff.h:127
const edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > clusters_token_
Definition: HitEff.h:83
float PU
Definition: HitEff.h:132
int nHits
Definition: HitEff.h:128
unsigned int Id
Definition: HitEff.h:124
const edm::EDGetTokenT< reco::TrackCollection > combinatorialTracks_token_
Definition: HitEff.h:80
T sqrt(T t)
Definition: SSEVec.h:19
float timeAtIpInOutErr
Definition: MuonTime.h:14
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorToken_
Definition: HitEff.h:96
const edm::EDGetTokenT< DetIdCollection > digis_token_
Definition: HitEff.h:84
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
int nDof
number of muon stations used
Definition: MuonTime.h:9
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
unsigned int trajHitValid
Definition: HitEff.h:130
unsigned int ModIsBad
Definition: HitEff.h:123
float TrajGlbX
Definition: HitEff.h:118
const edm::ESGetToken< MeasurementTracker, CkfComponentsRecord > measurementTkToken_
Definition: HitEff.h:94
static constexpr auto TOB
bool withinAcceptance
Definition: HitEff.h:126
unsigned int run
Definition: HitEff.h:130
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:500
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:325
size_type size() const
Return the number of contained DetSets.
Definition: DetSetVector.h:259
float ClusterLocX
Definition: HitEff.h:121
~HitEff() override
Definition: HitEff.cc:104
int events
Definition: HitEff.h:101
float TrajLocAngleX
Definition: HitEff.h:119
const edm::ESGetToken< Chi2MeasurementEstimatorBase, TrackingComponentsRecord > chi2MeasurementEstimatorToken_
Definition: HitEff.h:95
Log< level::Info, false > LogInfo
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
TFile & file() const
return opened TFile
Definition: TFileService.h:37
Definition: DetId.h:17
unsigned int event
Definition: HitEff.h:130
double checkConsistency(const StripClusterParameterEstimator::LocalValues &parameters, double xx, double xerr)
Definition: HitEff.cc:867
static constexpr auto TIB
T const * product() const
Definition: Handle.h:70
bool useLastMeas_
Definition: HitEff.h:77
unsigned int whatlayer
Definition: HitEff.h:106
const edm::ESGetToken< StripClusterParameterEstimator, TkStripCPERecord > cpeToken_
Definition: HitEff.h:91
unsigned int trackMultiplicityCut_
Definition: HitEff.h:75
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
unsigned int checkLayer(unsigned int iidd, const TrackerTopology *tTopo)
Definition: HitEff.cc:924
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
unsigned int layers
Definition: HitEff.h:104
float pT
Definition: HitEff.h:129
float ResX
Definition: HitEff.h:122
void beginJob() override
Definition: HitEff.cc:106
bool addLumi_
Definition: HitEff.h:72
unsigned int SiStripQualBad
Definition: HitEff.h:125
bool addCommonMode_
Definition: HitEff.h:73
edm::EventID id() const
Definition: EventBase.h:59
const edm::EDGetTokenT< TrajTrackAssociationCollection > trajTrackAsso_token_
Definition: HitEff.h:82
float TrajLocErrY
Definition: HitEff.h:120
float TrajLocAngleY
Definition: HitEff.h:119
tuple MeasurementTrackerEvent
std::vector< LumiScalers > LumiScalersCollection
Definition: LumiScalers.h:144
bool cutOnTracks_
Definition: HitEff.h:74
bool useFirstMeas_
Definition: HitEff.h:76
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
float ClusterLocY
Definition: HitEff.h:121
void initEvent(const edm::EventSetup &iSetup)
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
tmp
align.sh
Definition: createJobs.py:716
const edm::EDGetTokenT< LumiScalersCollection > scalerToken_
Definition: HitEff.h:67
TTree * traj
Definition: HitEff.h:100
virtual float width() const =0
unsigned int tecWheel(const DetId &id) const
static constexpr auto TID
const edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > commonModeToken_
Definition: HitEff.h:68
edm::ParameterSet conf_
Definition: HitEff.h:98
float timeAtIpInOut
Definition: MuonTime.h:13
int EventTrackCKF
Definition: HitEff.h:101
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
float TrajLocY
Definition: HitEff.h:119
int tquality
Definition: HitEff.h:131
unsigned int tobLayer(const DetId &id) const
unsigned int tecSide(const DetId &id) const
#define LogDebug(id)