CMS 3D CMS Logo

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