34 throw cms::Exception(
"TypeMismatch") <<
"Argument is not an AlignableMuon";
73 double scale_ = 0, scaleError_ = 0, phiX_ = 0, phiY_ = 0, phiZ_ = 0;
74 double dX_ = 0, dY_ = 0, dZ_ = 0;
76 std::ostringstream
error;
79 for ( std::vector<std::string>::iterator iParam = parameterNames.begin(); iParam != parameterNames.end(); iParam++ ) {
80 if ( (*iParam) ==
"scale" ) scale_ = Parameters.
getParameter<
double>( *iParam );
82 else if ( (*iParam) ==
"scaleError" ) scaleError_ = Parameters.
getParameter<
double>( *iParam );
83 else if ( (*iParam) ==
"phiX" ) phiX_ = Parameters.
getParameter<
double>( *iParam );
84 else if ( (*iParam) ==
"phiY" ) phiY_ = Parameters.
getParameter<
double>( *iParam );
85 else if ( (*iParam) ==
"phiZ" ) phiZ_ = Parameters.
getParameter<
double>( *iParam );
86 else if ( (*iParam) ==
"dX" ) dX_ = Parameters.
getParameter<
double>( *iParam );
87 else if ( (*iParam) ==
"dY" ) dY_ = Parameters.
getParameter<
double>( *iParam );
88 else if ( (*iParam) ==
"dZ" ) dZ_ = Parameters.
getParameter<
double>( *iParam );
91 if ( !error.str().length() ) error <<
"Unknown parameter name(s): ";
92 error <<
" " << *iParam;
96 param.push_back(scale_); param.push_back(scaleError_);
97 param.push_back(phiX_); param.push_back(phiY_);
98 param.push_back(phiZ_); param.push_back(dX_);
99 param.push_back(dY_); param.push_back(dZ_);
100 if( distribution_ ==
"gaussian" )
102 else if ( distribution_ ==
"flat" )
104 else if ( distribution_ ==
"fix" )
116 double scale_ = param[0];
double scaleError_ = param[1];
117 double phiX_ = param[2];
double phiY_ = param[3];
double phiZ_ = param[4];
118 double dX_ = param[5];
double dY_ = param[6];
double dZ_ = param[7];
119 double dist_ = param[8];
121 double dx = scale_*dX_;
double dy = scale_*dY_;
double dz = scale_*dZ_;
122 double phix = scale_*phiX_;
double phiy = scale_*phiY_;
double phiz = scale_*phiZ_;
123 double errorx = scaleError_*dX_;
double errory = scaleError_*dY_;
double errorz = scaleError_*dZ_;
124 double errorphix = scaleError_*phiX_;
double errorphiy = scaleError_*phiY_;
double errorphiz = scaleError_*phiZ_;
126 errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
128 errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
131 std::fill_n(index[0][0], 5*4*14, -1);
134 for(
const auto& iter: DTchambers) {
136 index[myId.wheel()+2][myId.station()-1][myId.sector()-1] =
counter;
140 for(
int sector = 0; sector < 12; sector++) {
146 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
147 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
148 }
else if (dist_ == 1) {
151 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
152 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
154 disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
155 rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
160 if(sector == 3 &&
station == 3) {
163 }
else if(sector == 9 &&
station == 3) {
179 double scale_ = param[0];
double scaleError_ = param[1];
180 double phiX_ = param[2];
double phiY_ = param[3];
double phiZ_ = param[4];
181 double dX_ = param[5];
double dY_ = param[6];
double dZ_ = param[7];
182 double dist_ = param[8];
184 double dx = scale_*dX_;
double dy = scale_*dY_;
double dz = scale_*dZ_;
185 double phix = scale_*phiX_;
double phiy = scale_*phiY_;
double phiz = scale_*phiZ_;
186 double errorx = scaleError_*dX_;
double errory = scaleError_*dY_;
double errorz = scaleError_*dZ_;
187 double errorphix = scaleError_*phiX_;
double errorphiy = scaleError_*phiY_;
double errorphiz = scaleError_*phiZ_;
189 errorDisp.push_back(errorx); errorDisp.push_back(errory); errorDisp.push_back(errorz);
191 errorRotation.push_back(errorphix); errorRotation.push_back(errorphiy); errorRotation.push_back(errorphiz);
193 int index[2][4][4][36];
194 int sector_index[2][4][4][36];
195 std::fill_n(index[0][0][0], 2*4*4*36, -1);
196 std::fill_n(sector_index[0][0][0], 2*4*4*36, -1);
199 for(
const auto& iter: CSCchambers) {
200 CSCDetId myId(iter->geomDetId().rawId());
201 index[myId.endcap()-1][myId.station()-1][myId.ring()-1][myId.chamber()-1] =
counter;
207 for(
int sector = 1; sector < 7; sector++) {
213 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
214 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
215 }
else if (dist_ == 1) {
218 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
219 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
221 disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
222 rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
229 r_ring[0] = 0; r_ring[1] = 3;
231 r_ring[0] = 1; r_ring[1] = 2;
233 for(
int r_counter = 0; r_counter < 2; r_counter++) {
266 double scale_ = param[0];
double scaleError_ = param[1];
267 double phiX_ = param[2];
double phiY_ = param[3];
double phiZ_ = param[4];
268 double dX_ = param[5];
double dY_ = param[6];
double dZ_ = param[7];
269 double dist_ = param[8];
270 double dx = scale_*dX_;
double dy = scale_*dY_;
double dz = scale_*dZ_;
271 double phix = scale_*phiX_;
double phiy = scale_*phiY_;
double phiz = scale_*phiZ_;
272 double errorx = scaleError_*dX_;
double errory = scaleError_*dY_;
double errorz = scaleError_*dZ_;
273 double errorphix = scaleError_*phiX_;
double errorphiy = scaleError_*phiY_;
double errorphiz = scaleError_*phiZ_;
280 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
281 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
282 }
else if (dist_ == 1) {
285 disp.push_back(disp_[0]); disp.push_back(disp_[1]); disp.push_back(disp_[2]);
286 rotation.push_back(rotation_[0]); rotation.push_back(rotation_[1]); rotation.push_back(rotation_[2]);
288 disp.push_back(dx); disp.push_back(dy); disp.push_back(dz);
289 rotation.push_back(phix); rotation.push_back(phiy); rotation.push_back(phiz);
291 for(
const auto& iter: DTbarrel) {
297 for(
const auto& iter: CSCendcaps) {
316 disp[0] += dispRot.
x(); disp[1] += dispRot.y(); disp[2] += dispRot.z();
T getParameter(std::string const &) const
Entry const & retrieve(char const *) const
edm::ParameterSet theScenario
Misalignment scenario to apply (from config file)
void decodeMovements_(const edm::ParameterSet &, const align::Alignables &)
Decode movements defined in given parameter set for given set of alignables.
AlignableModifier theMuonModifier
void setSeed(long seed)
Resets the generator seed according to the argument.
align::Alignables CSCChambers()
void moveCSCSectors(const edm::ParameterSet &scenario)
this special method allows to move a CSCsector by a same amount
void addAlignmentPositionError(Alignable *alignable, float dx, float dy, float dz)
Add the AlignmentPositionError (in global frame) to Alignable.
AlignableMuon * theAlignableMuon
Pointer to alignable Muon object.
align::Alignables DTBarrel()
const std::vector< float > gaussianRandomVector(float sigmaX, float sigmaY, float sigmaZ) const
Return a vector of random numbers (gaussian distribution)
void moveMuon(const edm::ParameterSet &scenario)
this special method allows to move the complete muon system by a same amount
void moveChamberInSector(Alignable *, const align::Scalars &, const align::Scalars &, const align::Scalars &, const align::Scalars &)
void moveAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaX, float sigmaY, float sigmaZ)
Move alignable in global space according to parameters.
align::Scalars extractParameters(const edm::ParameterSet &, const char *)
align::Alignables CSCEndcaps()
vector< ParameterSet > Parameters
static int sectorFromTriggerLabels(int TriggerSector, int TriggerSubSector, int station)
align::Alignables DTChambers()
std::vector< Scalar > Scalars
MuonScenarioBuilder(Alignable *alignable)
Constructor.
Allows conversion between type and name, and vice-versa.
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 moveDTSectors(const edm::ParameterSet &scenario)
This special method allows to move a DTsector by a same amount.
void rotateAlignable(Alignable *alignable, bool random, bool gaussian, float sigmaPhiX, float sigmaPhiY, float sigmaPhiZ)
Rotate alignable in global space according to parameters.
AlignableModifier theModifier
Helper class for random movements.
Base class to build a scenario from configuration and apply to either tracker or muon.
static int triggerSectorFromLabels(int station, int ring, int chamber)
void addAlignmentPositionErrorFromRotation(Alignable *alignable, float phiX, float phiY, float phiZ)
Add alignment position error resulting from rotation in global frame.
static int triggerSubSectorFromLabels(int station, int chamber)
static std::atomic< unsigned int > counter
void applyScenario(const edm::ParameterSet &scenario) override
Apply misalignment scenario to the Muon.
const PositionType & globalPosition() const
Return the global position of the object.
int theModifierCounter
Counter for applied modification.
Constructor of the full muon geometry.
bool hasParameter_(const std::string &name, const edm::ParameterSet &pSet) const
Check if given parameter exists in parameter set.
const BasicVectorType & basicVector() const
edm::ParameterSet getParameterSet_(const std::string &name, const edm::ParameterSet &pSet) const