58 #include <TMatrixDSymEigen.h>
78 theConfig(cfg), theMode(this->decodeMode(theConfig.getUntrackedParameter<std::string>(
"mode"))),
79 theDir(theConfig.getUntrackedParameter<std::string>(
"fileDir")),
80 theAlignmentParameterStore(0), theAlignables(), theAlignableNavigator(0),
81 theMonitor(0), theMille(0), thePedeLabels(0), thePedeSteer(0),
82 theTrajectoryFactory(0),
83 theMinNumHits(cfg.getParameter<unsigned int>(
"minNumHits")),
84 theMaximalCor2D(cfg.getParameter<double>(
"max2Dcorrelation"))
87 edm::LogInfo(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm" <<
"Start in mode '"
89 <<
"' with output directory '" <<
theDir <<
"'.";
111 edm::LogWarning(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::initialize"
112 <<
"Running with AlignabeMuon not yet tested.";
128 const std::vector<edm::ParameterSet> mprespset
130 if (!mprespset.empty()) {
131 edm::LogInfo(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::initialize"
132 <<
"Apply " << mprespset.end() - mprespset.begin()
133 <<
" previous MillePede constants from 'pedeReaderInputs'.";
135 for (std::vector<edm::ParameterSet>::const_iterator iSet = mprespset.begin(), iE = mprespset.end();
136 iSet != iE; ++iSet) {
139 <<
"MillePedeAlignmentAlgorithm::initialize: Problems reading input constants of "
140 <<
"pedeReaderInputs entry " << iSet - mprespset.begin() <<
'.';
157 <<
"'vstring mergeTreeFiles' and 'vstring mergeBinaryFiles' must be empty for "
158 <<
"modes running mille.";
166 const std::string fctName(fctCfg.
getParameter<std::string>(
"TrajectoryFactoryName"));
189 std::vector<std::string>
files;
193 const std::vector<std::string> plainFiles
195 for (std::vector<std::string>::const_iterator
i = plainFiles.begin(), iEnd = plainFiles.end();
207 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::terminate"
208 <<
"Problems reading pede result, but applying!";
240 for (ConstTrajTrackPairCollection::const_iterator iTrajTrack = tracks.begin();
241 iTrajTrack != tracks.end(); ++iTrajTrack) {
249 unsigned int refTrajCount = 0;
250 for (RefTrajColl::const_iterator iRefTraj = trajectories.begin(), iRefTrajE = trajectories.end();
251 iRefTraj != iRefTrajE; ++iRefTraj, ++refTrajCount) {
258 if (
theMonitor && (nHitXy.first || nHitXy.second)) {
262 (trajectories.size() == tracks.size() ? tracks[refTrajCount].second : 0);
272 std::pair<unsigned int, unsigned int>
275 std::pair<unsigned int, unsigned int> hitResultXy(0,0);
276 if (refTrajPtr->isValid()) {
279 std::vector<AlignmentParameters*> parVec(refTrajPtr->recHits().size());
281 std::vector<bool> validHitVecY(refTrajPtr->recHits().size(),
false);
283 for (
unsigned int iHit = 0; iHit < refTrajPtr->recHits().size(); ++iHit) {
287 hitResultXy.first = 0;
290 if (flagXY >= 1) ++hitResultXy.first;
291 validHitVecY[iHit] = (flagXY >= 2);
296 for (
unsigned int iMsMeas = 0; iMsMeas < refTrajPtr->numberOfMsMeas(); ++iMsMeas) {
301 if (hitResultXy.first == 0 || hitResultXy.first <
theMinNumHits) {
303 hitResultXy.first = hitResultXy.second = 0;
307 for (
unsigned int iHit = 0; iHit < validHitVecY.size(); ++iHit) {
308 if (!parVec[iHit])
continue;
311 if (validHitVecY[iHit]) {
313 ++hitResultXy.second;
338 theFloatBufferX.clear();
339 theFloatBufferY.clear();
340 theIntBuffer.clear();
345 if (!recHitPtr->isValid())
return 0;
348 AlignableDetOrUnitPtr alidet(theAlignableNavigator->alignableFromDetId(recHitPtr->geographicalId()));
350 if (!this->globalDerivativesHierarchy(tsos, alidet, alidet, theFloatBufferX,
351 theFloatBufferY, theIntBuffer, params)) {
353 }
else if (theFloatBufferX.empty()) {
356 return this->callMille(refTrajPtr, iHit, theIntBuffer, theFloatBufferX, theFloatBufferY);
364 std::vector<float> &globalDerivativesX,
365 std::vector<float> &globalDerivativesY,
366 std::vector<int> &globalLabels,
370 if (!ali)
return true;
372 if (
false && theMonitor && alidet != ali) theMonitor->fillFrameToFrame(alidet, ali);
377 if (!lowestParams) lowestParams = params;
379 const unsigned int alignableLabel = thePedeLabels->alignableLabel(ali);
380 if (0 == alignableLabel) {
381 edm::LogWarning(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::globalDerivativesHierarchy"
382 <<
"Label not found, skip Alignable.";
386 const std::vector<bool> &selPars = params->
selector();
390 for (
unsigned int iSel = 0; iSel < selPars.size(); ++iSel) {
392 globalDerivativesX.push_back(derivs[iSel][kLocalX]
393 /thePedeSteer->cmsToPedeFactor(iSel));
394 globalLabels.push_back(thePedeLabels->parameterLabel(alignableLabel, iSel));
395 globalDerivativesY.push_back(derivs[iSel][kLocalY]
396 /thePedeSteer->cmsToPedeFactor(iSel));
400 if (thePedeSteer->isNoHiera(ali))
return true;
403 return this->globalDerivativesHierarchy(tsos, ali->
mother(), alidet,
404 globalDerivativesX, globalDerivativesY,
405 globalLabels, lowestParams);
447 if (recHit->dimension() < 2) {
449 }
else if (recHit->detUnit()) {
450 return recHit->detUnit()->type().isTrackerPixel();
452 if (dynamic_cast<const ProjectedSiStripRecHit2D*>(recHit->hit())) {
468 std::vector<Alignable*> alis;
469 bool okRead = reader.
read(alis, setUserVars);
470 bool numMatch =
true;
472 std::stringstream
out(
"Read ");
473 out << alis.size() <<
" alignables";
478 if (!okRead) out <<
", but problems in reading";
479 if (!allEmpty) out <<
", possibly overwriting previous settings";
482 if (okRead && allEmpty) {
484 edm::LogInfo(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
485 }
else if (alis.size()) {
486 edm::LogWarning(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
488 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
494 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::readFromPede" << out.str();
502 for (std::vector<Alignable*>::const_iterator iAli = alignables.begin();
503 iAli != alignables.end(); ++iAli) {
508 for (
int i = 0;
i < parVec.num_row(); ++
i) {
509 if (parVec[
i] != 0.)
return false;
510 for (
int j =
i;
j < parCov.num_col(); ++
j) {
511 if (parCov[
i][
j] != 0.)
return false;
526 if (outFilePlain.empty()) {
527 edm::LogInfo(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO"
528 <<
"treeFile parameter empty => skip writing for 'loop' " <<
loop;
532 const std::string outFile(
theDir + outFilePlain);
539 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO"
540 <<
"Problem " << ioerr <<
" in writeAlignableOriginalPositions";
545 const std::vector<std::string> inFiles
547 const std::vector<std::string> binFiles
549 if (inFiles.size() != binFiles.size()) {
550 edm::LogWarning(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO"
551 <<
"'vstring mergeTreeFiles' and 'vstring mergeBinaryFiles' "
559 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO"
560 <<
"Problem " << ioerr <<
" writing MillePedeVariables";
575 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO" <<
"Problem " << ioerr
576 <<
" in writeOrigRigidBodyAlignmentParameters, " <<
loop;
581 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO" <<
"Problem " << ioerr
582 <<
" in writeAlignableAbsolutePositions, " <<
loop;
587 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::doIO" <<
"Problem " << ioerr
588 <<
" in writeAlignableRelativePositions, " <<
loop;
598 for (std::vector<Alignable*>::const_iterator iAli = alis.begin(); iAli != alis.end(); ++iAli) {
601 throw cms::Exception(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::buildUserVariables"
602 <<
"No parameters for alignable";
612 if (mode ==
"full") {
614 }
else if (mode ==
"mille") {
616 }
else if (mode ==
"pede") {
618 }
else if (mode ==
"pedeSteer") {
620 }
else if (mode ==
"pedeRun") {
622 }
else if (mode ==
"pedeRead") {
627 <<
"Unknown mode '" << mode
628 <<
"', use 'full', 'mille', 'pede', 'pedeRun', 'pedeSteer' or 'pedeRead'.";
635 const std::vector<std::string> &inFiles)
const
640 if (inFiles.empty()) {
641 const std::vector<AlignmentUserVariables*> mpVars =
644 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::addHitStatistics"
645 <<
"Error " << ierr <<
" reading from " << outFile
646 <<
", tree " << fromLoop <<
", or problems in addHits";
649 for (std::vector<AlignmentUserVariables*>::const_iterator
i = mpVars.begin();
650 i != mpVars.end(); ++
i){
654 for (std::vector<std::string>::const_iterator iFile = inFiles.begin();
655 iFile != inFiles.end(); ++iFile) {
656 const std::string inFile(
theDir + *iFile);
657 const std::vector<AlignmentUserVariables*> mpVars =
660 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::addHitStatistics"
661 <<
"Error " << ierr <<
" reading from " << inFile
662 <<
", tree " << fromLoop <<
", or problems in addHits";
665 for (std::vector<AlignmentUserVariables*>::const_iterator
i = mpVars.begin();
666 i != mpVars.end(); ++
i) {
677 const std::vector<AlignmentUserVariables*> &mpVars)
const
679 bool allOk = (mpVars.size() == alis.size());
680 std::vector<AlignmentUserVariables*>::const_iterator iUser = mpVars.begin();
681 for (std::vector<Alignable*>::const_iterator iAli = alis.begin();
682 iAli != alis.end() && iUser != mpVars.end(); ++iAli, ++iUser) {
686 if (!mpVarNew || !mpVarOld || mpVarOld->
size() != mpVarNew->
size()) {
700 const std::vector<float> &globalDerivativesy,
701 TMatrixF &aGlobalDerivativesM)
704 for (
unsigned int i = 0;
i < globalDerivativesx.size(); ++
i) {
705 aGlobalDerivativesM(0,
i) = globalDerivativesx[
i];
706 aGlobalDerivativesM(1,
i) = globalDerivativesy[
i];
712 (TMatrixDSym &aHitCovarianceM, TMatrixF &aLocalDerivativesM, TMatrixF &aHitResidualsM,
713 TMatrixF &aGlobalDerivativesM)
const
715 TMatrixDSymEigen myDiag(aHitCovarianceM);
716 TMatrixD aTranfoToDiagonalSystem = myDiag.GetEigenVectors();
717 TMatrixD aTranfoToDiagonalSystemInv = myDiag.GetEigenVectors( );
718 TMatrixF aTranfoToDiagonalSystemInvF = myDiag.GetEigenVectors( );
719 TMatrixD aMatrix = aTranfoToDiagonalSystemInv.Invert() * aHitCovarianceM * aTranfoToDiagonalSystem;
725 aHitCovarianceM = TMatrixDSym(2, aMatrix.GetMatrixArray());
726 aTranfoToDiagonalSystemInvF.Invert();
728 aLocalDerivativesM = aTranfoToDiagonalSystemInvF * aLocalDerivativesM;
731 aHitResidualsM = aTranfoToDiagonalSystemInvF * aHitResidualsM;
732 aGlobalDerivativesM = aTranfoToDiagonalSystemInvF * aGlobalDerivativesM;
738 unsigned int iMsMeas, TMatrixDSym &aHitCovarianceM,
739 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM)
743 const unsigned int xIndex = iMsMeas + refTrajPtr->numberOfHitMeas();
747 aHitCovarianceM(0,0)=refTrajPtr->measurementErrors()[xIndex][xIndex];
750 aHitResidualsM(0,0)= refTrajPtr->measurements()[xIndex];
757 for (
int i = 0;
i < locDerivMatrix.num_col(); ++
i) {
758 aLocalDerivativesM(0,
i) = locDerivMatrix[xIndex][
i];
765 unsigned int iTrajHit, TMatrixDSym &aHitCovarianceM,
766 TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM)
770 const unsigned int xIndex = iTrajHit*2;
771 const unsigned int yIndex = iTrajHit*2+1;
775 aHitCovarianceM(0,0)=refTrajPtr->measurementErrors()[xIndex][xIndex];
776 aHitCovarianceM(0,1)=refTrajPtr->measurementErrors()[xIndex][yIndex];
777 aHitCovarianceM(1,0)=refTrajPtr->measurementErrors()[yIndex][xIndex];
778 aHitCovarianceM(1,1)=refTrajPtr->measurementErrors()[yIndex][yIndex];
781 aHitResidualsM(0,0)= refTrajPtr->measurements()[xIndex] - refTrajPtr->trajectoryPositions()[xIndex];
782 aHitResidualsM(1,0)= refTrajPtr->measurements()[yIndex] - refTrajPtr->trajectoryPositions()[yIndex];
789 for (
int i = 0;
i < locDerivMatrix.num_col(); ++
i) {
790 aLocalDerivativesM(0,
i) = locDerivMatrix[xIndex][
i];
791 aLocalDerivativesM(1,
i) = locDerivMatrix[yIndex][
i];
798 unsigned int iTrajHit,
const std::vector<int> &globalLabels,
799 const std::vector<float> &globalDerivativesX,
800 const std::vector<float> &globalDerivativesY)
804 if((aRecHit)->dimension() == 1) {
805 return this->callMille1D(refTrajPtr, iTrajHit, globalLabels, globalDerivativesX);
807 return this->callMille2D(refTrajPtr, iTrajHit, globalLabels,
808 globalDerivativesX, globalDerivativesY);
816 unsigned int iTrajHit,
const std::vector<int> &globalLabels,
817 const std::vector<float> &globalDerivativesX)
820 const unsigned int xIndex = iTrajHit*2;
824 const int nLocal = locDerivMatrix.num_col();
825 std::vector<float> localDerivatives(nLocal);
826 for (
unsigned int i = 0;
i < localDerivatives.size(); ++
i) {
827 localDerivatives[
i] = locDerivMatrix[xIndex][
i];
831 float residX = refTrajPtr->measurements()[xIndex] - refTrajPtr->trajectoryPositions()[xIndex];
832 float hitErrX = TMath::Sqrt(refTrajPtr->measurementErrors()[xIndex][xIndex]);
835 const int nGlobal = globalDerivativesX.size();
839 theMille->mille(nLocal, &(localDerivatives[0]), nGlobal, &(globalDerivativesX[0]),
840 &(globalLabels[0]), residX, hitErrX);
843 theMonitor->fillDerivatives(aRecHit, &(localDerivatives[0]), nLocal,
844 &(globalDerivativesX[0]), nGlobal, &(globalLabels[0]));
845 theMonitor->fillResiduals(aRecHit, refTrajPtr->trajectoryStates()[iTrajHit],
846 iTrajHit, residX, hitErrX,
false);
855 unsigned int iTrajHit,
const std::vector<int> &globalLabels,
856 const std::vector<float> &globalDerivativesx,
857 const std::vector<float> &globalDerivativesy)
861 if((aRecHit)->dimension() != 2) {
862 edm::LogError(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::callMille2D"
863 <<
"You try to call method for 2D hits for a "
865 <<
"D Hit. Hit gets ignored!";
869 TMatrixDSym aHitCovarianceM(2);
870 TMatrixF aHitResidualsM(2,1);
871 TMatrixF aLocalDerivativesM(2, refTrajPtr->derivatives().num_col());
873 this->addRefTrackData2D(refTrajPtr, iTrajHit, aHitCovarianceM,aHitResidualsM,aLocalDerivativesM);
874 TMatrixF aGlobalDerivativesM(2,globalDerivativesx.size());
875 this->makeGlobDerivMatrix(globalDerivativesx, globalDerivativesy, aGlobalDerivativesM);
880 const double corr = aHitCovarianceM(0,1) /
sqrt(aHitCovarianceM(0,0) * aHitCovarianceM(1,1));
881 if (theMonitor) theMonitor->fillCorrelations2D(corr, aRecHit);
883 switch(aRecHit->geographicalId().subdetId()) {
886 if (aRecHit->geographicalId().det() ==
DetId::Tracker && TMath::Abs(corr) > theMaximalCor2D) {
887 this->diagonalize(aHitCovarianceM, aLocalDerivativesM, aHitResidualsM, aGlobalDerivativesM);
894 float newResidX = aHitResidualsM(0,0);
895 float newResidY = aHitResidualsM(1,0);
896 float newHitErrX = TMath::Sqrt(aHitCovarianceM(0,0));
897 float newHitErrY = TMath::Sqrt(aHitCovarianceM(1,1));
898 float *newLocalDerivsX = aLocalDerivativesM[0].GetPtr();
899 float *newLocalDerivsY = aLocalDerivativesM[1].GetPtr();
900 float *newGlobDerivsX = aGlobalDerivativesM[0].GetPtr();
901 float *newGlobDerivsY = aGlobalDerivativesM[1].GetPtr();
902 const int nLocal = aLocalDerivativesM.GetNcols();
903 const int nGlobal = aGlobalDerivativesM.GetNcols();
905 if (diag && (newHitErrX > newHitErrY)) {
909 std::swap(newLocalDerivsX, newLocalDerivsY);
910 std::swap(newGlobDerivsX, newGlobDerivsY);
915 theMille->mille(nLocal, newLocalDerivsX, nGlobal, newGlobDerivsX,
916 &(globalLabels[0]), newResidX, newHitErrX);
919 theMonitor->fillDerivatives(aRecHit, newLocalDerivsX, nLocal, newGlobDerivsX, nGlobal,
921 theMonitor->fillResiduals(aRecHit, refTrajPtr->trajectoryStates()[iTrajHit],
922 iTrajHit, newResidX, newHitErrX,
false);
924 const bool isReal2DHit = this->is2D(aRecHit);
926 theMille->mille(nLocal, newLocalDerivsY, nGlobal, newGlobDerivsY,
927 &(globalLabels[0]), newResidY, newHitErrY);
929 theMonitor->fillDerivatives(aRecHit, newLocalDerivsY, nLocal, newGlobDerivsY, nGlobal,
931 theMonitor->fillResiduals(aRecHit, refTrajPtr->trajectoryStates()[iTrajHit],
932 iTrajHit, newResidY, newHitErrY,
true);
936 return (isReal2DHit ? 2 : 1);
943 TMatrixDSym aHitCovarianceM(1);
944 TMatrixF aHitResidualsM(1,1);
945 TMatrixF aLocalDerivativesM(1, refTrajPtr->derivatives().num_col());
947 this->addRefTrackMsMeas1D(refTrajPtr, iMsMeas, aHitCovarianceM, aHitResidualsM, aLocalDerivativesM);
950 TMatrixF aGlobalDerivativesM(1,1);
951 aGlobalDerivativesM(0,0) = 0;
953 float newResidX = aHitResidualsM(0,0);
954 float newHitErrX = TMath::Sqrt(aHitCovarianceM(0,0));
955 float *newLocalDerivsX = aLocalDerivativesM[0].GetPtr();
956 float *newGlobDerivsX = aGlobalDerivativesM[0].GetPtr();
957 const int nLocal = aLocalDerivativesM.GetNcols();
958 const int nGlobal = 0;
960 theMille->mille(nLocal, newLocalDerivsX, nGlobal, newGlobDerivsX,
961 &nGlobal, newResidX, newHitErrX);
968 TsosVectorCollection::const_iterator iTsoses = lasBeamTsoses.begin();
969 for(TkFittedLasBeamCollection::const_iterator iBeam = lasBeams.begin(), iEnd = lasBeams.end();
970 iBeam != iEnd; ++iBeam, ++iTsoses){
972 edm::LogInfo(
"Alignment") <<
"@SUB=MillePedeAlignmentAlgorithm::addLaserData"
973 <<
"Beam " << iBeam->getBeamId() <<
" with "
974 << iBeam->parameters().size() <<
" parameters and "
975 << iBeam->getData().size() <<
" hits.\n There are "
976 << iTsoses->size() <<
" TSOSes.";
984 const std::vector<TrajectoryStateOnSurface> &tsoses)
987 std::vector<float> lasLocalDerivsX;
990 for (
unsigned int iHit = 0; iHit < tsoses.size(); ++iHit) {
991 if (!tsoses[iHit].isValid())
continue;
996 lasLocalDerivsX.clear();
1003 for (
unsigned int nFitParams = 0;
1004 nFitParams < static_cast<unsigned int>(lasBeam.
parameters().size());
1008 lasLocalDerivsX.push_back(derivative);
1016 const float residual = hit.
localPosition().
x() - tsoses[iHit].localPosition().x();
1018 const float error = 0.003;
1030 const bool doOutputOnStdout(pxbSurveyCfg.
getParameter<
bool>(
"doOutputOnStdout"));
1031 if (doOutputOnStdout)
std::cout <<
"# Output from addPxbSurvey follows below because doOutputOnStdout is set to True" << std::endl;
1038 std::vector<SurveyPxbImageLocalFit> measurements;
1045 if (doOutputOnStdout)
std::cout <<
"Module " <<
i <<
": ";
1069 fidpointvec.push_back(fidpoint0inSurf1frame);
1070 fidpointvec.push_back(fidpoint1inSurf1frame);
1071 fidpointvec.push_back(fidpoint2);
1072 fidpointvec.push_back(fidpoint3);
1077 dicer.
doDice(fidpointvec,measurements[i].getIdPair(),
outfile);
1083 a = measurements[
i].getLocalParameters();
1087 if (doOutputOnStdout)
1089 std::cout <<
"a: " << a[0] <<
", " << a[1] <<
", " << a[2] <<
", " << a[3]
1090 <<
" S= " <<
sqrt(a[2]*a[2]+a[3]*a[3])
1091 <<
" phi= " << atan(a[3]/a[2])
1092 <<
" chi2= " << chi2 << std::endl;
1104 measurements[i].getLocalDerivsPtr(
j),
1105 (
int)measurements[i].getGlobalDerivsSize(),
1106 measurements[i].getGlobalDerivsPtr(
j),
1107 measurements[i].getGlobalDerivsLabelPtr(
j),
1108 measurements[i].getResiduum(
j),
1109 measurements[i].getSigma(
j));
unsigned int hitsX() const
get number of hits for x-measurement
std::vector< int > theIntBuffer
T getParameter(std::string const &) const
unsigned int firstFixedParameter() const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< AlignmentUserVariables * > readMillePedeVariables(const std::vector< Alignable * > &alivec, const char *filename, int iter, int &ierr)
bool globalDerivativesHierarchy(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
unsigned int size() const
number of parameters
void resetParameters(void)
reset parameters, correlations, user variables
void increaseHitsX(unsigned int add=1)
increase hits for x-measurement
bool read(std::vector< Alignable * > &alignables, bool setUserVars)
void addMsMeas(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iMsMeas)
adds data from reference trajectory from a specific multiple scattering measurement ...
std::vector< coord_t > fidpoint_t
unsigned int lasBeamLabel(unsigned int lasBeamId) const
void increaseHitsY(unsigned int add=1)
increase hits for y-measurement
std::vector< Alignable * > theAlignables
TrajectoryFactoryBase::ReferenceTrajectoryCollection RefTrajColl
bool theDoSurveyPixelBarrel
void writeAlignableOriginalPositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write Alignable original (before misalignment) absolute positions
void fillPxbSurveyHistsLocalPars(const float &a0, const float &a1, const float &S, const float &phi)
unsigned int theMinNumHits
void applyParameters(void)
Obsolete: Use AlignableNavigator::alignableDetFromDetId and alignableFromAlignableDet.
PedeSteerer * thePedeSteer
virtual LocalPoint localPosition() const
Container::value_type value_type
const AlgebraicMatrix & derivatives() const
matrix of local derivatives: columns are parameters, rows are hits
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
int callMille2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy)
const ConstTrajTrackPairCollection & trajTrackPairs_
const TsosVectorCollection * tkLasBeamTsoses_
might be null!
virtual void initialize(const edm::EventSetup &setup, AlignableTracker *tracker, AlignableMuon *muon, AlignableExtras *extras, AlignmentParameterStore *store)
Call at beginning of job.
unsigned int parameterLabel(unsigned int aliLabel, unsigned int parNum) const
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
void fillPxbSurveyHistsChi2(const float &chi2)
unsigned int doIO(int loop) const
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
void addRefTrackMsMeas1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, TMatrixDSym &aHitCovarianceM, TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM)
adds multiple scattering data from reference trajectory from a specific Hit
const AlgebraicVector & parameters(void) const
Get alignment parameters.
std::string doDice(const fidpoint_t &fidpointvec, const idPair_t &id, const bool rotate=false)
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
int callMille1D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, const std::vector< int > &globalLabels, const std::vector< float > &globalDerivativesX)
calls Mille for 1D hits
bool isMode(unsigned int testMode) const
align::RotationType toLocal(const align::RotationType &) const
Return in local frame a rotation given in global frame.
virtual AlgebraicMatrix derivatives(const TrajectoryStateOnSurface &tsos, const AlignableDetOrUnitPtr &alidet) const =0
Get derivatives of selected parameters.
CLHEP::HepMatrix AlgebraicMatrix
const std::vector< Scalar > & parameters() const
parallel to derivatives()
void fillUsedTrack(const reco::Track *track, unsigned int nHitX, unsigned int nHitY)
const PedeLabeler * thePedeLabels
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
void addLaserData(const TkFittedLasBeamCollection &tkLasBeams, const TsosVectorCollection &tkLasBeamTsoses)
int runPede(const std::string &masterSteer) const
run pede, masterSteer should be as returned from buildMasterSteer(...)
unsigned int getBeamId(void) const
return the full beam identifier
AlignmentParameterStore * theAlignmentParameterStore
directory for all kind of files
unsigned int hitsY() const
get number of hits for y-measurement
AlignableNavigator * theAlignableNavigator
bool is2D(const TransientTrackingRecHit::ConstRecHitPointer &recHit) const
true if hit belongs to 2D detector (currently tracker specific)
void diagonalize(TMatrixDSym &aHitCovarianceM, TMatrixF &aLocalDerivativesM, TMatrixF &aHitResidualsM, TMatrixF &theGlobalDerivativesM) const
edm::ParameterSet theConfig
std::string buildMasterSteer(const std::vector< std::string > &binaryFiles)
construct (and return name of) master steering file from config, binaryFiles etc. ...
void writeAlignableRelativePositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write Alignable relative positions (shift,rotation)
void mille(int NLC, const float *derLc, int NGL, const float *derGl, const int *label, float rMeas, float sigma)
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
bool addHits(const std::vector< Alignable * > &alis, const std::vector< AlignmentUserVariables * > &mpVars) const
void writeMillePedeVariables(const std::vector< Alignable * > &alivec, const char *filename, int iter, bool validCheck, int &ierr)
bool addHitStatistics(int fromLoop, const std::string &outFile, const std::vector< std::string > &inFiles) const
std::vector< ConstRecHitPointer > ConstRecHitContainer
bool areEmptyParams(const std::vector< Alignable * > &alignables) const
const reco::BeamSpot & beamSpot_
std::pair< unsigned int, unsigned int > addReferenceTrajectory(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr)
fill mille for a trajectory, returning number of x/y hits ([0,0] if 'bad' trajectory) ...
CLHEP::HepVector AlgebraicVector
MillePedeMonitor * theMonitor
unsigned int alignableLabel(Alignable *alignable) const
Return 32-bit unique label for alignable, 0 indicates failure.
std::vector< ReferenceTrajectoryPtr > ReferenceTrajectoryCollection
const SiStripDetId & getDetId(void) const
void addRefTrackData2D(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iTrajHit, TMatrixDSym &aHitCovarianceM, TMatrixF &aHitResidualsM, TMatrixF &aLocalDerivativesM)
adds data from reference trajectory from a specific Hit
void setUserVariables(AlignmentUserVariables *auv)
Set pointer to user variables.
std::vector< float > theFloatBufferX
void buildSubSteer(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *aliExtras)
construct steering files about hierarchy, fixing etc. an keep track of their names ...
void makeGlobDerivMatrix(const std::vector< float > &globalDerivativesx, const std::vector< float > &globalDerivativesy, TMatrixF &aGlobalDerivativesM)
Class to hold one picture of the BPix survey.
const TkFittedLasBeamCollection * tkLasBeams_
int addMeasurementData(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr, unsigned int iHit, AlignmentParameters *¶ms)
virtual void endRun(const EndRunInfo &runInfo, const edm::EventSetup &setup)
Run on run products, e.g. TkLAS.
std::vector< value_t > localpars_t
void fillTrack(const reco::Track *track)
const int size(void) const
Get number of parameters.
bool readFromPede(const edm::ParameterSet &mprespset, bool setUserVars)
read pede input defined by 'psetName', flag to create/not create MillePedeVariables ...
virtual void run(const edm::EventSetup &setup, const EventInfo &eventInfo)
Run the algorithm on trajectories and tracks.
define run information passed to algorithms (in endRun)
void buildUserVariables(const std::vector< Alignable * > &alignables) const
add MillePedeVariables for each AlignmentParameters (exception if no parameters...)
MillePedeAlignmentAlgorithm(const edm::ParameterSet &cfg)
Constructor.
TrajectoryFactoryBase * theTrajectoryFactory
virtual ~MillePedeAlignmentAlgorithm()
Destructor.
std::vector< TkFittedLasBeam > TkFittedLasBeamCollection
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
virtual const ReferenceTrajectoryCollection trajectories(const edm::EventSetup &setup, const ConstTrajTrackPairCollection &tracks, const reco::BeamSpot &beamSpot) const =0
void fillRefTrajectory(const ReferenceTrajectoryBase::ReferenceTrajectoryPtr &refTrajPtr)
std::vector< float > theFloatBufferY
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
static const count_t nMsrmts
void writeAlignableAbsolutePositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write Alignable current absolute positions
void addPxbSurvey(const edm::ParameterSet &pxbSurveyCfg)
add measurement data from PXB survey
unsigned int decodeMode(const std::string &mode) const
std::string fullPath() const
const std::vector< SiStripLaserRecHit2D > & getData(void) const
access the collection of hits
void writeOrigRigidBodyAlignmentParameters(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write RigidBodyAlignmentParameters as applied on top of original positions
std::vector< std::vector< TrajectoryStateOnSurface > > TsosVectorCollection
void addLasBeam(const TkFittedLasBeam &lasBeam, const std::vector< TrajectoryStateOnSurface > &tsoses)
const AlgebraicSymMatrix & covariance(void) const
Get parameter covariance matrix.
Constructor of the full muon geometry.
uint32_t dimension(pat::CandKinResolution::Parametrization parametrization)
Returns the number of free parameters in a parametrization (3 or 4)
AlignableDetOrUnitPtr alignableFromDetId(const DetId &detid)
Returns AlignableDetOrUnitPtr corresponding to given DetId.
Alignable * mother() const
Return pointer to container alignable (if any)
T get(const Candidate &c)
const align::Alignables & alignables(void) const
get all alignables
std::vector< ConstTrajTrackPair > ConstTrajTrackPairCollection
define event information passed to algorithms
virtual void terminate()
Call at end of job.