CMS 3D CMS Logo

AlignmentProducerBase.cc
Go to the documentation of this file.
2 
14 
16 
21 
25 
32 
33 //------------------------------------------------------------------------------
35  : doTracker_{config.getUntrackedParameter<bool>("doTracker")},
36  doMuon_{config.getUntrackedParameter<bool>("doMuon")},
37  useExtras_{config.getUntrackedParameter<bool>("useExtras")},
38  tjTkAssociationMapTag_{config.getParameter<edm::InputTag>("tjTkAssociationMapTag")},
39  beamSpotTag_{config.getParameter<edm::InputTag>("beamSpotTag")},
40  tkLasBeamTag_{config.getParameter<edm::InputTag>("tkLasBeamTag")},
41  clusterValueMapTag_{config.getParameter<edm::InputTag>("hitPrescaleMapTag")},
42  uniqueRunRanges_{align::makeUniqueRunRanges(config.getParameter<edm::VParameterSet>("RunRangeSelection"),
44  config_{config},
45  stNFixAlignables_{config.getParameter<int>("nFixAlignables")},
46  stRandomShift_{config.getParameter<double>("randomShift")},
47  stRandomRotation_{config.getParameter<double>("randomRotation")},
48  applyDbAlignment_{config.getUntrackedParameter<bool>("applyDbAlignment")},
49  checkDbAlignmentValidity_{config.getUntrackedParameter<bool>("checkDbAlignmentValidity")},
50  doMisalignmentScenario_{config.getParameter<bool>("doMisalignmentScenario")},
51  saveToDB_{config.getParameter<bool>("saveToDB")},
52  saveApeToDB_{config.getParameter<bool>("saveApeToDB")},
53  saveDeformationsToDB_{config.getParameter<bool>("saveDeformationsToDB")},
54  useSurvey_{config.getParameter<bool>("useSurvey")},
55  enableAlignableUpdates_{config.getParameter<bool>("enableAlignableUpdates")} {
56  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::AlignmentProducerBase";
57 
58  const auto& algoConfig = config_.getParameterSet("algoConfig");
59  if (hasParameter<bool>(config_, "runAtPCL")) {
60  // configured in main config?
61  runAtPCL_ = config_.getParameter<bool>("runAtPCL");
62 
63  if (hasParameter<bool>(algoConfig, "runAtPCL") && (runAtPCL_ != algoConfig.getParameter<bool>("runAtPCL"))) {
64  throw cms::Exception("BadConfig") << "Inconsistent settings for 'runAtPCL' in configuration of the "
65  << "alignment producer and the alignment algorithm.";
66  }
67 
68  } else if (hasParameter<bool>(algoConfig, "runAtPCL")) {
69  // configured in algo config?
70  runAtPCL_ = algoConfig.getParameter<bool>("runAtPCL");
71 
72  } else {
73  // assume 'false' if it was not configured
74  runAtPCL_ = false;
75  }
76 
80 }
81 
82 //------------------------------------------------------------------------------
84  for (auto& iCal : calibrations_)
85  delete iCal;
86 
88  delete alignableExtras_;
89  delete alignableTracker_;
90  delete alignableMuon_;
91 }
92 
93 //------------------------------------------------------------------------------
95  if (isDuringLoop_)
96  return;
97 
98  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::startProcessing"
99  << "Begin";
100 
101  if (!isAlgoInitialized_) {
102  throw cms::Exception("LogicError") << "@SUB=AlignmentProducerBase::startProcessing\n"
103  << "Trying to start event processing before initializing the alignment "
104  << "algorithm.";
105  }
106 
107  nevent_ = 0;
108 
109  alignmentAlgo_->startNewLoop();
110 
111  // FIXME: Should this be done in algorithm::startNewLoop()??
112  for (const auto& iCal : calibrations_)
113  iCal->startNewLoop();
114  for (const auto& monitor : monitors_)
115  monitor->startingNewLoop();
116 
118  isDuringLoop_ = true;
119 }
120 
121 //------------------------------------------------------------------------------
123  if (!isDuringLoop_)
124  return;
125 
126  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::terminateProcessing"
127  << "Terminating algorithm.";
128  if (setup) {
129  alignmentAlgo_->terminate(*setup);
130  } else {
131  alignmentAlgo_->terminate();
132  }
133 
134  // FIXME: Should this be done in algorithm::terminate()??
135  for (const auto& iCal : calibrations_)
136  iCal->endOfLoop();
137  for (const auto& monitor : monitors_)
138  monitor->endOfLoop();
139 
140  isDuringLoop_ = false;
141 }
142 
143 //------------------------------------------------------------------------------
145  if (setupChanged(setup)) {
146  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::processEvent"
147  << "EventSetup-Record changed.";
148 
149  // updatable alignables are currently not used at PCL, but event setup
150  // changes require a complete re-initialization
151  if (runAtPCL_) {
152  initAlignmentAlgorithm(setup, /* update = */ false);
153  } else if (enableAlignableUpdates_) {
154  initAlignmentAlgorithm(setup, /* update = */ true);
155  }
156  }
157 
158  initBeamSpot(event); // must happen every event and before incrementing 'nevent_'
159 
160  ++nevent_; // must happen before the check below;
161  // otherwise subsequent checks fail for "EmptySource"
162 
163  if (!alignmentAlgo_->processesEvents()) {
164  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::processEvent"
165  << "Skipping event. The current configuration of the alignment algorithm "
166  << "does not need to process any events.";
167  return false;
168  }
169 
170  // reading in survey records
171  readInSurveyRcds(setup);
172 
173  // Printout event number
174  for (int i = 10; i < 10000000; i *= 10) {
175  if (nevent_ < 10 * i && (nevent_ % i) == 0) {
176  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::processEvent"
177  << "Events processed: " << nevent_;
178  }
179  }
180 
181  // Retrieve trajectories and tracks from the event
182  // -> merely skip if collection is empty
183  edm::Handle<TrajTrackAssociationCollection> handleTrajTracksCollection;
184 
185  if (getTrajTrackAssociationCollection(event, handleTrajTracksCollection)) {
186  // Form pairs of trajectories and tracks
187  ConstTrajTrackPairs trajTracks;
188  for (auto iter = handleTrajTracksCollection->begin(); iter != handleTrajTracksCollection->end(); ++iter) {
189  trajTracks.push_back(ConstTrajTrackPair(&(*(*iter).key), &(*(*iter).val)));
190  }
191 
192  // Run the alignment algorithm with its input
193  const AliClusterValueMap* clusterValueMapPtr{nullptr};
194  if (!clusterValueMapTag_.encode().empty()) {
195  edm::Handle<AliClusterValueMap> clusterValueMap;
196  getAliClusterValueMap(event, clusterValueMap);
197  clusterValueMapPtr = &(*clusterValueMap);
198  }
199 
200  const AlignmentAlgorithmBase::EventInfo eventInfo{event.id(), trajTracks, *beamSpot_, clusterValueMapPtr};
201  alignmentAlgo_->run(setup, eventInfo);
202 
203  for (const auto& monitor : monitors_) {
204  monitor->duringLoop(event, setup, trajTracks); // forward eventInfo?
205  }
206  } else {
207  edm::LogError("Alignment") << "@SUB=AlignmentProducerBase::processEvent"
208  << "No track collection found: skipping event";
209  }
210 
211  return true;
212 }
213 
214 //------------------------------------------------------------------------------
216  const bool changed{setupChanged(setup)};
217  if (changed) {
218  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::beginRunImpl"
219  << "EventSetup-Record changed.";
220 
221  // updatable alignables are currently not used at PCL, but event setup
222  // changes require a complete re-initialization
223  if (runAtPCL_) {
224  initAlignmentAlgorithm(setup, /* update = */ false);
225  } else if (enableAlignableUpdates_) {
226  initAlignmentAlgorithm(setup, /* update = */ true);
227  }
228  }
229 
230  alignmentAlgo_->beginRun(run, setup, changed && (runAtPCL_ || enableAlignableUpdates_));
231 
232  for (const auto& iCal : calibrations_)
233  iCal->beginRun(run, setup);
234 
235  //store the first run analyzed to be used for setting the IOV (for PCL)
236  if (firstRun_ > static_cast<cond::Time_t>(run.id().run())) {
237  firstRun_ = static_cast<cond::Time_t>(run.id().run());
238  }
239 }
240 
241 //------------------------------------------------------------------------------
243  if (!tkLasBeamTag_.encode().empty()) {
246  getTkFittedLasBeamCollection(run, lasBeams);
247  getTsosVectorCollection(run, tsoses);
248 
249  alignmentAlgo_->endRun(EndRunInfo(run.id(), &(*lasBeams), &(*tsoses)), setup);
250  } else {
251  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::endRunImpl"
252  << "No Tk LAS beams to forward to algorithm.";
253  alignmentAlgo_->endRun(EndRunInfo(run.id(), nullptr, nullptr), setup);
254  }
255 }
256 
257 //------------------------------------------------------------------------------
259  // Do not forward edm::LuminosityBlock
260  alignmentAlgo_->beginLuminosityBlock(setup);
261 }
262 
263 //------------------------------------------------------------------------------
265  // Do not forward edm::LuminosityBlock
266  alignmentAlgo_->endLuminosityBlock(setup);
267 }
268 
269 //------------------------------------------------------------------------------
271  auto algoConfig = config_.getParameter<edm::ParameterSet>("algoConfig");
272  algoConfig.addUntrackedParameter("RunRangeSelection", config_.getParameter<edm::VParameterSet>("RunRangeSelection"));
273  algoConfig.addUntrackedParameter<align::RunNumber>("firstIOV", runAtPCL_ ? 1 : uniqueRunRanges_.front().first);
274  algoConfig.addUntrackedParameter("enableAlignableUpdates", enableAlignableUpdates_);
275 
276  const auto& algoName = algoConfig.getParameter<std::string>("algoName");
278  std::unique_ptr<AlignmentAlgorithmBase>{AlignmentAlgorithmPluginFactory::get()->create(algoName, algoConfig)};
279 
280  if (!alignmentAlgo_) {
281  throw cms::Exception("BadConfig") << "Couldn't find the called alignment algorithm: " << algoName;
282  }
283 }
284 
285 //------------------------------------------------------------------------------
287  const auto& monitorConfig = config_.getParameter<edm::ParameterSet>("monitorConfig");
288  auto monitors = monitorConfig.getUntrackedParameter<std::vector<std::string> >("monitors");
289  for (const auto& miter : monitors) {
290  std::unique_ptr<AlignmentMonitorBase> newMonitor{
291  AlignmentMonitorPluginFactory::get()->create(miter, monitorConfig.getUntrackedParameterSet(miter))};
292 
293  if (!newMonitor) {
294  throw cms::Exception("BadConfig") << "Couldn't find monitor named " << miter;
295  }
296  monitors_.emplace_back(std::move(newMonitor));
297  }
298 }
299 
300 //------------------------------------------------------------------------------
302  const auto& calibrations = config_.getParameter<edm::VParameterSet>("calibrations");
303  for (const auto& iCalib : calibrations) {
304  calibrations_.push_back(
305  IntegratedCalibrationPluginFactory::get()->create(iCalib.getParameter<std::string>("calibrationName"), iCalib));
306  }
307 }
308 
309 //------------------------------------------------------------------------------
311  bool changed{false};
312 
313  if (watchIdealGeometryRcd_.check(setup)) {
314  changed = true;
315  }
316 
317  if (watchGlobalPositionRcd_.check(setup)) {
318  changed = true;
319  }
320 
321  if (doTracker_) {
322  if (watchTrackerAlRcd_.check(setup)) {
323  changed = true;
324  }
325 
326  if (watchTrackerAlErrorExtRcd_.check(setup)) {
327  changed = true;
328  }
329 
330  if (watchTrackerSurDeRcd_.check(setup)) {
331  changed = true;
332  }
333  }
334 
335  if (doMuon_) {
336  if (watchDTAlRcd_.check(setup)) {
337  changed = true;
338  }
339 
340  if (watchDTAlErrExtRcd_.check(setup)) {
341  changed = true;
342  }
343 
344  if (watchCSCAlRcd_.check(setup)) {
345  changed = true;
346  }
347 
348  if (watchCSCAlErrExtRcd_.check(setup)) {
349  changed = true;
350  }
351  }
352 
353  /* TODO: ExtraAlignables: Which record(s) to check?
354  *
355  if (useExtras_) {}
356  */
357 
358  return changed;
359 }
360 
361 //------------------------------------------------------------------------------
363  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::initAlignmentAlgorithm"
364  << "Begin";
365 
366  auto isTrueUpdate = update && isAlgoInitialized_;
367 
368  // Retrieve tracker topology from geometry
369  edm::ESHandle<TrackerTopology> tTopoHandle;
370  setup.get<TrackerTopologyRcd>().get(tTopoHandle);
371  const TrackerTopology* const tTopo = tTopoHandle.product();
372 
373  // Create the geometries from the ideal geometries
374  createGeometries(setup, tTopo);
375 
376  applyAlignmentsToDB(setup);
377  createAlignables(tTopo, isTrueUpdate);
380 
381  // Initialize alignment algorithm and integrated calibration and pass the
382  // latter to algorithm
383  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::initAlignmentAlgorithm"
384  << "Initializing alignment algorithm.";
386 
387  // Not all algorithms support calibrations - so do not pass empty vector
388  // and throw if non-empty and not supported:
389  if (!calibrations_.empty()) {
390  if (alignmentAlgo_->supportsCalibrations()) {
391  alignmentAlgo_->addCalibrations(calibrations_);
392  } else {
393  throw cms::Exception("BadConfig") << "@SUB=AlignmentProducerBase::createCalibrations\n"
394  << "Configured " << calibrations_.size() << " calibration(s) "
395  << "for algorithm not supporting it.";
396  }
397  }
398 
399  isAlgoInitialized_ = true;
400 
402 
403  if (!isTrueUpdate) { // only needed the first time
404  for (const auto& iCal : calibrations_) {
406  }
407  for (const auto& monitor : monitors_) {
409  }
410  }
411  startProcessing(); // needed if derived class is non-EDLooper-based
412  // has no effect, if called during loop
413 
414  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::initAlignmentAlgorithm"
415  << "End";
416 }
417 
418 //------------------------------------------------------------------------------
420  getBeamSpot(event, beamSpot_);
421 
422  if (nevent_ == 0 && alignableExtras_) {
423  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::initBeamSpot"
424  << "Initializing AlignableBeamSpot";
425 
428  }
429 }
430 
431 //------------------------------------------------------------------------------
433  if (doTracker_) {
434  edm::ESHandle<GeometricDet> geometricDet;
435  iSetup.get<IdealGeometryRecord>().get(geometricDet);
436 
438  iSetup.get<PTrackerParametersRcd>().get(ptp);
439 
440  TrackerGeomBuilderFromGeometricDet trackerBuilder;
441 
442  trackerGeometry_ = std::shared_ptr<TrackerGeometry>(trackerBuilder.build(&(*geometricDet), *ptp, tTopo));
443  }
444 
445  if (doMuon_) {
447  iSetup.get<IdealGeometryRecord>().get(cpv);
449  iSetup.get<MuonNumberingRecord>().get(mdc);
452  muonDTGeometry_ = std::make_shared<DTGeometry>();
453  DTGeometryBuilder.build(*muonDTGeometry_, &(*cpv), *mdc);
454  muonCSCGeometry_ = std::make_shared<CSCGeometry>();
455  CSCGeometryBuilder.build(*muonCSCGeometry_, &(*cpv), *mdc);
456  }
457 }
458 
459 //------------------------------------------------------------------------------
461  // Retrieve and apply alignments, if requested (requires z setup)
462  if (applyDbAlignment_) {
463  // we need GlobalPositionRcd - and have to keep track for later removal
464  // before writing again to DB...
465 
466  edm::ESHandle<Alignments> globalAlignments;
467  setup.get<GlobalPositionRcd>().get(globalAlignments);
468  globalPositions_ = std::make_unique<Alignments>(*globalAlignments);
469 
470  if (doTracker_) {
471  applyDB<TrackerGeometry, TrackerAlignmentRcd, TrackerAlignmentErrorExtendedRcd>(
473 
474  applyDB<TrackerGeometry, TrackerSurfaceDeformationRcd>(trackerGeometry_.get(), setup);
475  }
476 
477  if (doMuon_) {
478  applyDB<DTGeometry, DTAlignmentRcd, DTAlignmentErrorExtendedRcd>(
480 
481  applyDB<CSCGeometry, CSCAlignmentRcd, CSCAlignmentErrorExtendedRcd>(
483  }
484  }
485 }
486 
487 //------------------------------------------------------------------------------
489  if (doTracker_) {
490  if (update) {
492  } else {
494  }
495  }
496 
497  if (doMuon_) {
498  if (update) {
500  } else {
502  }
503  }
504 
505  if (useExtras_) {
506  if (update) {
507  // FIXME: Requires further code changes to track beam spot condition changes
508  } else {
510  }
511  }
512 }
513 
514 //------------------------------------------------------------------------------
516  // Create alignment parameter builder
517  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::buildParameterStore"
518  << "Creating AlignmentParameterBuilder";
519 
520  const auto& alParamBuildCfg = config_.getParameter<edm::ParameterSet>("ParameterBuilder");
521  const auto& alParamStoreCfg = config_.getParameter<edm::ParameterSet>("ParameterStore");
522 
523  AlignmentParameterBuilder alignmentParameterBuilder{
525 
526  // Fix alignables if requested
527  if (stNFixAlignables_ > 0) {
528  alignmentParameterBuilder.fixAlignables(stNFixAlignables_);
529  }
530 
531  // Get list of alignables
532  const auto& alignables = alignmentParameterBuilder.alignables();
533  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::buildParameterStore"
534  << "got " << alignables.size() << " alignables";
535 
536  // Create AlignmentParameterStore
537  alignmentParameterStore_ = new AlignmentParameterStore(alignables, alParamStoreCfg);
538  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::buildParameterStore"
539  << "AlignmentParameterStore created!";
540 }
541 
542 //------------------------------------------------------------------------------
544  // Apply misalignment scenario to alignable tracker and muon if requested
545  // WARNING: this assumes scenarioConfig can be passed to both muon and tracker
546 
548  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::applyMisalignment"
549  << "Applying misalignment scenario to " << (doTracker_ ? "tracker" : "")
550  << (doMuon_ ? (doTracker_ ? " and muon" : "muon") : ".");
551 
552  const auto& scenarioConfig = config_.getParameterSet("MisalignmentScenario");
553 
554  if (doTracker_) {
555  TrackerScenarioBuilder scenarioBuilder(alignableTracker_);
556  scenarioBuilder.applyScenario(scenarioConfig);
557  }
558  if (doMuon_) {
559  MuonScenarioBuilder muonScenarioBuilder(alignableMuon_);
560  muonScenarioBuilder.applyScenario(scenarioConfig);
561  }
562 
563  } else {
564  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::applyMisalignment"
565  << "NOT applying misalignment scenario!";
566  }
567 
568  // Apply simple misalignment
569  const auto& sParSel = config_.getParameter<std::string>("parameterSelectorSimple");
571 }
572 
573 // ----------------------------------------------------------------------------
575  const align::Alignables& alivec, const std::string& selection, float shift, float rot, bool local) {
576  std::ostringstream output; // collecting output
577 
578  if (shift > 0. || rot > 0.) {
579  output << "Adding random flat shift of max size " << shift << " and adding random flat rotation of max size " << rot
580  << " to ";
581 
582  std::vector<bool> commSel(0);
583  if (selection != "-1") {
584  AlignmentParameterSelector aSelector(nullptr, nullptr); // no alignable needed here...
585  const std::vector<char> cSel(aSelector.convertParamSel(selection));
586  if (cSel.size() < RigidBodyAlignmentParameters::N_PARAM) {
587  throw cms::Exception("BadConfig")
588  << "[AlignmentProducerBase::simpleMisalignment_]\n"
589  << "Expect selection string '" << selection << "' to be at least of length "
590  << RigidBodyAlignmentParameters::N_PARAM << " or to be '-1'.\n"
591  << "(Most probably you have to adjust the parameter 'parameterSelectorSimple'.)";
592  }
593  for (const auto& cIter : cSel) {
594  commSel.push_back(cIter == '0' ? false : true);
595  }
596  output << "parameters defined by (" << selection << "), representing (x,y,z,alpha,beta,gamma),";
597  } else {
598  output << "the active parameters of each alignable,";
599  }
600  output << " in " << (local ? "local" : "global") << " frame.";
601 
602  for (const auto& ali : alivec) {
603  std::vector<bool> mysel(commSel.empty() ? ali->alignmentParameters()->selector() : commSel);
604 
605  if (std::abs(shift) > 0.00001) {
606  double s0 = 0., s1 = 0., s2 = 0.;
608  s0 = shift * double(random() % 1000 - 500) / 500.;
610  s1 = shift * double(random() % 1000 - 500) / 500.;
612  s2 = shift * double(random() % 1000 - 500) / 500.;
613 
614  if (local)
615  ali->move(ali->surface().toGlobal(align::LocalVector(s0, s1, s2)));
616  else
617  ali->move(align::GlobalVector(s0, s1, s2));
618 
619  //AlignmentPositionError ape(dx,dy,dz);
620  //ali->addAlignmentPositionError(ape);
621  }
622 
623  if (std::abs(rot) > 0.00001) {
626  r(1) = rot * double(random() % 1000 - 500) / 500.;
628  r(2) = rot * double(random() % 1000 - 500) / 500.;
630  r(3) = rot * double(random() % 1000 - 500) / 500.;
631 
632  const align::RotationType mrot = align::toMatrix(r);
633  if (local)
634  ali->rotateInLocalFrame(mrot);
635  else
636  ali->rotateInGlobalFrame(mrot);
637 
638  //ali->addAlignmentPositionErrorFromRotation(mrot);
639  }
640  } // end loop on alignables
641  } else {
642  output << "No simple misalignment added!";
643  }
644  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::simpleMisalignment" << output.str();
645 }
646 
647 //------------------------------------------------------------------------------
649  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::applyAlignmentsToGeometry"
650  << "Now physically apply alignments to geometry...";
651 
652  // Propagate changes to reconstruction geometry (from initialisation or iteration)
653  GeometryAligner aligner;
654 
655  if (doTracker_) {
656  if (!alignableTracker_) {
657  throw cms::Exception("LogicError") << "@SUB=AlignmentProducerBase::applyAlignmentsToGeometry\n"
658  << "Trying to apply tracker alignment before creating it.";
659  }
660 
661  std::unique_ptr<Alignments> alignments{alignableTracker_->alignments()};
662  std::unique_ptr<AlignmentErrorsExtended> alignmentErrExt{alignableTracker_->alignmentErrors()};
663  std::unique_ptr<AlignmentSurfaceDeformations> aliDeforms{alignableTracker_->surfaceDeformations()};
664 
665  aligner.applyAlignments(trackerGeometry_.get(), alignments.get(), alignmentErrExt.get(), AlignTransform());
666  aligner.attachSurfaceDeformations(trackerGeometry_.get(), aliDeforms.get());
667  }
668 
669  if (doMuon_) {
670  if (!alignableMuon_) {
671  throw cms::Exception("LogicError") << "@SUB=AlignmentProducerBase::applyAlignmentsToGeometry\n"
672  << "Trying to apply muon alignment before creating it.";
673  }
674 
675  std::unique_ptr<Alignments> dtAlignments{alignableMuon_->dtAlignments()};
676  std::unique_ptr<Alignments> cscAlignments{alignableMuon_->cscAlignments()};
677 
678  std::unique_ptr<AlignmentErrorsExtended> dtAlignmentErrExt{alignableMuon_->dtAlignmentErrorsExtended()};
679  std::unique_ptr<AlignmentErrorsExtended> cscAlignmentErrExt{alignableMuon_->cscAlignmentErrorsExtended()};
680 
681  aligner.applyAlignments(muonDTGeometry_.get(), dtAlignments.get(), dtAlignmentErrExt.get(), AlignTransform());
682  aligner.applyAlignments(muonCSCGeometry_.get(), cscAlignments.get(), cscAlignmentErrExt.get(), AlignTransform());
683  }
684 }
685 
686 //------------------------------------------------------------------------------
688  // Get Survey Rcds and add Survey Info
689  if (doTracker_ && useSurvey_) {
690  bool tkSurveyBool = watchTkSurveyRcd_.check(iSetup);
691  bool tkSurveyErrBool = watchTkSurveyErrExtRcd_.check(iSetup);
692  edm::LogInfo("Alignment") << "watcher tksurveyrcd: " << tkSurveyBool;
693  edm::LogInfo("Alignment") << "watcher tksurveyerrrcd: " << tkSurveyErrBool;
694  if (tkSurveyBool || tkSurveyErrBool) {
695  edm::LogInfo("Alignment") << "ADDING THE SURVEY INFORMATION";
697  edm::ESHandle<SurveyErrors> surveyErrors;
698 
699  iSetup.get<TrackerSurveyRcd>().get(surveys);
700  iSetup.get<TrackerSurveyErrorExtendedRcd>().get(surveyErrors);
701 
702  surveyIndex_ = 0;
703  surveyValues_ = &*surveys;
704  surveyErrors_ = &*surveyErrors;
706  }
707  }
708 
709  if (doMuon_ && useSurvey_) {
710  bool DTSurveyBool = watchTkSurveyRcd_.check(iSetup);
711  bool DTSurveyErrBool = watchTkSurveyErrExtRcd_.check(iSetup);
712  bool CSCSurveyBool = watchTkSurveyRcd_.check(iSetup);
713  bool CSCSurveyErrBool = watchTkSurveyErrExtRcd_.check(iSetup);
714 
715  if (DTSurveyBool || DTSurveyErrBool || CSCSurveyBool || CSCSurveyErrBool) {
716  edm::ESHandle<Alignments> dtSurveys;
717  edm::ESHandle<SurveyErrors> dtSurveyErrors;
718  edm::ESHandle<Alignments> cscSurveys;
719  edm::ESHandle<SurveyErrors> cscSurveyErrors;
720 
721  iSetup.get<DTSurveyRcd>().get(dtSurveys);
722  iSetup.get<DTSurveyErrorExtendedRcd>().get(dtSurveyErrors);
723  iSetup.get<CSCSurveyRcd>().get(cscSurveys);
724  iSetup.get<CSCSurveyErrorExtendedRcd>().get(cscSurveyErrors);
725 
726  surveyIndex_ = 0;
727  surveyValues_ = &*dtSurveys;
728  surveyErrors_ = &*dtSurveyErrors;
729  const auto& barrels = alignableMuon_->DTBarrel();
730  for (const auto& barrel : barrels)
732 
733  surveyIndex_ = 0;
734  surveyValues_ = &*cscSurveys;
735  surveyErrors_ = &*cscSurveyErrors;
736  const auto& endcaps = alignableMuon_->CSCEndcaps();
737  for (const auto& endcap : endcaps)
739  }
740  }
741 }
742 
743 //------------------------------------------------------------------------------
745  const auto& comps = ali->components();
746 
747  for (const auto& comp : comps)
749 
751 
752  if (ali->id() != error.rawId() || ali->alignableObjectId() != error.structureType()) {
753  throw cms::Exception("DatabaseError") << "Error reading survey info from DB. Mismatched id!";
754  }
755 
756  const auto& pos = surveyValues_->m_align[surveyIndex_].translation();
757  const auto& rot = surveyValues_->m_align[surveyIndex_].rotation();
758 
759  AlignableSurface surf(
760  align::PositionType(pos.x(), pos.y(), pos.z()),
761  align::RotationType(rot.xx(), rot.xy(), rot.xz(), rot.yx(), rot.yy(), rot.yz(), rot.zx(), rot.zy(), rot.zz()));
762 
763  surf.setWidth(ali->surface().width());
764  surf.setLength(ali->surface().length());
765 
766  ali->setSurvey(new SurveyDet(surf, error.matrix()));
767 
768  ++surveyIndex_;
769 }
770 
771 //------------------------------------------------------------------------------
773  for (const auto& monitor : monitors_)
774  monitor->endOfJob();
775 
776  if (alignmentAlgo_->processesEvents() && nevent_ == 0) {
777  return false;
778  }
779 
781  if (alignmentAlgo_->storeAlignments())
783  } else {
784  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::finish"
785  << "No payload to be stored!";
786  }
787 
788  // takes care of storing output of calibrations, but needs to be called only
789  // after 'storeAlignmentsToDB()'
790  for (const auto& iCal : calibrations_)
791  iCal->endOfJob();
792 
793  return true;
794 }
795 
796 //------------------------------------------------------------------------------
798  const auto runRangeSelectionVPSet = config_.getParameterSetVector("RunRangeSelection");
799 
800  // handle PCL use case
801  const auto& uniqueRunRanges =
802  (runAtPCL_ ? align::makeUniqueRunRanges(runRangeSelectionVPSet, firstRun_) : uniqueRunRanges_);
803 
804  std::vector<AlgebraicVector> beamSpotParameters;
805 
806  for (const auto& iRunRange : uniqueRunRanges) {
807  alignmentAlgo_->setParametersForRunRange(iRunRange);
808 
809  // Save alignments to database
811  writeForRunRange(iRunRange.first);
812  }
813 
814  // Deal with extra alignables, e.g. beam spot
815  if (alignableExtras_) {
816  auto& alis = alignableExtras_->beamSpot();
817  if (!alis.empty()) {
818  auto beamSpotAliPars = dynamic_cast<BeamSpotAlignmentParameters*>(alis[0]->alignmentParameters());
819  if (!beamSpotAliPars) {
820  throw cms::Exception("LogicError") << "@SUB=AlignmentProducerBase::storeAlignmentsToDB\n"
821  << "First alignable of alignableExtras_ does not have "
822  << "'BeamSpotAlignmentParameters', while it should have.";
823  }
824 
825  beamSpotParameters.push_back(beamSpotAliPars->parameters());
826  }
827  }
828  }
829 
830  if (alignableExtras_) {
831  std::ostringstream bsOutput;
832 
833  auto itPar = beamSpotParameters.cbegin();
834  for (auto iRunRange = uniqueRunRanges.cbegin(); iRunRange != uniqueRunRanges.cend(); ++iRunRange, ++itPar) {
835  bsOutput << "Run range: " << (*iRunRange).first << " - " << (*iRunRange).second << "\n";
836  bsOutput << " Displacement: x=" << (*itPar)[0] << ", y=" << (*itPar)[1] << "\n";
837  bsOutput << " Slope: dx/dz=" << (*itPar)[2] << ", dy/dz=" << (*itPar)[3] << "\n";
838  }
839 
840  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::storeAlignmentsToDB"
841  << "Parameters for alignable beamspot:\n"
842  << bsOutput.str();
843  }
844 }
845 
846 //------------------------------------------------------------------------------
848  if (doTracker_) { // first tracker
849  const AlignTransform* trackerGlobal{nullptr}; // will be 'removed' from constants
850  if (globalPositions_) { // i.e. applied before in applyDB
852  }
853 
854  auto alignments = alignableTracker_->alignments();
855  auto alignmentErrors = alignableTracker_->alignmentErrors();
856  this->writeDB(
857  alignments, "TrackerAlignmentRcd", alignmentErrors, "TrackerAlignmentErrorExtendedRcd", trackerGlobal, time);
858 
859  // Save surface deformations to database
860  if (saveDeformationsToDB_) {
861  auto alignmentSurfaceDeformations = alignableTracker_->surfaceDeformations();
862  this->writeDB(alignmentSurfaceDeformations, "TrackerSurfaceDeformationRcd", time);
863  }
864  }
865 
866  if (doMuon_) { // now muon
867  const AlignTransform* muonGlobal{nullptr}; // will be 'removed' from constants
868  if (globalPositions_) { // i.e. applied before in applyDB
870  }
871  // Get alignments+errors, first DT - ownership taken over by writeDB(..), so no delete
872  auto alignments = alignableMuon_->dtAlignments();
873  auto alignmentErrors = alignableMuon_->dtAlignmentErrorsExtended();
874  this->writeDB(alignments, "DTAlignmentRcd", alignmentErrors, "DTAlignmentErrorExtendedRcd", muonGlobal, time);
875 
876  // Get alignments+errors, now CSC - ownership taken over by writeDB(..), so no delete
877  alignments = alignableMuon_->cscAlignments();
878  alignmentErrors = alignableMuon_->cscAlignmentErrorsExtended();
879  this->writeDB(alignments, "CSCAlignmentRcd", alignmentErrors, "CSCAlignmentErrorExtendedRcd", muonGlobal, time);
880  }
881 }
882 
883 //------------------------------------------------------------------------------
885  const std::string& alignRcd,
886  AlignmentErrorsExtended* alignmentErrors,
887  const std::string& errRcd,
888  const AlignTransform* globalCoordinates,
889  cond::Time_t time) const {
890  Alignments* tempAlignments = alignments;
891  AlignmentErrorsExtended* tempAlignmentErrorsExtended = alignmentErrors;
892 
893  // Call service
895  if (!poolDb.isAvailable()) { // Die if not available
896  delete tempAlignments; // promised to take over ownership...
897  delete tempAlignmentErrorsExtended; // dito
898  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
899  }
900 
901  if (globalCoordinates // happens only if (applyDbAlignment_ == true)
902  && globalCoordinates->transform() != AlignTransform::Transform::Identity) {
903  tempAlignments = new Alignments(); // temporary storage for
904  tempAlignmentErrorsExtended = new AlignmentErrorsExtended(); // final alignments and errors
905 
906  GeometryAligner aligner;
907  aligner.removeGlobalTransform(
908  alignments, alignmentErrors, *globalCoordinates, tempAlignments, tempAlignmentErrorsExtended);
909 
910  delete alignments; // have to delete original alignments
911  delete alignmentErrors; // same thing for the errors
912 
913  edm::LogInfo("Alignment") << "@SUB=AlignmentProducerBase::writeDB"
914  << "globalCoordinates removed from alignments (" << alignRcd << ") and errors ("
915  << alignRcd << ").";
916  }
917 
918  if (saveToDB_) {
919  edm::LogInfo("Alignment") << "Writing Alignments for run " << time << " to " << alignRcd << ".";
920  poolDb->writeOne<Alignments>(tempAlignments, time, alignRcd);
921  } else { // poolDb->writeOne(..) takes over 'alignments' ownership,...
922  delete tempAlignments; // ...otherwise we have to delete, as promised!
923  }
924 
925  if (saveApeToDB_) {
926  edm::LogInfo("Alignment") << "Writing AlignmentErrorsExtended for run " << time << " to " << errRcd << ".";
927  poolDb->writeOne<AlignmentErrorsExtended>(tempAlignmentErrorsExtended, time, errRcd);
928  } else { // poolDb->writeOne(..) takes over 'alignmentErrors' ownership,...
929  delete tempAlignmentErrorsExtended; // ...otherwise we have to delete, as promised!
930  }
931 }
932 
933 //------------------------------------------------------------------------------
935  const std::string& surfaceDeformationRcd,
936  cond::Time_t time) const {
937  // Call service
939  if (!poolDb.isAvailable()) { // Die if not available
940  delete alignmentSurfaceDeformations; // promised to take over ownership...
941  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
942  }
943 
944  if (saveDeformationsToDB_) {
945  edm::LogInfo("Alignment") << "Writing AlignmentSurfaceDeformations for run " << time << " to "
946  << surfaceDeformationRcd << ".";
947  poolDb->writeOne<AlignmentSurfaceDeformations>(alignmentSurfaceDeformations, time, surfaceDeformationRcd);
948  } else { // poolDb->writeOne(..) takes over 'surfaceDeformation' ownership,...
949  delete alignmentSurfaceDeformations; // ...otherwise we have to delete, as promised!
950  }
951 }
952 
953 //------------------------------------------------------------------------------
954 template <typename T>
956  try {
957  config.getParameter<T>(name);
958  } catch (const edm::Exception& e) {
960  if (e.message().find("MissingParameter") != std::string::npos) {
961  return false;
962  } else {
963  throw;
964  }
965  } else {
966  throw;
967  }
968  }
969 
970  return true;
971 }
Code categoryCode() const
Definition: EDMException.h:97
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:22
align::Scalar width() const
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:189
double z0() const
z coordinate
Definition: BeamSpot.h:68
T getUntrackedParameter(std::string const &, T const &) const
VParameterSet const & getParameterSetVector(std::string const &name) const
const edm::InputTag tjTkAssociationMapTag_
Map with tracks/trajectories.
void readInSurveyRcds(const edm::EventSetup &)
Reads in survey records.
void applyAlignmentsToDB(const edm::EventSetup &)
void createGeometries(const edm::EventSetup &, const TrackerTopology *)
Creates ideal geometry from IdealGeometryRecord.
void writeDB(Alignments *, const std::string &, AlignmentErrorsExtended *, const std::string &, const AlignTransform *, cond::Time_t) const
std::vector< ConstTrajTrackPair > ConstTrajTrackPairs
RunID const & id() const
Definition: RunBase.h:39
std::shared_ptr< CSCGeometry > muonCSCGeometry_
Builds a scenario from configuration and applies it to the alignable Muon.
Alignment producer base class.
RunNumber_t run() const
Definition: RunID.h:39
def create(alignables, pedeDump, additionalData, outputFile, config)
edm::ESWatcher< DTAlignmentErrorExtendedRcd > watchDTAlErrExtRcd_
void update(const DTGeometry *, const CSCGeometry *)
const_iterator end() const
last iterator over the map (read only)
edm::ESWatcher< DTAlignmentRcd > watchDTAlRcd_
Time_t beginValue
Definition: Time.h:45
Class to update a given geometry with a set of alignments.
bool processEvent(const edm::Event &, const edm::EventSetup &)
Process event.
void initAlignmentAlgorithm(const edm::EventSetup &, bool update=false)
void terminateProcessing(const edm::EventSetup *=0)
Terminate processing of events.
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
ErrorMatrix matrix() const
Definition: SurveyError.h:76
AlignableExtras * alignableExtras_
AlignmentProducerBase(const edm::ParameterSet &)
void update(const TrackerGeometry *, const TrackerTopology *)
align::Alignables DTBarrel()
selection
main part
Definition: corrVsCorr.py:100
void buildParameterStore()
Creates the , which manages all Alignables.
virtual bool getAliClusterValueMap(const edm::Event &, edm::Handle< AliClusterValueMap > &)=0
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
std::string message() const
Definition: Exception.cc:145
TrackerGeometry * build(const GeometricDet *gd, const PTrackerParameters &ptp, const TrackerTopology *tTopo)
virtual ~AlignmentProducerBase()(false)
const Alignments * surveyValues_
void setWidth(align::Scalar width)
Definition: config.py:1
TRandom random
Definition: MVATrainer.cc:138
virtual const Alignables & components() const =0
Return vector of all direct components.
uint8_t structureType() const
Definition: SurveyError.h:66
AlignmentParameterStore * alignmentParameterStore_
std::vector< AlignTransform > m_align
Definition: Alignments.h:19
std::string encode() const
Definition: InputTag.cc:159
virtual bool getTkFittedLasBeamCollection(const edm::Run &, edm::Handle< TkFittedLasBeamCollection > &)=0
define event information passed to algorithms
std::shared_ptr< TrackerGeometry > trackerGeometry_
void setLength(align::Scalar length)
edm::ESWatcher< GlobalPositionRcd > watchGlobalPositionRcd_
virtual bool getTsosVectorCollection(const edm::Run &, edm::Handle< TsosVectorCollection > &)=0
double dydz() const
dydz slope
Definition: BeamSpot.h:84
void writeForRunRange(cond::Time_t)
Alignments * dtAlignments()
Get DT alignments sorted by DetId.
unsigned long long Time_t
Definition: Time.h:16
align::Alignables CSCEndcaps()
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
void build(CSCGeometry &geom, const DDCompactView *fv, const MuonDDDConstants &muonConstants)
Build the geometry.
void build(DTGeometry &theGeometry, const DDCompactView *cview, const MuonDDDConstants &muonConstants)
RunRanges makeUniqueRunRanges(const edm::VParameterSet &runRanges, const RunNumber &defaultRun)
Definition: Utilities.cc:263
void attachSurfaceDeformations(C *geometry, const AlignmentSurfaceDeformations *surfaceDeformations)
const edm::InputTag beamSpotTag_
BeamSpot.
void removeGlobalTransform(const Alignments *alignments, const AlignmentErrorsExtended *alignmentErrors, const AlignTransform &globalCoordinates, Alignments *newAlignments, AlignmentErrorsExtended *newAlignmentErrorsExtended)
edm::ESWatcher< TrackerSurveyErrorExtendedRcd > watchTkSurveyErrExtRcd_
void endRunImpl(const edm::Run &, const edm::EventSetup &)
end run
void addSurveyInfo(Alignable *)
Adds survey info to an Alignable.
bool isAvailable() const
Definition: Service.h:40
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void endLuminosityBlockImpl(const edm::LuminosityBlock &, const edm::EventSetup &)
end lumi block
align::ID rawId() const
Definition: SurveyError.h:71
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
void createAlignables(const TrackerTopology *, bool update=false)
AlignmentSurfaceDeformations * surfaceDeformations() const
Return surface deformations, sorted by DetId.
Definition: Alignable.cc:262
std::unique_ptr< const Alignments > globalPositions_
GlobalPositions that might be read from DB, nullptr otherwise.
AlignmentAlgorithmBase::EndRunInfo EndRunInfo
void initializeBeamSpot(double x, double y, double z, double dxdz, double dydz)
Initialize the alignable beam spot with the given parameters.
bool hasParameter(const edm::ParameterSet &, const std::string &name)
void startProcessing()
Start processing of events.
edm::ESWatcher< IdealGeometryRecord > watchIdealGeometryRcd_
AlignmentErrorsExtended * cscAlignmentErrorsExtended()
Get CSC alignment errors sorted by DetId.
double dxdz() const
dxdz slope
Definition: BeamSpot.h:82
virtual bool getBeamSpot(const edm::Event &, edm::Handle< reco::BeamSpot > &)=0
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
Definition: Alignable.h:135
edm::ESWatcher< CSCAlignmentErrorExtendedRcd > watchCSCAlErrExtRcd_
#define noexcept
Definition: DetId.h:18
edm::ESWatcher< TrackerSurfaceDeformationRcd > watchTrackerSurDeRcd_
void applyAlignments(C *geometry, const Alignments *alignments, const AlignmentErrorsExtended *alignmentErrors, const AlignTransform &globalCoordinates)
AlgebraicVector EulerAngles
Definition: Definitions.h:36
align::Scalar length() const
Transform transform() const
AlignableTracker * alignableTracker_
edm::Handle< reco::BeamSpot > beamSpot_
ParameterSet const & getParameterSet(std::string const &) const
void applyMisalignment()
Applies misalignment scenario to .
void setSurvey(const SurveyDet *)
Set survey info.
Definition: Alignable.cc:340
const align::RunRanges uniqueRunRanges_
Alignments * cscAlignments()
Get CSC alignments sorted by DetId.
void storeAlignmentsToDB()
Writes Alignments (i.e. Records) to database-file.
AlignmentErrorsExtended * dtAlignmentErrorsExtended()
Get DT alignment errors sorted by DetId.
virtual bool getTrajTrackAssociationCollection(const edm::Event &, edm::Handle< TrajTrackAssociationCollection > &)=0
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
std::vector< Alignable * > Alignables
Definition: Utilities.h:32
std::shared_ptr< DTGeometry > muonDTGeometry_
edm::ESWatcher< TrackerAlignmentRcd > watchTrackerAlRcd_
void applyScenario(const edm::ParameterSet &scenario) override
Apply misalignment scenario to the tracker.
void beginLuminosityBlockImpl(const edm::LuminosityBlock &, const edm::EventSetup &)
begin lumi block
edm::ESWatcher< TrackerAlignmentErrorExtendedRcd > watchTrackerAlErrorExtRcd_
bool setupChanged(const edm::EventSetup &)
Checks if one of the EventSetup-Records has changed.
Alignments * alignments() const override
Return alignments, sorted by DetId.
#define update(a, b)
edm::ESWatcher< TrackerSurveyRcd > watchTkSurveyRcd_
AlignmentErrorsExtended * alignmentErrors() const override
Return alignment errors, sorted by DetId.
T get() const
Definition: EventSetup.h:71
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
Definition: Utilities.cc:42
void createCalibrations()
Creates the calibrations.
std::vector< char > convertParamSel(const std::string &selString) const
Converting std::string into std::vector<char>
double y0() const
y coordinate
Definition: BeamSpot.h:66
static unsigned int const shift
void createAlignmentAlgorithm()
Creates the choosen alignment algorithm.
edm::ESWatcher< CSCAlignmentRcd > watchCSCAlRcd_
const AlignTransform & DetectorGlobalPosition(const Alignments &allGlobals, const DetId &id)
const edm::InputTag tkLasBeamTag_
LAS beams in edm::Run (ignore if empty)
const SurveyErrors * surveyErrors_
void initBeamSpot(const edm::Event &)
Initializes Beamspot of Alignables .
std::pair< const Trajectory *, const reco::Track * > ConstTrajTrackPair
void applyScenario(const edm::ParameterSet &scenario) override
Apply misalignment scenario to the Muon.
const_iterator begin() const
first iterator over the map (read only)
eventInfo
add run, event number and lumi section
std::vector< SurveyError > m_surveyErrors
Definition: SurveyErrors.h:23
long double T
Builds a scenario from configuration and applies it to the alignable tracker.
void beginRunImpl(const edm::Run &, const edm::EventSetup &)
begin run
const edm::InputTag clusterValueMapTag_
ValueMap containing associtaion cluster-flag.
T const * product() const
Definition: ESHandle.h:86
void simpleMisalignment(const align::Alignables &, const std::string &, float, float, bool)
Applies misalignment scenario to .
Alignables & beamSpot()
Return beam spot alignable as a vector with one element.
def move(src, dest)
Definition: eostools.py:511
T get(const Candidate &c)
Definition: component.h:55
const align::Alignables & alignables(void) const
get all alignables
Definition: event.py:1
Definition: Run.h:45
cond::RealTimeType< cond::runnumber >::type RunNumber
Definition: Utilities.h:38
std::unique_ptr< AlignmentAlgorithmBase > alignmentAlgo_
double x0() const
x coordinate
Definition: BeamSpot.h:64
void createMonitors()
Creates the monitors.