CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
AlignmentProducer.cc
Go to the documentation of this file.
1 
8 #include "AlignmentProducer.h"
13 
15 
16 // System include files
17 #include <memory>
18 #include <sstream>
19 
20 // Framework
26 
27 // Conditions database
30 
31 // Geometry
55 
56 // Tracking, LAS and cluster flag map (fwd is enough!)
61 
62 // Alignment
71 
72 //_____________________________________________________________________________
74  theAlignmentAlgo(0), theAlignmentParameterStore(0),
75  theAlignableExtras(0), theAlignableTracker(0), theAlignableMuon(0),
76  globalPositions_(0),
77  nevent_(0), theParameterSet(iConfig),
78  theMaxLoops( iConfig.getUntrackedParameter<unsigned int>("maxLoops") ),
79  stNFixAlignables_(iConfig.getParameter<int>("nFixAlignables") ),
80  stRandomShift_(iConfig.getParameter<double>("randomShift")),
81  stRandomRotation_(iConfig.getParameter<double>("randomRotation")),
82  applyDbAlignment_( iConfig.getUntrackedParameter<bool>("applyDbAlignment")),
83  applyDbDeformations_( iConfig.getUntrackedParameter<bool>("applyDbDeformations")),
84  doMisalignmentScenario_(iConfig.getParameter<bool>("doMisalignmentScenario")),
85  saveToDB_(iConfig.getParameter<bool>("saveToDB")),
86  saveApeToDB_(iConfig.getParameter<bool>("saveApeToDB")),
87  saveDeformationsToDB_(iConfig.getParameter<bool>("saveDeformationsToDB")),
88  doTracker_( iConfig.getUntrackedParameter<bool>("doTracker") ),
89  doMuon_( iConfig.getUntrackedParameter<bool>("doMuon") ),
90  useExtras_( iConfig.getUntrackedParameter<bool>("useExtras") ),
91  useSurvey_( iConfig.getParameter<bool>("useSurvey") ),
92  tjTkAssociationMapTag_(iConfig.getParameter<edm::InputTag>("tjTkAssociationMapTag")),
93  beamSpotTag_(iConfig.getParameter<edm::InputTag>("beamSpotTag")),
94  tkLasBeamTag_(iConfig.getParameter<edm::InputTag>("tkLasBeamTag")),
95  clusterValueMapTag_(iConfig.getParameter<edm::InputTag>("hitPrescaleMapTag"))
96 {
97  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::AlignmentProducer";
98 
99  // Tell the framework what data is being produced
100  if (doTracker_) {
102  }
103  if (doMuon_) {
106  }
107 
108  // Create the alignment algorithm
109  edm::ParameterSet algoConfig = iConfig.getParameter<edm::ParameterSet>( "algoConfig" );
110  std::string algoName = algoConfig.getParameter<std::string>("algoName");
111  theAlignmentAlgo = AlignmentAlgorithmPluginFactory::get( )->create( algoName, algoConfig );
112 
113  // Check if found
114  if ( !theAlignmentAlgo )
115  throw cms::Exception("BadConfig") << "Couldn't find algorithm called " << algoName;
116 
117  edm::ParameterSet monitorConfig = iConfig.getParameter<edm::ParameterSet>( "monitorConfig" );
118  std::vector<std::string> monitors = monitorConfig.getUntrackedParameter<std::vector<std::string> >( "monitors" );
119 
120  for (std::vector<std::string>::const_iterator miter = monitors.begin(); miter != monitors.end(); ++miter) {
121  AlignmentMonitorBase* newMonitor = AlignmentMonitorPluginFactory::get()->create(*miter, monitorConfig.getUntrackedParameter<edm::ParameterSet>(*miter));
122 
123  if (!newMonitor) throw cms::Exception("BadConfig") << "Couldn't find monitor named " << *miter;
124 
125  theMonitors.push_back(newMonitor);
126  }
127 }
128 
129 
130 //_____________________________________________________________________________
131 // Delete new objects
133 {
135  delete theAlignableExtras;
136  delete theAlignableTracker;
137  delete theAlignableMuon;
138 
139  delete globalPositions_;
140 }
141 
142 
143 //_____________________________________________________________________________
144 // Produce tracker geometry
145 boost::shared_ptr<TrackerGeometry>
147 {
148  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::produceTracker";
149  return theTracker;
150 }
151 
152 //_____________________________________________________________________________
153 // Produce muonDT geometry
154 boost::shared_ptr<DTGeometry>
156 {
157  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::produceDT";
158  return theMuonDT;
159 }
160 
161 //_____________________________________________________________________________
162 // Produce muonCSC geometry
163 boost::shared_ptr<CSCGeometry>
165 {
166  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::produceCSC";
167  return theMuonCSC;
168 }
169 
170 
171 //_____________________________________________________________________________
172 // Initialize algorithm
174 {
175  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob";
176 
177  // Create the geometries from the ideal geometries (first time only)
178  this->createGeometries_( iSetup );
179 
180  // Retrieve and apply alignments, if requested (requires DB setup)
181  if ( applyDbAlignment_ ) {
182  // we need GlobalPositionRcd - and have to keep track for later removal
183  // before writing again to DB...
184  edm::ESHandle<Alignments> globalPositionRcd;
185  iSetup.get<GlobalPositionRcd>().get(globalPositionRcd);
186  globalPositions_ = new Alignments(*globalPositionRcd);
187 
188  if ( doTracker_ ) { // apply to tracker
189  this->applyDB<TrackerGeometry,TrackerAlignmentRcd,TrackerAlignmentErrorRcd>
190  (&(*theTracker), iSetup,
192  }
193 
194  if ( doMuon_ ) { // apply to tracker
195  this->applyDB<DTGeometry,DTAlignmentRcd,DTAlignmentErrorRcd>
196  (&(*theMuonDT), iSetup,
198  this->applyDB<CSCGeometry,CSCAlignmentRcd,CSCAlignmentErrorRcd>
199  (&(*theMuonCSC), iSetup,
201  }
202  }
203 
204  if ( applyDbDeformations_ && doTracker_ ) {
205  this->applyDB<TrackerGeometry,TrackerSurfaceDeformationRcd>(&(*theTracker), iSetup);
206  }
207 
208  // Create alignable tracker and muon
209  if (doTracker_) {
211  }
212 
213  if (doMuon_) {
215  }
216 
217  if (useExtras_) {
219  }
220 
221  // Create alignment parameter builder
222  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob"
223  << "Creating AlignmentParameterBuilder";
224  edm::ParameterSet aliParamBuildCfg =
225  theParameterSet.getParameter<edm::ParameterSet>("ParameterBuilder");
226  AlignmentParameterBuilder alignmentParameterBuilder(theAlignableTracker,
229  aliParamBuildCfg );
230  // Fix alignables if requested
231  if (stNFixAlignables_>0) alignmentParameterBuilder.fixAlignables(stNFixAlignables_);
232 
233  // Get list of alignables
234  Alignables theAlignables = alignmentParameterBuilder.alignables();
235  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob"
236  << "got " << theAlignables.size() << " alignables";
237 
238  // Create AlignmentParameterStore
239  edm::ParameterSet aliParamStoreCfg =
241  theAlignmentParameterStore = new AlignmentParameterStore(theAlignables, aliParamStoreCfg);
242  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob"
243  << "AlignmentParameterStore created!";
244 
245  // Apply misalignment scenario to alignable tracker and muon if requested
246  // WARNING: this assumes scenarioConfig can be passed to both muon and tracker
248  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob"
249  << "Applying misalignment scenario to "
250  << (doTracker_ ? "tracker" : "")
251  << (doMuon_ ? (doTracker_ ? " and muon" : "muon") : ".");
252  edm::ParameterSet scenarioConfig
253  = theParameterSet.getParameter<edm::ParameterSet>( "MisalignmentScenario" );
254  if (doTracker_) {
255  TrackerScenarioBuilder scenarioBuilder( theAlignableTracker );
256  scenarioBuilder.applyScenario( scenarioConfig );
257  }
258  if (doMuon_) {
259  MuonScenarioBuilder muonScenarioBuilder( theAlignableMuon );
260  muonScenarioBuilder.applyScenario( scenarioConfig );
261  }
262  } else {
263  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::beginOfJob"
264  << "NOT applying misalignment scenario!";
265  }
266 
267  // Apply simple misalignment
268  const std::string sParSel(theParameterSet.getParameter<std::string>("parameterSelectorSimple"));
269  this->simpleMisalignment_(theAlignables, sParSel, stRandomShift_, stRandomRotation_, true);
270 
271  // Initialize alignment algorithm
272  theAlignmentAlgo->initialize( iSetup,
274  theAlignmentParameterStore );
275 
276  for (std::vector<AlignmentMonitorBase*>::const_iterator monitor = theMonitors.begin();
277  monitor != theMonitors.end(); ++monitor) {
278  (*monitor)->beginOfJob(theAlignableTracker, theAlignableMuon, theAlignmentParameterStore);
279  }
280 }
281 
282 //_____________________________________________________________________________
283 // Terminate algorithm
285 {
286  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::endOfJob";
287 
288  for (std::vector<AlignmentMonitorBase*>::const_iterator monitor = theMonitors.begin(); monitor != theMonitors.end(); ++monitor) {
289  (*monitor)->endOfJob();
290  }
291 
292  if (0 == nevent_) {
293  edm::LogError("Alignment") << "@SUB=AlignmentProducer::endOfJob" << "Did not process any "
294  << "events in last loop, do not dare to store to DB.";
295  } else {
296 
297  // Save alignments to database
298  if (saveToDB_ || saveApeToDB_) {
299 
300  if ( doTracker_ ) { // first tracker
301  const AlignTransform *trackerGlobal = 0; // will be 'removed' from constants
302  if (globalPositions_) { // i.e. applied before in applyDB
305  }
306  // Get alignments+errors - ownership taken over by writeDB(..), so no delete
307  Alignments *alignments = theAlignableTracker->alignments();
309  this->writeDB(alignments, "TrackerAlignmentRcd",
310  alignmentErrors, "TrackerAlignmentErrorRcd", trackerGlobal);
311  }
312 
313  if ( doMuon_ ) { // now muon
314  const AlignTransform *muonGlobal = 0; // will be 'removed' from constants
315  if (globalPositions_) { // i.e. applied before in applyDB
317  DetId(DetId::Muon));
318  }
319  // Get alignments+errors, first DT - ownership taken over by writeDB(..), so no delete
320  Alignments *alignments = theAlignableMuon->dtAlignments();
321  AlignmentErrors *alignmentErrors = theAlignableMuon->dtAlignmentErrors();
322  this->writeDB(alignments, "DTAlignmentRcd",
323  alignmentErrors, "DTAlignmentErrorRcd", muonGlobal);
324 
325  // Get alignments+errors, now CSC - ownership taken over by writeDB(..), so no delete
326  alignments = theAlignableMuon->cscAlignments();
327  alignmentErrors = theAlignableMuon->cscAlignmentErrors();
328  this->writeDB(alignments, "CSCAlignmentRcd",
329  alignmentErrors, "CSCAlignmentErrorRcd", muonGlobal);
330  }
331 
332  // Save surface deformations to database
334  AlignmentSurfaceDeformations *alignmentSurfaceDeformations = theAlignableTracker->surfaceDeformations();
335  this->writeDB(alignmentSurfaceDeformations, "TrackerSurfaceDeformationRcd");
336  }
337 
338  }
339  }
340 
342 }
343 
344 //_____________________________________________________________________________
345 // Called at beginning of loop
346 void AlignmentProducer::startingNewLoop(unsigned int iLoop )
347 {
348  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::startingNewLoop"
349  << "Starting loop number " << iLoop;
350 
351  nevent_ = 0;
352 
354 
355  for (std::vector<AlignmentMonitorBase*>::const_iterator monitor = theMonitors.begin(); monitor != theMonitors.end(); ++monitor) {
356  (*monitor)->startingNewLoop();
357  }
358 
359  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::startingNewLoop"
360  << "Now physically apply alignments to geometry...";
361 
362 
363  // Propagate changes to reconstruction geometry (from initialisation or iteration)
364  GeometryAligner aligner;
365  if ( doTracker_ ) {
366  std::auto_ptr<Alignments> alignments(theAlignableTracker->alignments());
367  std::auto_ptr<AlignmentErrors> alignmentErrors(theAlignableTracker->alignmentErrors());
368  aligner.applyAlignments<TrackerGeometry>( &(*theTracker),&(*alignments),&(*alignmentErrors), AlignTransform() ); // don't apply global a second time!
369  std::auto_ptr<AlignmentSurfaceDeformations> aliDeforms(theAlignableTracker->surfaceDeformations());
370  aligner.attachSurfaceDeformations<TrackerGeometry>(&(*theTracker), &(*aliDeforms));
371 
372  }
373  if ( doMuon_ ) {
374  std::auto_ptr<Alignments> dtAlignments( theAlignableMuon->dtAlignments());
375  std::auto_ptr<AlignmentErrors> dtAlignmentErrors( theAlignableMuon->dtAlignmentErrors());
376  std::auto_ptr<Alignments> cscAlignments( theAlignableMuon->cscAlignments());
377  std::auto_ptr<AlignmentErrors> cscAlignmentErrors( theAlignableMuon->cscAlignmentErrors());
378 
379  aligner.applyAlignments<DTGeometry>( &(*theMuonDT), &(*dtAlignments), &(*dtAlignmentErrors), AlignTransform() ); // don't apply global a second time!
380  aligner.applyAlignments<CSCGeometry>( &(*theMuonCSC), &(*cscAlignments), &(*cscAlignmentErrors), AlignTransform() ); // nope!
381  }
382 }
383 
384 
385 //_____________________________________________________________________________
386 // Called at end of loop
388 AlignmentProducer::endOfLoop(const edm::EventSetup& iSetup, unsigned int iLoop)
389 {
390 
391  if (0 == nevent_) {
392  // beginOfJob is usually called by the framework in the first event of the first loop
393  // (a hack: beginOfJob needs the EventSetup that is not well defined without an event)
394  // and the algorithms rely on the initialisations done in beginOfJob. We cannot call
395  // this->beginOfJob(iSetup); here either since that will access the EventSetup to get
396  // some geometry information that is not defined either without having seen an event.
397  edm::LogError("Alignment") << "@SUB=AlignmentProducer::endOfLoop"
398  << "Did not process any events in loop " << iLoop
399  << ", stop processing without terminating algorithm.";
400  return kStop;
401  }
402 
403  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::endOfLoop"
404  << "Ending loop " << iLoop << ", terminating algorithm.";
405 
407 
408  for (std::vector<AlignmentMonitorBase*>::const_iterator monitor = theMonitors.begin(); monitor != theMonitors.end(); ++monitor) {
409  (*monitor)->endOfLoop(iSetup);
410  }
411 
412  if ( iLoop == theMaxLoops-1 || iLoop >= theMaxLoops ) return kStop;
413  else return kContinue;
414 }
415 
416 //_____________________________________________________________________________
417 // Called at each event
420  const edm::EventSetup& setup )
421 {
422  ++nevent_;
423 
424  // reading in survey records
425  this->readInSurveyRcds(setup);
426 
427  // Printout event number
428  for ( int i=10; i<10000000; i*=10 )
429  if ( nevent_<10*i && (nevent_%i)==0 )
430  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::duringLoop"
431  << "Events processed: " << nevent_;
432 
433  // Retrieve trajectories and tracks from the event
434  // -> merely skip if collection is empty
436  if (event.getByLabel(tjTkAssociationMapTag_, m_TrajTracksMap)) {
437 
438  // Form pairs of trajectories and tracks
439  ConstTrajTrackPairCollection trajTracks;
440  for ( TrajTrackAssociationCollection::const_iterator iPair = m_TrajTracksMap->begin();
441  iPair != m_TrajTracksMap->end(); ++iPair) {
442  trajTracks.push_back( ConstTrajTrackPair( &(*(*iPair).key), &(*(*iPair).val) ) );
443  }
445  event.getByLabel(beamSpotTag_, beamSpot);
446 
447  if (nevent_==1 && theAlignableExtras) {
448  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::duringLoop"
449  << "initializing AlignableBeamSpot" << std::endl;
450  theAlignableExtras->initializeBeamSpot(beamSpot->x0(), beamSpot->y0(), beamSpot->z0(),
451  beamSpot->dxdz(), beamSpot->dydz());
452  }
453 
454  // Run the alignment algorithm with its input
455  const AliClusterValueMap *clusterValueMapPtr = 0;
456  if(clusterValueMapTag_.encode().size()){//check that the input tag is not empty
457  edm::Handle<AliClusterValueMap> clusterValueMap;
458  event.getByLabel(clusterValueMapTag_, clusterValueMap);
459  clusterValueMapPtr = &(*clusterValueMap);
460  }
461 
462  const AlignmentAlgorithmBase::EventInfo eventInfo(event.id(), trajTracks, *beamSpot,
463  clusterValueMapPtr);
464  theAlignmentAlgo->run(setup, eventInfo);
465 
466 
467  for (std::vector<AlignmentMonitorBase*>::const_iterator monitor = theMonitors.begin();
468  monitor != theMonitors.end(); ++monitor) {
469  (*monitor)->duringLoop(event, setup, trajTracks); // forward eventInfo?
470  }
471  } else {
472  edm::LogError("Alignment") << "@SUB=AlignmentProducer::duringLoop"
473  << "No track collection found: skipping event";
474  }
475 
476 
477  return kContinue;
478 }
479 
480 // ----------------------------------------------------------------------------
482 {
483  theAlignmentAlgo->beginRun(setup); // do not forward edm::Run...
484 }
485 
486 // ----------------------------------------------------------------------------
488 {
489  // call with or without las beam info...
490  typedef AlignmentAlgorithmBase::EndRunInfo EndRunInfo;
491  if (tkLasBeamTag_.encode().size()) { // non-empty InputTag
494  run.getByLabel(tkLasBeamTag_, lasBeams);
495  run.getByLabel(tkLasBeamTag_, tsoses);
496 
497  theAlignmentAlgo->endRun(EndRunInfo(run.id(), &(*lasBeams), &(*tsoses)), setup);
498  } else {
499  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::endRun"
500  << "No Tk LAS beams to forward to algorithm.";
501  theAlignmentAlgo->endRun(EndRunInfo(run.id(), 0, 0), setup);
502  }
503 }
504 
505 // ----------------------------------------------------------------------------
507  const edm::EventSetup &setup)
508 {
509  theAlignmentAlgo->beginLuminosityBlock(setup); // do not forward edm::LuminosityBlock
510 }
511 
512 // ----------------------------------------------------------------------------
514  const edm::EventSetup &setup)
515 {
516  theAlignmentAlgo->endLuminosityBlock(setup); // do not forward edm::LuminosityBlock
517 }
518 
519 // ----------------------------------------------------------------------------
520 
521 void AlignmentProducer::simpleMisalignment_(const Alignables &alivec, const std::string &selection,
522  float shift, float rot, bool local)
523 {
524 
525  std::ostringstream output; // collecting output
526 
527  if (shift > 0. || rot > 0.) {
528  output << "Adding random flat shift of max size " << shift
529  << " and adding random flat rotation of max size " << rot <<" to ";
530 
531  std::vector<bool> commSel(0);
532  if (selection != "-1") {
533  AlignmentParameterSelector aSelector(0,0); // no alignable needed here...
534  const std::vector<char> cSel(aSelector.convertParamSel(selection));
535  if (cSel.size() < RigidBodyAlignmentParameters::N_PARAM) {
536  throw cms::Exception("BadConfig")
537  << "[AlignmentProducer::simpleMisalignment_]\n"
538  << "Expect selection string '" << selection << "' to be at least of length "
539  << RigidBodyAlignmentParameters::N_PARAM << " or to be '-1'.\n"
540  << "(Most probably you have to adjust the parameter 'parameterSelectorSimple'.)";
541  }
542  for (std::vector<char>::const_iterator cIter = cSel.begin(); cIter != cSel.end(); ++cIter) {
543  commSel.push_back(*cIter == '0' ? false : true);
544  }
545  output << "parameters defined by (" << selection
546  << "), representing (x,y,z,alpha,beta,gamma),";
547  } else {
548  output << "the active parameters of each alignable,";
549  }
550  output << " in " << (local ? "local" : "global") << " frame.";
551 
552  for (std::vector<Alignable*>::const_iterator it = alivec.begin(); it != alivec.end(); ++it) {
553  Alignable* ali=(*it);
554  std::vector<bool> mysel(commSel.empty() ? ali->alignmentParameters()->selector() : commSel);
555 
556  if (std::abs(shift)>0.00001) {
557  double s0 = 0., s1 = 0., s2 = 0.;
558  if (mysel[RigidBodyAlignmentParameters::dx]) s0 = shift * double(random()%1000-500)/500.;
559  if (mysel[RigidBodyAlignmentParameters::dy]) s1 = shift * double(random()%1000-500)/500.;
560  if (mysel[RigidBodyAlignmentParameters::dz]) s2 = shift * double(random()%1000-500)/500.;
561 
562  if (local) ali->move( ali->surface().toGlobal(align::LocalVector(s0,s1,s2)) );
563  else ali->move( align::GlobalVector(s0,s1,s2) );
564 
565  //AlignmentPositionError ape(dx,dy,dz);
566  //ali->addAlignmentPositionError(ape);
567  }
568 
569  if (std::abs(rot)>0.00001) {
571  if (mysel[RigidBodyAlignmentParameters::dalpha]) r(1)=rot*double(random()%1000-500)/500.;
572  if (mysel[RigidBodyAlignmentParameters::dbeta]) r(2)=rot*double(random()%1000-500)/500.;
573  if (mysel[RigidBodyAlignmentParameters::dgamma]) r(3)=rot*double(random()%1000-500)/500.;
574 
575  const align::RotationType mrot = align::toMatrix(r);
576  if (local) ali->rotateInLocalFrame(mrot);
577  else ali->rotateInGlobalFrame(mrot);
578 
579  //ali->addAlignmentPositionErrorFromRotation(mrot);
580  }
581  } // end loop on alignables
582  } else {
583  output << "No simple misalignment added!";
584  }
585  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::simpleMisalignment_" << output.str();
586 }
587 
588 
589 //__________________________________________________________________________________________________
591 {
593  iSetup.get<IdealGeometryRecord>().get( cpv );
594 
595  if (doTracker_) {
596  edm::ESHandle<GeometricDet> geometricDet;
597  iSetup.get<IdealGeometryRecord>().get( geometricDet );
598  TrackerGeomBuilderFromGeometricDet trackerBuilder;
599  theTracker = boost::shared_ptr<TrackerGeometry>( trackerBuilder.build(&(*geometricDet)) );
600  }
601 
602  if (doMuon_) {
604  iSetup.get<MuonNumberingRecord>().get(mdc);
605  DTGeometryBuilderFromDDD DTGeometryBuilder;
607  theMuonDT = boost::shared_ptr<DTGeometry>(new DTGeometry );
608  DTGeometryBuilder.build( theMuonDT, &(*cpv), *mdc);
609  theMuonCSC = boost::shared_ptr<CSCGeometry>( new CSCGeometry );
610  CSCGeometryBuilder.build( theMuonCSC, &(*cpv), *mdc );
611  }
612 }
613 
615 {
616  const std::vector<Alignable*>& comp = ali->components();
617 
618  unsigned int nComp = comp.size();
619 
620  for (unsigned int i = 0; i < nComp; ++i) addSurveyInfo_(comp[i]);
621 
623 
624  if ( ali->id() != error.rawId() ||
625  ali->alignableObjectId() != error.structureType() )
626  {
627  throw cms::Exception("DatabaseError")
628  << "Error reading survey info from DB. Mismatched id!";
629  }
630 
631  const CLHEP::Hep3Vector& pos = theSurveyValues->m_align[theSurveyIndex].translation();
632  const CLHEP::HepRotation& rot = theSurveyValues->m_align[theSurveyIndex].rotation();
633 
634  AlignableSurface surf( align::PositionType( pos.x(), pos.y(), pos.z() ),
635  align::RotationType( rot.xx(), rot.xy(), rot.xz(),
636  rot.yx(), rot.yy(), rot.yz(),
637  rot.zx(), rot.zy(), rot.zz() ) );
638 
639  surf.setWidth( ali->surface().width() );
640  surf.setLength( ali->surface().length() );
641 
642  ali->setSurvey( new SurveyDet( surf, error.matrix() ) );
643 
644  ++theSurveyIndex;
645 }
646 
648 
649  // Get Survey Rcds and add Survey Info
650  if ( doTracker_ && useSurvey_ ){
651  bool tkSurveyBool = watchTkSurveyRcd_.check(iSetup);
652  bool tkSurveyErrBool = watchTkSurveyErrRcd_.check(iSetup);
653  edm::LogInfo("Alignment") << "watcher tksurveyrcd: " << tkSurveyBool;
654  edm::LogInfo("Alignment") << "watcher tksurveyerrrcd: " << tkSurveyErrBool;
655  if ( tkSurveyBool || tkSurveyErrBool){
656 
657  edm::LogInfo("Alignment") << "ADDING THE SURVEY INFORMATION";
659  edm::ESHandle<SurveyErrors> surveyErrors;
660 
661  iSetup.get<TrackerSurveyRcd>().get(surveys);
662  iSetup.get<TrackerSurveyErrorRcd>().get(surveyErrors);
663 
664  theSurveyIndex = 0;
665  theSurveyValues = &*surveys;
666  theSurveyErrors = &*surveyErrors;
668  }
669  }
670 
671  if ( doMuon_ && useSurvey_) {
672  bool DTSurveyBool = watchTkSurveyRcd_.check(iSetup);
673  bool DTSurveyErrBool = watchTkSurveyErrRcd_.check(iSetup);
674  bool CSCSurveyBool = watchTkSurveyRcd_.check(iSetup);
675  bool CSCSurveyErrBool = watchTkSurveyErrRcd_.check(iSetup);
676 
677  if ( DTSurveyBool || DTSurveyErrBool || CSCSurveyBool || CSCSurveyErrBool ){
678  edm::ESHandle<Alignments> dtSurveys;
679  edm::ESHandle<SurveyErrors> dtSurveyErrors;
680  edm::ESHandle<Alignments> cscSurveys;
681  edm::ESHandle<SurveyErrors> cscSurveyErrors;
682 
683  iSetup.get<DTSurveyRcd>().get(dtSurveys);
684  iSetup.get<DTSurveyErrorRcd>().get(dtSurveyErrors);
685  iSetup.get<CSCSurveyRcd>().get(cscSurveys);
686  iSetup.get<CSCSurveyErrorRcd>().get(cscSurveyErrors);
687 
688  theSurveyIndex = 0;
689  theSurveyValues = &*dtSurveys;
690  theSurveyErrors = &*dtSurveyErrors;
691  std::vector<Alignable*> barrels = theAlignableMuon->DTBarrel();
692  for (std::vector<Alignable*>::const_iterator iter = barrels.begin(); iter != barrels.end(); ++iter) {
693  addSurveyInfo_(*iter);
694  }
695 
696  theSurveyIndex = 0;
697  theSurveyValues = &*cscSurveys;
698  theSurveyErrors = &*cscSurveyErrors;
699  std::vector<Alignable*> endcaps = theAlignableMuon->CSCEndcaps();
700  for (std::vector<Alignable*>::const_iterator iter = endcaps.begin(); iter != endcaps.end(); ++iter) {
701  addSurveyInfo_(*iter);
702  }
703  }
704  }
705 
706 }
707 
708 
710 // a templated method - but private, so not accessible from outside
711 // ==> does not have to be in header file
712 template<class G, class Rcd, class ErrRcd>
714  const AlignTransform &globalCoordinates) const
715 {
716  // 'G' is the geometry class for that DB should be applied,
717  // 'Rcd' is the record class for its Alignments
718  // 'ErrRcd' is the record class for its AlignmentErrors
719  // 'globalCoordinates' are global transformation for this geometry
720  edm::ESHandle<Alignments> alignments;
721  iSetup.get<Rcd>().get(alignments);
722 
723  edm::ESHandle<AlignmentErrors> alignmentErrors;
724  iSetup.get<ErrRcd>().get(alignmentErrors);
725 
726  GeometryAligner aligner;
727  aligner.applyAlignments<G>(geometry, &(*alignments), &(*alignmentErrors),
728  globalCoordinates);
729 }
730 
731 
733 // a templated method - but private, so not accessible from outside
734 // ==> does not have to be in header file
735 template<class G, class DeformationRcd>
737 {
738  // 'G' is the geometry class for that DB should be applied,
739  // 'DeformationRcd' is the record class for its surface deformations
741  iSetup.get<DeformationRcd>().get(surfaceDeformations);
742 
743  GeometryAligner aligner;
744  aligner.attachSurfaceDeformations<G>(geometry, &(*surfaceDeformations));
745 }
746 
747 
750  const std::string &alignRcd,
751  AlignmentErrors *alignmentErrors,
752  const std::string &errRcd,
753  const AlignTransform *globalCoordinates) const
754 {
755  Alignments * tempAlignments = alignments;
756  AlignmentErrors * tempAlignmentErrors = alignmentErrors;
757 
758  // Call service
760  if (!poolDb.isAvailable()) { // Die if not available
761  delete tempAlignments; // promised to take over ownership...
762  delete tempAlignmentErrors; // dito
763  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
764  }
765 
766  if (globalCoordinates // happens only if (applyDbAlignment_ == true)
767  && globalCoordinates->transform() != AlignTransform::Transform::Identity) {
768 
769  tempAlignments = new Alignments(); // temporary storage for
770  tempAlignmentErrors = new AlignmentErrors(); // final alignments and errors
771 
772  GeometryAligner aligner;
773  aligner.removeGlobalTransform(alignments, alignmentErrors,
774  *globalCoordinates,
775  tempAlignments, tempAlignmentErrors);
776 
777  delete alignments; // have to delete original alignments
778  delete alignmentErrors; // same thing for the errors
779 
780  edm::LogInfo("Alignment") << "@SUB=AlignmentProducer::writeDB"
781  << "globalCoordinates removed from alignments (" << alignRcd
782  << ") and errors (" << alignRcd << ").";
783  }
784 
785  if (saveToDB_) {
786  edm::LogInfo("Alignment") << "Writing Alignments to " << alignRcd << ".";
787  poolDb->writeOne<Alignments>(tempAlignments, poolDb->beginOfTime(), alignRcd);
788  } else { // poolDb->writeOne(..) takes over 'alignments' ownership,...
789  delete tempAlignments; // ...otherwise we have to delete, as promised!
790  }
791 
792  if (saveApeToDB_) {
793  edm::LogInfo("Alignment") << "Writing AlignmentErrors to " << errRcd << ".";
794  poolDb->writeOne<AlignmentErrors>(tempAlignmentErrors, poolDb->beginOfTime(), errRcd);
795  } else { // poolDb->writeOne(..) takes over 'alignmentErrors' ownership,...
796  delete tempAlignmentErrors; // ...otherwise we have to delete, as promised!
797  }
798 }
799 
800 
802 void AlignmentProducer::writeDB(AlignmentSurfaceDeformations *alignmentSurfaceDeformations,
803  const std::string &surfaceDeformationRcd) const
804 {
805  // Call service
807  if (!poolDb.isAvailable()) { // Die if not available
808  delete alignmentSurfaceDeformations; // promised to take over ownership...
809  throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
810  }
811 
812  if (saveDeformationsToDB_) {
813  edm::LogInfo("Alignment") << "Writing AlignmentSurfaceDeformations to "
814  << surfaceDeformationRcd << ".";
815  poolDb->writeOne<AlignmentSurfaceDeformations>(alignmentSurfaceDeformations, poolDb->beginOfTime(),
816  surfaceDeformationRcd);
817  } else { // poolDb->writeOne(..) takes over 'surfaceDeformation' ownership,...
818  delete alignmentSurfaceDeformations; // ...otherwise we have to delete, as promised!
819  }
820 }
821 
std::vector< Alignable * > Alignables
align::Scalar width() const
AlignmentProducer(const edm::ParameterSet &iConfig)
Constructor.
virtual void beginLuminosityBlock(const edm::EventSetup &setup)
called at begin of luminosity block (no lumi block info passed yet)
virtual void beginRun(const edm::EventSetup &setup)
called at begin of run
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:180
bool getByLabel(std::string const &label, Handle< PROD > &result) const
Definition: Run.h:174
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
virtual void terminate()=0
Call at end of job (must be implemented in derived class)
const bool applyDbDeformations_
AlignmentErrors * dtAlignmentErrors()
boost::shared_ptr< TrackerGeometry > theTracker
virtual void rotateInLocalFrame(const RotationType &rotation)
Rotation intepreted in the local reference frame.
Definition: Alignable.cc:89
const bool doMisalignmentScenario_
RunID const & id() const
Definition: RunBase.h:43
virtual void run(const edm::EventSetup &setup, const EventInfo &eventInfo)=0
Run the algorithm (must be implemented in derived class)
Builds a scenario from configuration and applies it to the alignable Muon.
AlignmentAlgorithmBase * theAlignmentAlgo
~AlignmentProducer()
Destructor.
virtual boost::shared_ptr< TrackerGeometry > produceTracker(const TrackerDigiGeometryRecord &iRecord)
Produce the tracker geometry.
Class to update a given geometry with a set of alignments.
void simpleMisalignment_(const Alignables &alivec, const std::string &selection, float shift, float rot, bool local)
Apply random shifts and rotations to selected alignables, according to configuration.
void readInSurveyRcds(const edm::EventSetup &)
read in survey records
ErrorMatrix matrix() const
Definition: SurveyError.h:72
virtual boost::shared_ptr< DTGeometry > produceDT(const MuonGeometryRecord &iRecord)
Produce the muon DT geometry.
virtual void endLuminosityBlock(const edm::EventSetup &setup)
called at end of luminosity block (no lumi block info passed yet)
virtual void beginRun(const edm::Run &run, const edm::EventSetup &setup)
Called at run start and calling algorithms beginRun.
#define abs(x)
Definition: mlp_lapack.h:159
#define DEFINE_FWK_LOOPER(type)
Definition: LooperFactory.h:99
virtual Status endOfLoop(const edm::EventSetup &, unsigned int iLoop)
Called at end of loop.
edm::ParameterSet theParameterSet
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
void setWidth(align::Scalar width)
TRandom random
Definition: MVATrainer.cc:138
const edm::InputTag tkLasBeamTag_
const Alignments * theSurveyValues
void addSurveyInfo_(Alignable *)
Add survey info to an alignable.
uint8_t structureType() const
Definition: SurveyError.h:62
void createGeometries_(const edm::EventSetup &)
Create tracker and muon geometries.
virtual Alignables components() const =0
Return vector of all direct components.
std::vector< AlignTransform > m_align
Definition: Alignments.h:14
std::string encode() const
Definition: InputTag.cc:72
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
Definition: Alignable.h:57
void removeGlobalTransform(const Alignments *alignments, const AlignmentErrors *alignmentErrors, const AlignTransform &globalCoordinates, Alignments *newAlignments, AlignmentErrors *newAlignmentErrors)
void setWhatProduced(T *iThis, const es::Label &iLabel=es::Label())
Definition: ESProducer.h:115
const bool applyDbAlignment_
tuple s2
Definition: indexGen.py:106
virtual void endRun(const EndRunInfo &runInfo, const edm::EventSetup &setup)
called at end of run - order of arguments like in EDProducer etc.
void build(boost::shared_ptr< CSCGeometry > geom, const DDCompactView *fv, const MuonDDDConstants &muonConstants)
Build the geometry.
void setLength(align::Scalar length)
const unsigned int theMaxLoops
AlignableExtras * theAlignableExtras
Alignments * dtAlignments()
boost::shared_ptr< CSCGeometry > theMuonCSC
std::vector< Alignable * > CSCEndcaps()
const edm::InputTag clusterValueMapTag_
void attachSurfaceDeformations(C *geometry, const AlignmentSurfaceDeformations *surfaceDeformations)
bool isAvailable() const
Definition: Service.h:47
unsigned int theSurveyIndex
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
AlignmentErrors * alignmentErrors() const
Return alignment errors, sorted by DetId.
AlignmentErrors * cscAlignmentErrors()
std::vector< AlignmentMonitorBase * > theMonitors
void applyAlignments(C *geometry, const Alignments *alignments, const AlignmentErrors *alignmentErrors, const AlignTransform &globalCoordinates)
virtual void startingNewLoop(unsigned int iLoop)
Called at beginning of loop.
AlignmentParameterStore * theAlignmentParameterStore
align::ID rawId() const
Definition: SurveyError.h:67
void writeOne(T *payload, Time_t time, const std::string &recordName, bool withlogging=false)
AlignmentSurfaceDeformations * surfaceDeformations() const
Return surface deformations, sorted by DetId.
Definition: Alignable.cc:214
virtual void initialize(const edm::EventSetup &setup, AlignableTracker *tracker, AlignableMuon *muon, AlignableExtras *extras, AlignmentParameterStore *store)=0
Call at beginning of job (must be implemented in derived class)
void applyScenario(const edm::ParameterSet &scenario)
Apply misalignment scenario to the tracker.
boost::shared_ptr< DTGeometry > theMuonDT
void initializeBeamSpot(double x, double y, double z, double dxdz, double dydz)
Initialize the alignable beam spot with the given parameters.
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
const edm::InputTag beamSpotTag_
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
virtual void endRun(const edm::Run &run, const edm::EventSetup &setup)
Called at run end - currently reading TkFittedLasBeam if an InpuTag is given for that.
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
Definition: Alignable.h:126
const SurveyErrors * theSurveyErrors
const edm::InputTag tjTkAssociationMapTag_
edm::ESWatcher< TrackerSurveyErrorRcd > watchTkSurveyErrRcd_
virtual Status duringLoop(const edm::Event &event, const edm::EventSetup &setup)
Called at each event.
std::vector< Alignable * > DTBarrel()
Definition: DetId.h:20
AlignableMuon * theAlignableMuon
const bool saveDeformationsToDB_
virtual void endOfJob()
Called at end of job.
AlgebraicVector EulerAngles
Definition: Definitions.h:36
align::Scalar length() const
const double stRandomShift_
virtual void beginOfJob()
Definition: EDLooperBase.cc:74
Transform transform() const
void build(boost::shared_ptr< DTGeometry > theGeometry, const DDCompactView *cview, const MuonDDDConstants &muonConstants)
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
void setSurvey(const SurveyDet *)
Set survey info.
Definition: Alignable.cc:243
const T & get() const
Definition: EventSetup.h:55
virtual void endLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &setup)
Called at lumi block end, calling algorithm&#39;s endLuminosityBlock.
std::vector< ConstTrajTrackPair > ConstTrajTrackPairCollection
Alignments * cscAlignments()
TrackerGeometry * build(const GeometricDet *gd)
void dump(void) const
define run information passed to algorithms (in endRun)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:59
void writeDB(Alignments *alignments, const std::string &alignRcd, AlignmentErrors *alignmentErrors, const std::string &errRcd, const AlignTransform *globalCoordinates) const
ESHandle< TrackerGeometry > geometry
edm::EventID id() const
Definition: EventBase.h:56
virtual boost::shared_ptr< CSCGeometry > produceCSC(const MuonGeometryRecord &iRecord)
Produce the muon CSC geometry.
edm::ESWatcher< TrackerSurveyRcd > watchTkSurveyRcd_
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
AlignableTracker * theAlignableTracker
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
Definition: Utilities.cc:40
virtual void beginLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &setup)
Called at lumi block start, calling algorithm&#39;s beginLuminosityBlock.
std::vector< char > convertParamSel(const std::string &selString) const
Converting std::string into std::vector&lt;char&gt;
static unsigned int const shift
void applyDB(G *geometry, const edm::EventSetup &iSetup, const AlignTransform &globalPosition) const
const AlignTransform & DetectorGlobalPosition(const Alignments &allGlobals, const DetId &id)
Alignments * alignments() const
Return alignments, sorted by DetId.
std::vector< SurveyError > m_surveyErrors
Definition: SurveyErrors.h:21
std::pair< const Trajectory *, const reco::Track * > ConstTrajTrackPair
Builds a scenario from configuration and applies it to the alignable tracker.
const Alignments * globalPositions_
GlobalPositions that might be read from DB, NULL otherwise.
void applyScenario(const edm::ParameterSet &scenario)
Apply misalignment scenario to the Muon.
T get(const Candidate &c)
Definition: component.h:56
const double stRandomRotation_
Definition: Run.h:31
define event information passed to algorithms