3 #include "CLHEP/Random/DRand48Engine.h"
4 #include "CLHEP/Random/RandGauss.h"
5 #include "CLHEP/Random/Randomize.h"
75 if ( parameterName ==
"distribution" ||
76 parameterName ==
"setError" ||
77 parameterName ==
"scaleError" ||
78 parameterName ==
"setRotations" ||
79 parameterName ==
"setTranslations" ||
80 parameterName ==
"scale"
95 int rotX_=0, rotY_=0, rotZ_=0;
102 std::ostringstream
error;
104 for ( std::vector<std::string>::iterator iParam = parameterNames.begin();
105 iParam != parameterNames.end(); iParam++ ) {
115 else if ( (*iParam) ==
"dX" )
dX_ = pSet.
getParameter<
double>( *iParam );
116 else if ( (*iParam) ==
"dY" )
dY_ = pSet.
getParameter<
double>( *iParam );
117 else if ( (*iParam) ==
"dZ" )
dZ_ = pSet.
getParameter<
double>( *iParam );
129 else if ( (*iParam) ==
"deformation" ) {
136 && ((*iParam).find(
"deform") != std::string::npos ||
137 (*iParam).find(
"ation") != std::string::npos)) {
138 throw cms::Exception(
"BadConfig") <<
"Probable mistyping in config: '" << (*iParam)
139 <<
"' should probably mean 'deformation'\n";
141 if ( !error.str().length() ) error <<
"Unknown parameter name(s): ";
142 error <<
" " << *iParam;
147 if ( rotX_==2 )
throw cms::Exception(
"BadConfig") <<
"Found both localX and phiXlocal";
148 if ( rotY_==2 )
throw cms::Exception(
"BadConfig") <<
"Found both localY and phiYlocal";
149 if ( rotZ_==2 )
throw cms::Exception(
"BadConfig") <<
"Found both localZ and phiZlocal";
152 if ( error.str().length() )
181 edm::LogError(
"NotImplemented") <<
"Twist is not implemented yet";
185 edm::LogError(
"NotImplemented") <<
"Shear is not implemented yet";
236 if ( distr ==
"fixed" )
random_ =
false;
237 else if ( distr ==
"flat" ) {
240 }
else if ( distr ==
"gaussian" ) {
255 if ( seed > 0 ) m_seed = seed;
261 LogDebug(
"PrintArgs") <<
"Setting generator seed to " << m_seed;
271 float sigmaX,
float sigmaY,
float sigmaZ )
280 std::vector<float> randomNumbers;
281 message <<
"random ";
284 message <<
"gaussian ";
289 moveV =
GlobalVector( randomNumbers[0], randomNumbers[1], randomNumbers[2] );
292 message <<
" move with sigma " << sigmaX <<
" " << sigmaY <<
" " << sigmaZ;
294 LogDebug(
"PrintArgs") << message.str();
296 LogDebug(
"PrintMovement") <<
"applied displacement: " << moveV;
297 alignable->
move(moveV);
307 float sigmaX,
float sigmaY,
float sigmaZ )
316 std::vector<float> randomNumbers;
317 message <<
"random ";
320 message <<
"gaussian ";
328 message <<
" move with sigma " << sigmaX <<
" " << sigmaY <<
" " << sigmaZ;
330 LogDebug(
"PrintArgs") << message.str();
332 LogDebug(
"PrintMovement") <<
"applied local displacement: " << moveV;
343 bool random,
bool gaussian,
double scale)
351 std::vector<double> rndDeformation(deformation.second.begin(),
352 deformation.second.end() - (rndNotLast ? 1 : 0));
353 for (
unsigned int i = 0;
i < rndDeformation.size(); ++
i) {
354 rndDeformation[
i] *= scale;
357 this->randomise(rndDeformation, gaussian);
360 rndDeformation.push_back(deformation.second.back());
364 const std::auto_ptr<SurfaceDeformation> surfDef
375 float sigmaPhiX,
float sigmaPhiY,
float sigmaPhiZ )
384 std::vector<float> randomNumbers;
385 message <<
"random ";
388 message <<
"gaussian ";
393 rotV =
GlobalVector( randomNumbers[0], randomNumbers[1], randomNumbers[2] );
396 message <<
"global rotation by angles " << sigmaPhiX <<
" " << sigmaPhiY <<
" " << sigmaPhiZ;
398 LogDebug(
"PrintArgs") << message.str();
400 LogDebug(
"PrintMovement") <<
"applied rotation angles: " << rotV;
414 float sigmaPhiX,
float sigmaPhiY,
float sigmaPhiZ )
423 std::vector<float> randomNumbers;
424 message <<
"random ";
427 message <<
"gaussian ";
435 message <<
"local rotation by angles " << sigmaPhiX <<
" " << sigmaPhiY <<
" " << sigmaPhiZ;
437 LogDebug(
"PrintArgs") << message.str();
439 LogDebug(
"PrintMovement") <<
"applied local rotation angles: " << rotV;
450 const std::vector<float>
456 edm::LogWarning(
"BadConfig") <<
" taking absolute value for gaussian sigma_x";
460 edm::LogWarning(
"BadConfig") <<
" taking absolute value for gaussian sigma_y";
464 edm::LogWarning(
"BadConfig") <<
" taking absolute value for gaussian sigma_z";
473 std::vector<float> randomVector;
474 randomVector.push_back( aGaussObjX.fire() );
475 randomVector.push_back( aGaussObjY.fire() );
476 randomVector.push_back( aGaussObjZ.fire() );
484 const std::vector<float>
490 edm::LogWarning(
"BadConfig") <<
" taking absolute value for flat sigma_x";
494 edm::LogWarning(
"BadConfig") <<
" taking absolute value for flat sigma_y";
498 edm::LogWarning(
"BadConfig") <<
" taking absolute value for flat sigma_z";
506 std::vector<float> randomVector;
507 randomVector.push_back( aFlatObjX.fire() );
508 randomVector.push_back( aFlatObjY.fire() );
509 randomVector.push_back( aFlatObjZ.fire() );
518 for (
unsigned int i = 0;
i < rnd.size(); ++
i) {
520 edm::LogWarning(
"BadConfig") <<
" taking absolute value to randomise " <<
i;
526 rnd[
i] = aGaussObj.fire();
529 rnd[
i] = aFlatObj.fire();
536 float dx,
float dy,
float dz )
539 LogDebug(
"PrintArgs") <<
"Adding an AlignmentPositionError of size "
540 << dx <<
" " << dy <<
" " << dz;
550 float dx,
float dy,
float dz )
553 LogDebug(
"PrintArgs") <<
"Adding a local AlignmentPositionError of size "
554 << dx <<
" " << dy <<
" " << dz;
557 as[0][0] = dx*dx; as[1][1] = dy*dy; as[2][2] = dz*dz;
560 am[0][0]=rt.
xx(); am[0][1]=rt.
xy(); am[0][2]=rt.
xz();
561 am[1][0]=rt.
yx(); am[1][1]=rt.
yy(); am[1][2]=rt.
yz();
562 am[2][0]=rt.
zx(); am[2][1]=rt.
zy(); am[2][2]=rt.
zz();
563 as=as.similarityT(am);
576 float phiX,
float phiY,
592 float phiX,
float phiY,
611 LogDebug(
"PrintArgs") <<
"Adding an AlignmentPositionError from Rotation" << std::endl
624 LogDebug(
"PrintArgs") <<
"Adding an AlignmentPositionError from Local Rotation" << std::endl
T getParameter(std::string const &) const
void addAlignmentPositionErrorFromLocalRotation(Alignable *alignable, float phiX, float phiY, float phiZ)
Add alignment position error resulting from rotation in local frame.
void rotateAlignableLocal(Alignable *alignable, bool random, bool gaussian, float sigmaPhiX, float sigmaPhiY, float sigmaPhiZ)
Rotate alignable in local space according to parameters.
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
virtual void rotateAroundLocalZ(Scalar radians)
Rotation around local z-axis.
void setSeed(long seed)
Resets the generator seed according to the argument.
virtual void addAlignmentPositionErrorFromRotation(const RotationType &rotation, bool propagateDown)=0
void addAlignmentPositionError(Alignable *alignable, float dx, float dy, float dz)
Add the AlignmentPositionError (in global frame) to Alignable.
~AlignableModifier()
Destructor.
const std::vector< float > gaussianRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (gaussian distribution)
void init_()
Initialisation of all parameters.
const RotationType & globalRotation() const
Return the global orientation of the object.
virtual void move(const GlobalVector &displacement)=0
Movement with respect to the global reference frame.
virtual void addAlignmentPositionError(const AlignmentPositionError &ape, bool propagateDown)=0
void addAlignmentPositionErrorLocal(Alignable *alignable, float dx, float dy, float dz)
Add the AlignmentPositionError (in local frame) to Alignable.
std::string distribution_
void addDeformation(Alignable *alignable, const DeformationMemberType &deformation, bool random, bool gaussian, double scale)
virtual void rotateAroundGlobalZ(Scalar radians)
Rotation around global z-axis.
virtual void addAlignmentPositionErrorFromLocalRotation(const RotationType &rotation, bool propagateDown)=0
void moveAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaX, float sigmaY, float sigmaZ)
Move alignable in global space according to parameters.
AlignableModifier()
Constructor.
CLHEP::HepMatrix AlgebraicMatrix
virtual void addSurfaceDeformation(const SurfaceDeformation *deformation, bool propagateDown)=0
void setDistribution(const std::string &distr)
Decodes string and sets distribution accordingly ('fixed', 'flat' or 'gaussian'). ...
CLHEP::DRand48Engine * theDRand48Engine
Unique random number generator.
std::vector< std::string > getParameterNames() const
const std::vector< float > flatRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (flat distribution)
void randomise(std::vector< double > &rnd, bool gaussian) const
const bool isPropagated(const std::string ¶meterName) const
Check if given parameter should be propagated.
Vector3DBase< Scalar, LocalTag > LocalVector
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
DeformationMemberType deformation_
void rotateAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaPhiX, float sigmaPhiY, float sigmaPhiZ)
Rotate alignable in global space according to parameters.
virtual void rotateAroundGlobalX(Scalar radians)
Rotation around global x-axis.
bool modify(Alignable *alignable, const edm::ParameterSet &pSet)
Modify given set of alignables according to parameters.
void addAlignmentPositionErrorFromRotation(Alignable *alignable, float phiX, float phiY, float phiZ)
Add alignment position error resulting from rotation in global frame.
virtual void rotateAroundLocalY(Scalar radians)
Rotation around local y-axis.
virtual void rotateAroundGlobalY(Scalar radians)
Rotation around global y-axis.
std::pair< std::string, std::vector< double > > DeformationMemberType
virtual void rotateAroundLocalX(Scalar radians)
Rotation around local x-axis.
align::GlobalPoints toGlobal(const align::LocalPoints &) const
Return in global coord given a set of local points.
CLHEP::HepSymMatrix AlgebraicSymMatrix
void moveAlignableLocal(Alignable *alignable, bool random, bool gaussian, float sigmaX, float sigmaY, float sigmaZ)
Move alignable in local space according to parameters.
virtual uint32_t mySeed() const =0
Exists for backward compatibility.
Global3DVector GlobalVector