CMS 3D CMS Logo

MeasurementTrackerImpl.cc
Go to the documentation of this file.
2 
5 
11 
13 
19 
21 
26 
29 #include "TkStripMeasurementDet.h"
30 #include "TkPixelMeasurementDet.h"
32 #include "TkGluedMeasurementDet.h"
33 #include "TkStackMeasurementDet.h"
34 
37 
38 #include <iostream>
39 #include <typeinfo>
40 #include <map>
41 #include <algorithm>
42 
43 //
44 
45 using namespace std;
46 
47 namespace {
48 
49  class StrictWeakOrdering {
50  public:
51  bool operator()(uint32_t p, const uint32_t& i) const { return p < i; }
52  };
53 
54  struct CmpTKD {
55  bool operator()(MeasurementDet const* rh, MeasurementDet const* lh) {
56  return rh->fastGeomDet().geographicalId().rawId() < lh->fastGeomDet().geographicalId().rawId();
57  }
58  bool operator()(MeasurementDet const& rh, MeasurementDet const& lh) {
59  return rh.fastGeomDet().geographicalId().rawId() < lh.fastGeomDet().geographicalId().rawId();
60  }
61  };
62 
63  template <typename TKD>
64  void sortTKD(std::vector<TKD*>& det) {
65  std::sort(det.begin(), det.end(), CmpTKD());
66  }
67  template <typename TKD>
68  void sortTKD(std::vector<TKD>& det) {
69  std::sort(det.begin(), det.end(), CmpTKD());
70  }
71 
72 } // namespace
73 
76  const StripClusterParameterEstimator* stripCPE,
77  const SiStripRecHitMatcher* hitMatcher,
78  const TrackerTopology* trackerTopology,
79  const TrackerGeometry* trackerGeom,
80  const GeometricSearchTracker* geometricSearchTracker,
81  const SiStripQuality* stripQuality,
82  int stripQualityFlags,
83  int stripQualityDebugFlags,
84  const SiPixelQuality* pixelQuality,
85  const SiPixelFedCabling* pixelCabling,
86  int pixelQualityFlags,
87  int pixelQualityDebugFlags,
89  : MeasurementTracker(trackerGeom, geometricSearchTracker),
90  theStDetConditions(hitMatcher, stripCPE),
91  thePxDetConditions(pixelCPE),
92  thePhase2DetConditions(phase2OTCPE) {
93  this->initialize(trackerTopology);
94  this->initializeStripStatus(badStripCuts, stripQuality, stripQualityFlags, stripQualityDebugFlags);
95  this->initializePixelStatus(pixelQuality, pixelCabling, pixelQualityFlags, pixelQualityDebugFlags);
96 }
97 
99 
101  bool subIsPixel = false;
102  //FIXME:just temporary solution for phase2 :
103  //the OT is defined as PixelSubDetector!
104  bool subIsOT = false;
105 
106  //if the TkGeometry has the subDet vector filled, the theDetMap is filled, otherwise nothing should happen
107  if (!theTrackerGeom->detsPXB().empty()) {
109  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsPXB().front()->geographicalId().subdetId()));
110  addDets(theTrackerGeom->detsPXB(), subIsPixel, subIsOT);
111  }
112 
113  if (!theTrackerGeom->detsPXF().empty()) {
115  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsPXF().front()->geographicalId().subdetId()));
116  addDets(theTrackerGeom->detsPXF(), subIsPixel, subIsOT);
117  }
118 
119  subIsOT = true;
120 
121  if (!theTrackerGeom->detsTIB().empty()) {
123  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsTIB().front()->geographicalId().subdetId()));
124  addDets(theTrackerGeom->detsTIB(), subIsPixel, subIsOT);
125  }
126 
127  if (!theTrackerGeom->detsTID().empty()) {
129  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsTID().front()->geographicalId().subdetId()));
130  addDets(theTrackerGeom->detsTID(), subIsPixel, subIsOT);
131  }
132 
133  if (!theTrackerGeom->detsTOB().empty()) {
135  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsTOB().front()->geographicalId().subdetId()));
136  addDets(theTrackerGeom->detsTOB(), subIsPixel, subIsOT);
137  }
138 
139  if (!theTrackerGeom->detsTEC().empty()) {
141  theTrackerGeom->geomDetSubDetector(theTrackerGeom->detsTEC().front()->geographicalId().subdetId()));
142  addDets(theTrackerGeom->detsTEC(), subIsPixel, subIsOT);
143  }
144 
145  // fist all stripdets
146  sortTKD(theStripDets);
148  for (unsigned int i = 0; i != theStripDets.size(); ++i)
150 
151  // now the glued dets
152  sortTKD(theGluedDets);
153  for (unsigned int i = 0; i != theGluedDets.size(); ++i)
154  initGluedDet(theGluedDets[i], trackerTopology);
155 
156  // then the pixels
157  sortTKD(thePixelDets);
159  for (unsigned int i = 0; i != thePixelDets.size(); ++i)
161 
162  // then the phase2 dets
163  sortTKD(thePhase2Dets);
165  for (unsigned int i = 0; i != thePhase2Dets.size(); ++i)
167 
168  // and then the stack dets, at last
169  sortTKD(theStackDets);
170  for (unsigned int i = 0; i != theStackDets.size(); ++i)
172 
173  if (!checkDets())
174  throw MeasurementDetException("Number of dets in MeasurementTracker not consistent with TrackerGeometry!");
175 }
176 
177 void MeasurementTrackerImpl::initStMeasurementConditionSet(std::vector<TkStripMeasurementDet>& stripDets) {
178  // assume vector is full and ordered!
179  int size = stripDets.size();
181  for (int i = 0; i != size; ++i) {
182  auto& mdet = stripDets[i];
183  mdet.setIndex(i);
184  //intialize the detId !
185  theStDetConditions.id_[i] = mdet.specificGeomDet().geographicalId().rawId();
187  //initalize the total number of strips
188  theStDetConditions.totalStrips_[i] = mdet.specificGeomDet().specificTopology().nstrips();
189  }
190 }
191 
192 void MeasurementTrackerImpl::initPxMeasurementConditionSet(std::vector<TkPixelMeasurementDet>& pixelDets) {
193  // assume vector is full and ordered!
194  int size = pixelDets.size();
196 
197  for (int i = 0; i != size; ++i) {
198  auto& mdet = pixelDets[i];
199  mdet.setIndex(i);
200  thePxDetConditions.id_[i] = mdet.specificGeomDet().geographicalId().rawId();
201  }
202 }
203 
204 void MeasurementTrackerImpl::initPhase2OTMeasurementConditionSet(std::vector<TkPhase2OTMeasurementDet>& phase2Dets) {
205  // assume vector is full and ordered!
206  int size = phase2Dets.size();
208 
209  for (int i = 0; i != size; ++i) {
210  auto& mdet = phase2Dets[i];
211  mdet.setIndex(i);
212  thePhase2DetConditions.id_[i] = mdet.specificGeomDet().geographicalId().rawId();
213  }
214 }
215 
216 void MeasurementTrackerImpl::addDets(const TrackingGeometry::DetContainer& dets, bool subIsPixel, bool subIsOT) {
217  //in phase2, we can have composed subDetector made by Pixel or Strip
218  for (TrackerGeometry::DetContainer::const_iterator gd = dets.begin(); gd != dets.end(); gd++) {
219  const GeomDetUnit* gdu = dynamic_cast<const GeomDetUnit*>(*gd);
220 
221  //Pixel or Strip GeomDetUnit
222  if (gdu->isLeaf()) {
223  if (subIsPixel) {
224  if (!subIsOT) {
225  addPixelDet(*gd);
226  } else {
227  addPhase2Det(*gd);
228  }
229  } else {
230  addStripDet(*gd);
231  }
232  } else {
233  //Glued or Stack GeomDet
234  const GluedGeomDet* gluedDet = dynamic_cast<const GluedGeomDet*>(*gd);
235  const StackGeomDet* stackDet = dynamic_cast<const StackGeomDet*>(*gd);
236 
237  if ((gluedDet == nullptr && stackDet == nullptr) || (gluedDet != nullptr && stackDet != nullptr)) {
238  throw MeasurementDetException("MeasurementTracker ERROR: GeomDet neither DetUnit nor GluedDet nor StackDet");
239  }
240  if (gluedDet != nullptr)
241  addGluedDet(gluedDet);
242  else if (stackDet != nullptr)
243  addStackDet(stackDet);
244  }
245  }
246 }
247 
249  if (theTrackerGeom->dets().size() == theDetMap.size())
250  return true;
251  return false;
252 }
253 
255  try {
257  } catch (MeasurementDetException& err) {
258  edm::LogError("MeasurementDet") << "Oops, got a MeasurementDetException: " << err.what();
259  }
260 }
261 
263  try {
265  } catch (MeasurementDetException& err) {
266  edm::LogError("MeasurementDet") << "Oops, got a MeasurementDetException: " << err.what();
267  }
268 }
269 
271  try {
273  } catch (MeasurementDetException& err) {
274  edm::LogError("MeasurementDet") << "Oops, got a MeasurementDetException: " << err.what();
275  }
276 }
277 
280 }
281 
283  //since the Stack will be composed by PS or 2S,
284  //both cluster parameter estimators are needed? - right now just the thePixelCPE is used.
286 }
287 
289  const GluedGeomDet& gd = det.specificGeomDet();
290  const MeasurementDet* monoDet = findDet(gd.monoDet()->geographicalId());
291  const MeasurementDet* stereoDet = findDet(gd.stereoDet()->geographicalId());
292  if (monoDet == nullptr || stereoDet == nullptr) {
293  edm::LogError("MeasurementDet") << "MeasurementTracker ERROR: GluedDet components not found as MeasurementDets ";
294  throw MeasurementDetException("MeasurementTracker ERROR: GluedDet components not found as MeasurementDets");
295  }
296  det.init(monoDet, stereoDet, trackerTopology);
297  theDetMap[gd.geographicalId()] = &det;
298 }
299 
301  const StackGeomDet& gd = det.specificGeomDet();
302  const MeasurementDet* lowerDet = findDet(gd.lowerDet()->geographicalId());
303  const MeasurementDet* upperDet = findDet(gd.upperDet()->geographicalId());
304  if (lowerDet == nullptr || upperDet == nullptr) {
305  edm::LogError("MeasurementDet") << "MeasurementTracker ERROR: StackDet components not found as MeasurementDets ";
306  throw MeasurementDetException("MeasurementTracker ERROR: StackDet components not found as MeasurementDets");
307  }
308  det.init(lowerDet, upperDet);
309  theDetMap[gd.geographicalId()] = &det;
310 }
311 
313  const SiStripQuality* quality,
314  int qualityFlags,
315  int qualityDebugFlags) {
316  if (qualityFlags & BadStrips) {
321  }
323 
324  if ((quality != nullptr) && (qualityFlags != 0)) {
325  edm::LogInfo("MeasurementTracker") << "qualityFlags = " << qualityFlags;
326  unsigned int on = 0, tot = 0;
327  unsigned int foff = 0, ftot = 0, aoff = 0, atot = 0;
328  for (int i = 0; i != theStDetConditions.nDet(); i++) {
329  uint32_t detid = theStDetConditions.id(i);
330  if (qualityFlags & BadModules) {
331  bool isOn = quality->IsModuleUsable(detid);
333  tot++;
334  on += (unsigned int)isOn;
335  if (qualityDebugFlags & BadModules) {
336  edm::LogInfo("MeasurementTracker")
337  << "MeasurementTrackerImpl::initializeStripStatus : detid " << detid << " is " << (isOn ? "on" : "off");
338  }
339  } else {
341  }
342  // first turn all APVs and fibers ON
344  if (qualityFlags & BadAPVFibers) {
345  short badApvs = quality->getBadApvs(detid);
346  short badFibers = quality->getBadFibers(detid);
347  for (int j = 0; j < 6; j++) {
348  atot++;
349  if (badApvs & (1 << j)) {
351  aoff++;
352  }
353  }
354  for (int j = 0; j < 3; j++) {
355  ftot++;
356  if (badFibers & (1 << j)) {
358  theStDetConditions.set128StripStatus(i, false, 2 * j + 1);
359  foff++;
360  }
361  }
362  }
363  auto& badStrips = theStDetConditions.getBadStripBlocks(i);
364  badStrips.clear();
365  if (qualityFlags & BadStrips) {
367  for (SiStripBadStrip::ContainerIterator bit = range.first; bit != range.second; ++bit) {
368  badStrips.push_back(quality->decode(*bit));
369  }
370  }
371  }
372  if (qualityDebugFlags & BadModules) {
373  edm::LogInfo("MeasurementTracker StripModuleStatus")
374  << " Total modules: " << tot << ", active " << on << ", inactive " << (tot - on);
375  }
376  if (qualityDebugFlags & BadAPVFibers) {
377  edm::LogInfo("MeasurementTracker StripAPVStatus")
378  << " Total APVs: " << atot << ", active " << (atot - aoff) << ", inactive " << (aoff);
379  edm::LogInfo("MeasurementTracker StripFiberStatus")
380  << " Total Fibers: " << ftot << ", active " << (ftot - foff) << ", inactive " << (foff);
381  }
382  } else {
383  for (int i = 0; i != theStDetConditions.nDet(); i++) {
384  theStDetConditions.setActive(i, true); // module ON
385  theStDetConditions.set128StripStatus(i, true); // all APVs and fibers ON
386  }
387  }
388 }
389 
391  const SiPixelFedCabling* pixelCabling,
392  int qualityFlags,
393  int qualityDebugFlags) {
394  if ((quality != nullptr) && (qualityFlags != 0)) {
395  edm::LogInfo("MeasurementTracker") << "qualityFlags = " << qualityFlags;
396  unsigned int on = 0, tot = 0, badrocs = 0;
397  for (std::vector<TkPixelMeasurementDet>::iterator i = thePixelDets.begin(); i != thePixelDets.end(); i++) {
398  uint32_t detid = ((*i).geomDet().geographicalId()).rawId();
399  if (qualityFlags & BadModules) {
400  bool isOn = quality->IsModuleUsable(detid);
401  (i)->setActive(isOn);
402  tot++;
403  on += (unsigned int)isOn;
404  if (qualityDebugFlags & BadModules) {
405  edm::LogInfo("MeasurementTracker")
406  << "MeasurementTrackerImpl::initializePixelStatus : detid " << detid << " is " << (isOn ? "on" : "off");
407  }
408  } else {
409  (i)->setActive(true);
410  }
411  if ((qualityFlags & BadROCs) && (quality->getBadRocs(detid) != 0)) {
412  std::vector<LocalPoint> badROCs = quality->getBadRocPositions(detid, *theTrackerGeom, pixelCabling);
413  badrocs += badROCs.size();
414  (i)->setBadRocPositions(badROCs);
415  } else {
416  (i)->clearBadRocPositions();
417  }
418  }
419  if (qualityDebugFlags & BadModules) {
420  edm::LogInfo("MeasurementTracker PixelModuleStatus")
421  << " Total modules: " << tot << ", active " << on << ", inactive " << (tot - on);
422  }
423  if (qualityDebugFlags & BadROCs) {
424  edm::LogInfo("MeasurementTracker PixelROCStatus") << " Total of bad ROCs: " << badrocs;
425  }
426  } else {
427  for (std::vector<TkPixelMeasurementDet>::iterator i = thePixelDets.begin(); i != thePixelDets.end(); i++) {
428  (i)->setActive(true); // module ON
429  }
430  }
431 }
size
Write out results.
const DetContainer & detsTIB() const
virtual bool isLeaf() const
is a Unit
Definition: GeomDet.h:70
void addStripDet(const GeomDet *gd)
void addStackDet(const StackGeomDet *gd)
const GeomDetUnit * lowerDet() const
Definition: StackGeomDet.h:19
std::vector< TkStripMeasurementDet > theStripDets
const DetContainer & detsPXB() const
std::vector< TkStackMeasurementDet > theStackDets
StMeasurementConditionSet theStDetConditions
static constexpr auto TID
Definition: SiStripDetId.h:39
const GeomDetUnit * upperDet() const
Definition: StackGeomDet.h:20
unsigned int id(int i) const
std::vector< unsigned int >::const_iterator ContainerIterator
void addDets(const TrackingGeometry::DetContainer &dets, bool subIsPixel, bool subIsOT)
const TrackerGeometry * theTrackerGeom
const DetContainer & detsPXF() const
const StripClusterParameterEstimator * stripCPE() const
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
const GluedGeomDet & specificGeomDet() const
bool int lh
Definition: SIMDVec.h:27
std::vector< TkPhase2OTMeasurementDet > thePhase2Dets
Log< level::Error, false > LogError
void addPixelDet(const GeomDet *gd)
const SiStripRecHitMatcher * matcher() const
std::vector< const GeomDet * > DetContainer
string quality
void init(const MeasurementDet *lowerDet, const MeasurementDet *upperDet)
std::vector< unsigned char > subId_
unsigned int id(int i) const
void initGluedDet(TkGluedMeasurementDet &det, const TrackerTopology *trackerTopology)
const DetContainer & detsTOB() const
std::vector< TkPixelMeasurementDet > thePixelDets
void initializePixelStatus(const SiPixelQuality *stripQuality, const SiPixelFedCabling *pixelCabling, int qualityFlags, int qualityDebugFlags)
void initPhase2OTMeasurementConditionSet(std::vector< TkPhase2OTMeasurementDet > &phase2Dets)
void setActive(int i, bool active)
Turn on/off the module for reconstruction, for the full run or lumi (using info from DB...
std::vector< BadStripBlock > & getBadStripBlocks(int i)
MeasurementTrackerImpl(const BadStripCutsDet &badStripCuts, const PixelClusterParameterEstimator *pixelCPE, const StripClusterParameterEstimator *stripCPE, const SiStripRecHitMatcher *hitMatcher, const TrackerTopology *trackerTopology, const TrackerGeometry *trackerGeom, const GeometricSearchTracker *geometricSearchTracker, const SiStripQuality *stripQuality, int stripQualityFlags, int stripQualityDebugFlags, const SiPixelQuality *pixelQuality, const SiPixelFedCabling *pixelCabling, int pixelQualityFlags, int pixelQualityDebugFlags, const ClusterParameterEstimator< Phase2TrackerCluster1D > *phase2OTCPE=nullptr)
void initialize(const TrackerTopology *trackerTopology)
void initStMeasurementConditionSet(std::vector< TkStripMeasurementDet > &stripDets)
unsigned int id(int i) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
std::vector< unsigned int > id_
DetId geographicalId() const
The label of this GeomDet.
Definition: GeomDet.h:64
static constexpr auto TOB
Definition: SiStripDetId.h:40
std::vector< int > totalStrips_
void initializeStripStatus(const BadStripCutsDet &badStripCuts, const SiStripQuality *stripQuality, int qualityFlags, int qualityDebugFlags)
const std::vector< TkStripMeasurementDet > & stripDets() const
const GeomDetUnit * monoDet() const
Definition: GluedGeomDet.h:19
void addPhase2Det(const GeomDet *gd)
Log< level::Info, false > LogInfo
Detector identifier class for the strip tracker.
Definition: SiStripDetId.h:19
void setMaskBad128StripBlocks(bool maskThem)
std::vector< unsigned int > id_
void addGluedDet(const GluedGeomDet *gd)
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
std::vector< unsigned int > id_
const GeomDet & fastGeomDet() const
const GeomDetUnit * stereoDet() const
Definition: GluedGeomDet.h:20
std::vector< TkGluedMeasurementDet > theGluedDets
static constexpr auto TIB
Definition: SiStripDetId.h:38
void init(const MeasurementDet *monoDet, const MeasurementDet *stereoDet, const TrackerTopology *tTopo)
PxMeasurementConditionSet thePxDetConditions
Phase2OTMeasurementConditionSet thePhase2DetConditions
const MeasurementDet * findDet(const DetId &id) const
const GeomDetEnumerators::SubDetector geomDetSubDetector(int subdet) const
std::pair< ContainerIterator, ContainerIterator > Range
const std::vector< TkPixelMeasurementDet > & pixelDets() const
const DetContainer & detsTEC() const
const StackGeomDet & specificGeomDet() const
void initPxMeasurementConditionSet(std::vector< TkPixelMeasurementDet > &pixelDets)
void set128StripStatus(int i, bool good, int idx=-1)
const PixelClusterParameterEstimator * pixelCPE() const
void initStackDet(TkStackMeasurementDet &det)
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
static constexpr auto TEC
Definition: SiStripDetId.h:41
const DetContainer & detsTID() const