CMS 3D CMS Logo

TrackerGeometryCompare.cc
Go to the documentation of this file.
5 #include "CLHEP/Vector/RotationInterfaces.h"
11 
15 
17 
23 
39 
40 #include "TrackerGeometryCompare.h"
41 #include "TFile.h"
42 #include "CLHEP/Vector/ThreeVector.h"
43 
44 // Database
48 
51 
52 #include <iostream>
53 #include <fstream>
54 #include <sstream>
55 
57  : cpvTokenDDD_(esConsumes()),
58  cpvTokenDD4hep_(esConsumes()),
59  topoToken_(esConsumes()),
60  geomDetToken_(esConsumes()),
61  ptpToken_(esConsumes()),
62  ptitpToken_(esConsumes()),
63  pixQualityToken_(esConsumes()),
64  stripQualityToken_(esConsumes()),
65  referenceTracker(nullptr),
66  dummyTracker(nullptr),
67  currentTracker(nullptr),
68  theSurveyIndex(0),
69  theSurveyValues(nullptr),
70  theSurveyErrors(nullptr),
71  levelStrings_(cfg.getUntrackedParameter<std::vector<std::string> >("levels")),
72  fromDD4hep_(cfg.getUntrackedParameter<bool>("fromDD4hep")),
73  writeToDB_(cfg.getUntrackedParameter<bool>("writeToDB")),
74  commonTrackerLevel_(align::invalid),
75  moduleListFile_(),
76  moduleList_(0),
77  inputRootFile1_(nullptr),
78  inputRootFile2_(nullptr),
79  inputTree01_(nullptr),
80  inputTree02_(nullptr),
81  inputTree11_(nullptr),
82  inputTree12_(nullptr),
83  m_nBins_(10000),
84  m_rangeLow_(-.1),
85  m_rangeHigh_(.1),
86  firstEvent_(true),
87  m_vtkmap_(13) {
88  moduleListName_ = cfg.getUntrackedParameter<std::string>("moduleList");
89 
90  //input is ROOT
91  inputFilename1_ = cfg.getUntrackedParameter<std::string>("inputROOTFile1");
92  inputFilename2_ = cfg.getUntrackedParameter<std::string>("inputROOTFile2");
93  inputTreenameAlign_ = cfg.getUntrackedParameter<std::string>("treeNameAlign");
94  inputTreenameDeform_ = cfg.getUntrackedParameter<std::string>("treeNameDeform");
95 
96  //output file
97  filename_ = cfg.getUntrackedParameter<std::string>("outputFile");
98  //output dir for surface deformations
99  surfdir_ = cfg.getUntrackedParameter<std::string>("surfDir");
100 
101  weightBy_ = cfg.getUntrackedParameter<std::string>("weightBy");
102  setCommonTrackerSystem_ = cfg.getUntrackedParameter<std::string>("setCommonTrackerSystem");
103  detIdFlag_ = cfg.getUntrackedParameter<bool>("detIdFlag");
104  detIdFlagFile_ = cfg.getUntrackedParameter<std::string>("detIdFlagFile");
105  weightById_ = cfg.getUntrackedParameter<bool>("weightById");
106  weightByIdFile_ = cfg.getUntrackedParameter<std::string>("weightByIdFile");
107 
108  // if want to use, make id cut list
109  if (detIdFlag_) {
110  std::ifstream fin;
111  fin.open(detIdFlagFile_.c_str());
112 
113  while (!fin.eof() && fin.good()) {
114  uint32_t id;
115  fin >> id;
116  detIdFlagVector_.push_back(id);
117  }
118  fin.close();
119  }
120 
121  // turn weightByIdFile into weightByIdVector
122  if (weightById_) {
123  std::ifstream inFile;
124  inFile.open(weightByIdFile_.c_str());
125  while (!inFile.eof()) {
126  unsigned int listId;
127  inFile >> listId;
128  inFile.ignore(256, '\n');
129 
130  weightByIdVector_.push_back(listId);
131  }
132  inFile.close();
133  }
134 
135  //root configuration
136  theFile_ = new TFile(filename_.c_str(), "RECREATE");
137  alignTree_ = new TTree("alignTree",
138  "alignTree"); //,"id:level:mid:mlevel:sublevel:x:y:z:r:phi:a:b:c:dx:dy:dz:dr:dphi:da:db:dc");
139  alignTree_->Branch("id", &id_, "id/I");
140  alignTree_->Branch("badModuleQuality", &badModuleQuality_, "badModuleQuality/I");
141  alignTree_->Branch("inModuleList", &inModuleList_, "inModuleList/I");
142  alignTree_->Branch("level", &level_, "level/I");
143  alignTree_->Branch("mid", &mid_, "mid/I");
144  alignTree_->Branch("mlevel", &mlevel_, "mlevel/I");
145  alignTree_->Branch("sublevel", &sublevel_, "sublevel/I");
146  alignTree_->Branch("x", &xVal_, "x/F");
147  alignTree_->Branch("y", &yVal_, "y/F");
148  alignTree_->Branch("z", &zVal_, "z/F");
149  alignTree_->Branch("r", &rVal_, "r/F");
150  alignTree_->Branch("phi", &phiVal_, "phi/F");
151  alignTree_->Branch("eta", &etaVal_, "eta/F");
152  alignTree_->Branch("alpha", &alphaVal_, "alpha/F");
153  alignTree_->Branch("beta", &betaVal_, "beta/F");
154  alignTree_->Branch("gamma", &gammaVal_, "gamma/F");
155  alignTree_->Branch("dx", &dxVal_, "dx/F");
156  alignTree_->Branch("dy", &dyVal_, "dy/F");
157  alignTree_->Branch("dz", &dzVal_, "dz/F");
158  alignTree_->Branch("dr", &drVal_, "dr/F");
159  alignTree_->Branch("dphi", &dphiVal_, "dphi/F");
160  alignTree_->Branch("dalpha", &dalphaVal_, "dalpha/F");
161  alignTree_->Branch("dbeta", &dbetaVal_, "dbeta/F");
162  alignTree_->Branch("dgamma", &dgammaVal_, "dgamma/F");
163  alignTree_->Branch("du", &duVal_, "du/F");
164  alignTree_->Branch("dv", &dvVal_, "dv/F");
165  alignTree_->Branch("dw", &dwVal_, "dw/F");
166  alignTree_->Branch("da", &daVal_, "da/F");
167  alignTree_->Branch("db", &dbVal_, "db/F");
168  alignTree_->Branch("dg", &dgVal_, "dg/F");
169  alignTree_->Branch("useDetId", &useDetId_, "useDetId/I");
170  alignTree_->Branch("detDim", &detDim_, "detDim/I");
171  alignTree_->Branch("surW", &surWidth_, "surW/F");
172  alignTree_->Branch("surL", &surLength_, "surL/F");
173  alignTree_->Branch("surRot", &surRot_, "surRot[9]/D");
174  alignTree_->Branch("identifiers", &identifiers_, "identifiers[6]/I");
175  alignTree_->Branch("type", &type_, "type/I");
176  alignTree_->Branch("surfDeform", &surfDeform_, "surfDeform[13]/D");
177 
178  for (std::vector<TrackerMap>::iterator it = m_vtkmap_.begin(); it != m_vtkmap_.end(); ++it) {
179  it->setPalette(1);
180  it->addPixel(true);
181  }
182 
184  TFileDirectory subDir_All = fs->mkdir("AllSubdetectors");
185  TFileDirectory subDir_PXB = fs->mkdir("PixelBarrel");
186  TFileDirectory subDir_PXF = fs->mkdir("PixelEndcap");
187  for (int ii = 0; ii < 13; ++ii) {
188  std::stringstream histname0;
189  histname0 << "SurfDeform_Par_" << ii;
190  m_h1_[histname0.str()] = subDir_All.make<TH1D>(
191  (histname0.str()).c_str(), (histname0.str()).c_str(), m_nBins_, m_rangeLow_, m_rangeHigh_);
192 
193  std::stringstream histname1;
194  histname1 << "SurfDeform_PixelBarrel_Par_" << ii;
195  m_h1_[histname1.str()] = subDir_PXB.make<TH1D>(
196  (histname1.str()).c_str(), (histname1.str()).c_str(), m_nBins_, m_rangeLow_, m_rangeHigh_);
197 
198  std::stringstream histname2;
199  histname2 << "SurfDeform_PixelEndcap_Par_" << ii;
200  m_h1_[histname2.str()] = subDir_PXF.make<TH1D>(
201  (histname2.str()).c_str(), (histname2.str()).c_str(), m_nBins_, m_rangeLow_, m_rangeHigh_);
202  }
203 }
204 
207  desc.setComment("Validates alignment payloads by comparing positions of tracker modules positiona and orientations");
208  desc.addUntracked<std::vector<std::string> >("levels", {});
209  desc.addUntracked<bool>("fromDD4hep", false);
210  desc.addUntracked<bool>("writeToDB", false);
211  desc.addUntracked<std::string>("moduleList", "moduleList.txt");
212  desc.addUntracked<std::string>("inputROOTFile1", "IDEAL");
213  desc.addUntracked<std::string>("inputROOTFile2", "idealtracker2.root");
214  desc.addUntracked<std::string>("treeNameAlign", "alignTree");
215  desc.addUntracked<std::string>("treeNameDeform", "alignTreeDeformations");
216  desc.addUntracked<std::string>("outputFile", "output.root");
217  desc.addUntracked<std::string>("surfDir", ".");
218  desc.addUntracked<std::string>("weightBy", "DetUnit");
219  desc.addUntracked<std::string>("setCommonTrackerSystem", "NONE");
220  desc.addUntracked<bool>("detIdFlag", false);
221  desc.addUntracked<std::string>("detIdFlagFile", "blah.txt");
222  desc.addUntracked<bool>("weightById", false);
223  desc.addUntracked<std::string>("weightByIdFile", "blah2.txt");
224  descriptions.addWithDefaultLabel(desc);
225 }
226 
228 
230  int iname(0);
231  for (std::vector<TrackerMap>::iterator it = m_vtkmap_.begin(); it != m_vtkmap_.end(); ++it) {
232  std::stringstream mapname;
233  mapname << surfdir_ << "/TkMap_SurfDeform_0" << iname << ".png";
234  it->save(true, 0, 0, mapname.str());
235  mapname.str(std::string());
236  mapname.clear();
237  mapname << surfdir_ << "/TkMap_SurfDeform_1" << iname << ".pdf";
238  it->save(true, 0, 0, mapname.str());
239  ++iname;
240  }
241 
242  theFile_->cd();
243  alignTree_->Write();
244  theFile_->Close();
245 }
246 
248  if (firstEvent_) {
249  //Retrieve tracker topology from geometry
250  const TrackerTopology* const tTopo = &iSetup.getData(topoToken_);
251 
252  //upload the ROOT geometries
253  createROOTGeometry(iSetup);
254 
255  //setting the levels being used in the geometry comparator
256  edm::LogInfo("TrackerGeometryCompare") << "levels: " << levelStrings_.size();
257  for (const auto& level : levelStrings_) {
259  edm::LogInfo("TrackerGeometryCompare") << "level: " << level;
260  edm::LogInfo("TrackerGeometryCompare")
261  << "structure type: " << currentTracker->objectIdProvider().stringToId(level);
262  }
263 
264  //set common tracker system first
265  // if setting the tracker common system
266  if (setCommonTrackerSystem_ != "NONE") {
268  }
269 
270  //compare the goemetries
273 
274  //write out ntuple
275  //might be better to do within output module
276 
277  if (writeToDB_) {
278  Alignments* myAlignments = currentTracker->alignments();
279  AlignmentErrorsExtended* myAlignmentErrorsExtended = currentTracker->alignmentErrors();
280 
281  // 2. Store alignment[Error]s to DB
283  // Call service
284  if (!poolDbService.isAvailable()) // Die if not available
285  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
286 
287  poolDbService->writeOneIOV<Alignments>(*myAlignments, poolDbService->beginOfTime(), "TrackerAlignmentRcd");
288  poolDbService->writeOneIOV<AlignmentErrorsExtended>(
289  *myAlignmentErrorsExtended, poolDbService->beginOfTime(), "TrackerAlignmentErrorExtendedRcd");
290  }
291 
292  firstEvent_ = false;
293  }
294 }
295 
297  int inputRawId1, inputRawId2;
298  double inputX1, inputY1, inputZ1, inputX2, inputY2, inputZ2;
299  double inputAlpha1, inputBeta1, inputGamma1, inputAlpha2, inputBeta2, inputGamma2;
300 
301  //Retrieve tracker topology from geometry
302  const TrackerTopology* const tTopo = &iSetup.getData(topoToken_);
303 
304  // Fill module IDs from file into a list
306  if (moduleListFile_.is_open()) {
308  while (!moduleListFile_.eof()) {
309  std::getline(moduleListFile_, line);
310  moduleList_.push_back(std::atoi(line.c_str()));
311  }
312  } else {
313  edm::LogInfo("TrackerGeometryCompare") << "Error: Module list not found! Please verify that given list exists!";
314  }
315 
316  //declare alignments
317  Alignments* alignments1 = new Alignments();
318  AlignmentErrorsExtended* alignmentErrors1 = new AlignmentErrorsExtended();
319  if (inputFilename1_ != "IDEAL") {
320  inputRootFile1_ = new TFile(inputFilename1_.c_str());
321  TTree* inputTree01_ = (TTree*)inputRootFile1_->Get(inputTreenameAlign_.c_str());
322  inputTree01_->SetBranchAddress("rawid", &inputRawId1);
323  inputTree01_->SetBranchAddress("x", &inputX1);
324  inputTree01_->SetBranchAddress("y", &inputY1);
325  inputTree01_->SetBranchAddress("z", &inputZ1);
326  inputTree01_->SetBranchAddress("alpha", &inputAlpha1);
327  inputTree01_->SetBranchAddress("beta", &inputBeta1);
328  inputTree01_->SetBranchAddress("gamma", &inputGamma1);
329 
330  int nEntries1 = inputTree01_->GetEntries();
331  //fill alignments
332  for (int i = 0; i < nEntries1; ++i) {
333  inputTree01_->GetEntry(i);
334  CLHEP::Hep3Vector translation1(inputX1, inputY1, inputZ1);
335  CLHEP::HepEulerAngles eulerangles1(inputAlpha1, inputBeta1, inputGamma1);
336  uint32_t detid1 = inputRawId1;
337  AlignTransform transform1(translation1, eulerangles1, detid1);
338  alignments1->m_align.push_back(transform1);
339 
340  // dummy errors
341  // APE matrix was 3x3, now it's 6x6 (because of muons), see PR #6483
342  CLHEP::HepSymMatrix clhepSymMatrix(6, 0);
343  AlignTransformErrorExtended transformError(clhepSymMatrix, detid1);
344  alignmentErrors1->m_alignError.push_back(transformError);
345  }
346 
347  // to get the right order, sort by rawId
348  std::sort(alignments1->m_align.begin(), alignments1->m_align.end());
349  std::sort(alignmentErrors1->m_alignError.begin(), alignmentErrors1->m_alignError.end());
350  }
351  //------------------
352  Alignments* alignments2 = new Alignments();
353  AlignmentErrorsExtended* alignmentErrors2 = new AlignmentErrorsExtended();
354  if (inputFilename2_ != "IDEAL") {
355  inputRootFile2_ = new TFile(inputFilename2_.c_str());
356  TTree* inputTree02_ = (TTree*)inputRootFile2_->Get(inputTreenameAlign_.c_str());
357  inputTree02_->SetBranchAddress("rawid", &inputRawId2);
358  inputTree02_->SetBranchAddress("x", &inputX2);
359  inputTree02_->SetBranchAddress("y", &inputY2);
360  inputTree02_->SetBranchAddress("z", &inputZ2);
361  inputTree02_->SetBranchAddress("alpha", &inputAlpha2);
362  inputTree02_->SetBranchAddress("beta", &inputBeta2);
363  inputTree02_->SetBranchAddress("gamma", &inputGamma2);
364 
365  int nEntries2 = inputTree02_->GetEntries();
366  //fill alignments
367  for (int i = 0; i < nEntries2; ++i) {
368  inputTree02_->GetEntry(i);
369  CLHEP::Hep3Vector translation2(inputX2, inputY2, inputZ2);
370  CLHEP::HepEulerAngles eulerangles2(inputAlpha2, inputBeta2, inputGamma2);
371  uint32_t detid2 = inputRawId2;
372  AlignTransform transform2(translation2, eulerangles2, detid2);
373  alignments2->m_align.push_back(transform2);
374 
375  // dummy errors
376  // APE matrix was 3x3, now it's 6x6 (because of muons), see PR #6483
377  CLHEP::HepSymMatrix clhepSymMatrix(6, 0);
378  AlignTransformErrorExtended transformError(clhepSymMatrix, detid2);
379  alignmentErrors2->m_alignError.push_back(transformError);
380  }
381 
382  // to get the right order, sort by rawId
383  std::sort(alignments2->m_align.begin(), alignments2->m_align.end());
384  std::sort(alignmentErrors2->m_alignError.begin(), alignmentErrors2->m_alignError.end());
385  }
386 
387  //accessing the initial geometry
388  if (!fromDD4hep_) {
390  } else {
392  }
393 
394  const GeometricDet* theGeometricDet = &iSetup.getData(geomDetToken_);
395  const PTrackerParameters* ptp = &iSetup.getData(ptpToken_);
397  TrackerGeomBuilderFromGeometricDet trackerBuilder;
398 
399  //reference tracker
400  TrackerGeometry* theRefTracker = trackerBuilder.build(theGeometricDet, ptitp, *ptp, tTopo);
401  if (inputFilename1_ != "IDEAL") {
402  GeometryAligner aligner1;
404  &(*theRefTracker), &(*alignments1), &(*alignmentErrors1), AlignTransform());
405  }
406  referenceTracker = new AlignableTracker(&(*theRefTracker), tTopo);
407  //referenceTracker->setSurfaceDeformation(surfDef1, true) ;
408 
409  //set tracker pixel Phase, assume current tracker is the same Phase
410  if (theRefTracker->isThere(GeomDetEnumerators::P2PXB) || theRefTracker->isThere(GeomDetEnumerators::P2PXEC)) {
412  } else if (theRefTracker->isThere(GeomDetEnumerators::P1PXB) || theRefTracker->isThere(GeomDetEnumerators::P1PXEC)) {
414  } else {
416  }
417 
418  int inputRawid1;
419  int inputRawid2;
420  int inputDtype1, inputDtype2;
421  std::vector<double> inputDpar1;
422  std::vector<double> inputDpar2;
423  std::vector<double>* p_inputDpar1 = &inputDpar1;
424  std::vector<double>* p_inputDpar2 = &inputDpar2;
425 
426  const auto& comp1 = referenceTracker->deepComponents();
427 
428  SurfaceDeformation* surfDef1;
429  if (inputFilename1_ != "IDEAL") {
430  TTree* inputTree11_ = (TTree*)inputRootFile1_->Get(inputTreenameDeform_.c_str());
431  inputTree11_->SetBranchAddress("irawid", &inputRawid1);
432  inputTree11_->SetBranchAddress("dtype", &inputDtype1);
433  inputTree11_->SetBranchAddress("dpar", &p_inputDpar1);
434 
435  unsigned int nEntries11 = inputTree11_->GetEntries();
436  edm::LogInfo("TrackerGeometryCompare") << " nentries11 = " << nEntries11;
437  for (unsigned int iEntry = 0; iEntry < nEntries11; ++iEntry) {
438  inputTree11_->GetEntry(iEntry);
439 
440  surfDef1 = SurfaceDeformationFactory::create(inputDtype1, inputDpar1);
441 
442  if (int(comp1[iEntry]->id()) == inputRawid1) {
443  comp1[iEntry]->setSurfaceDeformation(surfDef1, true);
444  }
445  }
446  }
447 
448  //currernt tracker
449  TrackerGeometry* theCurTracker = trackerBuilder.build(&*theGeometricDet, ptitp, *ptp, tTopo);
450  if (inputFilename2_ != "IDEAL") {
451  GeometryAligner aligner2;
453  &(*theCurTracker), &(*alignments2), &(*alignmentErrors2), AlignTransform());
454  }
455  currentTracker = new AlignableTracker(&(*theCurTracker), tTopo);
456 
457  const auto& comp2 = currentTracker->deepComponents();
458 
459  SurfaceDeformation* surfDef2;
460  if (inputFilename2_ != "IDEAL") {
461  TTree* inputTree12_ = (TTree*)inputRootFile2_->Get(inputTreenameDeform_.c_str());
462  inputTree12_->SetBranchAddress("irawid", &inputRawid2);
463  inputTree12_->SetBranchAddress("dtype", &inputDtype2);
464  inputTree12_->SetBranchAddress("dpar", &p_inputDpar2);
465 
466  unsigned int nEntries12 = inputTree12_->GetEntries();
467  edm::LogInfo("TrackerGeometryCompare") << " nentries12 = " << nEntries12;
468  for (unsigned int iEntry = 0; iEntry < nEntries12; ++iEntry) {
469  inputTree12_->GetEntry(iEntry);
470 
471  surfDef2 = SurfaceDeformationFactory::create(inputDtype2, inputDpar2);
472 
473  if (int(comp2[iEntry]->id()) == inputRawid2) {
474  comp2[iEntry]->setSurfaceDeformation(surfDef2, true);
475  }
476  }
477  }
478 
479  delete alignments1;
480  delete alignmentErrors1;
481  delete alignments2;
482  delete alignmentErrors2;
483 }
484 
485 void TrackerGeometryCompare::compareSurfaceDeformations(TTree* refTree, TTree* curTree) {
486  if (inputFilename1_ != "IDEAL" && inputFilename2_ != "IDEAL") {
487  int inputRawid1;
488  int inputRawid2;
489  int inputSubdetid1, inputSubdetid2;
490  int inputDtype1, inputDtype2;
491  std::vector<double> inputDpar1;
492  std::vector<double> inputDpar2;
493  std::vector<double>* p_inputDpar1 = &inputDpar1;
494  std::vector<double>* p_inputDpar2 = &inputDpar2;
495 
496  TTree* refTree = (TTree*)inputRootFile1_->Get(inputTreenameDeform_.c_str());
497  refTree->SetBranchAddress("irawid", &inputRawid1);
498  refTree->SetBranchAddress("subdetid", &inputSubdetid1);
499  refTree->SetBranchAddress("dtype", &inputDtype1);
500  refTree->SetBranchAddress("dpar", &p_inputDpar1);
501 
502  TTree* curTree = (TTree*)inputRootFile2_->Get(inputTreenameDeform_.c_str());
503  curTree->SetBranchAddress("irawid", &inputRawid2);
504  curTree->SetBranchAddress("subdetid", &inputSubdetid2);
505  curTree->SetBranchAddress("dtype", &inputDtype2);
506  curTree->SetBranchAddress("dpar", &p_inputDpar2);
507 
508  unsigned int nEntries11 = refTree->GetEntries();
509  unsigned int nEntries12 = curTree->GetEntries();
510 
511  if (nEntries11 != nEntries12) {
512  edm::LogError("TrackerGeometryCompare") << " Surface deformation parameters in two geometries differ!\n";
513  return;
514  }
515 
516  for (unsigned int iEntry = 0; iEntry < nEntries12; ++iEntry) {
517  refTree->GetEntry(iEntry);
518  curTree->GetEntry(iEntry);
519  for (int ii = 0; ii < 13; ++ii) {
520  surfDeform_[ii] = -1.0;
521  }
522  for (int npar = 0; npar < int(inputDpar2.size()); ++npar) {
523  if (inputRawid1 == inputRawid2) {
524  surfDeform_[npar] = inputDpar2.at(npar) - inputDpar1.at(npar);
525  std::stringstream histname0;
526  histname0 << "SurfDeform_Par_" << npar;
527  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
528  m_h1_[histname0.str()]->Fill(surfDeform_[npar]);
529  if (inputSubdetid1 == 1 && inputSubdetid2 == 1) {
530  std::stringstream histname1;
531  histname1 << "SurfDeform_PixelBarrel_Par_" << npar;
532  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
533  m_h1_[histname1.str()]->Fill(surfDeform_[npar]);
534  }
535  if (inputSubdetid1 == 2 && inputSubdetid2 == 2) {
536  std::stringstream histname2;
537  histname2 << "SurfDeform_PixelEndcap_Par_" << npar;
538  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
539  m_h1_[histname2.str()]->Fill(surfDeform_[npar]);
540  }
543  (m_vtkmap_.at(npar)).fill_current_val(inputRawid1, surfDeform_[npar]);
544  } else {
545  // old-style tracker map does not support Phase1 Pixel
546  if (!(inputSubdetid1 == 1 && inputSubdetid2 == 1) && !(inputSubdetid1 == 2 && inputSubdetid2 == 2)) {
547  (m_vtkmap_.at(npar)).fill_current_val(inputRawid1, surfDeform_[npar]);
548  }
549  }
550  }
551  }
552  }
553  }
554 
555  } else if (inputFilename1_ == "IDEAL" && inputFilename2_ != "IDEAL") {
556  int inputRawid2;
557  int inputSubdetid2;
558  int inputDtype2;
559  std::vector<double> inputDpar2;
560  std::vector<double>* p_inputDpar2 = &inputDpar2;
561 
562  TTree* curTree = (TTree*)inputRootFile2_->Get(inputTreenameDeform_.c_str());
563  curTree->SetBranchAddress("irawid", &inputRawid2);
564  curTree->SetBranchAddress("subdetid", &inputSubdetid2);
565  curTree->SetBranchAddress("dtype", &inputDtype2);
566  curTree->SetBranchAddress("dpar", &p_inputDpar2);
567 
568  unsigned int nEntries12 = curTree->GetEntries();
569  for (unsigned int iEntry = 0; iEntry < nEntries12; ++iEntry) {
570  curTree->GetEntry(iEntry);
571  for (int ii = 0; ii < 12; ++ii) {
572  surfDeform_[ii] = -1.0;
573  }
574  for (int npar = 0; npar < int(inputDpar2.size()); ++npar) {
575  surfDeform_[npar] = inputDpar2.at(npar);
576  std::stringstream histname0;
577  histname0 << "SurfDeform_Par_" << npar;
578  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
579  m_h1_[histname0.str()]->Fill(surfDeform_[npar]);
580  if (inputSubdetid2 == 1) {
581  std::stringstream histname1;
582  histname1 << "SurfDeform_PixelBarrel_Par_" << npar;
583  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
584  m_h1_[histname1.str()]->Fill(surfDeform_[npar]);
585  }
586  if (inputSubdetid2 == 2) {
587  std::stringstream histname2;
588  histname2 << "SurfDeform_PixelEndcap_Par_" << npar;
589  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
590  m_h1_[histname2.str()]->Fill(surfDeform_[npar]);
591  }
594  (m_vtkmap_.at(npar)).fill_current_val(inputRawid2, surfDeform_[npar]);
595  } else {
596  // old-style tracker map does not support Phase1 Pixel
597  if (inputSubdetid2 != 1 && inputSubdetid2 != 2) {
598  (m_vtkmap_.at(npar)).fill_current_val(inputRawid2, surfDeform_[npar]);
599  }
600  }
601  }
602  }
603  }
604 
605  } else if (inputFilename1_ != "IDEAL" && inputFilename2_ == "IDEAL") {
606  int inputRawid1;
607  int inputSubdetid1;
608  int inputDtype1;
609  std::vector<double> inputDpar1;
610  std::vector<double>* p_inputDpar1 = &inputDpar1;
611 
612  TTree* refTree = (TTree*)inputRootFile1_->Get(inputTreenameDeform_.c_str());
613  refTree->SetBranchAddress("irawid", &inputRawid1);
614  refTree->SetBranchAddress("subdetid", &inputSubdetid1);
615  refTree->SetBranchAddress("dtype", &inputDtype1);
616  refTree->SetBranchAddress("dpar", &p_inputDpar1);
617  unsigned int nEntries11 = refTree->GetEntries();
618 
619  for (unsigned int iEntry = 0; iEntry < nEntries11; ++iEntry) {
620  refTree->GetEntry(iEntry);
621  for (int ii = 0; ii < 12; ++ii) {
622  surfDeform_[ii] = -1.0;
623  }
624  for (int npar = 0; npar < int(inputDpar1.size()); ++npar) {
625  surfDeform_[npar] = -inputDpar1.at(npar);
626  std::stringstream histname0;
627  histname0 << "SurfDeform_Par_" << npar;
628  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
629  m_h1_[histname0.str()]->Fill(surfDeform_[npar]);
630  if (inputSubdetid1 == 1) {
631  std::stringstream histname1;
632  histname1 << "SurfDeform_PixelBarrel_Par_" << npar;
633  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
634  m_h1_[histname1.str()]->Fill(surfDeform_[npar]);
635  }
636  if (inputSubdetid1 == 2) {
637  std::stringstream histname2;
638  histname2 << "SurfDeform_PixelEndcap_Par_" << npar;
639  if (TMath::Abs(surfDeform_[npar]) > (m_rangeHigh_ - m_rangeLow_) / (10. * m_nBins_))
640  m_h1_[histname2.str()]->Fill(surfDeform_[npar]);
641  }
644  (m_vtkmap_.at(npar)).fill_current_val(inputRawid1, surfDeform_[npar]);
645  } else {
646  // old-style tracker map does not support Phase1 Pixel
647  if (inputSubdetid1 != 1 && inputSubdetid1 != 2) {
648  (m_vtkmap_.at(npar)).fill_current_val(inputRawid1, surfDeform_[npar]);
649  }
650  }
651  }
652  }
653  }
654 
655  } else if (inputFilename1_ == "IDEAL" && inputFilename2_ == "IDEAL") {
656  edm::LogInfo("TrackerGeometryCompare") << ">>>> Comparing IDEAL with IDEAL: nothing to do! <<<<\n";
657  }
658  return;
659 }
660 
662  Alignable* curAli,
663  const TrackerTopology* tTopo,
664  const edm::EventSetup& iSetup) {
665  using namespace align;
666 
667  const auto& refComp = refAli->components();
668  const auto& curComp = curAli->components();
669 
670  unsigned int nComp = refComp.size();
671  //only perform for designate levels
672  bool useLevel = false;
673  for (unsigned int i = 0; i < m_theLevels.size(); ++i) {
674  if (refAli->alignableObjectId() == m_theLevels[i])
675  useLevel = true;
676  }
677 
678  //another added level for difference between det and detunit
679  //if ((refAli->alignableObjectId()==2)&&(nComp == 1)) useLevel = false;
680 
681  //coordinate matching, etc etc
682  if (useLevel) {
683  DetId detid(refAli->id());
684 
685  CLHEP::Hep3Vector Rtotal, Wtotal, lRtotal, lWtotal;
686  Rtotal.set(0., 0., 0.);
687  Wtotal.set(0., 0., 0.);
688  lRtotal.set(0., 0., 0.);
689  lWtotal.set(0., 0., 0.);
690 
691  bool converged = false;
692 
694 
695  for (int i = 0; i < 100; i++) {
696  // Get differences between alignments for rotations and translations
697  // both local and global
699 
700  // 'diffAlignables' returns 'refAli - curAli' for translations and 'curAli - refAli' for rotations.
701  // The plan is to unify this at some point, but a simple change of the sign for one of them was postponed
702  // to do some further checks to understand the rotations better
703  //Updated July 2018: as requested the sign in the translations has been changed to match the one in rotations. A test was done to change the diffAlignables function and solve the issue there, but proved quite time consuming. To unify the sign convention in the least amount of time the choice was made to change the sign here.
704  CLHEP::Hep3Vector dR(-diff[0], -diff[1], -diff[2]);
705  CLHEP::Hep3Vector dW(diff[3], diff[4], diff[5]);
706  CLHEP::Hep3Vector dRLocal(-diff[6], -diff[7], -diff[8]);
707  CLHEP::Hep3Vector dWLocal(diff[9], diff[10], diff[11]);
708 
709  // Translations
710  Rtotal += dR;
711  lRtotal += dRLocal;
712 
713  //Rotations
714  CLHEP::HepRotation rot(Wtotal.unit(), Wtotal.mag());
715  CLHEP::HepRotation drot(dW.unit(), dW.mag());
716  rot *= drot;
717  Wtotal.set(rot.axis().x() * rot.delta(), rot.axis().y() * rot.delta(), rot.axis().z() * rot.delta());
718 
719  CLHEP::HepRotation rotLocal(lWtotal.unit(), lWtotal.mag());
720  CLHEP::HepRotation drotLocal(dWLocal.unit(), dWLocal.mag());
721  rotLocal *= drotLocal;
722  lWtotal.set(rotLocal.axis().x() * rotLocal.delta(),
723  rotLocal.axis().y() * rotLocal.delta(),
724  rotLocal.axis().z() * rotLocal.delta());
725 
726  // Move current alignable by shift and check if difference
727  // is smaller than tolerance value
728  // if true, break the loop
729  align::moveAlignable(curAli, diff);
730  float tolerance = 1e-7;
732  align::GlobalVector checkR(check[0], check[1], check[2]);
733  align::GlobalVector checkW(check[3], check[4], check[5]);
734  if ((checkR.mag() < tolerance) && (checkW.mag() < tolerance)) {
735  converged = true;
736  break;
737  }
738  }
739 
740  // give an exception if difference has not fallen below tolerance level
741  // i.e. method has not converged
742  if (!converged) {
743  edm::LogInfo("TrackerGeometryCompare")
744  << "Tolerance Exceeded!(alObjId: " << refAli->alignableObjectId()
745  << ", rawId: " << refAli->geomDetId().rawId() << ", subdetId: " << detid.subdetId() << "): " << diff << check;
746  throw cms::Exception("Tolerance in TrackerGeometryCompare exceeded");
747  }
748  AlgebraicVector TRtot(12);
749  // global
750  TRtot(1) = Rtotal.x();
751  TRtot(2) = Rtotal.y();
752  TRtot(3) = Rtotal.z();
753  TRtot(4) = Wtotal.x();
754  TRtot(5) = Wtotal.y();
755  TRtot(6) = Wtotal.z();
756  // local
757  TRtot(7) = lRtotal.x();
758  TRtot(8) = lRtotal.y();
759  TRtot(9) = lRtotal.z();
760  TRtot(10) = lWtotal.x();
761  TRtot(11) = lWtotal.y();
762  TRtot(12) = lWtotal.z();
763 
764  fillTree(refAli, TRtot, tTopo, iSetup);
765  }
766 
767  // another added level for difference between det and detunit
768  for (unsigned int i = 0; i < nComp; ++i)
769  compareGeometries(refComp[i], curComp[i], tTopo, iSetup);
770 }
771 
773  edm::LogInfo("TrackerGeometryCompare") << "Setting Common Tracker System....";
774 
775  // DM_534??AlignableObjectId dummy;
776  // DM_534??_commonTrackerLevel = dummy.nameToType(_setCommonTrackerSystem);
778 
780 
781  align::EulerAngles dOmega(3);
782  dOmega[0] = TrackerCommonR_.x();
783  dOmega[1] = TrackerCommonR_.y();
784  dOmega[2] = TrackerCommonR_.z();
787 
788  edm::LogInfo("TrackerGeometryCompare") << "what we get from overlaying the pixels..." << theR << ", " << rot;
789 
790  //transform to the Tracker System
792  align::GlobalVector cmDiff(
793  trackerCM.x() - TrackerCommonCM_.x(), trackerCM.y() - TrackerCommonCM_.y(), trackerCM.z() - TrackerCommonCM_.z());
794 
795  edm::LogInfo("TrackerGeometryCompare") << "Pixel CM: " << TrackerCommonCM_ << ", tracker CM: " << trackerCM;
796 
797  //adjust translational difference factoring in different rotational CM
798  //needed because rotateInGlobalFrame is about CM of alignable, not Tracker
799  const align::GlobalVector::BasicVectorType& lpvgf = cmDiff.basicVector();
800  align::GlobalVector moveV(rot.multiplyInverse(lpvgf) - lpvgf);
801  align::GlobalVector theRprime(theR + moveV);
802 
803  AlgebraicVector TrackerCommonTR(6);
804  TrackerCommonTR(1) = theRprime.x();
805  TrackerCommonTR(2) = theRprime.y();
806  TrackerCommonTR(3) = theRprime.z();
807  TrackerCommonTR(4) = TrackerCommonR_.x();
808  TrackerCommonTR(5) = TrackerCommonR_.y();
809  TrackerCommonTR(6) = TrackerCommonR_.z();
810 
811  edm::LogInfo("TrackerGeometryCompare") << "and after the transformation: " << TrackerCommonTR;
812  align::moveAlignable(currentTracker, TrackerCommonTR);
813 }
814 
816  const auto& refComp = refAli->components();
817  const auto& curComp = curAli->components();
818  unsigned int nComp = refComp.size();
819  //only perform for designate levels
820  bool useLevel = false;
821  if (refAli->alignableObjectId() == commonTrackerLevel_)
822  useLevel = true;
823 
824  //useLevel = false;
825  if (useLevel) {
826  CLHEP::Hep3Vector Rtotal, Wtotal;
827  Rtotal.set(0., 0., 0.);
828  Wtotal.set(0., 0., 0.);
829 
831  CLHEP::Hep3Vector dR(diff[0], diff[1], diff[2]);
832  Rtotal += dR;
833  CLHEP::Hep3Vector dW(diff[3], diff[4], diff[5]);
834  CLHEP::HepRotation rot(Wtotal.unit(), Wtotal.mag());
835  CLHEP::HepRotation drot(dW.unit(), dW.mag());
836  rot *= drot;
837  Wtotal.set(rot.axis().x() * rot.delta(), rot.axis().y() * rot.delta(), rot.axis().z() * rot.delta());
838 
839  TrackerCommonT_ = align::GlobalVector(Rtotal.x(), Rtotal.y(), Rtotal.z());
840  TrackerCommonR_ = align::GlobalVector(Wtotal.x(), Wtotal.y(), Wtotal.z());
841  TrackerCommonCM_ = curAli->globalPosition();
842 
843  } else {
844  for (unsigned int i = 0; i < nComp; ++i)
845  diffCommonTrackerSystem(refComp[i], curComp[i]);
846  }
847 }
848 
850  const AlgebraicVector& diff,
851  const TrackerTopology* tTopo,
852  const edm::EventSetup& iSetup) {
853  //Get bad modules
854  const SiPixelQuality* SiPixelModules = &iSetup.getData(pixQualityToken_);
855  const SiStripQuality* SiStripModules = &iSetup.getData(stripQualityToken_);
856 
857  id_ = refAli->id();
858 
859  badModuleQuality_ = 0;
860  //check if module has a bad quality tag
861  if (SiPixelModules->IsModuleBad(id_)) {
862  badModuleQuality_ = 1;
863  }
864  if (SiStripModules->IsModuleBad(id_)) {
865  badModuleQuality_ = 1;
866  }
867 
868  //check if module is in a given list of bad/untouched etc. modules
869  inModuleList_ = 0;
870  for (unsigned int i = 0; i < moduleList_.size(); i++) {
871  if (moduleList_[i] == id_) {
872  inModuleList_ = 1;
873  break;
874  }
875  }
876 
877  level_ = refAli->alignableObjectId();
878  //need if ali has no mother
879  if (refAli->mother()) {
880  mid_ = refAli->mother()->geomDetId().rawId();
881  mlevel_ = refAli->mother()->alignableObjectId();
882  } else {
883  mid_ = -1;
884  mlevel_ = -1;
885  }
886  DetId detid(id_);
887  sublevel_ = detid.subdetId();
888  fillIdentifiers(sublevel_, id_, tTopo);
889  xVal_ = refAli->globalPosition().x();
890  yVal_ = refAli->globalPosition().y();
891  zVal_ = refAli->globalPosition().z();
893  rVal_ = vec.perp();
894  phiVal_ = vec.phi();
895  etaVal_ = vec.eta();
897  align::EulerAngles eulerAngles = align::toAngles(rot);
898  alphaVal_ = eulerAngles[0];
899  betaVal_ = eulerAngles[1];
900  gammaVal_ = eulerAngles[2];
901  // global
902  dxVal_ = diff[0];
903  dyVal_ = diff[1];
904  dzVal_ = diff[2];
905  // local
906  duVal_ = diff[6];
907  dvVal_ = diff[7];
908  dwVal_ = diff[8];
909  //...TODO...
911  //getting dR and dPhi
914  drVal_ = vCur.perp() - vRef.perp();
915  dphiVal_ = vCur.phi() - vRef.phi();
916  // global
917  dalphaVal_ = diff[3];
918  dbetaVal_ = diff[4];
919  dgammaVal_ = diff[5];
920  // local
921  daVal_ = diff[9];
922  dbVal_ = diff[10];
923  dgVal_ = diff[11];
924  //detIdFlag
925  if (refAli->alignableObjectId() == align::AlignableDetUnit) {
926  if (detIdFlag_) {
927  if ((passIdCut(refAli->id())) || (passIdCut(refAli->mother()->id()))) {
928  useDetId_ = 1;
929  } else {
930  useDetId_ = 0;
931  }
932  }
933  }
934  // det module dimension
935  if (refAli->alignableObjectId() == align::AlignableDetUnit) {
936  if (refAli->mother()->alignableObjectId() != align::AlignableDet)
937  detDim_ = 1;
938  else if (refAli->mother()->alignableObjectId() == align::AlignableDet)
939  detDim_ = 2;
940  } else
941  detDim_ = 0;
942 
943  surWidth_ = refAli->surface().width();
944  surLength_ = refAli->surface().length();
946  surRot_[0] = rt.xx();
947  surRot_[1] = rt.xy();
948  surRot_[2] = rt.xz();
949  surRot_[3] = rt.yx();
950  surRot_[4] = rt.yy();
951  surRot_[5] = rt.yz();
952  surRot_[6] = rt.zx();
953  surRot_[7] = rt.zy();
954  surRot_[8] = rt.zz();
955 
956  //Fill
957  alignTree_->Fill();
958 }
959 
961  Alignments* alignVals,
962  AlignmentErrorsExtended* alignErrors) {
963  //getting the right alignables for the alignment record
964  auto detPB = ali->pixelHalfBarrelGeomDets();
965  auto detPEC = ali->pixelEndcapGeomDets();
966  auto detTIB = ali->innerBarrelGeomDets();
967  auto detTID = ali->TIDGeomDets();
968  auto detTOB = ali->outerBarrelGeomDets();
969  auto detTEC = ali->endcapGeomDets();
970 
971  align::Alignables allGeomDets;
972  std::copy(detPB.begin(), detPB.end(), std::back_inserter(allGeomDets));
973  std::copy(detPEC.begin(), detPEC.end(), std::back_inserter(allGeomDets));
974  std::copy(detTIB.begin(), detTIB.end(), std::back_inserter(allGeomDets));
975  std::copy(detTID.begin(), detTID.end(), std::back_inserter(allGeomDets));
976  std::copy(detTOB.begin(), detTOB.end(), std::back_inserter(allGeomDets));
977  std::copy(detTEC.begin(), detTEC.end(), std::back_inserter(allGeomDets));
978 
979  align::Alignables rcdAlis;
980  for (const auto& i : allGeomDets) {
981  if (i->components().size() == 1) {
982  rcdAlis.push_back(i);
983  } else if (i->components().size() > 1) {
984  rcdAlis.push_back(i);
985  const auto& comp = i->components();
986  for (const auto& j : comp)
987  rcdAlis.push_back(j);
988  }
989  }
990 
991  //turning them into alignments
992  for (const auto& k : rcdAlis) {
993  const SurveyDet* surveyInfo = k->survey();
994  const align::PositionType& pos(surveyInfo->position());
995  align::RotationType rot(surveyInfo->rotation());
996  CLHEP::Hep3Vector clhepVector(pos.x(), pos.y(), pos.z());
997  CLHEP::HepRotation clhepRotation(
998  CLHEP::HepRep3x3(rot.xx(), rot.xy(), rot.xz(), rot.yx(), rot.yy(), rot.yz(), rot.zx(), rot.zy(), rot.zz()));
999  AlignTransform transform(clhepVector, clhepRotation, k->id());
1000  AlignTransformErrorExtended transformError(CLHEP::HepSymMatrix(3, 1), k->id());
1001  alignVals->m_align.push_back(transform);
1002  alignErrors->m_alignError.push_back(transformError);
1003  }
1004 
1005  // to get the right order, sort by rawId
1006  std::sort(alignVals->m_align.begin(), alignVals->m_align.end());
1007  std::sort(alignErrors->m_alignError.begin(), alignErrors->m_alignError.end());
1008 }
1009 
1011  const auto& comp = ali->components();
1012 
1013  unsigned int nComp = comp.size();
1014 
1015  for (unsigned int i = 0; i < nComp; ++i)
1016  addSurveyInfo(comp[i]);
1017 
1019 
1020  if (ali->geomDetId().rawId() != error.rawId() || ali->alignableObjectId() != error.structureType()) {
1021  throw cms::Exception("DatabaseError") << "Error reading survey info from DB. Mismatched id!";
1022  }
1023 
1024  const CLHEP::Hep3Vector& pos = theSurveyValues->m_align[theSurveyIndex].translation();
1025  const CLHEP::HepRotation& rot = theSurveyValues->m_align[theSurveyIndex].rotation();
1026 
1027  AlignableSurface surf(
1028  align::PositionType(pos.x(), pos.y(), pos.z()),
1029  align::RotationType(rot.xx(), rot.xy(), rot.xz(), rot.yx(), rot.yy(), rot.yz(), rot.zx(), rot.zy(), rot.zz()));
1030 
1031  surf.setWidth(ali->surface().width());
1032  surf.setLength(ali->surface().length());
1033 
1034  ali->setSurvey(new SurveyDet(surf, error.matrix()));
1035 
1036  ++theSurveyIndex;
1037 }
1038 
1040  bool pass = false;
1041  int nEntries = detIdFlagVector_.size();
1042 
1043  for (int i = 0; i < nEntries; i++) {
1044  if (detIdFlagVector_[i] == id)
1045  pass = true;
1046  }
1047 
1048  return pass;
1049 }
1050 
1051 void TrackerGeometryCompare::fillIdentifiers(int subdetlevel, int rawid, const TrackerTopology* tTopo) {
1052  switch (subdetlevel) {
1053  case 1: {
1054  identifiers_[0] = tTopo->pxbModule(rawid);
1055  identifiers_[1] = tTopo->pxbLadder(rawid);
1056  identifiers_[2] = tTopo->pxbLayer(rawid);
1057  identifiers_[3] = 999;
1058  identifiers_[4] = 999;
1059  identifiers_[5] = 999;
1060  break;
1061  }
1062  case 2: {
1063  identifiers_[0] = tTopo->pxfModule(rawid);
1064  identifiers_[1] = tTopo->pxfPanel(rawid);
1065  identifiers_[2] = tTopo->pxfBlade(rawid);
1066  identifiers_[3] = tTopo->pxfDisk(rawid);
1067  identifiers_[4] = tTopo->pxfSide(rawid);
1068  identifiers_[5] = 999;
1069  break;
1070  }
1071  case 3: {
1072  identifiers_[0] = tTopo->tibModule(rawid);
1073  identifiers_[1] = tTopo->tibStringInfo(rawid)[0];
1074  identifiers_[2] = tTopo->tibStringInfo(rawid)[1];
1075  identifiers_[3] = tTopo->tibStringInfo(rawid)[2];
1076  identifiers_[4] = tTopo->tibLayer(rawid);
1077  identifiers_[5] = 999;
1078  break;
1079  }
1080  case 4: {
1081  identifiers_[0] = tTopo->tidModuleInfo(rawid)[0];
1082  identifiers_[1] = tTopo->tidModuleInfo(rawid)[1];
1083  identifiers_[2] = tTopo->tidRing(rawid);
1084  identifiers_[3] = tTopo->tidWheel(rawid);
1085  identifiers_[4] = tTopo->tidSide(rawid);
1086  identifiers_[5] = 999;
1087  break;
1088  }
1089  case 5: {
1090  identifiers_[0] = tTopo->tobModule(rawid);
1091  identifiers_[1] = tTopo->tobRodInfo(rawid)[0];
1092  identifiers_[2] = tTopo->tobRodInfo(rawid)[1];
1093  identifiers_[3] = tTopo->tobLayer(rawid);
1094  identifiers_[4] = 999;
1095  identifiers_[5] = 999;
1096  break;
1097  }
1098  case 6: {
1099  identifiers_[0] = tTopo->tecModule(rawid);
1100  identifiers_[1] = tTopo->tecRing(rawid);
1101  identifiers_[2] = tTopo->tecPetalInfo(rawid)[0];
1102  identifiers_[3] = tTopo->tecPetalInfo(rawid)[1];
1103  identifiers_[4] = tTopo->tecWheel(rawid);
1104  identifiers_[5] = tTopo->tecSide(rawid);
1105  break;
1106  }
1107  default: {
1108  edm::LogInfo("TrackerGeometryCompare") << "Error: bad subdetid!!";
1109  break;
1110  }
1111  }
1112 }
1113 
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Alignables & pixelHalfBarrelGeomDets()
Return pixel barrel GeomDets.
unsigned int tobLayer(const DetId &id) const
unsigned int pxbLayer(const DetId &id) const
const edm::ESGetToken< PTrackerParameters, PTrackerParametersRcd > ptpToken_
Alignable * mother() const
Return pointer to container alignable (if any)
Definition: Alignable.h:91
T perp() const
Definition: PV3DBase.h:69
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
align::GlobalVector TrackerCommonR_
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
Definition: Alignable.h:132
std::vector< unsigned int > tidModuleInfo(const DetId &id) const
Alignments * alignments() const override
Return alignments, sorted by DetId.
Vector3DBase< Scalar, GlobalTag > GlobalVector
Definition: Definitions.h:31
void compareGeometries(Alignable *refAli, Alignable *curAli, const TrackerTopology *tTopo, const edm::EventSetup &iSetup)
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
unsigned int pxfBlade(const DetId &id) const
Class to update a given geometry with a set of alignments.
T z() const
Definition: PV3DBase.h:61
unsigned int tibModule(const DetId &id) const
unsigned int tidSide(const DetId &id) const
std::vector< align::StructureType > m_theLevels
const double tolerance
const std::vector< std::string > levelStrings_
const Alignments * theSurveyValues
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
TrackerGeometry * build(const GeometricDet *gd, const PTrackerAdditionalParametersPerDet *ptitp, const PTrackerParameters &ptp, const TrackerTopology *tTopo)
unsigned int pxfModule(const DetId &id) const
void addSurveyInfo(Alignable *ali)
std::vector< unsigned int > tecPetalInfo(const DetId &id) const
unsigned int tidWheel(const DetId &id) const
unsigned int tecWheel(const DetId &id) const
T eta() const
Definition: PV3DBase.h:73
const edm::ESGetToken< PTrackerAdditionalParametersPerDet, PTrackerAdditionalParametersPerDetRcd > ptitpToken_
bool IsModuleBad(uint32_t detid) const
AlgebraicVector diffAlignables(Alignable *refAli, Alignable *curAli, const std::string &weightBy, bool weightById, const std::vector< unsigned int > &weightByIdVector)
Definition: AlignTools.cc:10
align::Scalar width() const
std::vector< TrackerMap > m_vtkmap_
void diffCommonTrackerSystem(Alignable *refAli, Alignable *curAli)
bool IsModuleBad(const uint32_t &detid) const
const edm::ESGetToken< GeometricDet, IdealGeometryRecord > geomDetToken_
void setWidth(align::Scalar width)
unsigned int pxbLadder(const DetId &id) const
Log< level::Error, false > LogError
const Alignables & deepComponents() const
Definition: Alignable.h:72
std::map< std::string, TH1D * > m_h1_
std::vector< int > moduleList_
std::vector< AlignTransform > m_align
Definition: Alignments.h:19
unsigned int tecRing(const DetId &id) const
ring id
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
const edm::ESGetToken< SiStripQuality, SiStripQualityRcd > stripQualityToken_
void applyAlignments(const C *geometry, const Alignments *alignments, const AlignmentErrorsExtended *alignmentErrors, const AlignTransform &globalCoordinates)
void setLength(align::Scalar length)
T * make(const Args &...args) const
make new ROOT object
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
unsigned int tecModule(const DetId &id) const
std::vector< uint32_t > detIdFlagVector_
const PositionType & globalPosition() const
Return the global position of the object.
Definition: Alignable.h:135
const align::RotationType & rotation() const
Definition: SurveyDet.h:60
Alignables & innerBarrelGeomDets()
Return inner barrel GeomDets.
unsigned int tecSide(const DetId &id) const
bool isThere(GeomDetEnumerators::SubDetector subdet) const
const edm::ESGetToken< DDCompactView, IdealGeometryRecord > cpvTokenDDD_
std::vector< unsigned int > weightByIdVector_
Alignables & TIDGeomDets()
Return TID GeomDets.
T mag() const
Definition: PV3DBase.h:64
unsigned int pxfDisk(const DetId &id) const
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
Hash writeOneIOV(const T &payload, Time_t time, const std::string &recordName)
void beginJob() override
Read from DB and print survey info.
void analyze(const edm::Event &, const edm::EventSetup &) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
TrackerGeometryCompare(const edm::ParameterSet &)
Do nothing. Required by framework.
const align::PositionType & position() const
Definition: SurveyDet.h:58
align::GlobalVector TrackerCommonT_
EulerAngles toAngles(const RotationType &)
Convert rotation matrix to angles about x-, y-, z-axes (frame rotation).
Definition: Utilities.cc:8
virtual const Alignables & components() const =0
Return vector of all direct components.
Alignables & endcapGeomDets()
Return endcap GeomDets.
Alignables & pixelEndcapGeomDets()
Return pixel endcap GeomDets.
void fillTree(Alignable *refAli, const AlgebraicVector &diff, const TrackerTopology *tTopo, const edm::EventSetup &iSetup)
ii
Definition: cuy.py:589
unsigned int pxfPanel(const DetId &id) const
Log< level::Info, false > LogInfo
Definition: DetId.h:17
CLHEP::HepVector AlgebraicVector
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:180
unsigned int pxfSide(const DetId &id) const
AlgebraicVector EulerAngles
Definition: Definitions.h:34
std::vector< unsigned int > tibStringInfo(const DetId &id) const
Alignables & outerBarrelGeomDets()
Return outer barrel GeomDets.
AlignableTracker * currentTracker
void surveyToTracker(AlignableTracker *ali, Alignments *alignVals, AlignmentErrorsExtended *alignErrors)
std::vector< AlignTransformErrorExtended > m_alignError
const DetId & geomDetId() const
Definition: Alignable.h:177
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
void setSurvey(const SurveyDet *)
Set survey info.
Definition: Alignable.cc:266
const edm::ESGetToken< cms::DDCompactView, IdealGeometryRecord > cpvTokenDD4hep_
align::Scalar length() const
align::StructureType commonTrackerLevel_
void fillIdentifiers(int subdetlevel, int rawid, const TrackerTopology *tTopo)
AlignmentErrorsExtended * alignmentErrors() const override
Return alignment errors, sorted by DetId.
std::vector< Alignable * > Alignables
Definition: Utilities.h:31
align::StructureType stringToId(const char *) const
AlignableTracker * referenceTracker
std::vector< unsigned int > tobRodInfo(const DetId &id) const
void createROOTGeometry(const edm::EventSetup &iSetup)
align::PositionType TrackerCommonCM_
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
Definition: Utilities.cc:34
ESTransientHandle< T > getTransientHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:141
const AlignableObjectId & objectIdProvider() const
Return tracker alignable object ID provider derived from the tracker&#39;s geometry.
unsigned int tidRing(const DetId &id) const
const SurveyErrors * theSurveyErrors
const RotationType & globalRotation() const
Return the global orientation of the object.
Definition: Alignable.h:138
bool isAvailable() const
Definition: Service.h:40
unsigned int tibLayer(const DetId &id) const
unsigned int tobModule(const DetId &id) const
unsigned int pxbModule(const DetId &id) const
std::vector< SurveyError > m_surveyErrors
Definition: SurveyErrors.h:22
void moveAlignable(Alignable *ali, AlgebraicVector diff)
Moves the alignable by the AlgebraicVector.
Definition: AlignTools.cc:84
SurfaceDeformation * create(int type, const std::vector< double > &params)
void compareSurfaceDeformations(TTree *_inputTree11, TTree *_inputTree12)
const edm::ESGetToken< SiPixelQuality, SiPixelQualityRcd > pixQualityToken_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
unsigned transform(const HcalDetId &id, unsigned transformCode)