17 #include <boost/cstdint.hpp>
55 myParameterStore(store), myLabels(labels), myConfig(config),
56 myDirectory(myConfig.getUntrackedParameter<std::string>(
"fileDir")),
57 myNoSteerFiles(noSteerFiles),
58 myIsSteerFileDebug(myConfig.getUntrackedParameter<bool>(
"steerFileDebug")),
59 myParameterSign(myConfig.getUntrackedParameter<int>(
"parameterSign")),
60 theMinHieraConstrCoeff(myConfig.getParameter<double>(
"minHieraConstrCoeff")),
61 theMinHieraParPerConstr(myConfig.getParameter<unsigned int>(
"minHieraParPerConstr")),
65 cms::Exception(
"BadConfig") <<
"Expect PedeSteerer.parameterSign = +/-1, "
100 <<
"[PedeSteerer]" <<
"Cannot define global coordinate system "
101 <<
"with neither tracker nor muon!";
106 for ( std::vector<Alignable*>::iterator it = allExtras.begin(); it != allExtras.end(); ++it ) {
160 for (std::vector<Alignable*>::const_iterator iAli = alis.begin() ; iAli != alis.end(); ++iAli) {
163 if (!selVar)
continue;
165 unsigned int numNoHieraPar = 0;
166 unsigned int numHieraPar = 0;
167 for (
unsigned int iParam = 0;
static_cast<int>(iParam) < params->
size(); ++iParam) {
169 if (selector ==
'C' || selector ==
'F' || selector ==
'H') {
171 }
else if (selector ==
'c' || selector ==
'f' || selector ==
'1' || selector ==
'r'
172 || selector ==
's') {
179 <<
"[PedeSteerer::buildNoHierarchyCollection] All active parameters of alignables to be "
180 <<
" taken out of the hierarchy must be marked with capital letters 'C', 'F' or 'H'!";
182 bool isInHiera =
false;
184 while ((mother = mother->
mother())) {
189 else edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteerer::buildNoHierarchyCollection"
190 <<
"Alignable not in hierarchy, no need to remove it!";
200 for (std::vector<Alignable*>::const_iterator iAli = alis.begin() ; iAli != alis.end(); ++iAli) {
203 if (!selVar)
continue;
204 for (
unsigned int iParam = 0;
static_cast<int>(iParam) < paras->
size(); ++iParam) {
206 if (sel !=
'f' && sel !=
'F' && sel !=
'c' && sel !=
'C' &&
207 sel !=
'0' && sel !=
'1' && sel !=
'H' && sel !=
'r' && sel !=
's') {
209 <<
"[PedeSteerer::unknownParameterChoices] "
210 <<
"Unexpected parameter selector '" << sel
211 <<
"', use \n'f/F' (fix),\n'c/C' (fix at correct pos.),\n'1/H' (free),\n"
212 <<
"'r/s' (free, but defining reference system, trying to correct misalignment if 's')"
213 <<
" or \n'0' (ignore).\n"
214 <<
"Capital letters mean that the Alignable is taken out of a possible hierarchy,\n"
215 <<
"but must be used consistently for all its parameters.";
225 std::pair<unsigned int, unsigned int>
229 std::pair<unsigned int, unsigned int> numFixNumFixCor(0, 0);
231 std::ofstream *filePtr = 0;
233 for (std::vector<Alignable*>::const_iterator iAli = alis.begin() ; iAli != alis.end(); ++iAli) {
237 if (!selVar)
continue;
239 for (
unsigned int iParam = 0;
static_cast<int>(iParam) < params->
size(); ++iParam) {
241 for (
unsigned int iInstance=0;iInstance<nInstances;++iInstance) {
242 int whichFix = this->
fixParameter(*iAli, iInstance, iParam,
246 ++(numFixNumFixCor.first);
247 }
else if (whichFix == -1) {
248 ++(numFixNumFixCor.second);
256 return numFixNumFixCor;
261 unsigned int iParam,
char selector,
262 std::ofstream* &filePtr,
const std::string &
fileName)
266 if (selector ==
'c' || selector ==
'C') {
269 <<
"PedeSteerer::fixParameter: correction (c/C) possible only for RigidBodyParameters";
273 }
else if (selector ==
'f' || selector ==
'F') {
280 (*filePtr) <<
"Parameter\n";
282 std::ofstream &
file = *filePtr;
301 std::vector<Alignable*> coordAlis;
303 for (std::vector<Alignable*>::const_iterator iAli = alis.begin() ; iAli != alis.end(); ++iAli) {
306 if (!selVar)
continue;
307 unsigned int refParam = 0;
308 unsigned int nonRefParam = 0;
309 for (
unsigned int iParam = 0;
static_cast<int>(iParam) < params->
size(); ++iParam) {
311 if (selector ==
'r' || selector ==
's') {
313 }
else if (selector !=
'0' && selector !=
'f') {
321 <<
"[PedeSteerer::selectCoordinateAlis] All active parameters of alignables defining "
322 <<
"the coordinate system must be marked with 'r/s' (or fixed, 'f')!";
325 while ((mother = mother->
mother())) {
327 throw cms::Exception(
"BadConfig") <<
"[PedeSteerer::selectCoordinateAlis] "
328 <<
"Alignables defining the coordinate system must "
329 <<
"be highest level!";
332 coordAlis.push_back(*iAli);
346 (*filePtr) <<
"* Constraints to define coordinate system:\n";
349 <<
"[PedeSteerer::defineCoordinates] " <<
"No master alignable or it has parameters!";
352 edm::LogError(
"Alignment") <<
"@SUB=PedeSteerer::defineCoordinates"
353 <<
"Ignore following LogicErrors from PedeLabeler.";
366 bool doCorrect =
false;
367 bool doNotCorrect =
false;
368 for (std::vector<Alignable*>::const_iterator it = coordDefiners.begin(), iE=coordDefiners.end();
371 ((*it)->alignmentParameters() ?
373 if (!selVar)
continue;
381 if (doCorrect && doNotCorrect) {
383 <<
"[PedeSteerer::doCorrectToRefSystem]: Parameter selection 's' and 'r' must not coexist!";
395 std::vector<Alignable*> definerDets;
398 const std::vector<Alignable*> &comp = (*it)->deepComponents();
399 definerDets.insert(definerDets.end(), comp.begin(), comp.end());
402 for (
unsigned int iLoop = 0; ; ++iLoop) {
404 for (std::vector<Alignable*>::iterator it = definerDets.begin(), iE = definerDets.end();
406 meanPars += RbPars(*it,
true).globalParameters();
408 meanPars /= definerDets.size();
411 if (squareSum < 1.
e-20)
break;
413 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::correctToReferenceSystem"
414 <<
"Loop " << iLoop <<
" "
415 <<
"Mean misalignment of dets of defined coordinate system"
416 << (squareSum < 1.e-20 ?
":" :
417 " (will be iteratively corrected to < 1.e-10):") << meanPars;
420 edm::LogError(
"Alignment") <<
"@SUB=PedeSteerer::correctToReferenceSystem"
421 <<
"No convergence in " << iLoop <<
" iterations, "
422 <<
"remaining misalignment: " << meanPars;
426 const GlobalVector globalShift(meanPars[RbPars::dx],meanPars[RbPars::dy],meanPars[RbPars::dz]);
429 globalAngles[0] = meanPars[RbPars::dalpha];
430 globalAngles[1] = meanPars[RbPars::dbeta];
431 globalAngles[2] = meanPars[RbPars::dgamma];
441 std::ofstream *filePtr = 0;
443 unsigned int nConstraints = 0;
444 std::vector<Alignable*> aliDaughts;
445 for (std::vector<Alignable*>::const_iterator iA = alis.begin(), iEnd = alis.end();
448 if (!(*iA)->firstCompsWithParams(aliDaughts)) {
450 edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteerer::hierarchyConstraints"
451 <<
"Some but not all daughters of "
452 << objId. typeToName((*iA)->alignableObjectId())
457 if (aliDaughts.empty())
continue;
478 std::ofstream &
file)
const
482 std::vector<std::vector<ParameterId> > paramIdsVec;
483 std::vector<std::vector<double> > factorsVec;
484 const bool allConstr =
false;
485 static bool first =
true;
486 if (allConstr && first) {
487 edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteerer::hierarchyConstraint"
488 <<
"changed to use all 6 constraints";
493 edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteerer::hierarchyConstraint"
494 <<
"Problems from store.";
497 for (
unsigned int iConstr = 0; iConstr < paramIdsVec.size(); ++iConstr) {
498 std::ostringstream aConstr;
500 const std::vector<ParameterId> &parIds = paramIdsVec[iConstr];
501 const std::vector<double> &factors = factorsVec[iConstr];
502 unsigned int nParPerConstr = 0;
504 for (
unsigned int iParam = 0; iParam < parIds.size(); ++iParam) {
505 Alignable *aliSubComp = parIds[iParam].first;
506 const unsigned int compParNum = parIds[iParam].second;
514 aConstr << paramLabel <<
" " << factors[iParam];
517 aConstr <<
" ! for param " << compParNum <<
" of a "
529 file <<
"\n* Nr. " << iConstr <<
" of a '"
535 file <<
"\nConstraint 0.\n" << aConstr.str();
536 }
else if (nParPerConstr > 0) {
537 edm::LogWarning(
"Alignment") <<
"@SUB=PedeSteerer::hierarchyConstraint"
538 <<
"Skip constraint on " << nParPerConstr
539 <<
" parameter(s):\n" << aConstr.str();
547 const std::vector<Alignable*> &alis,
556 for (std::vector<edm::ParameterSet>::const_iterator iSet = cffPresi.begin(), iE = cffPresi.end();
557 iSet != iE; ++iSet) {
562 const float presigma = (*iSet).getParameter<
double>(
"presigma");
563 if (presigma <= 0.) {
565 <<
"[PedeSteerer::presigmas]: Pre-sigma must be > 0., but is " << presigma <<
".";
568 for (
unsigned int iAli = 0; iAli < alis.size(); ++iAli) {
569 std::vector<float> &
presigmas = aliPresiMap[alis[iAli]];
570 if (presigmas.size() < sels[iAli].size()) presigmas.resize(sels[iAli].size(), 0.);
571 for (
unsigned int iParam = 0; iParam < sels[iAli].size(); ++iParam) {
572 if (sels[iAli][iParam] !=
'0') {
573 if (presigmas[iParam] != 0.) {
575 <<
"[PedeSteerer::presigmas]: Try to set pre-sigma " << presigma <<
", but already "
576 <<
"set " << presigmas[iParam] <<
" (for a "
579 presigmas[iParam] = presigma;
585 if (aliPresiMap.empty())
return 0;
586 else return this->
presigmasFile(fileName, alis, aliPresiMap);
591 const std::vector<Alignable*> &alis,
596 std::ofstream *filePtr = 0;
599 unsigned int nPresiParam = 0;
600 for (std::vector<Alignable*>::const_iterator iAli = alis.begin(), iAliE = alis.end();
601 iAli != iAliE; ++iAli) {
603 AlignablePresigmasMap::const_iterator presigmasIt = aliPresiMap.find(*iAli);
604 if (presigmasIt == aliPresiMap.end())
continue;
608 const std::vector<float> &
presigmas = presigmasIt->second;
609 for (
unsigned int iParam = 0; iParam < presigmas.size(); ++iParam) {
611 if (presigmas[iParam] <= 0.)
continue;
613 if (!(*iAli)->alignmentParameters()->selector()[iParam])
continue;
616 const char selChar = (selVar ? selVar->
fullSelection()[iParam] :
'1');
617 if (selChar ==
'f' || selChar ==
'F' || selChar ==
'c' || selChar ==
'C')
continue;
621 (*filePtr) <<
"* Presigma values for active parameters: \nParameter\n";
627 (*filePtr) <<
" ! for a " << aliObjId.
typeToName((*iAli)->alignableObjectId());
642 const std::string realName(
myNoSteerFiles ?
"/dev/null" : name.c_str());
645 if (!result || !result->is_open()) {
647 throw cms::Exception(
"FileOpenProblem") <<
"[PedeSteerer::createSteerFile]"
648 <<
"Could not open " << realName
649 <<
" as output file.";
650 }
else if (addToList) {
676 const std::string nameCoordFile(this->
fileName(
"Coord"));
678 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::buildSubSteer"
680 <<
"coordinate system, steering file " << nameCoordFile <<
".";
683 const std::string nameFixFile(this->
fileName(
"FixPara"));
684 const std::pair<unsigned int, unsigned int> nFixFixCor(this->
fixParameters(alis, nameFixFile));
685 if (nFixFixCor.first != 0 || nFixFixCor.second != 0) {
686 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::buildSubSteer"
687 << nFixFixCor.first <<
" parameters fixed at 0. and "
688 << nFixFixCor.second <<
" at 'original' position, "
689 <<
"steering file " << nameFixFile <<
".";
693 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::buildSubSteer"
697 const std::string nameHierarchyFile(this->
fileName(
"Hierarchy"));
700 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::buildSubSteer"
701 <<
"Hierarchy constraints for " << nConstraint <<
" alignables, "
702 <<
"steering file " << nameHierarchyFile <<
".";
705 const std::string namePresigmaFile(this->
fileName(
"Presigma"));
706 unsigned int nPresigma =
708 namePresigmaFile, alis, aliTracker, aliMuon, aliExtras);
710 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::buildSubSteer"
711 <<
"Presigma values set for " << nPresigma <<
" parameters, "
712 <<
"steering file " << namePresigmaFile <<
".";
721 const std::string nameMasterSteer(this->
fileName(
"Master"));
722 std::ofstream *mainSteerPtr = this->
createSteerFile(nameMasterSteer,
false);
723 if (!mainSteerPtr)
return "";
726 std::vector<std::string> addfiles =
myConfig.
getParameter<std::vector<std::string> >(
"additionalSteerFiles");
732 std::ofstream &mainSteerRef = *mainSteerPtr;
733 for (
unsigned int iFile = 0; iFile <
mySteeringFiles.size(); ++iFile) {
738 mainSteerRef <<
"\nCfiles\n";
739 for (
unsigned int iFile = 0; iFile < binaryFiles.size(); ++iFile) {
740 mainSteerRef << binaryFiles[iFile] <<
"\n";
747 const std::vector<std::string> opt(
myConfig.
getParameter<std::vector<std::string> >(
"options"));
748 mainSteerRef <<
"\n* Outlier treatment and other options \n";
749 for (
unsigned int i = 0;
i < opt.size(); ++
i) {
750 mainSteerRef << opt[
i] <<
"\n";
755 return nameMasterSteer;
761 if (masterSteer.empty()) {
762 edm::LogError(
"Alignment") <<
"@SUB=PedeSteerer::runPede" <<
"Empty master steer file, stop";
767 (command +=
" ") += masterSteer;
776 int shellReturn = gSystem->Exec(command.c_str());
777 edm::LogInfo(
"Alignment") <<
"@SUB=PedeSteerer::runPede" <<
"Command returns " << shellReturn;
void correctToReferenceSystem()
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of 'first' component GeomDet(Unit).
T getUntrackedParameter(std::string const &, T const &) const
bool checkParameterChoices(const std::vector< Alignable * > &alis) const
std::vector< Alignable * > theCoordDefiners
master coordinates, must (?) be global frame
std::pair< Alignable *, unsigned int > ParameterId
a single alignable parameter of an Alignable
PedeSteerer(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *aliExtras, AlignmentParameterStore *store, const PedeLabelerBase *labels, const edm::ParameterSet &config, const std::string &defaultDir, bool noSteerFiles)
Alignable * theCoordMaster
Alignables deselected for hierarchy constr.
std::map< const Alignable *, std::vector< float > > AlignablePresigmasMap
virtual unsigned int alignableLabel(Alignable *alignable) const =0
void move(const GlobalVector &displacement)
unsigned int presigmasFile(const std::string &fileName, const std::vector< Alignable * > &alis, const AlignablePresigmasMap &aliPresisMap)
look for active 'alis' in map of presigma values and create steering file
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
const std::string & typeToName(align::StructureType type) const
Convert type to name.
std::set< const Alignable * > myNoHieraCollection
keeps track of created 'secondary' steering files
edm::ParameterSet myConfig
pointer to labeler (not the owner)
bool isCorrectToRefSystem(const std::vector< Alignable * > &coordDefiners) const
unsigned int hierarchyConstraints(const std::vector< Alignable * > &alis, const std::string &file)
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
static int position[TOTALCHAMBERS][3]
unsigned int theMinHieraParPerConstr
min absolute value of coefficients in hierarchy constraints
virtual unsigned int parameterLabel(unsigned int aliLabel, unsigned int parNum) const =0
returns the label for a given alignable parameter number combination
int fixParameter(Alignable *ali, unsigned int iRunRange, unsigned int iParam, char selector, std::ofstream *&filePtr, const std::string &fileName)
const AlgebraicVector & parameters(void) const
Get alignment parameters.
std::ofstream * createSteerFile(const std::string &name, bool addToList)
create and open file with name, if (addToList) append to mySteeringFiles
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
void clear()
remove all selected Alignables and geometrical restrictions
const std::vector< char > & fullSelection() const
void setAlignmentParameters(AlignmentParameters *dap)
Set the AlignmentParameters.
bool hierarchyConstraints(const Alignable *aliMaster, const align::Alignables &aliComps, std::vector< std::vector< ParameterId > > ¶mIdsVecOut, std::vector< std::vector< double > > &factorsVecOut, bool all, double epsilon) const
const PedeLabelerBase * myLabels
not the owner!
int runPede(const std::string &masterSteer) const
run pede, masterSteer should be as returned from buildMasterSteer(...)
unsigned int presigmas(const std::vector< edm::ParameterSet > &cffPresi, const std::string &fileName, const std::vector< Alignable * > &alis, AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *aliExtras)
interprete content of presigma VPSet 'cffPresi' and call presigmasFile
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
Allows conversion between type and name, and vice-versa.
virtual void addComponent(Alignable *)=0
std::string buildMasterSteer(const std::vector< std::string > &binaryFiles)
construct (and return name of) master steering file from config, binaryFiles etc. ...
virtual unsigned int alignableLabelFromParamAndInstance(Alignable *alignable, unsigned int param, unsigned int instance) const =0
int myParameterSign
whether or not to fill pede steering files with debug info
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
const align::Alignables & selectedAlignables() const
vector of alignables selected so far
double theMinHieraConstrCoeff
old pede versions (before May '07) need a sign flip...
const AlignmentParameterStore * myParameterStore
CLHEP::HepVector AlgebraicVector
AlgebraicVector EulerAngles
virtual int type() const =0
tell type (AlignmentParametersFactory::ParametersType - but no circular dependency) ...
std::pair< unsigned int, unsigned int > fixParameters(const std::vector< Alignable * > &alignables, const std::string &file)
bool myNoSteerFiles
directory of all files
void hierarchyConstraint(const Alignable *ali, const std::vector< Alignable * > &components, std::ofstream &file) const
int size(void) const
Get number of parameters.
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
void buildSubSteer(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *aliExtras)
construct steering files about hierarchy, fixing etc. an keep track of their names ...
std::vector< std::string > mySteeringFiles
hierarchy constraints with less params are ignored
double cmsToPedeFactor(unsigned int parNum) const
std::string fileName(const std::string &addendum) const
full name with directory and 'idenitfier'
bool isNoHiera(const Alignable *ali) const
True if 'ali' was deselected from hierarchy and any ancestor (e.g. mother) has parameters.
std::vector< Alignable * > Alignables
unsigned int buildNoHierarchyCollection(const std::vector< Alignable * > &alis)
bool myIsSteerFileDebug
flag to write steering files to /dev/null
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
unsigned int addSelections(const edm::ParameterSet &pSet)
std::vector< Alignable * > selectCoordinateAlis(const std::vector< Alignable * > &alignables) const
const PositionType & globalPosition() const
Return the global position of the object.
const std::vector< std::vector< char > > & selectedParameters() const
vector of selection 'strings' for alignables, parallel to selectedAlignables()
Constructor of the full muon geometry.
Alignable * mother() const
Return pointer to container alignable (if any)
const align::Alignables & alignables(void) const
get all alignables
virtual unsigned int numberOfParameterInstances(Alignable *alignable, int param=-1) const =0
returns the number of instances for a given parameter
void defineCoordinates(const std::vector< Alignable * > &alis, Alignable *aliMaster, const std::string &fileName)
int parameterSign() const
results from pede (and start values for pede) might need a sign flip