37 edm::LogInfo(
"Alignment") <<
"@SUB=AlignmentParameterStore"
51 std::vector<AlignableDetOrUnitPtr> detOrUnits;
52 detOrUnits.reserve(alignabledets.size());
54 std::vector<AlignableDet*>::const_iterator it, iEnd;
55 for ( it = alignabledets.begin(), iEnd = alignabledets.end(); it != iEnd; ++it)
67 std::map <AlignableDetOrUnitPtr,Alignable*> alidettoalimap;
68 std::map <Alignable*,int> aliposmap;
69 std::map <Alignable*,int> alilenmap;
73 for( std::vector<AlignableDetOrUnitPtr>::const_iterator iad = alignabledets.begin();
74 iad != alignabledets.end(); ++iad )
79 alidettoalimap[ *iad ] = ali;
81 if (
find(alignables.begin(),alignables.end(),ali) == alignables.end() )
83 alignables.push_back(ali);
95 align::Alignables::const_iterator it1;
96 for( it1 = alignables.begin(); it1 != alignables.end(); ++it1 )
102 aliposmap[*it1]=ipos;
103 alilenmap[*it1]=npar;
111 for( it1 = alignables.begin(); it1 != alignables.end(); ++it1 )
116 align::Alignables::const_iterator it2;
117 for( it2 = alignables.begin(); it2 != it1; ++it2 )
120 jpos += (*it2)->alignmentParameters()->numSelected();
123 ipos += (*it1)->alignmentParameters()->numSelected();
139 std::map <AlignableDetOrUnitPtr,Alignable*> alidettoalimap;
140 std::map <Alignable*,int> aliposmap;
141 std::map <Alignable*,int> alilenmap;
145 align::Alignables::const_iterator ita;
146 for ( ita = alignables.begin(); ita != alignables.end(); ++ita )
149 if (
find(selectedAlignables.begin(), selectedAlignables.end(), *ita) == selectedAlignables.end() )
151 selectedAlignables.push_back( *ita );
162 align::Alignables::const_iterator it1;
163 for( it1 = selectedAlignables.begin(); it1 != selectedAlignables.end(); ++it1 )
169 aliposmap[*it1]=ipos;
170 alilenmap[*it1]=npar;
178 for( it1 = selectedAlignables.begin(); it1 != selectedAlignables.end(); ++it1 )
183 align::Alignables::const_iterator it2;
184 for( it2 = selectedAlignables.begin(); it2 != it1; ++it2 )
187 jpos += (*it2)->alignmentParameters()->numSelected();
190 ipos += (*it1)->alignmentParameters()->numSelected();
211 for( align::Alignables::const_iterator it=alignables.begin(); it != alignables.end(); ++it )
219 (*it)->setAlignmentParameters( apnew );
222 if ( updateCorrelations )
225 for( align::Alignables::const_iterator it2 = alignables.begin(); it2 != it; ++it2 )
228 jpos += (*it2)->alignmentParameters()->numSelected();
242 for (align::Alignables::const_iterator iali =
theAlignables.begin();
244 if ( (*iali)->alignmentParameters()->isValid() ) result.push_back(*iali);
246 LogDebug(
"Alignment") <<
"@SUB=AlignmentParameterStore::validAlignables"
247 <<
"Valid alignables: " << result.size()
258 mother = mother->
mother();
267 align::Alignables::const_iterator iali;
280 <<
"applyParameters: provided alignable does not have alignment parameters";
293 align::Alignables::const_iterator iali;
317 edm::LogError(
"BadArgument") <<
"@SUB=AlignmentParameterStore::resetParameters"
318 <<
"alignable has no alignment parameter";
321 edm::LogError(
"BadArgument") <<
"@SUB=AlignmentParameterStore::resetParameters"
322 <<
"argument is NULL";
329 align::Alignables::const_iterator iali;
331 (*iali)->cacheTransformation();
338 align::Alignables::const_iterator iali;
340 (*iali)->restoreCachedTransformation();
349 for (
unsigned int i = 0;
i < nAlignables; ++
i)
358 <<
"acquireRelativeParameters: "
359 <<
"provided alignable does not have rigid body alignment parameters";
401 unsigned int nappl=0;
405 for (align::Alignables::const_iterator iali = alivec.begin(); iali != alivec.end(); ++iali) {
412 for (AlignablePositions::const_iterator ipos = newpos.begin(); ipos != newpos.end(); ++ipos) {
413 if (
id == ipos->id() && typeId == ipos->objId()) {
416 <<
"New positions for alignable found more than once!";
429 ali->
move( posDiff );
431 LogDebug(
"NewPosition") <<
"moving by:" << posDiff;
432 LogDebug(
"NewRotation") <<
"rotating by:\n" << rotDiff;
446 if ( nappl< newpos.size() )
447 edm::LogError(
"Mismatch") <<
"Applied only " << nappl <<
" new positions"
448 <<
" out of " << newpos.size();
450 LogDebug(
"NewPositions") <<
"Applied new positions for " << nappl
451 <<
" out of " << alivec.size() <<
" alignables.";
462 unsigned int nappl=0;
463 unsigned int nAlignables = alivec.size();
465 for (
unsigned int i = 0;
i < nAlignables; ++
i) {
473 for (AlignableShifts::const_iterator ipos = shifts.begin(); ipos != shifts.end(); ++ipos) {
474 if (
id == ipos->id() && typeId == ipos->objId()) {
477 <<
"New positions for alignable found more than once!";
479 ali->
move( ipos->pos() );
494 if ( nappl < shifts.size() )
495 edm::LogError(
"Mismatch") <<
"Applied only " << nappl <<
" new positions"
496 <<
" out of " << shifts.size();
498 LogDebug(
"NewPositions") <<
"Applied new positions for " << nappl <<
" alignables.";
520 for ( align::Alignables::const_iterator iali = alivec.begin(); iali != alivec.end(); ++iali )
524 for ( Parameters::const_iterator ipar = parvec.begin(); ipar != parvec.end(); ++ipar)
534 (*iali)->setAlignmentParameters(ap);
538 else edm::LogError(
"Alignment") <<
"@SUB=AlignmentParameterStore::attachAlignmentParameters"
539 <<
"More than one parameters for Alignable.";
544 if (ifail>0) ierr=-1;
546 LogDebug(
"attachAlignmentParameters") <<
" Parameters, Alignables: " << parvec.size() <<
","
547 << alivec.size() <<
"\n pass,fail: " << ipass <<
","<< ifail;
553 bool overwrite,
int& ierr )
562 bool overwrite,
int& ierr )
568 for ( Correlations::const_iterator icor = cormap.begin(); icor!=cormap.end(); ++icor )
575 if (
find( alivec.begin(), alivec.end(), ali1 ) != alivec.end() &&
576 find( alivec.begin(), alivec.end(), ali2 ) != alivec.end() )
584 else edm::LogInfo(
"AlreadyExists") <<
"Correlation existing and not overwritten";
586 else edm::LogInfo(
"IgnoreCorrelation") <<
"Ignoring correlation with no alignables!";
589 LogDebug(
"attachCorrelations" ) <<
" Alignables,Correlations: " << alivec.size() <<
","<< cormap.size()
590 <<
"\n applied: " << icount ;
598 const std::vector<AlignmentUserVariables*>& uvarvec,
int& ierr )
602 LogDebug(
"DumpArguments") <<
"size of alivec: " << alivec.size()
603 <<
"\nsize of uvarvec: " << uvarvec.size();
605 std::vector<AlignmentUserVariables*>::const_iterator iuvar=uvarvec.begin();
607 for ( align::Alignables::const_iterator iali=alivec.begin(); iali!=alivec.end(); ++iali, ++iuvar )
618 double valshift,
double valrot )
620 unsigned int nAlignables = alivec.size();
622 for (
unsigned int i = 0;
i < nAlignables; ++
i)
640 r(1)=valrot;
r(2)=valrot;
r(3)=valrot;
644 LogDebug(
"StoreAPE") <<
"Store APE from shift: " << valshift
645 <<
"\nStore APE from rotation: " << valrot;
651 std::vector<std::vector<ParameterId> > ¶mIdsVecOut,
652 std::vector<std::vector<double> > &factorsVecOut,
661 paramIdsVecOut.clear();
662 factorsVecOut.clear();
664 bool firstComp =
true;
665 for (align::Alignables::const_iterator iComp = aliComps.begin(), iCompE = aliComps.end();
666 iComp != iCompE; ++iComp) {
669 if (!p2pDerivs.
isOK()) {
671 <<
"AlignmentParameterStore::hierarchyConstraints"
672 <<
" Bad match of types of AlignmentParameters classes.\n";
675 const std::vector<bool> &aliCompSel = (*iComp)->alignmentParameters()->selector();
676 for (
unsigned int iParMast = 0, iParMastUsed = 0; iParMast < aliSel.size(); ++iParMast) {
677 if (!all && !aliSel[iParMast])
continue;
679 paramIdsVecOut.push_back(std::vector<ParameterId>());
680 factorsVecOut.push_back(std::vector<double>());
682 for (
unsigned int iParComp = 0; iParComp < aliCompSel.size(); ++iParComp) {
683 if (aliCompSel[iParComp]) {
684 const double factor = p2pDerivs(iParMast, iParComp);
685 if (fabs(factor) > epsilon) {
686 paramIdsVecOut[iParMastUsed].push_back(
ParameterId(*iComp, iParComp));
687 factorsVecOut[iParMastUsed].push_back(factor);
void attachUserVariables(const align::Alignables &alivec, const std::vector< AlignmentUserVariables * > &uvarvec, int &ierr)
Attach User Variables to given alignables.
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
void resetParameters(void)
reset parameters, correlations, user variables
std::map< std::pair< Alignable *, Alignable * >, AlgebraicMatrix > Correlations
T y() const
Cartesian y coordinate.
std::pair< int, int > typeAndLayerFromDetId(const DetId &detId, const TrackerTopology *tTopo) const
virtual RigidBodyAlignmentParameters * clone(const AlgebraicVector ¶meters, const AlgebraicSymMatrix &covMatrix) const
Clone all parameters (for update of parameters)
std::pair< int, int > typeAndLayer(const Alignable *ali, const TrackerTopology *tTopo) const
Obtain type and layer from Alignable.
std::pair< Alignable *, unsigned int > ParameterId
a single alignable parameter of an Alignable
virtual void addAlignmentPositionErrorFromRotation(const RotationType &rotation, bool propagateDown)=0
AlgebraicVector selectedParameters(void) const
Get selected parameters.
void setAlignmentPositionError(const align::Alignables &alivec, double valshift, double valrot)
Set Alignment position error.
align::Alignables validAlignables(void) const
get all alignables with valid parameters
bool isOK() const
Indicate whether able to provide the derivatives.
void attachCorrelations(const align::Alignables &alivec, const Correlations &cormap, bool overwrite, int &ierr)
Attach correlations to given alignables.
const GlobalVector & displacement() const
Return change of the global position since the creation of the object.
void restoreCachedTransformations(void)
restore the previously cached position, rotation and other parameters
virtual ~AlignmentParameterStore()
destructor
const RotationType & globalRotation() const
Return the global orientation of the object.
void applyParameters(void)
Obsolete: Use AlignableNavigator::alignableDetFromDetId and alignableFromAlignableDet.
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
const std::vector< bool > & selector(void) const
Get alignment parameter selector vector.
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
virtual void addAlignmentPositionError(const AlignmentPositionError &ape, bool propagateDown)=0
virtual bool correlationsAvailable(Alignable *ap1, Alignable *ap2) const
Check whether correlations are stored for a given pair of alignables.
void applyAlignableAbsolutePositions(const align::Alignables &alis, const AlignablePositions &newpos, int &ierr)
apply absolute positions to alignables
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
void updateParameters(const CompositeAlignmentParameters &aap, bool updateCorrelations=true)
update parameters
std::vector< AlignableRelData > AlignableShifts
Basic3DVector< T > x() const
const AlgebraicVector & parameters() const
Get alignment parameters.
const RotationType & rotation() const
Return change of orientation since the creation of the object.
virtual void setCorrelations(Alignable *ap1, Alignable *ap2, const AlgebraicSymMatrix &cov, int row, int col)
align::RotationType toLocal(const align::RotationType &) const
Return in local frame a rotation given in global frame.
std::vector< AlignmentParameters * > Parameters
void setAlignmentParameters(AlignmentParameters *dap)
Set the AlignmentParameters.
CLHEP::HepMatrix AlgebraicMatrix
void rectify(RotationType &)
Correct a rotation matrix for rounding errors.
void setValid(bool v)
Set validity flag.
AlignmentParameterStore(const align::Alignables &alis, const edm::ParameterSet &config)
constructor
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
Components components() const
Get vector of alignable components.
void applyAlignableRelativePositions(const align::Alignables &alivec, const AlignableShifts &shifts, int &ierr)
apply relative shifts to alignables
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
const AlgebraicSymMatrix & covariance() const
Get parameter covariance matrix.
virtual void resetCorrelations(void)
Reset correlations.
(Abstract) Base class for alignment algorithm user variables
EulerAngles toAngles(const RotationType &)
Convert rotation matrix to angles about x-, y-, z-axes (frame rotation).
Alignable * alignable(void) const
Get pointer to corresponding alignable.
virtual void setAlignmentPositionError(const AlignmentPositionError &ape, bool propagateDown)=0
Set the alignment position error - if (!propagateDown) do not affect daughters.
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
AlgebraicSymMatrix selectedCovariance(void) const
Get covariance matrix of selected parameters.
void acquireRelativeParameters(void)
int numSelected(void) const
Get number of selected parameters.
CLHEP::HepVector AlgebraicVector
AlgebraicVector EulerAngles
virtual void correlations(Alignable *ap1, Alignable *ap2, AlgebraicSymMatrix &cov, int row, int col) const
void setUserVariables(AlignmentUserVariables *auv)
Set pointer to user variables.
int size(void) const
Get number of parameters.
virtual void rotateInGlobalFrame(const RotationType &rotation)=0
align::Alignables theAlignables
alignables
CompositeAlignmentParameters selectParameters(const std::vector< AlignableDet * > &alignabledets) const
std::vector< Alignable * > Alignables
AlignmentCorrelationsStore * theCorrelationsStore
char data[epos_bytes_allocation]
void cacheTransformations(void)
cache the current position, rotation and other parameters
RotationType toMatrix(const EulerAngles &)
Convert rotation angles about x-, y-, z-axes to matrix.
CLHEP::HepSymMatrix AlgebraicSymMatrix
std::vector< AlignableAbsData > AlignablePositions
const PositionType & globalPosition() const
Return the global position of the object.
Basic3DVector< T > multiplyInverse(const Basic3DVector< T > &v) const
void attachAlignmentParameters(const align::Alignables &alivec, const Parameters &parvec, int &ierr)
Attach alignment parameters to given alignables.
virtual AlignmentParameters * cloneFromSelected(const AlgebraicVector &par, const AlgebraicSymMatrix &cov) const =0
Alignable * alignableFromAlignableDet(AlignableDetOrUnitPtr alignableDet) const
Obsolete: Use AlignableNavigator::alignableDetFromGeomDet and alignableFromAlignableDet.
Alignable * mother() const
Return pointer to container alignable (if any)
virtual void apply()=0
apply parameters to alignable
const align::Alignables & alignables(void) const
get all alignables