CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
MillePedeAlignmentAlgorithm Class Reference

#include <MillePedeAlignmentAlgorithm.h>

Inheritance diagram for MillePedeAlignmentAlgorithm:
AlignmentAlgorithmBase

Public Member Functions

bool addCalibrations (const std::vector< IntegratedCalibrationBase * > &iCals) override
 Pass integrated calibrations to Millepede (they are not owned by Millepede!) More...
 
void beginLuminosityBlock (const edm::EventSetup &) override
 called at begin of luminosity block (resets Mille binary in mille mode) More...
 
void beginRun (const edm::Run &run, const edm::EventSetup &setup, bool changed) override
 called at begin of run More...
 
void endLuminosityBlock (const edm::EventSetup &) override
 called at end of luminosity block More...
 
virtual void endRun (const EventInfo &, const EndRunInfo &, const edm::EventSetup &)
 Run on run products, e.g. TkLAS. More...
 
void endRun (const EndRunInfo &runInfo, const edm::EventSetup &setup) override
 called at end of run - order of arguments like in EDProducer etc. More...
 
void initialize (const edm::EventSetup &setup, AlignableTracker *tracker, AlignableMuon *muon, AlignableExtras *extras, AlignmentParameterStore *store) override
 Called at beginning of job. More...
 
 MillePedeAlignmentAlgorithm (const edm::ParameterSet &cfg, edm::ConsumesCollector &iC)
 Constructor. More...
 
bool processesEvents () override
 Returns whether MP should process events in the current configuration. More...
 
void run (const edm::EventSetup &setup, const EventInfo &eventInfo) override
 Run the algorithm on trajectories and tracks. More...
 
bool setParametersForRunRange (const RunRange &runrange) override
 
bool storeAlignments () override
 Returns whether MP produced results to be stored. More...
 
virtual bool storeThresholds (const int &nRecords, const AlignPCLThresholds::threshold_map &thresholdMap)
 
bool supportsCalibrations () override
 Returns whether MP supports calibrations. More...
 
void terminate (const edm::EventSetup &iSetup) override
 Called at end of job. More...
 
void terminate () override
 Called at end of job. More...
 
 ~MillePedeAlignmentAlgorithm () override
 Destructor. More...
 
- Public Member Functions inherited from AlignmentAlgorithmBase
virtual bool addCalibrations (const Calibrations &)
 
bool addCalibrations (const CalibrationsOwner &cals)
 
 AlignmentAlgorithmBase (const edm::ParameterSet &, const edm::ConsumesCollector &)
 Constructor. More...
 
virtual void startNewLoop ()
 
virtual ~AlignmentAlgorithmBase ()
 Destructor. More...
 

Private Types

enum  EModeBit { myMilleBit = 1 << 0, myPedeRunBit = 1 << 1, myPedeSteerBit = 1 << 2, myPedeReadBit = 1 << 3 }
 
enum  MeasurementDirection { kLocalX = 0, kLocalY }
 

Private Member Functions

int addGlobalData (const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iHit, gbl::GblPoint &gblPoint)
 
unsigned int addHitCount (const std::vector< AlignmentParameters * > &parVec, const std::vector< bool > &validHitVecY) const
 
bool addHits (const align::Alignables &alis, const std::vector< AlignmentUserVariables * > &mpVars) const
 
bool addHitStatistics (int fromLoop, const std::string &outFile, const std::vector< std::string > &inFiles) const
 
void addLasBeam (const EventInfo &eventInfo, const TkFittedLasBeam &lasBeam, const std::vector< TrajectoryStateOnSurface > &tsoses)
 
void addLaserData (const EventInfo &eventInfo, const TkFittedLasBeamCollection &tkLasBeams, const TsosVectorCollection &tkLasBeamTsoses)
 
int addMeasurementData (const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iHit, AlignmentParameters *&params)
 
void addPxbSurvey (const edm::ParameterSet &pxbSurveyCfg)
 add measurement data from PXB survey More...
 
std::pair< unsigned int,
unsigned int > 
addReferenceTrajectory (const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr)
 fill mille for a trajectory, returning number of x/y hits ([0,0] if 'bad' trajectory) More...
 
template<typename CovarianceMatrix , typename ResidualMatrix , typename LocalDerivativeMatrix >
void addRefTrackData2D (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM)
 adds data from reference trajectory from a specific Hit More...
 
template<typename CovarianceMatrix , typename ResidualMatrix , typename LocalDerivativeMatrix >
void addRefTrackVirtualMeas1D (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iVirtualMeas, Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM)
 adds data for a specific virtual measurement from reference trajectory More...
 
void addVirtualMeas (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iVirtualMeas)
 adds data for virtual measurements from reference trajectory More...
 
bool areEmptyParams (const align::Alignables &alignables) const
 
bool areIOVsSpecified () const
 
void buildUserVariables (const align::Alignables &alignables) const
 add MillePedeVariables for each AlignmentParameters (exception if no parameters...) More...
 
int callMille (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesX, const std::vector< float > &globalDerivativesY)
 calls callMille1D or callMille2D More...
 
int callMille1D (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesX)
 calls Mille for 1D hits More...
 
int callMille2D (const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy)
 
unsigned int decodeMode (const std::string &mode) const
 
template<typename CovarianceMatrix , typename LocalDerivativeMatrix , typename ResidualMatrix , typename GlobalDerivativeMatrix >
void diagonalize (Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< GlobalDerivativeMatrix > &aGlobalDerivativesM) const
 
unsigned int doIO (int loop) const
 
std::vector< std::string > getExistingFormattedFiles (const std::vector< std::string > &plainFiles, const std::string &theDir)
 
void globalDerivativesCalibration (const TransientTrackingRecHit::ConstRecHitPointer &recHit, const TrajectoryStateOnSurface &tsos, const edm::EventSetup &setup, const EventInfo &eventInfo, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels) const
 adding derivatives from integrated calibrations More...
 
bool globalDerivativesHierarchy (const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
 recursively adding derivatives and labels, false if problems More...
 
bool globalDerivativesHierarchy (const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< double > &globalDerivativesX, std::vector< double > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
 recursively adding derivatives (double) and labels, false if problems More...
 
bool is2D (const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
 true if hit belongs to 2D detector (currently tracker specific) More...
 
bool isMode (unsigned int testMode) const
 
template<typename GlobalDerivativeMatrix >
void makeGlobDerivMatrix (const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy, Eigen::MatrixBase< GlobalDerivativeMatrix > &aGlobalDerivativesM)
 
bool readFromPede (const edm::ParameterSet &mprespset, bool setUserVars, const RunRange &runrange)
 read pede input defined by 'psetName', flag to create/not create MillePedeVariables More...
 

Private Attributes

const edm::ESGetToken
< AlignPCLThresholds,
AlignPCLThresholdsRcd
aliThrToken_
 
std::vector< align::RunNumbercachedRuns_
 
const bool enableAlignableUpdates_
 
const bool enforceSingleIOVInput_
 
const align::RunNumber firstIOV_
 
const bool ignoreFirstIOVCheck_
 
const bool ignoreHitsWithoutGlobalDerivatives_
 
align::RunNumber lastProcessedRun_
 
const bool runAtPCL_
 
const bool skipGlobalPositionRcdCheck_
 
std::unique_ptr
< AlignableNavigator
theAlignableNavigator
 
align::Alignables theAlignables
 
AlignmentParameterStoretheAlignmentParameterStore
 directory for all kind of files More...
 
std::unique_ptr< gbl::MilleBinary > theBinary
 
std::vector
< IntegratedCalibrationBase * > 
theCalibrations
 
edm::ParameterSet theConfig
 
std::string theDir
 
bool theDoSurveyPixelBarrel
 
std::vector< float > theFloatBufferX
 
std::vector< float > theFloatBufferY
 
bool theGblDoubleBinary
 
std::vector< int > theIntBuffer
 
int theLastWrittenIov
 
double theMaximalCor2D
 
std::unique_ptr< MilletheMille
 
unsigned int theMinNumHits
 
unsigned int theMode
 
std::unique_ptr< MillePedeMonitortheMonitor
 
std::shared_ptr< PedeLabelerBasethePedeLabels
 
std::unique_ptr< PedeSteererthePedeSteer
 
std::shared_ptr
< AlignPCLThresholds
theThresholds
 
std::unique_ptr
< TrajectoryFactoryBase
theTrajectoryFactory
 
const edm::ESGetToken
< TrackerTopology,
TrackerTopologyRcd
topoToken_
 
const align::RunRanges uniqueRunRanges_
 

Additional Inherited Members

- Public Types inherited from AlignmentAlgorithmBase
typedef std::pair< const
Trajectory *, const
reco::Track * > 
ConstTrajTrackPair
 
typedef std::vector
< ConstTrajTrackPair
ConstTrajTrackPairCollection
 
using RunNumber = align::RunNumber
 
using RunRange = align::RunRange
 

Detailed Description

CMSSW interface to pede: produces pede's binary input and steering file(s)

Author
: Gero Flucke date : October 2006
Revision:
1.36
Date:
2012/08/10 09:01:11

(last update by

Author:
flucke

)

Definition at line 59 of file MillePedeAlignmentAlgorithm.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

MillePedeAlignmentAlgorithm::MillePedeAlignmentAlgorithm ( const edm::ParameterSet cfg,
edm::ConsumesCollector iC 
)

Constructor.

Definition at line 87 of file MillePedeAlignmentAlgorithm.cc.

References edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), isMode(), myMilleBit, AlCaHLTBitMon_QueryRunRegistry::string, theBinary, theConfig, theDir, theGblDoubleBinary, and theMille.

88  : AlignmentAlgorithmBase(cfg, iC),
91  theConfig(cfg),
95  theAlignables(),
98  .getParameter<std::string>("TrajectoryFactoryName"),
99  theConfig.getParameter<edm::ParameterSet>("TrajectoryFactory"),
100  iC)),
101  theMinNumHits(cfg.getParameter<unsigned int>("minNumHits")),
102  theMaximalCor2D(cfg.getParameter<double>("max2Dcorrelation")),
104  ignoreFirstIOVCheck_(cfg.getUntrackedParameter<bool>("ignoreFirstIOVCheck")),
105  enableAlignableUpdates_(cfg.getUntrackedParameter<bool>("enableAlignableUpdates")),
107  theGblDoubleBinary(cfg.getParameter<bool>("doubleBinary")),
108  runAtPCL_(cfg.getParameter<bool>("runAtPCL")),
109  ignoreHitsWithoutGlobalDerivatives_(cfg.getParameter<bool>("ignoreHitsWithoutGlobalDerivatives")),
110  skipGlobalPositionRcdCheck_(cfg.getParameter<bool>("skipGlobalPositionRcdCheck")),
115  if (!theDir.empty() && theDir.find_last_of('/') != theDir.size() - 1)
116  theDir += '/'; // may need '/'
117  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm"
118  << "Start in mode '" << theConfig.getUntrackedParameter<std::string>("mode")
119  << "' with output directory '" << theDir << "'.";
120  if (this->isMode(myMilleBit)) {
121  theMille = std::make_unique<Mille>(
122  (theDir + theConfig.getParameter<std::string>("binaryFile")).c_str()); // add ', false);' for text output);
123  // use same file for GBL
124  theBinary = std::make_unique<MilleBinary>((theDir + theConfig.getParameter<std::string>("binaryFile")).c_str(),
126  }
127 }
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:16
T getUntrackedParameter(std::string const &, T const &) const
Time_t beginValue
Definition: Time.h:41
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:34
std::unique_ptr< TrajectoryFactoryBase > theTrajectoryFactory
std::unique_ptr< gbl::MilleBinary > theBinary
bool isMode(unsigned int testMode) const
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
RunRanges makeUniqueRunRanges(const edm::VParameterSet &runRanges, const RunNumber &defaultRun)
Definition: Utilities.cc:241
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
AlignmentAlgorithmBase(const edm::ParameterSet &, const edm::ConsumesCollector &)
Constructor.
Log< level::Info, false > LogInfo
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
const edm::ESGetToken< AlignPCLThresholds, AlignPCLThresholdsRcd > aliThrToken_
unsigned int decodeMode(const std::string &mode) const
#define get
MillePedeAlignmentAlgorithm::~MillePedeAlignmentAlgorithm ( )
override

Destructor.

Definition at line 131 of file MillePedeAlignmentAlgorithm.cc.

131 {}

Member Function Documentation

bool MillePedeAlignmentAlgorithm::addCalibrations ( const std::vector< IntegratedCalibrationBase * > &  iCals)
override

Pass integrated calibrations to Millepede (they are not owned by Millepede!)

Definition at line 296 of file MillePedeAlignmentAlgorithm.cc.

References theCalibrations, and thePedeLabels.

296  {
297  theCalibrations.insert(theCalibrations.end(), iCals.begin(), iCals.end());
298  thePedeLabels->addCalibrations(iCals);
299  return true;
300 }
std::shared_ptr< PedeLabelerBase > thePedeLabels
std::vector< IntegratedCalibrationBase * > theCalibrations
int MillePedeAlignmentAlgorithm::addGlobalData ( const edm::EventSetup setup,
const EventInfo eventInfo,
const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iHit,
gbl::GblPoint &  gblPoint 
)
private

Add global data (labels, derivatives) to GBL trajectory Returns -1 if any problem (for params cf. globalDerivativesHierarchy)

Definition at line 777 of file MillePedeAlignmentAlgorithm.cc.

References globalDerivativesHierarchy(), mps_fire::i, submitPVValidationJobs::params, theAlignableNavigator, theCalibrations, theIntBuffer, and thePedeLabels.

Referenced by addReferenceTrajectory().

781  {
782  AlignmentParameters *params = nullptr;
783  std::vector<double> theDoubleBufferX, theDoubleBufferY;
784  theDoubleBufferX.clear();
785  theDoubleBufferY.clear();
786  theIntBuffer.clear();
787  int iret = 0;
788 
789  const TrajectoryStateOnSurface &tsos = refTrajPtr->trajectoryStates()[iHit];
790  const ConstRecHitPointer &recHitPtr = refTrajPtr->recHits()[iHit];
791  // ignore invalid hits
792  if (!recHitPtr->isValid())
793  return 0;
794 
795  // get AlignableDet/Unit for this hit
796  AlignableDetOrUnitPtr alidet(theAlignableNavigator->alignableFromDetId(recHitPtr->geographicalId()));
797 
798  if (!this->globalDerivativesHierarchy(eventInfo,
799  tsos,
800  alidet,
801  alidet,
802  theDoubleBufferX, // 2x alidet, sic!
803  theDoubleBufferY,
804  theIntBuffer,
805  params)) {
806  return -1; // problem
807  }
808  //calibration parameters
809  int globalLabel;
810  std::vector<IntegratedCalibrationBase::ValuesIndexPair> derivs;
811  for (auto iCalib = theCalibrations.begin(); iCalib != theCalibrations.end(); ++iCalib) {
812  // get all derivatives of this calibration // const unsigned int num =
813  (*iCalib)->derivatives(derivs, *recHitPtr, tsos, setup, eventInfo);
814  for (auto iValuesInd = derivs.begin(); iValuesInd != derivs.end(); ++iValuesInd) {
815  // transfer label and x/y derivatives
816  globalLabel = thePedeLabels->calibrationLabel(*iCalib, iValuesInd->second);
817  if (globalLabel > 0 && globalLabel <= 2147483647) {
818  theIntBuffer.push_back(globalLabel);
819  theDoubleBufferX.push_back(iValuesInd->first.first);
820  theDoubleBufferY.push_back(iValuesInd->first.second);
821  } else {
822  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addGlobalData"
823  << "Invalid label " << globalLabel << " <= 0 or > 2147483647";
824  }
825  }
826  }
827  unsigned int numGlobals = theIntBuffer.size();
828  if (numGlobals > 0) {
829  Eigen::Matrix<double, 2, Eigen::Dynamic> globalDer{2, numGlobals};
830  for (unsigned int i = 0; i < numGlobals; ++i) {
831  globalDer(0, i) = theDoubleBufferX[i];
832  globalDer(1, i) = theDoubleBufferY[i];
833  }
834  gblPoint.addGlobals(theIntBuffer, globalDer);
835  iret = 1;
836  }
837  return iret;
838 }
bool globalDerivativesHierarchy(const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
recursively adding derivatives and labels, false if problems
std::shared_ptr< PedeLabelerBase > thePedeLabels
Log< level::Error, false > LogError
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::vector< IntegratedCalibrationBase * > theCalibrations
std::unique_ptr< AlignableNavigator > theAlignableNavigator
unsigned int MillePedeAlignmentAlgorithm::addHitCount ( const std::vector< AlignmentParameters * > &  parVec,
const std::vector< bool > &  validHitVecY 
) const
private

Increase hit counting of MillePedeVariables behind each parVec[i] (and also for parameters higher in hierarchy), assuming 'parVec' and 'validHitVecY' to be parallel. Returns number of valid y-hits.

Definition at line 592 of file MillePedeAlignmentAlgorithm.cc.

References Alignable::alignmentParameters(), MillePedeVariables::increaseHitsX(), MillePedeVariables::increaseHitsY(), Alignable::mother(), and AlignmentParameters::userVariables().

Referenced by addReferenceTrajectory().

593  {
594  // Loop on all hit information in the input arrays and count valid y-hits:
595  unsigned int nHitY = 0;
596  for (unsigned int iHit = 0; iHit < validHitVecY.size(); ++iHit) {
597  Alignable *ali = (parVec[iHit] ? parVec[iHit]->alignable() : nullptr);
598  // Loop upwards on hierarchy of alignables to add hits to all levels
599  // that are currently aligned. If only a non-selected alignable was hit,
600  // (i.e. flagXY == 0 in addReferenceTrajectory(..)), there is no loop at all...
601  while (ali) {
603  if (pars) { // otherwise hierarchy level not selected
604  // cast ensured by previous checks:
605  MillePedeVariables *mpVar = static_cast<MillePedeVariables *>(pars->userVariables());
606  // every hit has an x-measurement, cf. addReferenceTrajectory(..):
607  mpVar->increaseHitsX();
608  if (validHitVecY[iHit]) {
609  mpVar->increaseHitsY();
610  if (pars == parVec[iHit])
611  ++nHitY; // do not count hits twice
612  }
613  }
614  ali = ali->mother();
615  }
616  }
617 
618  return nHitY;
619 }
void increaseHitsX(unsigned int add=1)
increase hits for x-measurement
void increaseHitsY(unsigned int add=1)
increase hits for y-measurement
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
Definition: Alignable.h:58
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
Alignable * mother() const
Return pointer to container alignable (if any)
Definition: Alignable.h:91
bool MillePedeAlignmentAlgorithm::addHits ( const align::Alignables alis,
const std::vector< AlignmentUserVariables * > &  mpVars 
) const
private

Definition at line 1222 of file MillePedeAlignmentAlgorithm.cc.

References MillePedeVariables::hitsX(), MillePedeVariables::hitsY(), MillePedeVariables::increaseHitsX(), MillePedeVariables::increaseHitsY(), MillePedeVariables::size(), and AlignmentParameters::userVariables().

Referenced by addHitStatistics().

1223  {
1224  bool allOk = (mpVars.size() == alis.size());
1225  std::vector<AlignmentUserVariables *>::const_iterator iUser = mpVars.begin();
1226  for (auto iAli = alis.cbegin(); iAli != alis.cend() && iUser != mpVars.end(); ++iAli, ++iUser) {
1227  MillePedeVariables *mpVarNew = dynamic_cast<MillePedeVariables *>(*iUser);
1228  AlignmentParameters *ps = (*iAli)->alignmentParameters();
1229  MillePedeVariables *mpVarOld = (ps ? dynamic_cast<MillePedeVariables *>(ps->userVariables()) : nullptr);
1230  if (!mpVarNew || !mpVarOld || mpVarOld->size() != mpVarNew->size()) {
1231  allOk = false;
1232  continue; // FIXME error etc.?
1233  }
1234 
1235  mpVarOld->increaseHitsX(mpVarNew->hitsX());
1236  mpVarOld->increaseHitsY(mpVarNew->hitsY());
1237  }
1238 
1239  return allOk;
1240 }
unsigned int hitsX() const
get number of hits for x-measurement
unsigned int size() const
number of parameters
void increaseHitsX(unsigned int add=1)
increase hits for x-measurement
void increaseHitsY(unsigned int add=1)
increase hits for y-measurement
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
unsigned int hitsY() const
get number of hits for y-measurement
bool MillePedeAlignmentAlgorithm::addHitStatistics ( int  fromLoop,
const std::string &  outFile,
const std::vector< std::string > &  inFiles 
) const
private

Definition at line 1197 of file MillePedeAlignmentAlgorithm.cc.

References addHits(), mps_fire::i, MillePedeVariablesIORoot::readMillePedeVariables(), AlCaHLTBitMon_QueryRunRegistry::string, theAlignables, and theDir.

Referenced by doIO().

1199  {
1200  bool allOk = true;
1201  int ierr = 0;
1202  MillePedeVariablesIORoot millePedeIO;
1203  for (std::vector<std::string>::const_iterator iFile = inFiles.begin(); iFile != inFiles.end(); ++iFile) {
1204  const std::string inFile(theDir + *iFile);
1205  const std::vector<AlignmentUserVariables *> mpVars =
1206  millePedeIO.readMillePedeVariables(theAlignables, inFile.c_str(), fromIov, ierr);
1207  if (ierr || !this->addHits(theAlignables, mpVars)) {
1208  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addHitStatistics"
1209  << "Error " << ierr << " reading from " << inFile << ", tree " << fromIov
1210  << ", or problems in addHits";
1211  allOk = false;
1212  }
1213  for (std::vector<AlignmentUserVariables *>::const_iterator i = mpVars.begin(); i != mpVars.end(); ++i) {
1214  delete *i; // clean created objects
1215  }
1216  }
1217 
1218  return allOk;
1219 }
Log< level::Error, false > LogError
bool addHits(const align::Alignables &alis, const std::vector< AlignmentUserVariables * > &mpVars) const
std::vector< AlignmentUserVariables * > readMillePedeVariables(const align::Alignables &alivec, const char *filename, int iter, int &ierr)
void MillePedeAlignmentAlgorithm::addLasBeam ( const EventInfo eventInfo,
const TkFittedLasBeam lasBeam,
const std::vector< TrajectoryStateOnSurface > &  tsoses 
)
private

Definition at line 1526 of file MillePedeAlignmentAlgorithm.cc.

References funct::derivative(), TkFittedLasBeam::derivatives(), relativeConstraints::error, TkFittedLasBeam::firstFixedParameter(), TkLasBeam::getBeamId(), TkLasBeam::getData(), SiStripLaserRecHit2D::getDetId(), globalDerivativesHierarchy(), sistrip::SpyUtilities::isValid(), SiStripLaserRecHit2D::localPosition(), TkFittedLasBeam::parameters(), theAlignableNavigator, theFloatBufferX, theFloatBufferY, theIntBuffer, theMille, and thePedeLabels.

Referenced by addLaserData().

1528  {
1529  AlignmentParameters *dummyPtr = nullptr; // for globalDerivativesHierarchy()
1530  std::vector<float> lasLocalDerivsX; // buffer for local derivatives
1531  const unsigned int beamLabel = thePedeLabels->lasBeamLabel(lasBeam.getBeamId()); // for global par
1532 
1533  for (unsigned int iHit = 0; iHit < tsoses.size(); ++iHit) {
1534  if (!tsoses[iHit].isValid())
1535  continue;
1536  // clear buffer
1537  theFloatBufferX.clear();
1538  theFloatBufferY.clear();
1539  theIntBuffer.clear();
1540  lasLocalDerivsX.clear();
1541  // get alignables and global parameters
1542  const SiStripLaserRecHit2D &hit = lasBeam.getData()[iHit];
1543  AlignableDetOrUnitPtr lasAli(theAlignableNavigator->alignableFromDetId(hit.getDetId()));
1545  eventInfo, tsoses[iHit], lasAli, lasAli, theFloatBufferX, theFloatBufferY, theIntBuffer, dummyPtr);
1546  // fill derivatives vector from derivatives matrix
1547  for (unsigned int nFitParams = 0; nFitParams < static_cast<unsigned int>(lasBeam.parameters().size());
1548  ++nFitParams) {
1549  const float derivative = lasBeam.derivatives()[iHit][nFitParams];
1550  if (nFitParams < lasBeam.firstFixedParameter()) { // first local beam parameters
1551  lasLocalDerivsX.push_back(derivative);
1552  } else { // now global ones
1553  const unsigned int numPar = nFitParams - lasBeam.firstFixedParameter();
1554  theIntBuffer.push_back(thePedeLabels->parameterLabel(beamLabel, numPar));
1555  theFloatBufferX.push_back(derivative);
1556  }
1557  } // end loop over parameters
1558 
1559  const float residual = hit.localPosition().x() - tsoses[iHit].localPosition().x();
1560  // error from file or assume 0.003
1561  const float error = 0.003; // hit.localPositionError().xx(); sqrt???
1562 
1563  theMille->mille(lasLocalDerivsX.size(),
1564  &(lasLocalDerivsX[0]),
1565  theFloatBufferX.size(),
1566  &(theFloatBufferX[0]),
1567  &(theIntBuffer[0]),
1568  residual,
1569  error);
1570  } // end of loop over hits
1571 
1572  theMille->end();
1573 }
unsigned int firstFixedParameter() const
LocalPoint localPosition() const override
Derivative< X, A >::type derivative(const A &_)
Definition: Derivative.h:18
const bool isValid(const Frame &aFrame, const FrameQuality &aQuality, const uint16_t aExpectedPos)
bool globalDerivativesHierarchy(const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
recursively adding derivatives and labels, false if problems
std::shared_ptr< PedeLabelerBase > thePedeLabels
const AlgebraicMatrix & derivatives() const
matrix of local derivatives: columns are parameters, rows are hits
const std::vector< Scalar > & parameters() const
parallel to derivatives()
unsigned int getBeamId(void) const
return the full beam identifier
Definition: TkLasBeam.h:23
const SiStripDetId & getDetId(void) const
std::unique_ptr< AlignableNavigator > theAlignableNavigator
const std::vector< SiStripLaserRecHit2D > & getData(void) const
access the collection of hits
Definition: TkLasBeam.h:26
void MillePedeAlignmentAlgorithm::addLaserData ( const EventInfo eventInfo,
const TkFittedLasBeamCollection tkLasBeams,
const TsosVectorCollection tkLasBeamTsoses 
)
private

Definition at line 1509 of file MillePedeAlignmentAlgorithm.cc.

References addLasBeam().

Referenced by endRun().

1511  {
1512  TsosVectorCollection::const_iterator iTsoses = lasBeamTsoses.begin();
1513  for (TkFittedLasBeamCollection::const_iterator iBeam = lasBeams.begin(), iEnd = lasBeams.end(); iBeam != iEnd;
1514  ++iBeam, ++iTsoses) { // beam/tsoses parallel!
1515 
1516  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addLaserData"
1517  << "Beam " << iBeam->getBeamId() << " with " << iBeam->parameters().size()
1518  << " parameters and " << iBeam->getData().size() << " hits.\n There are "
1519  << iTsoses->size() << " TSOSes.";
1520 
1521  this->addLasBeam(eventInfo, *iBeam, *iTsoses);
1522  }
1523 }
void addLasBeam(const EventInfo &eventInfo, const TkFittedLasBeam &lasBeam, const std::vector< TrajectoryStateOnSurface > &tsoses)
Log< level::Info, false > LogInfo
int MillePedeAlignmentAlgorithm::addMeasurementData ( const edm::EventSetup setup,
const EventInfo eventInfo,
const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iHit,
AlignmentParameters *&  params 
)
private

If hit is usable: callMille for x and (probably) y direction. If globalDerivatives fine: returns 2 if 2D-hit, 1 if 1D-hit, 0 if no Alignable for hit. Returns -1 if any problem (for params cf. globalDerivativesHierarchy)

Definition at line 728 of file MillePedeAlignmentAlgorithm.cc.

References callMille(), globalDerivativesCalibration(), globalDerivativesHierarchy(), ignoreHitsWithoutGlobalDerivatives_, theAlignableNavigator, theFloatBufferX, theFloatBufferY, and theIntBuffer.

Referenced by addReferenceTrajectory().

732  {
733  params = nullptr;
734  theFloatBufferX.clear();
735  theFloatBufferY.clear();
736  theIntBuffer.clear();
737 
738  const TrajectoryStateOnSurface &tsos = refTrajPtr->trajectoryStates()[iHit];
739  const ConstRecHitPointer &recHitPtr = refTrajPtr->recHits()[iHit];
740  // ignore invalid hits
741  if (!recHitPtr->isValid())
742  return 0;
743 
744  // First add the derivatives from IntegratedCalibration's,
745  // should even be OK if problems for "usual" derivatives from Alignables
746  this->globalDerivativesCalibration(recHitPtr,
747  tsos,
748  setup,
749  eventInfo, // input
752  theIntBuffer); // output
753 
754  // get AlignableDet/Unit for this hit
755  AlignableDetOrUnitPtr alidet(theAlignableNavigator->alignableFromDetId(recHitPtr->geographicalId()));
756 
757  if (!this->globalDerivativesHierarchy(eventInfo,
758  tsos,
759  alidet,
760  alidet,
761  theFloatBufferX, // 2x alidet, sic!
763  theIntBuffer,
764  params)) {
765  return -1; // problem
767  return 0; // empty for X: no alignable for hit, nor calibrations
768  } else {
769  // store measurement even if no alignable or calibrations
770  // -> measurement used for pede-internal track-fit
771  return this->callMille(refTrajPtr, iHit, theIntBuffer, theFloatBufferX, theFloatBufferY);
772  }
773 }
void globalDerivativesCalibration(const TransientTrackingRecHit::ConstRecHitPointer &recHit, const TrajectoryStateOnSurface &tsos, const edm::EventSetup &setup, const EventInfo &eventInfo, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels) const
adding derivatives from integrated calibrations
bool globalDerivativesHierarchy(const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
recursively adding derivatives and labels, false if problems
int callMille(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesX, const std::vector< float > &globalDerivativesY)
calls callMille1D or callMille2D
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::unique_ptr< AlignableNavigator > theAlignableNavigator
void MillePedeAlignmentAlgorithm::addPxbSurvey ( const edm::ParameterSet pxbSurveyCfg)
private

add measurement data from PXB survey

Definition at line 1575 of file MillePedeAlignmentAlgorithm.cc.

References a, HLT_FULL_cff::chi2, SurveyPxbDicer::doDice(), lut2db_cfg::filename, edm::FileInPath::fullPath(), edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), mps_fire::i, dqmiolumiharvest::j, SurveyPxbImageLocalFit::nMsrmts, timingPdfMaker::outfile, DQM::reader, mathSSE::sqrt(), AlCaHLTBitMon_QueryRunRegistry::string, Alignable::surface(), theAlignableNavigator, theMille, theMonitor, thePedeLabels, AlignableSurface::toGlobal(), and AlignableSurface::toLocal().

Referenced by initialize().

1575  {
1576  // do some printing, if requested
1577  const bool doOutputOnStdout(pxbSurveyCfg.getParameter<bool>("doOutputOnStdout"));
1578  if (doOutputOnStdout) {
1579  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addPxbSurvey"
1580  << "# Output from addPxbSurvey follows below because "
1581  << "doOutputOnStdout is set to True";
1582  }
1583 
1584  // instantiate a dicer object
1585  SurveyPxbDicer dicer(pxbSurveyCfg.getParameter<std::vector<edm::ParameterSet> >("toySurveyParameters"),
1586  pxbSurveyCfg.getParameter<unsigned int>("toySurveySeed"));
1587  std::ofstream outfile(pxbSurveyCfg.getUntrackedParameter<std::string>("toySurveyFile").c_str());
1588 
1589  // read data from file
1590  std::vector<SurveyPxbImageLocalFit> measurements;
1591  std::string filename(pxbSurveyCfg.getParameter<edm::FileInPath>("infile").fullPath());
1593 
1594  // loop over photographs (=measurements) and perform the fit
1595  for (std::vector<SurveyPxbImageLocalFit>::size_type i = 0; i != measurements.size(); i++) {
1596  if (doOutputOnStdout) {
1597  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addPxbSurvey"
1598  << "Module " << i << ": ";
1599  }
1600 
1601  // get the Alignables and their surfaces
1602  AlignableDetOrUnitPtr mod1(theAlignableNavigator->alignableFromDetId(measurements[i].getIdFirst()));
1603  AlignableDetOrUnitPtr mod2(theAlignableNavigator->alignableFromDetId(measurements[i].getIdSecond()));
1604  const AlignableSurface &surf1 = mod1->surface();
1605  const AlignableSurface &surf2 = mod2->surface();
1606 
1607  // the position of the fiducial points in local frame of a PXB module
1608  const LocalPoint fidpoint0(-0.91, +3.30);
1609  const LocalPoint fidpoint1(+0.91, +3.30);
1610  const LocalPoint fidpoint2(+0.91, -3.30);
1611  const LocalPoint fidpoint3(-0.91, -3.30);
1612 
1613  // We choose the local frame of the first module as reference,
1614  // so take the fidpoints of the second module and calculate their
1615  // positions in the reference frame
1616  const GlobalPoint surf2point0(surf2.toGlobal(fidpoint0));
1617  const GlobalPoint surf2point1(surf2.toGlobal(fidpoint1));
1618  const LocalPoint fidpoint0inSurf1frame(surf1.toLocal(surf2point0));
1619  const LocalPoint fidpoint1inSurf1frame(surf1.toLocal(surf2point1));
1620 
1621  // Create the vector for the fit
1623  fidpointvec.push_back(fidpoint0inSurf1frame);
1624  fidpointvec.push_back(fidpoint1inSurf1frame);
1625  fidpointvec.push_back(fidpoint2);
1626  fidpointvec.push_back(fidpoint3);
1627 
1628  // if toy survey is requested, dice the values now
1629  if (pxbSurveyCfg.getParameter<bool>("doToySurvey")) {
1630  dicer.doDice(fidpointvec, measurements[i].getIdPair(), outfile);
1631  }
1632 
1633  // do the fit
1634  measurements[i].doFit(fidpointvec, thePedeLabels->alignableLabel(mod1), thePedeLabels->alignableLabel(mod2));
1635  SurveyPxbImageLocalFit::localpars_t a; // local pars from fit
1636  a = measurements[i].getLocalParameters();
1637  const SurveyPxbImageLocalFit::value_t chi2 = measurements[i].getChi2();
1638 
1639  // do some reporting, if requested
1640  if (doOutputOnStdout) {
1641  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::addPxbSurvey"
1642  << "a: " << a[0] << ", " << a[1] << ", " << a[2] << ", " << a[3]
1643  << " S= " << sqrt(a[2] * a[2] + a[3] * a[3]) << " phi= " << atan(a[3] / a[2])
1644  << " chi2= " << chi2 << std::endl;
1645  }
1646  if (theMonitor) {
1647  theMonitor->fillPxbSurveyHistsChi2(chi2);
1648  theMonitor->fillPxbSurveyHistsLocalPars(a[0], a[1], sqrt(a[2] * a[2] + a[3] * a[3]), atan(a[3] / a[2]));
1649  }
1650 
1651  // pass the results from the local fit to mille
1653  theMille->mille((int)measurements[i].getLocalDerivsSize(),
1654  measurements[i].getLocalDerivsPtr(j),
1655  (int)measurements[i].getGlobalDerivsSize(),
1656  measurements[i].getGlobalDerivsPtr(j),
1657  measurements[i].getGlobalDerivsLabelPtr(j),
1658  measurements[i].getResiduum(j),
1659  measurements[i].getSigma(j));
1660  }
1661  theMille->end();
1662  }
1663  outfile.close();
1664 }
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< MillePedeMonitor > theMonitor
std::vector< coord_t > fidpoint_t
std::shared_ptr< PedeLabelerBase > thePedeLabels
uint16_t size_type
align::RotationType toLocal(const align::RotationType &) const
Return in local frame a rotation given in global frame.
T sqrt(T t)
Definition: SSEVec.h:19
tuple reader
Definition: DQM.py:105
Log< level::Info, false > LogInfo
Class to hold one picture of the BPix survey.
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< value_t > localpars_t
double a
Definition: hdecay.h:119
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
tuple filename
Definition: lut2db_cfg.py:20
std::string fullPath() const
Definition: FileInPath.cc:161
static const count_t nMsrmts
std::unique_ptr< AlignableNavigator > theAlignableNavigator
std::pair< unsigned int, unsigned int > MillePedeAlignmentAlgorithm::addReferenceTrajectory ( const edm::EventSetup setup,
const EventInfo eventInfo,
const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr 
)
private

fill mille for a trajectory, returning number of x/y hits ([0,0] if 'bad' trajectory)

Definition at line 501 of file MillePedeAlignmentAlgorithm.cc.

References addGlobalData(), addHitCount(), addMeasurementData(), addVirtualMeas(), theBinary, theMille, and theMinNumHits.

Referenced by run().

502  {
503  std::pair<unsigned int, unsigned int> hitResultXy(0, 0);
504  if (refTrajPtr->isValid()) {
505  // GblTrajectory?
506  if (!refTrajPtr->gblInput().empty()) {
507  // by construction: number of GblPoints == number of recHits or == zero !!!
508  unsigned int iHit = 0;
509  unsigned int numPointsWithMeas = 0;
510  std::vector<GblPoint>::iterator itPoint;
511  auto theGblInput = refTrajPtr->gblInput();
512  for (unsigned int iTraj = 0; iTraj < refTrajPtr->gblInput().size(); ++iTraj) {
513  for (itPoint = refTrajPtr->gblInput()[iTraj].first.begin(); itPoint < refTrajPtr->gblInput()[iTraj].first.end();
514  ++itPoint) {
515  if (this->addGlobalData(setup, eventInfo, refTrajPtr, iHit++, *itPoint) < 0)
516  return hitResultXy;
517  if (itPoint->hasMeasurement() >= 1)
518  ++numPointsWithMeas;
519  }
520  }
521  hitResultXy.first = numPointsWithMeas;
522  // check #hits criterion
523  if (hitResultXy.first == 0 || hitResultXy.first < theMinNumHits)
524  return hitResultXy;
525  // construct GBL trajectory
526  if (refTrajPtr->gblInput().size() == 1) {
527  // from single track
528  GblTrajectory aGblTrajectory(refTrajPtr->gblInput()[0].first, refTrajPtr->nominalField() != 0);
529  // GBL fit trajectory
530  /*double Chi2;
531  int Ndf;
532  double lostWeight;
533  aGblTrajectory.fit(Chi2, Ndf, lostWeight);
534  std::cout << " GblFit: " << Chi2 << ", " << Ndf << ", " << lostWeight << std::endl; */
535  // write to MP binary file
536  if (aGblTrajectory.isValid() && aGblTrajectory.getNumPoints() >= theMinNumHits)
537  aGblTrajectory.milleOut(*theBinary);
538  }
539  if (refTrajPtr->gblInput().size() == 2) {
540  // from TwoBodyDecay
541  GblTrajectory aGblTrajectory(refTrajPtr->gblInput(),
542  refTrajPtr->gblExtDerivatives(),
543  refTrajPtr->gblExtMeasurements(),
544  refTrajPtr->gblExtPrecisions());
545  // write to MP binary file
546  if (aGblTrajectory.isValid() && aGblTrajectory.getNumPoints() >= theMinNumHits)
547  aGblTrajectory.milleOut(*theBinary);
548  }
549  } else {
550  // to add hits if all fine:
551  std::vector<AlignmentParameters *> parVec(refTrajPtr->recHits().size());
552  // collect hit statistics, assuming that there are no y-only hits
553  std::vector<bool> validHitVecY(refTrajPtr->recHits().size(), false);
554  // Use recHits from ReferenceTrajectory (since they have the right order!):
555  for (unsigned int iHit = 0; iHit < refTrajPtr->recHits().size(); ++iHit) {
556  const int flagXY = this->addMeasurementData(setup, eventInfo, refTrajPtr, iHit, parVec[iHit]);
557 
558  if (flagXY < 0) { // problem
559  hitResultXy.first = 0;
560  break;
561  } else { // hit is fine, increase x/y statistics
562  if (flagXY >= 1)
563  ++hitResultXy.first;
564  validHitVecY[iHit] = (flagXY >= 2);
565  }
566  } // end loop on hits
567 
568  // add virtual measurements
569  for (unsigned int iVirtualMeas = 0; iVirtualMeas < refTrajPtr->numberOfVirtualMeas(); ++iVirtualMeas) {
570  this->addVirtualMeas(refTrajPtr, iVirtualMeas);
571  }
572 
573  // kill or end 'track' for mille, depends on #hits criterion
574  if (hitResultXy.first == 0 || hitResultXy.first < theMinNumHits) {
575  theMille->kill();
576  hitResultXy.first = hitResultXy.second = 0; //reset
577  } else {
578  theMille->end();
579  // add x/y hit count to MillePedeVariables of parVec,
580  // returning number of y-hits of the reference trajectory
581  hitResultXy.second = this->addHitCount(parVec, validHitVecY);
582  //
583  }
584  }
585 
586  } // end if valid trajectory
587 
588  return hitResultXy;
589 }
std::unique_ptr< gbl::MilleBinary > theBinary
int addGlobalData(const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iHit, gbl::GblPoint &gblPoint)
unsigned int addHitCount(const std::vector< AlignmentParameters * > &parVec, const std::vector< bool > &validHitVecY) const
int addMeasurementData(const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iHit, AlignmentParameters *&params)
void addVirtualMeas(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iVirtualMeas)
adds data for virtual measurements from reference trajectory
template<typename CovarianceMatrix , typename ResidualMatrix , typename LocalDerivativeMatrix >
void MillePedeAlignmentAlgorithm::addRefTrackData2D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iTrajHit,
Eigen::MatrixBase< CovarianceMatrix > &  aHitCovarianceM,
Eigen::MatrixBase< ResidualMatrix > &  aHitResidualsM,
Eigen::MatrixBase< LocalDerivativeMatrix > &  aLocalDerivativesM 
)
private

adds data from reference trajectory from a specific Hit

Definition at line 1308 of file MillePedeAlignmentAlgorithm.cc.

References mps_fire::i.

Referenced by callMille2D().

1312  {
1313  // This Method is valid for 2D measurements only
1314 
1315  const unsigned int xIndex = iTrajHit * 2;
1316  const unsigned int yIndex = iTrajHit * 2 + 1;
1317 
1318  aHitCovarianceM(0, 0) = refTrajPtr->measurementErrors()[xIndex][xIndex];
1319  aHitCovarianceM(0, 1) = refTrajPtr->measurementErrors()[xIndex][yIndex];
1320  aHitCovarianceM(1, 0) = refTrajPtr->measurementErrors()[yIndex][xIndex];
1321  aHitCovarianceM(1, 1) = refTrajPtr->measurementErrors()[yIndex][yIndex];
1322 
1323  aHitResidualsM(0, 0) = refTrajPtr->measurements()[xIndex] - refTrajPtr->trajectoryPositions()[xIndex];
1324  aHitResidualsM(1, 0) = refTrajPtr->measurements()[yIndex] - refTrajPtr->trajectoryPositions()[yIndex];
1325 
1326  const auto &locDerivMatrix = refTrajPtr->derivatives();
1327  for (int i = 0; i < locDerivMatrix.num_col(); ++i) {
1328  aLocalDerivativesM(0, i) = locDerivMatrix[xIndex][i];
1329  aLocalDerivativesM(1, i) = locDerivMatrix[yIndex][i];
1330  }
1331 }
template<typename CovarianceMatrix , typename ResidualMatrix , typename LocalDerivativeMatrix >
void MillePedeAlignmentAlgorithm::addRefTrackVirtualMeas1D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iVirtualMeas,
Eigen::MatrixBase< CovarianceMatrix > &  aHitCovarianceM,
Eigen::MatrixBase< ResidualMatrix > &  aHitResidualsM,
Eigen::MatrixBase< LocalDerivativeMatrix > &  aLocalDerivativesM 
)
private

adds data for a specific virtual measurement from reference trajectory

Definition at line 1287 of file MillePedeAlignmentAlgorithm.cc.

References mps_fire::i.

Referenced by addVirtualMeas().

1292  {
1293  // This Method is valid for 1D measurements only
1294 
1295  const unsigned int xIndex = iVirtualMeas + refTrajPtr->numberOfHitMeas();
1296 
1297  aHitCovarianceM(0, 0) = refTrajPtr->measurementErrors()[xIndex][xIndex];
1298  aHitResidualsM(0, 0) = refTrajPtr->measurements()[xIndex];
1299 
1300  const auto &locDerivMatrix = refTrajPtr->derivatives();
1301  for (int i = 0; i < locDerivMatrix.num_col(); ++i) {
1302  aLocalDerivativesM(0, i) = locDerivMatrix[xIndex][i];
1303  }
1304 }
void MillePedeAlignmentAlgorithm::addVirtualMeas ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iVirtualMeas 
)
private

adds data for virtual measurements from reference trajectory

Definition at line 1481 of file MillePedeAlignmentAlgorithm.cc.

References addRefTrackVirtualMeas1D(), and theMille.

Referenced by addReferenceTrajectory().

1482  {
1483  Eigen::Matrix<double, 1, 1> aHitCovarianceM;
1484  Eigen::Matrix<float, 1, 1> aHitResidualsM;
1485  Eigen::Matrix<float, 1, Eigen::Dynamic> aLocalDerivativesM{1, refTrajPtr->derivatives().num_col()};
1486  // below method fills above 3 'matrices'
1487  this->addRefTrackVirtualMeas1D(refTrajPtr, iVirtualMeas, aHitCovarianceM, aHitResidualsM, aLocalDerivativesM);
1488 
1489  // no global parameters (use dummy 0)
1490  auto aGlobalDerivativesM = Eigen::Matrix<float, 1, 1>::Zero();
1491 
1492  float newResidX = aHitResidualsM(0, 0);
1493  float newHitErrX = TMath::Sqrt(aHitCovarianceM(0, 0));
1494  std::vector<float> newLocalDerivsX(aLocalDerivativesM.size());
1495  Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> >(
1496  newLocalDerivsX.data(), aLocalDerivativesM.rows(), aLocalDerivativesM.cols()) = aLocalDerivativesM;
1497 
1498  std::vector<float> newGlobDerivsX(aGlobalDerivativesM.size());
1499  Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> >(
1500  newGlobDerivsX.data(), aGlobalDerivativesM.rows(), aGlobalDerivativesM.cols()) = aGlobalDerivativesM;
1501 
1502  const int nLocal = aLocalDerivativesM.cols();
1503  const int nGlobal = 0;
1504 
1505  theMille->mille(nLocal, newLocalDerivsX.data(), nGlobal, newGlobDerivsX.data(), &nGlobal, newResidX, newHitErrX);
1506 }
void addRefTrackVirtualMeas1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iVirtualMeas, Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM)
adds data for a specific virtual measurement from reference trajectory
bool MillePedeAlignmentAlgorithm::areEmptyParams ( const align::Alignables alignables) const
private

Definition at line 1070 of file MillePedeAlignmentAlgorithm.cc.

References AlignmentParameters::covariance(), mps_fire::i, dqmiolumiharvest::j, AlignmentParameters::parameters(), and submitPVValidationJobs::params.

Referenced by readFromPede().

1070  {
1071  for (const auto &iAli : alignables) {
1072  const AlignmentParameters *params = iAli->alignmentParameters();
1073  if (params) {
1074  const auto &parVec(params->parameters());
1075  const auto &parCov(params->covariance());
1076  for (int i = 0; i < parVec.num_row(); ++i) {
1077  if (parVec[i] != 0.)
1078  return false;
1079  for (int j = i; j < parCov.num_col(); ++j) {
1080  if (parCov[i][j] != 0.)
1081  return false;
1082  }
1083  }
1084  }
1085  }
1086 
1087  return true;
1088 }
const AlgebraicVector & parameters(void) const
Get alignment parameters.
const AlgebraicSymMatrix & covariance(void) const
Get parameter covariance matrix.
bool MillePedeAlignmentAlgorithm::areIOVsSpecified ( ) const
private

Definition at line 1666 of file MillePedeAlignmentAlgorithm.cc.

References edm::ParameterSet::getUntrackedParameter(), align::makeNonOverlappingRunRanges(), cond::runnumber, theConfig, and cond::timeTypeSpecs.

1666  {
1667  const auto runRangeSelection = theConfig.getUntrackedParameter<edm::VParameterSet>("RunRangeSelection");
1668 
1669  if (runRangeSelection.empty())
1670  return false;
1671 
1672  const auto runRanges =
1674 
1675  return !(runRanges.empty());
1676 }
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:16
T getUntrackedParameter(std::string const &, T const &) const
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:34
RunRanges makeNonOverlappingRunRanges(const edm::VParameterSet &runRanges, const RunNumber &defaultRun)
Definition: Utilities.cc:202
void MillePedeAlignmentAlgorithm::beginLuminosityBlock ( const edm::EventSetup )
overridevirtual

called at begin of luminosity block (resets Mille binary in mille mode)

Reimplemented from AlignmentAlgorithmBase.

Definition at line 712 of file MillePedeAlignmentAlgorithm.cc.

References isMode(), myMilleBit, runAtPCL_, and theMille.

712  {
713  if (!runAtPCL_)
714  return;
715  if (this->isMode(myMilleBit))
716  theMille->resetOutputFile();
717 }
bool isMode(unsigned int testMode) const
void MillePedeAlignmentAlgorithm::beginRun ( const edm::Run run,
const edm::EventSetup setup,
bool  changed 
)
overridevirtual

called at begin of run

Reimplemented from AlignmentAlgorithmBase.

Definition at line 621 of file MillePedeAlignmentAlgorithm.cc.

References cond::TimeTypeSpecs::beginValue, cachedRuns_, AlignmentParameterStore::cacheTransformations(), enableAlignableUpdates_, edm::IOVSyncValue::eventID(), Exception, spr::find(), edm::ValidityInterval::first(), firstIOV_, dataset::firstRun, edm::EventSetup::get(), ignoreFirstIOVCheck_, edm::eventsetup::EventSetupRecordImplementation< T >::key(), lastProcessedRun_, edm::eventsetup::EventSetupRecordKey::name(), edm::EventID::run(), edm::RunBase::run(), cond::runnumber, convertSQLiteXML::runNumber, skipGlobalPositionRcdCheck_, theAlignmentParameterStore, cond::persistency::throwException(), cond::timeTypeSpecs, uniqueRunRanges_, and edm::eventsetup::EventSetupRecord::validityInterval().

621  {
622  if (run.run() < firstIOV_ && !ignoreFirstIOVCheck_) {
623  throw cms::Exception("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::beginRun\n"
624  << "Using data (run = " << run.run() << ") prior to the first defined IOV ("
625  << firstIOV_ << ").";
626  }
627 
628  lastProcessedRun_ = run.run();
629 
630  if (changed && enableAlignableUpdates_) {
631  const auto runNumber = run.run();
633  for (auto runRange = uniqueRunRanges_.crbegin(); runRange != uniqueRunRanges_.crend(); ++runRange) {
634  if (runNumber >= runRange->first) {
635  firstRun = runRange->first;
636  break;
637  }
638  }
639  if (std::find(cachedRuns_.begin(), cachedRuns_.end(), firstRun) != cachedRuns_.end()) {
640  const auto &geometryRcd = setup.get<IdealGeometryRecord>();
641  const auto &globalPosRcd = setup.get<GlobalPositionRcd>();
642  const auto &alignmentRcd = setup.get<TrackerAlignmentRcd>();
643  const auto &surfaceRcd = setup.get<TrackerSurfaceDeformationRcd>();
644  const auto &errorRcd = setup.get<TrackerAlignmentErrorExtendedRcd>();
645 
646  std::ostringstream message;
647  bool throwException{false};
648  message << "Trying to cache tracker alignment payloads for a run (" << runNumber << ") in an IOV (" << firstRun
649  << ") that was already cached.\n"
650  << "The following records in your input database tag have an IOV "
651  << "boundary that does not match your IOV definition:\n";
652  if (geometryRcd.validityInterval().first().eventID().run() > firstRun) {
653  message << " - IdealGeometryRecord '" << geometryRcd.key().name() << "' (since "
654  << geometryRcd.validityInterval().first().eventID().run() << ")\n";
655  throwException = true;
656  }
657  if (globalPosRcd.validityInterval().first().eventID().run() > firstRun) {
658  message << " - GlobalPositionRecord '" << globalPosRcd.key().name() << "' (since "
659  << globalPosRcd.validityInterval().first().eventID().run() << ")";
661  message << " --> ignored\n";
662  } else {
663  message << "\n";
664  throwException = true;
665  }
666  }
667  if (alignmentRcd.validityInterval().first().eventID().run() > firstRun) {
668  message << " - TrackerAlignmentRcd '" << alignmentRcd.key().name() << "' (since "
669  << alignmentRcd.validityInterval().first().eventID().run() << ")\n";
670  throwException = true;
671  }
672  if (surfaceRcd.validityInterval().first().eventID().run() > firstRun) {
673  message << " - TrackerSurfaceDeformationRcd '" << surfaceRcd.key().name() << "' (since "
674  << surfaceRcd.validityInterval().first().eventID().run() << ")\n";
675  throwException = true;
676  }
677  if (errorRcd.validityInterval().first().eventID().run() > firstRun) {
678  message << " - TrackerAlignmentErrorExtendedRcd '" << errorRcd.key().name() << "' (since "
679  << errorRcd.validityInterval().first().eventID().run() << ")\n";
680  throwException = true;
681  }
682 
683  if (throwException) {
684  throw cms::Exception("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::beginRun\n" << message.str();
685  }
686  } else {
687  cachedRuns_.push_back(firstRun);
689  }
690  }
691 }
RunNumber_t run() const
Definition: EventID.h:38
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:16
RunNumber_t run() const
Definition: RunBase.h:40
const EventID & eventID() const
Definition: IOVSyncValue.h:40
Time_t beginValue
Definition: Time.h:41
string firstRun
Definition: dataset.py:936
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
std::vector< align::RunNumber > cachedRuns_
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
ValidityInterval validityInterval() const
T get() const
Definition: EventSetup.h:88
void cacheTransformations(void)
cache the current position, rotation and other parameters
const IOVSyncValue & first() const
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:12
void MillePedeAlignmentAlgorithm::buildUserVariables ( const align::Alignables alignables) const
private

add MillePedeVariables for each AlignmentParameters (exception if no parameters...)

Definition at line 1148 of file MillePedeAlignmentAlgorithm.cc.

References Exception, submitPVValidationJobs::params, MillePedeVariables::setAllDefault(), AlignmentParameters::setUserVariables(), MillePedeVariables::size(), AlignmentParameters::size(), thePedeLabels, and AlignmentParameters::userVariables().

Referenced by initialize(), and setParametersForRunRange().

1148  {
1149  for (const auto &iAli : alis) {
1150  AlignmentParameters *params = iAli->alignmentParameters();
1151  if (!params) {
1152  throw cms::Exception("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::buildUserVariables"
1153  << "No parameters for alignable";
1154  }
1155  MillePedeVariables *userVars = dynamic_cast<MillePedeVariables *>(params->userVariables());
1156  if (userVars) { // Just re-use existing, keeping label and numHits:
1157  for (unsigned int iPar = 0; iPar < userVars->size(); ++iPar) {
1158  // if (params->hierarchyLevel() > 0) {
1159  //std::cout << params->hierarchyLevel() << "\nBefore: " << userVars->parameter()[iPar];
1160  // }
1161  userVars->setAllDefault(iPar);
1162  //std::cout << "\nAfter: " << userVars->parameter()[iPar] << std::endl;
1163  }
1164  } else { // Nothing yet or erase wrong type:
1165  userVars = new MillePedeVariables(
1166  params->size(),
1167  thePedeLabels->alignableLabel(iAli),
1168  thePedeLabels->alignableTracker()->objectIdProvider().typeToName(iAli->alignableObjectId()));
1169  params->setUserVariables(userVars);
1170  }
1171  }
1172 }
unsigned int size() const
number of parameters
std::shared_ptr< PedeLabelerBase > thePedeLabels
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
void setUserVariables(AlignmentUserVariables *auv)
Set pointer to user variables.
int size(void) const
Get number of parameters.
bool setAllDefault(unsigned int nParam)
set default values for all data concerning nParam (false if nParam out of range)
int MillePedeAlignmentAlgorithm::callMille ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iTrajHit,
const std::vector< int > &  globalLabels,
const std::vector< float > &  globalDerivativesX,
const std::vector< float > &  globalDerivativesY 
)
private

calls callMille1D or callMille2D

Definition at line 1334 of file MillePedeAlignmentAlgorithm.cc.

References callMille1D(), and callMille2D().

Referenced by addMeasurementData().

1338  {
1339  const ConstRecHitPointer aRecHit(refTrajPtr->recHits()[iTrajHit]);
1340 
1341  if ((aRecHit)->dimension() == 1) {
1342  return this->callMille1D(refTrajPtr, iTrajHit, globalLabels, globalDerivativesX);
1343  } else {
1344  return this->callMille2D(refTrajPtr, iTrajHit, globalLabels, globalDerivativesX, globalDerivativesY);
1345  }
1346 }
int callMille2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy)
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
int callMille1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesX)
calls Mille for 1D hits
int MillePedeAlignmentAlgorithm::callMille1D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iTrajHit,
const std::vector< int > &  globalLabels,
const std::vector< float > &  globalDerivativesX 
)
private

calls Mille for 1D hits

Definition at line 1349 of file MillePedeAlignmentAlgorithm.cc.

References mps_fire::i, theMille, and theMonitor.

Referenced by callMille().

1352  {
1353  const ConstRecHitPointer aRecHit(refTrajPtr->recHits()[iTrajHit]);
1354  const unsigned int xIndex = iTrajHit * 2; // the even ones are local x
1355 
1356  // local derivatives
1357  const AlgebraicMatrix &locDerivMatrix = refTrajPtr->derivatives();
1358  const int nLocal = locDerivMatrix.num_col();
1359  std::vector<float> localDerivatives(nLocal);
1360  for (unsigned int i = 0; i < localDerivatives.size(); ++i) {
1361  localDerivatives[i] = locDerivMatrix[xIndex][i];
1362  }
1363 
1364  // residuum and error
1365  float residX = refTrajPtr->measurements()[xIndex] - refTrajPtr->trajectoryPositions()[xIndex];
1366  float hitErrX = TMath::Sqrt(refTrajPtr->measurementErrors()[xIndex][xIndex]);
1367 
1368  // number of global derivatives
1369  const int nGlobal = globalDerivativesX.size();
1370 
1371  // &(localDerivatives[0]) etc. are valid - as long as vector is not empty
1372  // cf. http://www.parashift.com/c++-faq-lite/containers.html#faq-34.3
1373  theMille->mille(
1374  nLocal, &(localDerivatives[0]), nGlobal, &(globalDerivativesX[0]), &(globalLabels[0]), residX, hitErrX);
1375 
1376  if (theMonitor) {
1377  theMonitor->fillDerivatives(
1378  aRecHit, &(localDerivatives[0]), nLocal, &(globalDerivativesX[0]), nGlobal, &(globalLabels[0]));
1379  theMonitor->fillResiduals(aRecHit, refTrajPtr->trajectoryStates()[iTrajHit], iTrajHit, residX, hitErrX, false);
1380  }
1381 
1382  return 1;
1383 }
std::unique_ptr< MillePedeMonitor > theMonitor
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
CLHEP::HepMatrix AlgebraicMatrix
int MillePedeAlignmentAlgorithm::callMille2D ( const ReferenceTrajectoryBase::ReferenceTrajectoryPtr refTrajPtr,
unsigned int  iTrajHit,
const std::vector< int > &  globalLabels,
const std::vector< float > &  globalDerivativesx,
const std::vector< float > &  globalDerivativesy 
)
private

calls Mille for x and possibly y component of hit, y is skipped for non-real 2D (e.g. SiStripRecHit2D), for TID/TEC first diagonalises if correlation is larger than configurable

Definition at line 1386 of file MillePedeAlignmentAlgorithm.cc.

References Abs(), addRefTrackData2D(), alignCSCRings::corr, diagonalize(), pat::helper::ParametrizationHelper::dimension(), is2D(), makeGlobDerivMatrix(), mathSSE::sqrt(), std::swap(), SiStripDetId::TEC, theMaximalCor2D, theMille, theMonitor, SiStripDetId::TID, and DetId::Tracker.

Referenced by callMille().

1390  {
1391  const ConstRecHitPointer aRecHit(refTrajPtr->recHits()[iTrajHit]);
1392 
1393  if ((aRecHit)->dimension() != 2) {
1394  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::callMille2D"
1395  << "You try to call method for 2D hits for a " << (aRecHit)->dimension()
1396  << "D Hit. Hit gets ignored!";
1397  return -1;
1398  }
1399 
1400  Eigen::Matrix<double, 2, 2> aHitCovarianceM;
1401  Eigen::Matrix<float, 2, 1> aHitResidualsM;
1402  Eigen::Matrix<float, 2, Eigen::Dynamic> aLocalDerivativesM{2, refTrajPtr->derivatives().num_col()};
1403  // below method fills above 3 matrices
1404  this->addRefTrackData2D(refTrajPtr, iTrajHit, aHitCovarianceM, aHitResidualsM, aLocalDerivativesM);
1405  Eigen::Matrix<float, 2, Eigen::Dynamic> aGlobalDerivativesM{2, globalDerivativesx.size()};
1406  this->makeGlobDerivMatrix(globalDerivativesx, globalDerivativesy, aGlobalDerivativesM);
1407 
1408  // calculates correlation between Hit measurements
1409  // FIXME: Should take correlation (and resulting transformation) from original hit,
1410  // not 2x2 matrix from ReferenceTrajectory: That can come from error propagation etc.!
1411  const double corr = aHitCovarianceM(0, 1) / sqrt(aHitCovarianceM(0, 0) * aHitCovarianceM(1, 1));
1412  if (theMonitor)
1413  theMonitor->fillCorrelations2D(corr, aRecHit);
1414  bool diag = false; // diagonalise only tracker TID, TEC
1415  switch (aRecHit->geographicalId().subdetId()) {
1416  case SiStripDetId::TID:
1417  case SiStripDetId::TEC:
1418  if (aRecHit->geographicalId().det() == DetId::Tracker && TMath::Abs(corr) > theMaximalCor2D) {
1419  this->diagonalize(aHitCovarianceM, aLocalDerivativesM, aHitResidualsM, aGlobalDerivativesM);
1420  diag = true;
1421  }
1422  break;
1423  default:;
1424  }
1425 
1426  float newResidX = aHitResidualsM(0, 0);
1427  float newResidY = aHitResidualsM(1, 0);
1428  float newHitErrX = TMath::Sqrt(aHitCovarianceM(0, 0));
1429  float newHitErrY = TMath::Sqrt(aHitCovarianceM(1, 1));
1430 
1431  // change from column major (Eigen default) to row major to have row entries
1432  // in continuous memory
1433  std::vector<float> newLocalDerivs(aLocalDerivativesM.size());
1434  Eigen::Map<Eigen::Matrix<float, 2, Eigen::Dynamic, Eigen::RowMajor> >(
1435  newLocalDerivs.data(), aLocalDerivativesM.rows(), aLocalDerivativesM.cols()) = aLocalDerivativesM;
1436  float *newLocalDerivsX = &(newLocalDerivs[0]);
1437  float *newLocalDerivsY = &(newLocalDerivs[aLocalDerivativesM.cols()]);
1438 
1439  // change from column major (Eigen default) to row major to have row entries
1440  // in continuous memory
1441  std::vector<float> newGlobDerivs(aGlobalDerivativesM.size());
1442  Eigen::Map<Eigen::Matrix<float, 2, Eigen::Dynamic, Eigen::RowMajor> >(
1443  newGlobDerivs.data(), aGlobalDerivativesM.rows(), aGlobalDerivativesM.cols()) = aGlobalDerivativesM;
1444  float *newGlobDerivsX = &(newGlobDerivs[0]);
1445  float *newGlobDerivsY = &(newGlobDerivs[aGlobalDerivativesM.cols()]);
1446 
1447  const int nLocal = aLocalDerivativesM.cols();
1448  const int nGlobal = aGlobalDerivativesM.cols();
1449 
1450  if (diag && (newHitErrX > newHitErrY)) { // also for 2D hits?
1451  // measurement with smaller error is x-measurement (for !is2D do not fill y-measurement):
1452  std::swap(newResidX, newResidY);
1453  std::swap(newHitErrX, newHitErrY);
1454  std::swap(newLocalDerivsX, newLocalDerivsY);
1455  std::swap(newGlobDerivsX, newGlobDerivsY);
1456  }
1457 
1458  // &(globalLabels[0]) is valid - as long as vector is not empty
1459  // cf. http://www.parashift.com/c++-faq-lite/containers.html#faq-34.3
1460  theMille->mille(nLocal, newLocalDerivsX, nGlobal, newGlobDerivsX, &(globalLabels[0]), newResidX, newHitErrX);
1461 
1462  if (theMonitor) {
1463  theMonitor->fillDerivatives(aRecHit, newLocalDerivsX, nLocal, newGlobDerivsX, nGlobal, &(globalLabels[0]));
1464  theMonitor->fillResiduals(
1465  aRecHit, refTrajPtr->trajectoryStates()[iTrajHit], iTrajHit, newResidX, newHitErrX, false);
1466  }
1467  const bool isReal2DHit = this->is2D(aRecHit); // strip is 1D (except matched hits)
1468  if (isReal2DHit) {
1469  theMille->mille(nLocal, newLocalDerivsY, nGlobal, newGlobDerivsY, &(globalLabels[0]), newResidY, newHitErrY);
1470  if (theMonitor) {
1471  theMonitor->fillDerivatives(aRecHit, newLocalDerivsY, nLocal, newGlobDerivsY, nGlobal, &(globalLabels[0]));
1472  theMonitor->fillResiduals(
1473  aRecHit, refTrajPtr->trajectoryStates()[iTrajHit], iTrajHit, newResidY, newHitErrY, true); // true: y
1474  }
1475  }
1476 
1477  return (isReal2DHit ? 2 : 1);
1478 }
std::unique_ptr< MillePedeMonitor > theMonitor
void diagonalize(Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< GlobalDerivativeMatrix > &aGlobalDerivativesM) const
static constexpr auto TID
Definition: SiStripDetId.h:38
Log< level::Error, false > LogError
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
void makeGlobDerivMatrix(const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy, Eigen::MatrixBase< GlobalDerivativeMatrix > &aGlobalDerivativesM)
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
T sqrt(T t)
Definition: SSEVec.h:19
T Abs(T a)
Definition: MathUtil.h:49
bool is2D(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
true if hit belongs to 2D detector (currently tracker specific)
void addRefTrackData2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, Eigen::MatrixBase< CovarianceMatrix > &aHitCovarianceM, Eigen::MatrixBase< ResidualMatrix > &aHitResidualsM, Eigen::MatrixBase< LocalDerivativeMatrix > &aLocalDerivativesM)
adds data from reference trajectory from a specific Hit
uint32_t dimension(pat::CandKinResolution::Parametrization parametrization)
Returns the number of free parameters in a parametrization (3 or 4)
static constexpr auto TEC
Definition: SiStripDetId.h:40
unsigned int MillePedeAlignmentAlgorithm::decodeMode ( const std::string &  mode) const
private

Definition at line 1175 of file MillePedeAlignmentAlgorithm.cc.

References Exception, myMilleBit, myPedeReadBit, myPedeRunBit, and myPedeSteerBit.

1175  {
1176  if (mode == "full") {
1178  } else if (mode == "mille") {
1179  return myMilleBit; // + myPedeSteerBit; // sic! Including production of steerig file. NO!
1180  } else if (mode == "pede") {
1182  } else if (mode == "pedeSteer") {
1183  return myPedeSteerBit;
1184  } else if (mode == "pedeRun") {
1185  return myPedeSteerBit + myPedeRunBit + myPedeReadBit; // sic! Including steering and reading of result.
1186  } else if (mode == "pedeRead") {
1187  return myPedeReadBit;
1188  }
1189 
1190  throw cms::Exception("BadConfig") << "Unknown mode '" << mode
1191  << "', use 'full', 'mille', 'pede', 'pedeRun', 'pedeSteer' or 'pedeRead'.";
1192 
1193  return 0;
1194 }
template<typename CovarianceMatrix , typename LocalDerivativeMatrix , typename ResidualMatrix , typename GlobalDerivativeMatrix >
void MillePedeAlignmentAlgorithm::diagonalize ( Eigen::MatrixBase< CovarianceMatrix > &  aHitCovarianceM,
Eigen::MatrixBase< LocalDerivativeMatrix > &  aLocalDerivativesM,
Eigen::MatrixBase< ResidualMatrix > &  aHitResidualsM,
Eigen::MatrixBase< GlobalDerivativeMatrix > &  aGlobalDerivativesM 
) const
private

Definition at line 1260 of file MillePedeAlignmentAlgorithm.cc.

References relativeConstraints::value.

Referenced by callMille2D().

1263  {
1265  "'aLocalDerivativesM' and 'aHitResidualsM' must have the "
1266  "same underlying scalar type");
1268  "'aLocalDerivativesM' and 'aGlobalDerivativesM' must have the "
1269  "same underlying scalar type");
1270 
1271  Eigen::SelfAdjointEigenSolver<typename CovarianceMatrix::PlainObject> myDiag{aHitCovarianceM};
1272  // eigenvectors of real symmetric matrices are orthogonal, i.e. invert == transpose
1273  auto aTranfoToDiagonalSystemInv =
1274  myDiag.eigenvectors().transpose().template cast<typename LocalDerivativeMatrix::Scalar>();
1275 
1276  aHitCovarianceM = myDiag.eigenvalues().asDiagonal();
1277  aLocalDerivativesM = aTranfoToDiagonalSystemInv * aLocalDerivativesM;
1278  aHitResidualsM = aTranfoToDiagonalSystemInv * aHitResidualsM;
1279  if (aGlobalDerivativesM.size() > 0) {
1280  // diagonalize only if measurement depends on alignables or calibrations
1281  aGlobalDerivativesM = aTranfoToDiagonalSystemInv * aGlobalDerivativesM;
1282  }
1283 }
unsigned int MillePedeAlignmentAlgorithm::doIO ( int  loop) const
private

Definition at line 1091 of file MillePedeAlignmentAlgorithm.cc.

References addHitStatistics(), edm::ParameterSet::getParameter(), heppy_loop::loop, produceTPGParameters_beamv6_transparency_spikekill_2016_script::outFile, mps_fire::result, AlCaHLTBitMon_QueryRunRegistry::string, theAlignables, theConfig, theDir, AlignmentIORoot::writeAlignableAbsolutePositions(), AlignmentIORoot::writeAlignableOriginalPositions(), MillePedeVariablesIORoot::writeMillePedeVariables(), and AlignmentIORoot::writeOrigRigidBodyAlignmentParameters().

Referenced by setParametersForRunRange(), and terminate().

1091  {
1092  unsigned int result = 0;
1093 
1094  const std::string outFilePlain(theConfig.getParameter<std::string>("treeFile"));
1095  if (outFilePlain.empty()) {
1096  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1097  << "treeFile parameter empty => skip writing for 'loop' " << loop;
1098  return result;
1099  }
1100 
1101  const std::string outFile(theDir + outFilePlain);
1102 
1103  AlignmentIORoot aliIO;
1104  int ioerr = 0;
1105  if (loop == 0) {
1106  aliIO.writeAlignableOriginalPositions(theAlignables, outFile.c_str(), loop, false, ioerr);
1107  if (ioerr) {
1108  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1109  << "Problem " << ioerr << " in writeAlignableOriginalPositions";
1110  ++result;
1111  }
1112  } else if (loop == 1) {
1113  // only for first iov add hit counts, else 2x, 3x,... number of hits in IOV 2, 3,...
1114  const std::vector<std::string> inFiles(theConfig.getParameter<std::vector<std::string> >("mergeTreeFiles"));
1115  const std::vector<std::string> binFiles(theConfig.getParameter<std::vector<std::string> >("mergeBinaryFiles"));
1116  if (inFiles.size() != binFiles.size()) {
1117  edm::LogWarning("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1118  << "'vstring mergeTreeFiles' and 'vstring mergeBinaryFiles' "
1119  << "differ in size";
1120  }
1121  this->addHitStatistics(0, outFile, inFiles); // add hit info from tree 0 in 'infiles'
1122  }
1123  MillePedeVariablesIORoot millePedeIO;
1124  millePedeIO.writeMillePedeVariables(theAlignables, outFile.c_str(), loop, false, ioerr);
1125  if (ioerr) {
1126  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1127  << "Problem " << ioerr << " writing MillePedeVariables";
1128  ++result;
1129  }
1130 
1131  aliIO.writeOrigRigidBodyAlignmentParameters(theAlignables, outFile.c_str(), loop, false, ioerr);
1132  if (ioerr) {
1133  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1134  << "Problem " << ioerr << " in writeOrigRigidBodyAlignmentParameters, " << loop;
1135  ++result;
1136  }
1137  aliIO.writeAlignableAbsolutePositions(theAlignables, outFile.c_str(), loop, false, ioerr);
1138  if (ioerr) {
1139  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::doIO"
1140  << "Problem " << ioerr << " in writeAlignableAbsolutePositions, " << loop;
1141  ++result;
1142  }
1143 
1144  return result;
1145 }
Log< level::Error, false > LogError
void writeMillePedeVariables(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
void writeAlignableOriginalPositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr) override
write Alignable original (before misalignment) absolute positions
tuple result
Definition: mps_fire.py:311
void writeOrigRigidBodyAlignmentParameters(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr) override
write RigidBodyAlignmentParameters as applied on top of original positions
bool addHitStatistics(int fromLoop, const std::string &outFile, const std::vector< std::string > &inFiles) const
Log< level::Info, false > LogInfo
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void writeAlignableAbsolutePositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr) override
write Alignable current absolute positions
Log< level::Warning, false > LogWarning
void MillePedeAlignmentAlgorithm::endLuminosityBlock ( const edm::EventSetup )
overridevirtual

called at end of luminosity block

Reimplemented from AlignmentAlgorithmBase.

Definition at line 720 of file MillePedeAlignmentAlgorithm.cc.

References isMode(), myMilleBit, runAtPCL_, and theMille.

720  {
721  if (!runAtPCL_)
722  return;
723  if (this->isMode(myMilleBit))
724  theMille->flushOutputFile();
725 }
bool isMode(unsigned int testMode) const
void MillePedeAlignmentAlgorithm::endRun ( const EventInfo eventInfo,
const EndRunInfo runInfo,
const edm::EventSetup setup 
)
virtual

Run on run products, e.g. TkLAS.

Definition at line 694 of file MillePedeAlignmentAlgorithm.cc.

References addLaserData(), isMode(), myMilleBit, theMille, AlignmentAlgorithmBase::EndRunInfo::tkLasBeams(), and AlignmentAlgorithmBase::EndRunInfo::tkLasBeamTsoses().

696  {
697  if (runInfo.tkLasBeams() && runInfo.tkLasBeamTsoses()) {
698  // LAS beam treatment
699  this->addLaserData(eventInfo, *(runInfo.tkLasBeams()), *(runInfo.tkLasBeamTsoses()));
700  }
701  if (this->isMode(myMilleBit))
702  theMille->flushOutputFile();
703 }
void addLaserData(const EventInfo &eventInfo, const TkFittedLasBeamCollection &tkLasBeams, const TsosVectorCollection &tkLasBeamTsoses)
bool isMode(unsigned int testMode) const
const TkFittedLasBeamCollection * tkLasBeams() const
const TsosVectorCollection * tkLasBeamTsoses() const
might be null!
void MillePedeAlignmentAlgorithm::endRun ( const EndRunInfo runInfo,
const edm::EventSetup setup 
)
overridevirtual

called at end of run - order of arguments like in EDProducer etc.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 706 of file MillePedeAlignmentAlgorithm.cc.

References isMode(), myMilleBit, and theMille.

706  {
707  if (this->isMode(myMilleBit))
708  theMille->flushOutputFile();
709 }
bool isMode(unsigned int testMode) const
std::vector< std::string > MillePedeAlignmentAlgorithm::getExistingFormattedFiles ( const std::vector< std::string > &  plainFiles,
const std::string &  theDir 
)
private

Generates list of files to read, given the list and dir from the configuration. This will automatically expand formatting directives, if they appear.

Definition at line 424 of file MillePedeAlignmentAlgorithm.cc.

References edmScanValgrind::buffer, submitPVResolutionJobs::files, edm_modernize_messagelogger::stat, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by terminate().

425  {
426  std::vector<std::string> files;
427  for (const auto &plainFile : plainFiles) {
428  const std::string &theInputFileName = plainFile;
429  int theNumber = 0;
430  while (true) {
431  // Create a formatted version of the filename, with growing numbers
432  // If the parameter doesn't contain a formatting directive, it just stays unchanged
433  char theNumberedInputFileName[200];
434  sprintf(theNumberedInputFileName, theInputFileName.c_str(), theNumber);
435  std::string theCompleteInputFileName = theDir + theNumberedInputFileName;
436  const auto endOfStrippedFileName = theCompleteInputFileName.rfind(" --");
437  const auto strippedInputFileName = theCompleteInputFileName.substr(0, endOfStrippedFileName);
438  // Check if the file exists
439  struct stat buffer;
440  if (stat(strippedInputFileName.c_str(), &buffer) == 0) {
441  // If the file exists, add it to the list
442  files.push_back(theCompleteInputFileName);
443  if (theNumberedInputFileName == theInputFileName) {
444  // If the filename didn't contain a formatting directive, no reason to look any further, break out of the loop
445  break;
446  } else {
447  // Otherwise look for the next number
448  theNumber++;
449  }
450  } else {
451  // The file doesn't exist, break out of the loop
452  break;
453  }
454  }
455  // warning if unformatted (-> theNumber stays at 0) does not exist
456  if (theNumber == 0 && (files.empty() || files.back() != plainFile)) {
457  edm::LogWarning("Alignment") << "The input file '" << plainFile << "' does not exist.";
458  }
459  }
460  return files;
461 }
Log< level::Warning, false > LogWarning
void MillePedeAlignmentAlgorithm::globalDerivativesCalibration ( const TransientTrackingRecHit::ConstRecHitPointer recHit,
const TrajectoryStateOnSurface tsos,
const edm::EventSetup setup,
const EventInfo eventInfo,
std::vector< float > &  globalDerivativesX,
std::vector< float > &  globalDerivativesY,
std::vector< int > &  globalLabels 
) const
private

adding derivatives from integrated calibrations

Definition at line 958 of file MillePedeAlignmentAlgorithm.cc.

References theCalibrations, and thePedeLabels.

Referenced by addMeasurementData().

964  {
965  std::vector<IntegratedCalibrationBase::ValuesIndexPair> derivs;
966  for (auto iCalib = theCalibrations.begin(); iCalib != theCalibrations.end(); ++iCalib) {
967  // get all derivatives of this calibration // const unsigned int num =
968  (*iCalib)->derivatives(derivs, *recHit, tsos, setup, eventInfo);
969  for (auto iValuesInd = derivs.begin(); iValuesInd != derivs.end(); ++iValuesInd) {
970  // transfer label and x/y derivatives
971  globalLabels.push_back(thePedeLabels->calibrationLabel(*iCalib, iValuesInd->second));
972  globalDerivativesX.push_back(iValuesInd->first.first);
973  globalDerivativesY.push_back(iValuesInd->first.second);
974  }
975  }
976 }
std::shared_ptr< PedeLabelerBase > thePedeLabels
std::vector< IntegratedCalibrationBase * > theCalibrations
bool MillePedeAlignmentAlgorithm::globalDerivativesHierarchy ( const EventInfo eventInfo,
const TrajectoryStateOnSurface tsos,
Alignable ali,
const AlignableDetOrUnitPtr alidet,
std::vector< float > &  globalDerivativesX,
std::vector< float > &  globalDerivativesY,
std::vector< int > &  globalLabels,
AlignmentParameters *&  lowestParams 
) const
private

recursively adding derivatives and labels, false if problems

Definition at line 841 of file MillePedeAlignmentAlgorithm.cc.

References Alignable::alignmentParameters(), AlignmentParameters::derivatives(), kLocalX, kLocalY, Alignable::mother(), submitPVValidationJobs::params, AlignmentParameters::selector(), theMonitor, thePedeLabels, and thePedeSteer.

Referenced by addGlobalData(), addLasBeam(), addMeasurementData(), and globalDerivativesHierarchy().

848  {
849  // derivatives and labels are recursively attached
850  if (!ali)
851  return true; // no mother might be OK
852 
853  if (false && theMonitor && alidet != ali)
854  theMonitor->fillFrameToFrame(alidet, ali);
855 
857 
858  if (params) {
859  if (!lowestParams)
860  lowestParams = params; // set parameters of lowest level
861 
862  bool hasSplitParameters = thePedeLabels->hasSplitParameters(ali);
863  const unsigned int alignableLabel = thePedeLabels->alignableLabel(ali);
864 
865  if (0 == alignableLabel) { // FIXME: what about regardAllHits in Markus' code?
866  edm::LogWarning("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::globalDerivativesHierarchy"
867  << "Label not found, skip Alignable.";
868  return false;
869  }
870 
871  const std::vector<bool> &selPars = params->selector();
872  const AlgebraicMatrix derivs(params->derivatives(tsos, alidet));
873 
874  // cols: 2, i.e. x&y, rows: parameters, usually RigidBodyAlignmentParameters::N_PARAM
875  for (unsigned int iSel = 0; iSel < selPars.size(); ++iSel) {
876  if (selPars[iSel]) {
877  globalDerivativesX.push_back(derivs[iSel][kLocalX] / thePedeSteer->cmsToPedeFactor(iSel));
878  if (hasSplitParameters == true) {
879  globalLabels.push_back(thePedeLabels->parameterLabel(ali, iSel, eventInfo, tsos));
880  } else {
881  globalLabels.push_back(thePedeLabels->parameterLabel(alignableLabel, iSel));
882  }
883  globalDerivativesY.push_back(derivs[iSel][kLocalY] / thePedeSteer->cmsToPedeFactor(iSel));
884  }
885  }
886  // Exclude mothers if Alignable selected to be no part of a hierarchy:
887  if (thePedeSteer->isNoHiera(ali))
888  return true;
889  }
890  // Call recursively for mother, will stop if mother == 0:
891  return this->globalDerivativesHierarchy(
892  eventInfo, tsos, ali->mother(), alidet, globalDerivativesX, globalDerivativesY, globalLabels, lowestParams);
893 }
std::unique_ptr< MillePedeMonitor > theMonitor
bool globalDerivativesHierarchy(const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
recursively adding derivatives and labels, false if problems
std::shared_ptr< PedeLabelerBase > thePedeLabels
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
Definition: Alignable.h:58
virtual AlgebraicMatrix derivatives(const TrajectoryStateOnSurface &tsos, const AlignableDetOrUnitPtr &alidet) const =0
Get derivatives of selected parameters.
CLHEP::HepMatrix AlgebraicMatrix
std::unique_ptr< PedeSteerer > thePedeSteer
Log< level::Warning, false > LogWarning
Alignable * mother() const
Return pointer to container alignable (if any)
Definition: Alignable.h:91
bool MillePedeAlignmentAlgorithm::globalDerivativesHierarchy ( const EventInfo eventInfo,
const TrajectoryStateOnSurface tsos,
Alignable ali,
const AlignableDetOrUnitPtr alidet,
std::vector< double > &  globalDerivativesX,
std::vector< double > &  globalDerivativesY,
std::vector< int > &  globalLabels,
AlignmentParameters *&  lowestParams 
) const
private

recursively adding derivatives (double) and labels, false if problems

Definition at line 896 of file MillePedeAlignmentAlgorithm.cc.

References Alignable::alignmentParameters(), AlignmentParameters::derivatives(), globalDerivativesHierarchy(), kLocalX, kLocalY, Alignable::mother(), submitPVValidationJobs::params, AlignmentParameters::selector(), theMonitor, thePedeLabels, and thePedeSteer.

903  {
904  // derivatives and labels are recursively attached
905  if (!ali)
906  return true; // no mother might be OK
907 
908  if (false && theMonitor && alidet != ali)
909  theMonitor->fillFrameToFrame(alidet, ali);
910 
912 
913  if (params) {
914  if (!lowestParams)
915  lowestParams = params; // set parameters of lowest level
916 
917  bool hasSplitParameters = thePedeLabels->hasSplitParameters(ali);
918  const unsigned int alignableLabel = thePedeLabels->alignableLabel(ali);
919 
920  if (0 == alignableLabel) { // FIXME: what about regardAllHits in Markus' code?
921  edm::LogWarning("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::globalDerivativesHierarchy"
922  << "Label not found, skip Alignable.";
923  return false;
924  }
925 
926  const std::vector<bool> &selPars = params->selector();
927  const AlgebraicMatrix derivs(params->derivatives(tsos, alidet));
928  int globalLabel;
929 
930  // cols: 2, i.e. x&y, rows: parameters, usually RigidBodyAlignmentParameters::N_PARAM
931  for (unsigned int iSel = 0; iSel < selPars.size(); ++iSel) {
932  if (selPars[iSel]) {
933  if (hasSplitParameters == true) {
934  globalLabel = thePedeLabels->parameterLabel(ali, iSel, eventInfo, tsos);
935  } else {
936  globalLabel = thePedeLabels->parameterLabel(alignableLabel, iSel);
937  }
938  if (globalLabel > 0 && globalLabel <= 2147483647) {
939  globalLabels.push_back(globalLabel);
940  globalDerivativesX.push_back(derivs[iSel][kLocalX] / thePedeSteer->cmsToPedeFactor(iSel));
941  globalDerivativesY.push_back(derivs[iSel][kLocalY] / thePedeSteer->cmsToPedeFactor(iSel));
942  } else {
943  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::globalDerivativesHierarchy"
944  << "Invalid label " << globalLabel << " <= 0 or > 2147483647";
945  }
946  }
947  }
948  // Exclude mothers if Alignable selected to be no part of a hierarchy:
949  if (thePedeSteer->isNoHiera(ali))
950  return true;
951  }
952  // Call recursively for mother, will stop if mother == 0:
953  return this->globalDerivativesHierarchy(
954  eventInfo, tsos, ali->mother(), alidet, globalDerivativesX, globalDerivativesY, globalLabels, lowestParams);
955 }
std::unique_ptr< MillePedeMonitor > theMonitor
bool globalDerivativesHierarchy(const EventInfo &eventInfo, const TrajectoryStateOnSurface &tsos, Alignable *ali, const AlignableDetOrUnitPtr &alidet, std::vector< float > &globalDerivativesX, std::vector< float > &globalDerivativesY, std::vector< int > &globalLabels, AlignmentParameters *&lowestParams) const
recursively adding derivatives and labels, false if problems
std::shared_ptr< PedeLabelerBase > thePedeLabels
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
Log< level::Error, false > LogError
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
Definition: Alignable.h:58
virtual AlgebraicMatrix derivatives(const TrajectoryStateOnSurface &tsos, const AlignableDetOrUnitPtr &alidet) const =0
Get derivatives of selected parameters.
CLHEP::HepMatrix AlgebraicMatrix
std::unique_ptr< PedeSteerer > thePedeSteer
Log< level::Warning, false > LogWarning
Alignable * mother() const
Return pointer to container alignable (if any)
Definition: Alignable.h:91
void MillePedeAlignmentAlgorithm::initialize ( const edm::EventSetup setup,
AlignableTracker tracker,
AlignableMuon muon,
AlignableExtras extras,
AlignmentParameterStore store 
)
overridevirtual

Called at beginning of job.

Implements AlignmentAlgorithmBase.

Definition at line 135 of file MillePedeAlignmentAlgorithm.cc.

References addPxbSurvey(), edm::ParameterSet::addUntrackedParameter(), aliThrToken_, cond::TimeTypeSpecs::beginValue, buildUserVariables(), relativeConstraints::empty, cond::TimeTypeSpecs::endValue, enforceSingleIOVInput_, Exception, edm::ParameterSet::exists(), edm::EventSetup::get(), get, edm::EventSetup::getData(), edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), isMode(), submitPVResolutionJobs::key, cond::time::MAX_VAL(), cond::time::MIN_VAL(), HLT_FULL_cff::muon, myMilleBit, myPedeSteerBit, readFromPede(), runAtPCL_, cond::runnumber, storeThresholds(), AlCaHLTBitMon_QueryRunRegistry::string, theAlignableNavigator, theAlignables, theAlignmentParameterStore, theConfig, theDir, theDoSurveyPixelBarrel, theMonitor, thePedeLabels, thePedeSteer, theThresholds, cond::persistency::throwException(), cond::timeTypeSpecs, and topoToken_.

139  {
140  if (muon) {
141  edm::LogWarning("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::initialize"
142  << "Running with AlignabeMuon not yet tested.";
143  }
144 
148  const auto &iov_alignments = setup.get<TrackerAlignmentRcd>().validityInterval();
149  const auto &iov_surfaces = setup.get<TrackerSurfaceDeformationRcd>().validityInterval();
150  const auto &iov_errors = setup.get<TrackerAlignmentErrorExtendedRcd>().validityInterval();
151 
152  std::ostringstream message;
153  bool throwException{false};
154  if (iov_alignments.first().eventID().run() != MIN_VAL || iov_alignments.last().eventID().run() != MAX_VAL) {
155  message << "\nTrying to apply " << setup.get<TrackerAlignmentRcd>().key().name()
156  << " with multiple IOVs in tag without specifying 'RunRangeSelection'.\n"
157  << "Validity range is " << iov_alignments.first().eventID().run() << " - "
158  << iov_alignments.last().eventID().run() << "\n";
159  throwException = true;
160  }
161  if (iov_surfaces.first().eventID().run() != MIN_VAL || iov_surfaces.last().eventID().run() != MAX_VAL) {
162  message << "\nTrying to apply " << setup.get<TrackerSurfaceDeformationRcd>().key().name()
163  << " with multiple IOVs in tag without specifying 'RunRangeSelection'.\n"
164  << "Validity range is " << iov_surfaces.first().eventID().run() << " - "
165  << iov_surfaces.last().eventID().run() << "\n";
166  throwException = true;
167  }
168  if (iov_errors.first().eventID().run() != MIN_VAL || iov_errors.last().eventID().run() != MAX_VAL) {
169  message << "\nTrying to apply " << setup.get<TrackerAlignmentErrorExtendedRcd>().key().name()
170  << " with multiple IOVs in tag without specifying 'RunRangeSelection'.\n"
171  << "Validity range is " << iov_errors.first().eventID().run() << " - "
172  << iov_errors.last().eventID().run() << "\n";
173  throwException = true;
174  }
175  if (throwException) {
176  throw cms::Exception("DatabaseError") << "@SUB=MillePedeAlignmentAlgorithm::initialize" << message.str();
177  }
178  }
179 
180  //Retrieve tracker topology from geometry
181  const TrackerTopology *const tTopo = &setup.getData(topoToken_);
182 
183  //Retrieve the thresolds cuts from DB for the PCL
184  if (runAtPCL_) {
185  const auto &th = &setup.getData(aliThrToken_);
186  theThresholds = std::make_shared<AlignPCLThresholds>();
187  storeThresholds(th->getNrecords(), th->getThreshold_Map());
188  }
189 
190  theAlignableNavigator = std::make_unique<AlignableNavigator>(extras, tracker, muon);
192  theAlignables = theAlignmentParameterStore->alignables();
193 
194  edm::ParameterSet pedeLabelerCfg(theConfig.getParameter<edm::ParameterSet>("pedeLabeler"));
195  edm::VParameterSet RunRangeSelectionVPSet(theConfig.getUntrackedParameter<edm::VParameterSet>("RunRangeSelection"));
196  pedeLabelerCfg.addUntrackedParameter<edm::VParameterSet>("RunRangeSelection", RunRangeSelectionVPSet);
197 
198  std::string labelerPlugin = "PedeLabeler";
199  if (!RunRangeSelectionVPSet.empty()) {
200  labelerPlugin = "RunRangeDependentPedeLabeler";
201  if (pedeLabelerCfg.exists("plugin")) {
202  std::string labelerPluginCfg = pedeLabelerCfg.getParameter<std::string>("plugin");
203  if ((labelerPluginCfg != "PedeLabeler" && labelerPluginCfg != "RunRangeDependentPedeLabeler") ||
204  !pedeLabelerCfg.getUntrackedParameter<edm::VParameterSet>("parameterInstances").empty()) {
205  throw cms::Exception("BadConfig") << "MillePedeAlignmentAlgorithm::initialize"
206  << "both RunRangeSelection and generic labeler specified in config file. "
207  << "Please get rid of either one of them.\n";
208  }
209  }
210  } else {
211  if (pedeLabelerCfg.exists("plugin")) {
212  labelerPlugin = pedeLabelerCfg.getParameter<std::string>("plugin");
213  }
214  }
215 
216  if (!pedeLabelerCfg.exists("plugin")) {
217  pedeLabelerCfg.addUntrackedParameter<std::string>("plugin", labelerPlugin);
218  }
219 
220  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::initialize"
221  << "Using plugin '" << labelerPlugin << "' to generate labels.";
222 
223  thePedeLabels = std::shared_ptr<PedeLabelerBase>(PedeLabelerPluginFactory::get()->create(
224  labelerPlugin, PedeLabelerBase::TopLevelAlignables(tracker, muon, extras), pedeLabelerCfg));
225 
226  // 1) Create PedeSteerer: correct alignable positions for coordinate system selection
227  edm::ParameterSet pedeSteerCfg(theConfig.getParameter<edm::ParameterSet>("pedeSteerer"));
228  thePedeSteer = std::make_unique<PedeSteerer>(tracker,
229  muon,
230  extras,
232  thePedeLabels.get(),
233  pedeSteerCfg,
234  theDir,
235  !this->isMode(myPedeSteerBit));
236 
237  // 2) If requested, directly read in and apply result of previous pede run,
238  // assuming that correction from 1) was also applied to create the result:
239  const std::vector<edm::ParameterSet> mprespset(
240  theConfig.getParameter<std::vector<edm::ParameterSet> >("pedeReaderInputs"));
241  if (!mprespset.empty()) {
242  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::initialize"
243  << "Apply " << mprespset.end() - mprespset.begin()
244  << " previous MillePede constants from 'pedeReaderInputs'.";
245  }
246 
247  // FIXME: add selection of run range via 'pedeReaderInputs'
248  // Note: Results for parameters of IntegratedCalibration's cannot be treated...
250  for (std::vector<edm::ParameterSet>::const_iterator iSet = mprespset.begin(), iE = mprespset.end(); iSet != iE;
251  ++iSet) {
252  // This read will ignore calibrations as long as they are not yet passed to Millepede
253  // during/before initialize(..) - currently addCalibrations(..) is called later in AlignmentProducer
254  if (!this->readFromPede((*iSet), false, runrange)) { // false: do not erase SelectionUserVariables
255  throw cms::Exception("BadConfig")
256  << "MillePedeAlignmentAlgorithm::initialize: Problems reading input constants of "
257  << "pedeReaderInputs entry " << iSet - mprespset.begin() << '.';
258  }
259  theAlignmentParameterStore->applyParameters();
260  // Needed to shut up later warning from checkAliParams:
261  theAlignmentParameterStore->resetParameters();
262  }
263 
264  // 3) Now create steerings with 'final' start position:
265  thePedeSteer->buildSubSteer(tracker, muon, extras);
266 
267  // After (!) 1-3 of PedeSteerer which uses the SelectionUserVariables attached to the parameters:
268  this->buildUserVariables(theAlignables); // for hit statistics and/or pede result
269 
270  if (this->isMode(myMilleBit)) {
271  if (!theConfig.getParameter<std::vector<std::string> >("mergeBinaryFiles").empty() ||
272  !theConfig.getParameter<std::vector<std::string> >("mergeTreeFiles").empty()) {
273  throw cms::Exception("BadConfig") << "'vstring mergeTreeFiles' and 'vstring mergeBinaryFiles' must be empty for "
274  << "modes running mille.";
275  }
276  const std::string moniFile(theConfig.getUntrackedParameter<std::string>("monitorFile"));
277  if (!moniFile.empty())
278  theMonitor = std::make_unique<MillePedeMonitor>(tTopo, (theDir + moniFile).c_str());
279 
280  // Get trajectory factory. In case nothing found, FrameWork will throw...
281  }
282 
283  if (this->isMode(myPedeSteerBit)) {
284  // Get config for survey and set flag accordingly
285  const edm::ParameterSet pxbSurveyCfg(theConfig.getParameter<edm::ParameterSet>("surveyPixelBarrel"));
286  theDoSurveyPixelBarrel = pxbSurveyCfg.getParameter<bool>("doSurvey");
288  this->addPxbSurvey(pxbSurveyCfg);
289  }
290 }
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:16
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< MillePedeMonitor > theMonitor
std::shared_ptr< AlignPCLThresholds > theThresholds
Time_t beginValue
Definition: Time.h:41
void buildUserVariables(const align::Alignables &alignables) const
add MillePedeVariables for each AlignmentParameters (exception if no parameters...)
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:34
const Time_t MIN_VAL(0)
std::shared_ptr< PedeLabelerBase > thePedeLabels
bool getData(T &iHolder) const
Definition: EventSetup.h:128
bool isMode(unsigned int testMode) const
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > topoToken_
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
tuple key
prepare the HTCondor submission files and eventually submit them
std::unique_ptr< PedeSteerer > thePedeSteer
Log< level::Info, false > LogInfo
bool readFromPede(const edm::ParameterSet &mprespset, bool setUserVars, const RunRange &runrange)
read pede input defined by &#39;psetName&#39;, flag to create/not create MillePedeVariables ...
virtual bool storeThresholds(const int &nRecords, const AlignPCLThresholds::threshold_map &thresholdMap)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
T get() const
Definition: EventSetup.h:88
const edm::ESGetToken< AlignPCLThresholds, AlignPCLThresholdsRcd > aliThrToken_
void addPxbSurvey(const edm::ParameterSet &pxbSurveyCfg)
add measurement data from PXB survey
#define get
std::unique_ptr< AlignableNavigator > theAlignableNavigator
Log< level::Warning, false > LogWarning
Time_t endValue
Definition: Time.h:42
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:12
bool MillePedeAlignmentAlgorithm::is2D ( const TransientTrackingRecHit::ConstRecHitPointer recHit) const
private

true if hit belongs to 2D detector (currently tracker specific)

Definition at line 1013 of file MillePedeAlignmentAlgorithm.cc.

Referenced by callMille2D().

1013  {
1014  // FIXME: Check whether this is a reliable and recommended way to find out...
1015 
1016  if (recHit->dimension() < 2) {
1017  return false; // some muon and TIB/TOB stuff really has RecHit1D
1018  } else if (recHit->detUnit()) { // detunit in strip is 1D, in pixel 2D
1019  return recHit->detUnit()->type().isTrackerPixel();
1020  } else { // stereo strips (FIXME: endcap trouble due to non-parallel strips (wedge sensors)?)
1021  if (dynamic_cast<const ProjectedSiStripRecHit2D *>(recHit->hit())) { // check persistent hit
1022  // projected: 1D measurement on 'glued' module
1023  return false;
1024  } else {
1025  return true;
1026  }
1027  }
1028 }
bool MillePedeAlignmentAlgorithm::isMode ( unsigned int  testMode) const
inlineprivate
template<typename GlobalDerivativeMatrix >
void MillePedeAlignmentAlgorithm::makeGlobDerivMatrix ( const std::vector< float > &  globalDerivativesx,
const std::vector< float > &  globalDerivativesy,
Eigen::MatrixBase< GlobalDerivativeMatrix > &  aGlobalDerivativesM 
)
private

Definition at line 1244 of file MillePedeAlignmentAlgorithm.cc.

References mps_fire::i.

Referenced by callMille2D().

1246  {
1247  static_assert(GlobalDerivativeMatrix::RowsAtCompileTime == 2, "global derivative matrix must have two rows");
1248 
1249  for (size_t i = 0; i < globalDerivativesx.size(); ++i) {
1250  aGlobalDerivativesM(0, i) = globalDerivativesx[i];
1251  aGlobalDerivativesM(1, i) = globalDerivativesy[i];
1252  }
1253 }
bool MillePedeAlignmentAlgorithm::processesEvents ( )
overridevirtual

Returns whether MP should process events in the current configuration.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 310 of file MillePedeAlignmentAlgorithm.cc.

References isMode(), and myMilleBit.

310  {
311  if (isMode(myMilleBit)) {
312  return true;
313  } else {
314  return false;
315  }
316 }
bool isMode(unsigned int testMode) const
bool MillePedeAlignmentAlgorithm::readFromPede ( const edm::ParameterSet mprespset,
bool  setUserVars,
const RunRange runrange 
)
private

read pede input defined by 'psetName', flag to create/not create MillePedeVariables

Definition at line 1031 of file MillePedeAlignmentAlgorithm.cc.

References areEmptyParams(), submitPVResolutionJobs::out, PedeReader::read(), DQM::reader, theAlignables, thePedeLabels, and thePedeSteer.

Referenced by initialize(), and setParametersForRunRange().

1033  {
1034  bool allEmpty = this->areEmptyParams(theAlignables);
1035 
1036  PedeReader reader(mprespset, *thePedeSteer, *thePedeLabels, runrange);
1037  align::Alignables alis;
1038  bool okRead = reader.read(alis, setUserVars); // also may set params of IntegratedCalibration's
1039  bool numMatch = true;
1040 
1041  std::stringstream out;
1042  out << "Read " << alis.size() << " alignables";
1043  if (alis.size() != theAlignables.size()) {
1044  out << " while " << theAlignables.size() << " in store";
1045  numMatch = false; // FIXME: Should we check one by one? Or transfer 'alis' to the store?
1046  }
1047  if (!okRead)
1048  out << ", but problems in reading";
1049  if (!allEmpty)
1050  out << ", possibly overwriting previous settings";
1051  out << ".";
1052 
1053  if (okRead && allEmpty) {
1054  if (numMatch) { // as many alignables with result as trying to align
1055  edm::LogInfo("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
1056  } else if (!alis.empty()) { // dead module do not get hits and no pede result
1057  edm::LogWarning("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
1058  } else { // serious problem: no result read - and not all modules can be dead...
1059  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
1060  return false;
1061  }
1062  return true;
1063  }
1064  // the rest is not OK:
1065  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
1066  return false;
1067 }
bool areEmptyParams(const align::Alignables &alignables) const
std::shared_ptr< PedeLabelerBase > thePedeLabels
Log< level::Error, false > LogError
tuple reader
Definition: DQM.py:105
std::unique_ptr< PedeSteerer > thePedeSteer
Log< level::Info, false > LogInfo
std::vector< Alignable * > Alignables
Definition: Utilities.h:31
Log< level::Warning, false > LogWarning
void MillePedeAlignmentAlgorithm::run ( const edm::EventSetup setup,
const EventInfo eventInfo 
)
overridevirtual

Run the algorithm on trajectories and tracks.

Implements AlignmentAlgorithmBase.

Definition at line 465 of file MillePedeAlignmentAlgorithm.cc.

References addReferenceTrajectory(), AlignmentAlgorithmBase::EventInfo::beamSpot(), isMode(), myMilleBit, hltrates_dqm_sourceclient-live_cfg::offset, edm::second(), theMonitor, theTrajectoryFactory, tracks, HLT_FULL_cff::trajectories, and AlignmentAlgorithmBase::EventInfo::trajTrackPairs().

Referenced by DTWorkflow.DTWorkflow::all(), Types.EventID::cppID(), Types.LuminosityBlockID::cppID(), o2olib.O2OTool::execute(), and terminate().

465  {
466  if (!this->isMode(myMilleBit))
467  return; // no theMille created...
468  const auto &tracks = eventInfo.trajTrackPairs();
469 
470  if (theMonitor) { // monitor input tracks
471  for (const auto &iTrajTrack : tracks) {
472  theMonitor->fillTrack(iTrajTrack.second);
473  }
474  }
475 
476  const RefTrajColl trajectories(theTrajectoryFactory->trajectories(setup, tracks, eventInfo.beamSpot()));
477 
478  // Now loop over ReferenceTrajectoryCollection
479  unsigned int refTrajCount = 0; // counter for track monitoring
480  const auto tracksPerTraj = theTrajectoryFactory->tracksPerTrajectory();
481  for (auto iRefTraj = trajectories.cbegin(), iRefTrajE = trajectories.cend(); iRefTraj != iRefTrajE;
482  ++iRefTraj, ++refTrajCount) {
483  RefTrajColl::value_type refTrajPtr = *iRefTraj;
484  if (theMonitor)
485  theMonitor->fillRefTrajectory(refTrajPtr);
486 
487  const auto nHitXy = this->addReferenceTrajectory(setup, eventInfo, refTrajPtr);
488 
489  if (theMonitor && (nHitXy.first || nHitXy.second)) {
490  // if trajectory used (i.e. some hits), fill monitoring
491  const auto offset = tracksPerTraj * refTrajCount;
492  for (unsigned int iTrack = 0; iTrack < tracksPerTraj; ++iTrack) {
493  theMonitor->fillUsedTrack(tracks[offset + iTrack].second, nHitXy.first, nHitXy.second);
494  }
495  }
496 
497  } // end of reference trajectory and track loop
498 }
std::unique_ptr< MillePedeMonitor > theMonitor
TrajectoryFactoryBase::ReferenceTrajectoryCollection RefTrajColl
std::unique_ptr< TrajectoryFactoryBase > theTrajectoryFactory
auto const & tracks
cannot be loose
const ConstTrajTrackPairCollection & trajTrackPairs() const
U second(std::pair< T, U > const &p)
bool isMode(unsigned int testMode) const
std::pair< unsigned int, unsigned int > addReferenceTrajectory(const edm::EventSetup &setup, const EventInfo &eventInfo, const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr)
fill mille for a trajectory, returning number of x/y hits ([0,0] if &#39;bad&#39; trajectory) ...
const reco::BeamSpot & beamSpot() const
bool MillePedeAlignmentAlgorithm::setParametersForRunRange ( const RunRange runrange)
overridevirtual

Called in order to pass parameters to alignables for a specific run range in case the algorithm supports run range dependent alignment.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 335 of file MillePedeAlignmentAlgorithm.cc.

References buildUserVariables(), doIO(), enableAlignableUpdates_, edm::ParameterSet::getParameter(), isMode(), myPedeReadBit, readFromPede(), theAlignables, theAlignmentParameterStore, theConfig, and theLastWrittenIov.

335  {
336  if (this->isMode(myPedeReadBit)) {
337  if (not theAlignmentParameterStore) {
338  return false;
339  }
340  // restore initial positions, rotations and deformations
342  theAlignmentParameterStore->restoreCachedTransformations(runrange.first);
343  } else {
344  theAlignmentParameterStore->restoreCachedTransformations();
345  }
346 
347  // Needed to shut up later warning from checkAliParams:
348  theAlignmentParameterStore->resetParameters();
349  // To avoid that they keep values from previous IOV if no new one in pede result
351 
352  if (!this->readFromPede(theConfig.getParameter<edm::ParameterSet>("pedeReader"), true, runrange)) {
353  edm::LogError("Alignment") << "@SUB=MillePedeAlignmentAlgorithm::setParametersForRunRange"
354  << "Problems reading pede result, but applying!";
355  }
356  theAlignmentParameterStore->applyParameters();
357 
358  this->doIO(++theLastWrittenIov); // pre-increment!
359  }
360 
361  return true;
362 }
void buildUserVariables(const align::Alignables &alignables) const
add MillePedeVariables for each AlignmentParameters (exception if no parameters...)
Log< level::Error, false > LogError
unsigned int doIO(int loop) const
bool isMode(unsigned int testMode) const
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
bool readFromPede(const edm::ParameterSet &mprespset, bool setUserVars, const RunRange &runrange)
read pede input defined by &#39;psetName&#39;, flag to create/not create MillePedeVariables ...
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
bool MillePedeAlignmentAlgorithm::storeAlignments ( )
overridevirtual

Returns whether MP produced results to be stored.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 319 of file MillePedeAlignmentAlgorithm.cc.

References edm::ParameterSet::getParameter(), isMode(), myPedeReadBit, MillePedeFileReader::read(), runAtPCL_, MillePedeFileReader::storeAlignments(), theConfig, thePedeLabels, and theThresholds.

319  {
320  if (isMode(myPedeReadBit)) {
321  if (runAtPCL_) {
322  MillePedeFileReader mpReader(
324  mpReader.read();
325  return mpReader.storeAlignments();
326  } else {
327  return true;
328  }
329  } else {
330  return false;
331  }
332 }
std::shared_ptr< AlignPCLThresholds > theThresholds
std::shared_ptr< PedeLabelerBase > thePedeLabels
bool isMode(unsigned int testMode) const
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
bool MillePedeAlignmentAlgorithm::storeThresholds ( const int &  nRecords,
const AlignPCLThresholds::threshold_map thresholdMap 
)
virtual

Definition at line 303 of file MillePedeAlignmentAlgorithm.cc.

References theThresholds.

Referenced by initialize().

304  {
305  theThresholds->setAlignPCLThresholds(nRecords, thresholdMap);
306  return true;
307 }
std::shared_ptr< AlignPCLThresholds > theThresholds
bool MillePedeAlignmentAlgorithm::supportsCalibrations ( )
overridevirtual

Returns whether MP supports calibrations.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 293 of file MillePedeAlignmentAlgorithm.cc.

293 { return true; }
void MillePedeAlignmentAlgorithm::terminate ( const edm::EventSetup iSetup)
overridevirtual

Called at end of job.

Implements AlignmentAlgorithmBase.

Definition at line 366 of file MillePedeAlignmentAlgorithm.cc.

References terminate().

366 { terminate(); }
void terminate() override
Called at end of job.
void MillePedeAlignmentAlgorithm::terminate ( )
overridevirtual

Called at end of job.

Reimplemented from AlignmentAlgorithmBase.

Definition at line 367 of file MillePedeAlignmentAlgorithm.cc.

References cachedRuns_, doIO(), enableAlignableUpdates_, Exception, mergeVDriftHistosByStation::file, submitPVResolutionJobs::files, spr::find(), getExistingFormattedFiles(), edm::ParameterSet::getParameter(), isMode(), lastProcessedRun_, myMilleBit, myPedeReadBit, myPedeRunBit, run(), AlCaHLTBitMon_QueryRunRegistry::string, theAlignmentParameterStore, theBinary, theConfig, theDir, theLastWrittenIov, theMille, thePedeSteer, and uniqueRunRanges_.

Referenced by terminate().

367  {
368  theMille.reset(); // delete to close binary before running pede below (flush would be enough...)
369  theBinary.reset();
370 
371  std::vector<std::string> files;
372  if (this->isMode(myMilleBit) || !theConfig.getParameter<std::string>("binaryFile").empty()) {
373  files.push_back(theDir + theConfig.getParameter<std::string>("binaryFile"));
374  } else {
375  const std::vector<std::string> plainFiles(theConfig.getParameter<std::vector<std::string> >("mergeBinaryFiles"));
376  files = getExistingFormattedFiles(plainFiles, theDir);
377  // Do some logging:
378  std::string filesForLogOutput;
379  for (const auto &file : files)
380  filesForLogOutput += " " + file + ",";
381  if (filesForLogOutput.length() != 0)
382  filesForLogOutput.pop_back();
383  edm::LogInfo("Alignment") << "Based on the config parameter mergeBinaryFiles, using the following "
384  << "files as input (assigned weights are indicated by ' -- <weight>'):"
385  << filesForLogOutput;
386  }
387 
389  return;
390 
391  // cache all positions, rotations and deformations
392  theAlignmentParameterStore->cacheTransformations();
394  if (lastProcessedRun_ < uniqueRunRanges_.back().first) {
395  throw cms::Exception("BadConfig") << "@SUB=MillePedeAlignmentAlgorithm::terminate\n"
396  << "Last IOV of 'RunRangeSelection' has not been processed. "
397  << "Please reconfigure your source to process the runs at least up to "
398  << uniqueRunRanges_.back().first << ".";
399  }
400  auto lastCachedRun = uniqueRunRanges_.front().first;
401  for (const auto &runRange : uniqueRunRanges_) {
402  const auto run = runRange.first;
403  if (std::find(cachedRuns_.begin(), cachedRuns_.end(), run) == cachedRuns_.end()) {
404  theAlignmentParameterStore->restoreCachedTransformations(lastCachedRun);
405  theAlignmentParameterStore->cacheTransformations(run);
406  } else {
407  lastCachedRun = run;
408  }
409  }
410  theAlignmentParameterStore->restoreCachedTransformations();
411  }
412 
413  const std::string masterSteer(thePedeSteer->buildMasterSteer(files)); // do only if myPedeSteerBit?
414  if (this->isMode(myPedeRunBit)) {
415  thePedeSteer->runPede(masterSteer);
416  }
417 
418  // parameters from pede are not yet applied,
419  // so we can still write start positions (but with hit statistics in case of mille):
420  this->doIO(0);
421  theLastWrittenIov = 0;
422 }
std::unique_ptr< gbl::MilleBinary > theBinary
std::vector< std::string > getExistingFormattedFiles(const std::vector< std::string > &plainFiles, const std::string &theDir)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
unsigned int doIO(int loop) const
std::vector< align::RunNumber > cachedRuns_
bool isMode(unsigned int testMode) const
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
std::unique_ptr< PedeSteerer > thePedeSteer
Log< level::Info, false > LogInfo
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void run(const edm::EventSetup &setup, const EventInfo &eventInfo) override
Run the algorithm on trajectories and tracks.

Member Data Documentation

const edm::ESGetToken<AlignPCLThresholds, AlignPCLThresholdsRcd> MillePedeAlignmentAlgorithm::aliThrToken_
private

Definition at line 274 of file MillePedeAlignmentAlgorithm.h.

Referenced by initialize().

std::vector<align::RunNumber> MillePedeAlignmentAlgorithm::cachedRuns_
private

Definition at line 316 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun(), and terminate().

const bool MillePedeAlignmentAlgorithm::enableAlignableUpdates_
private

Definition at line 300 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun(), setParametersForRunRange(), and terminate().

const bool MillePedeAlignmentAlgorithm::enforceSingleIOVInput_
private

Definition at line 315 of file MillePedeAlignmentAlgorithm.h.

Referenced by initialize().

const align::RunNumber MillePedeAlignmentAlgorithm::firstIOV_
private

maximal correlation allowed for 2D hit in TID/TEC. If larger, the 2D measurement gets diagonalized!!!

Definition at line 298 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun().

const bool MillePedeAlignmentAlgorithm::ignoreFirstIOVCheck_
private

Definition at line 299 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun().

const bool MillePedeAlignmentAlgorithm::ignoreHitsWithoutGlobalDerivatives_
private

Definition at line 311 of file MillePedeAlignmentAlgorithm.h.

Referenced by addMeasurementData().

align::RunNumber MillePedeAlignmentAlgorithm::lastProcessedRun_
private

Definition at line 317 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun(), and terminate().

const bool MillePedeAlignmentAlgorithm::runAtPCL_
private
const bool MillePedeAlignmentAlgorithm::skipGlobalPositionRcdCheck_
private

Definition at line 312 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun().

std::unique_ptr<AlignableNavigator> MillePedeAlignmentAlgorithm::theAlignableNavigator
private
align::Alignables MillePedeAlignmentAlgorithm::theAlignables
private
AlignmentParameterStore* MillePedeAlignmentAlgorithm::theAlignmentParameterStore
private

directory for all kind of files

Definition at line 285 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun(), initialize(), setParametersForRunRange(), and terminate().

std::unique_ptr<gbl::MilleBinary> MillePedeAlignmentAlgorithm::theBinary
private
std::vector<IntegratedCalibrationBase *> MillePedeAlignmentAlgorithm::theCalibrations
private
edm::ParameterSet MillePedeAlignmentAlgorithm::theConfig
private
std::string MillePedeAlignmentAlgorithm::theDir
private
bool MillePedeAlignmentAlgorithm::theDoSurveyPixelBarrel
private

Definition at line 305 of file MillePedeAlignmentAlgorithm.h.

Referenced by initialize().

std::vector<float> MillePedeAlignmentAlgorithm::theFloatBufferX
private

Definition at line 302 of file MillePedeAlignmentAlgorithm.h.

Referenced by addLasBeam(), and addMeasurementData().

std::vector<float> MillePedeAlignmentAlgorithm::theFloatBufferY
private

Definition at line 303 of file MillePedeAlignmentAlgorithm.h.

Referenced by addLasBeam(), and addMeasurementData().

bool MillePedeAlignmentAlgorithm::theGblDoubleBinary
private

Definition at line 308 of file MillePedeAlignmentAlgorithm.h.

Referenced by MillePedeAlignmentAlgorithm().

std::vector<int> MillePedeAlignmentAlgorithm::theIntBuffer
private

Definition at line 304 of file MillePedeAlignmentAlgorithm.h.

Referenced by addGlobalData(), addLasBeam(), and addMeasurementData().

int MillePedeAlignmentAlgorithm::theLastWrittenIov
private

Definition at line 301 of file MillePedeAlignmentAlgorithm.h.

Referenced by setParametersForRunRange(), and terminate().

double MillePedeAlignmentAlgorithm::theMaximalCor2D
private

Definition at line 296 of file MillePedeAlignmentAlgorithm.h.

Referenced by callMille2D().

std::unique_ptr<Mille> MillePedeAlignmentAlgorithm::theMille
private
unsigned int MillePedeAlignmentAlgorithm::theMinNumHits
private

Definition at line 295 of file MillePedeAlignmentAlgorithm.h.

Referenced by addReferenceTrajectory().

unsigned int MillePedeAlignmentAlgorithm::theMode
private

Definition at line 283 of file MillePedeAlignmentAlgorithm.h.

Referenced by isMode().

std::unique_ptr<MillePedeMonitor> MillePedeAlignmentAlgorithm::theMonitor
private
std::shared_ptr<PedeLabelerBase> MillePedeAlignmentAlgorithm::thePedeLabels
private
std::unique_ptr<PedeSteerer> MillePedeAlignmentAlgorithm::thePedeSteer
private
std::shared_ptr<AlignPCLThresholds> MillePedeAlignmentAlgorithm::theThresholds
private

Definition at line 294 of file MillePedeAlignmentAlgorithm.h.

Referenced by initialize(), storeAlignments(), and storeThresholds().

std::unique_ptr<TrajectoryFactoryBase> MillePedeAlignmentAlgorithm::theTrajectoryFactory
private

Definition at line 292 of file MillePedeAlignmentAlgorithm.h.

Referenced by run().

const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> MillePedeAlignmentAlgorithm::topoToken_
private

Definition at line 273 of file MillePedeAlignmentAlgorithm.h.

Referenced by initialize().

const align::RunRanges MillePedeAlignmentAlgorithm::uniqueRunRanges_
private

Definition at line 314 of file MillePedeAlignmentAlgorithm.h.

Referenced by beginRun(), and terminate().