33 throw cms::Exception(
"TypeMismatch") <<
"Argument is not an AlignableMuon";
66 double scale_ = 0, scaleError_ = 0, phiX_ = 0, phiY_ = 0, phiZ_ = 0;
67 double dX_ = 0, dY_ = 0, dZ_ = 0;
69 std::ostringstream
error;
72 for (std::vector<std::string>::iterator iParam = parameterNames.begin(); iParam != parameterNames.end(); iParam++) {
73 if ((*iParam) ==
"scale")
75 else if ((*iParam) ==
"distribution")
77 else if ((*iParam) ==
"scaleError")
79 else if ((*iParam) ==
"phiX")
81 else if ((*iParam) ==
"phiY")
83 else if ((*iParam) ==
"phiZ")
85 else if ((*iParam) ==
"dX")
87 else if ((*iParam) ==
"dY")
89 else if ((*iParam) ==
"dZ")
92 if (!error.str().length())
93 error <<
"Unknown parameter name(s): ";
94 error <<
" " << *iParam;
98 param.push_back(scale_);
99 param.push_back(scaleError_);
100 param.push_back(phiX_);
101 param.push_back(phiY_);
102 param.push_back(phiZ_);
103 param.push_back(dX_);
104 param.push_back(dY_);
105 param.push_back(dZ_);
106 if (distribution_ ==
"gaussian")
108 else if (distribution_ ==
"flat")
110 else if (distribution_ ==
"fix")
121 double scale_ = param[0];
122 double scaleError_ = param[1];
123 double phiX_ = param[2];
124 double phiY_ = param[3];
125 double phiZ_ = param[4];
126 double dX_ = param[5];
127 double dY_ = param[6];
128 double dZ_ = param[7];
129 double dist_ = param[8];
131 double dx = scale_ * dX_;
132 double dy = scale_ * dY_;
133 double dz = scale_ * dZ_;
134 double phix = scale_ * phiX_;
135 double phiy = scale_ * phiY_;
136 double phiz = scale_ * phiZ_;
137 double errorx = scaleError_ * dX_;
138 double errory = scaleError_ * dY_;
139 double errorz = scaleError_ * dZ_;
140 double errorphix = scaleError_ * phiX_;
141 double errorphiy = scaleError_ * phiY_;
142 double errorphiz = scaleError_ * phiZ_;
144 errorDisp.push_back(errorx);
145 errorDisp.push_back(errory);
146 errorDisp.push_back(errorz);
148 errorRotation.push_back(errorphix);
149 errorRotation.push_back(errorphiy);
150 errorRotation.push_back(errorphiz);
153 std::fill_n(index[0][0], 5 * 4 * 14, -1);
156 for (
const auto& iter : DTchambers) {
158 index[myId.wheel() + 2][myId.station() - 1][myId.sector() - 1] =
counter;
161 for (
int wheel = 0; wheel < 5; wheel++) {
162 for (
int sector = 0; sector < 12; sector++) {
168 disp.push_back(disp_[0]);
169 disp.push_back(disp_[1]);
170 disp.push_back(disp_[2]);
171 rotation.push_back(rotation_[0]);
172 rotation.push_back(rotation_[1]);
173 rotation.push_back(rotation_[2]);
174 }
else if (dist_ == 1) {
177 disp.push_back(disp_[0]);
178 disp.push_back(disp_[1]);
179 disp.push_back(disp_[2]);
180 rotation.push_back(rotation_[0]);
181 rotation.push_back(rotation_[1]);
182 rotation.push_back(rotation_[2]);
187 rotation.push_back(phix);
188 rotation.push_back(phiy);
189 rotation.push_back(phiz);
194 if (sector == 3 &&
station == 3) {
197 }
else if (sector == 9 &&
station == 3) {
211 double scale_ = param[0];
212 double scaleError_ = param[1];
213 double phiX_ = param[2];
214 double phiY_ = param[3];
215 double phiZ_ = param[4];
216 double dX_ = param[5];
217 double dY_ = param[6];
218 double dZ_ = param[7];
219 double dist_ = param[8];
221 double dx = scale_ * dX_;
222 double dy = scale_ * dY_;
223 double dz = scale_ * dZ_;
224 double phix = scale_ * phiX_;
225 double phiy = scale_ * phiY_;
226 double phiz = scale_ * phiZ_;
227 double errorx = scaleError_ * dX_;
228 double errory = scaleError_ * dY_;
229 double errorz = scaleError_ * dZ_;
230 double errorphix = scaleError_ * phiX_;
231 double errorphiy = scaleError_ * phiY_;
232 double errorphiz = scaleError_ * phiZ_;
234 errorDisp.push_back(errorx);
235 errorDisp.push_back(errory);
236 errorDisp.push_back(errorz);
238 errorRotation.push_back(errorphix);
239 errorRotation.push_back(errorphiy);
240 errorRotation.push_back(errorphiz);
242 int index[2][4][4][36];
243 int sector_index[2][4][4][36];
244 std::fill_n(index[0][0][0], 2 * 4 * 4 * 36, -1);
245 std::fill_n(sector_index[0][0][0], 2 * 4 * 4 * 36, -1);
248 for (
const auto& iter : CSCchambers) {
249 CSCDetId myId(iter->geomDetId().rawId());
250 index[myId.endcap() - 1][myId.station() - 1][myId.ring() - 1][myId.chamber() - 1] =
counter;
251 sector_index[myId.endcap() - 1][myId.station() - 1][myId.ring() - 1][myId.chamber() - 1] =
259 for (
int sector = 1; sector < 7; sector++) {
265 disp.push_back(disp_[0]);
266 disp.push_back(disp_[1]);
267 disp.push_back(disp_[2]);
268 rotation.push_back(rotation_[0]);
269 rotation.push_back(rotation_[1]);
270 rotation.push_back(rotation_[2]);
271 }
else if (dist_ == 1) {
274 disp.push_back(disp_[0]);
275 disp.push_back(disp_[1]);
276 disp.push_back(disp_[2]);
277 rotation.push_back(rotation_[0]);
278 rotation.push_back(rotation_[1]);
279 rotation.push_back(rotation_[2]);
284 rotation.push_back(phix);
285 rotation.push_back(phiy);
286 rotation.push_back(phiz);
299 for (
int r_counter = 0; r_counter < 2; r_counter++) {
300 for (
int chamber = 0; chamber < 36; chamber++) {
301 if (sector == (sector_index[
endcap][
station][r_ring[r_counter]][chamber] + 1) / 2) {
310 for (
int chamber = 0; chamber < 36; chamber++) {
311 if (
ring == 0 && chamber > 17)
330 double scale_ = param[0];
331 double scaleError_ = param[1];
332 double phiX_ = param[2];
333 double phiY_ = param[3];
334 double phiZ_ = param[4];
335 double dX_ = param[5];
336 double dY_ = param[6];
337 double dZ_ = param[7];
339 double dx = scale_ * dX_;
340 double dy = scale_ * dY_;
341 double dz = scale_ * dZ_;
342 double phix = scale_ * phiX_;
343 double phiy = scale_ * phiY_;
344 double phiz = scale_ * phiZ_;
345 double errorx = scaleError_ * dX_;
346 double errory = scaleError_ * dY_;
347 double errorz = scaleError_ * dZ_;
348 double errorphix = scaleError_ * phiX_;
349 double errorphiy = scaleError_ * phiY_;
350 double errorphiz = scaleError_ * phiZ_;
352 errorDisp.push_back(errorx);
353 errorDisp.push_back(errory);
354 errorDisp.push_back(errorz);
356 errorRotation.push_back(errorphix);
357 errorRotation.push_back(errorphiy);
358 errorRotation.push_back(errorphiz);
361 for (
const auto& iter : GEMSuperChambers) {
365 disp.push_back(disp_[0]);
366 disp.push_back(disp_[1]);
367 disp.push_back(disp_[2]);
369 rotation.push_back(rotation_[0]);
370 rotation.push_back(rotation_[1]);
371 rotation.push_back(rotation_[2]);
382 double scale_ = param[0];
383 double scaleError_ = param[1];
384 double phiX_ = param[2];
385 double phiY_ = param[3];
386 double phiZ_ = param[4];
387 double dX_ = param[5];
388 double dY_ = param[6];
389 double dZ_ = param[7];
390 double dist_ = param[8];
391 double dx = scale_ * dX_;
392 double dy = scale_ * dY_;
393 double dz = scale_ * dZ_;
394 double phix = scale_ * phiX_;
395 double phiy = scale_ * phiY_;
396 double phiz = scale_ * phiZ_;
397 double errorx = scaleError_ * dX_;
398 double errory = scaleError_ * dY_;
399 double errorz = scaleError_ * dZ_;
400 double errorphix = scaleError_ * phiX_;
401 double errorphiy = scaleError_ * phiY_;
402 double errorphiz = scaleError_ * phiZ_;
409 disp.push_back(disp_[0]);
410 disp.push_back(disp_[1]);
411 disp.push_back(disp_[2]);
412 rotation.push_back(rotation_[0]);
413 rotation.push_back(rotation_[1]);
414 rotation.push_back(rotation_[2]);
415 }
else if (dist_ == 1) {
418 disp.push_back(disp_[0]);
419 disp.push_back(disp_[1]);
420 disp.push_back(disp_[2]);
421 rotation.push_back(rotation_[0]);
422 rotation.push_back(rotation_[1]);
423 rotation.push_back(rotation_[2]);
428 rotation.push_back(phix);
429 rotation.push_back(phiy);
430 rotation.push_back(phiz);
432 for (
const auto& iter : DTbarrel) {
438 for (
const auto& iter : CSCendcaps) {
444 for (
const auto& iter : GEMendcaps) {
465 disp[0] += dispRot.
x();
466 disp[1] += dispRot.y();
467 disp[2] += dispRot.z();
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.
void moveGEMSectors(const edm::ParameterSet &scenario)
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
align::Alignables GEMSuperChambers()
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
Class Geometry Contains vector for fit parameters (mean, sigma, etc.) obtained from multiple IOVs See...
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)
Log< level::Info, false > LogInfo
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)
T getParameter(std::string const &) const
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)
align::Alignables GEMEndcaps()
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