CMS 3D CMS Logo

AlignmentTask.cc
Go to the documentation of this file.
1 /****************************************************************************
2 * Authors:
3 * Jan Kašpar (jan.kaspar@gmail.com)
4 ****************************************************************************/
5 
8 
11 
13 
14 #include <algorithm>
15 
16 //----------------------------------------------------------------------------------------------------
17 
18 using namespace std;
19 using namespace edm;
20 
21 //----------------------------------------------------------------------------------------------------
22 
24  : resolveShR(ps.getParameter<bool>("resolveShR")),
25  resolveShZ(ps.getParameter<bool>("resolveShZ")),
26  resolveRotZ(ps.getParameter<bool>("resolveRotZ")),
27 
28  oneRotZPerPot(ps.getParameter<bool>("oneRotZPerPot")),
29  useEqualMeanUMeanVRotZConstraints(ps.getParameter<bool>("useEqualMeanUMeanVRotZConstraints")),
30 
31  fixedDetectorsConstraints(ps.getParameterSet("fixedDetectorsConstraints")),
32  standardConstraints(ps.getParameterSet("standardConstraints")) {
33  if (resolveShR) {
34  quantityClasses.push_back(qcShR1);
35  quantityClasses.push_back(qcShR2);
36  }
37 
38  if (resolveShZ) {
39  quantityClasses.push_back(qcShZ);
40  }
41 
42  if (resolveRotZ) {
43  quantityClasses.push_back(qcRotZ);
44  }
45 }
46 
47 //----------------------------------------------------------------------------------------------------
48 
49 void AlignmentTask::buildGeometry(const vector<unsigned int> &rpDecIds,
50  const vector<unsigned int> &excludedSensors,
51  const CTPPSGeometry *input,
52  double z0,
54  geometry.z0 = z0;
55 
56  // traverse full known geometry
57  for (auto it = input->beginSensor(); it != input->endSensor(); ++it) {
58  // skip excluded sensors
59  if (find(excludedSensors.begin(), excludedSensors.end(), it->first) != excludedSensors.end())
60  continue;
61 
62  // is RP selected?
63  const CTPPSDetId detId(it->first);
64  const unsigned int rpDecId = 100 * detId.arm() + 10 * detId.station() + detId.rp();
65  if (find(rpDecIds.begin(), rpDecIds.end(), rpDecId) == rpDecIds.end())
66  continue;
67 
68  // extract geometry data
69  CTPPSGeometry::Vector c = input->localToGlobal(detId, CTPPSGeometry::Vector(0., 0., 0.));
70  CTPPSGeometry::Vector d1 = input->localToGlobal(detId, CTPPSGeometry::Vector(1., 0., 0.)) - c;
71  CTPPSGeometry::Vector d2 = input->localToGlobal(detId, CTPPSGeometry::Vector(0., 1., 0.)) - c;
72 
73  // for strips: is it U plane?
74  bool isU = false;
75  if (detId.subdetId() == CTPPSDetId::sdTrackingStrip) {
76  TotemRPDetId stripDetId(it->first);
77  unsigned int rpNum = stripDetId.rp();
78  unsigned int plNum = stripDetId.plane();
79  isU = (plNum % 2 != 0);
80  if (rpNum == 2 || rpNum == 3)
81  isU = !isU;
82  }
83 
84  DetGeometry dg(c.z() - z0, c.x(), c.y(), isU);
85  dg.setDirection(1, d1.x(), d1.y(), d1.z());
86  dg.setDirection(2, d2.x(), d2.y(), d2.z());
87  geometry.insert(it->first, dg);
88  }
89 }
90 
91 //----------------------------------------------------------------------------------------------------
92 
94  // remove old mapping
95  mapMeasurementIndeces.clear();
96  mapQuantityIndeces.clear();
97 
98  // loop over all classes
99  for (const auto &qcl : quantityClasses) {
100  // create entry for this class
102 
103  // loop over all sensors
104  unsigned int idxMeas = 0;
105  unsigned int idxQuan = 0;
106  for (const auto &git : geometry.getSensorMap()) {
107  const unsigned int detId = git.first;
108  const unsigned int subdetId = CTPPSDetId(git.first).subdetId();
109 
110  // update measurement map
111  if (qcl == qcShR1) {
112  if (subdetId == CTPPSDetId::sdTimingDiamond)
113  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
114  if (subdetId == CTPPSDetId::sdTrackingPixel)
115  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
116  }
117 
118  if (qcl == qcShR2) {
119  if (subdetId == CTPPSDetId::sdTrackingStrip)
120  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
121  if (subdetId == CTPPSDetId::sdTrackingPixel)
122  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
123  }
124 
125  if (qcl == qcShZ) {
126  if (subdetId == CTPPSDetId::sdTrackingStrip)
127  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
128  if (subdetId == CTPPSDetId::sdTrackingPixel)
129  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
130  if (subdetId == CTPPSDetId::sdTrackingPixel)
131  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
132  if (subdetId == CTPPSDetId::sdTimingDiamond)
133  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
134  }
135 
136  if (qcl == qcRotZ) {
137  if (subdetId == CTPPSDetId::sdTrackingStrip)
138  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
139  if (subdetId == CTPPSDetId::sdTrackingPixel)
140  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
141  if (subdetId == CTPPSDetId::sdTrackingPixel)
142  mapMeasurementIndeces[qcl][{detId, 2}] = idxMeas++;
143  if (subdetId == CTPPSDetId::sdTimingDiamond)
144  mapMeasurementIndeces[qcl][{detId, 1}] = idxMeas++;
145  }
146 
147  // update quantity map
148  if (qcl == qcShR1) {
149  if (subdetId == CTPPSDetId::sdTimingDiamond)
150  mapQuantityIndeces[qcl][detId] = idxQuan++;
151  if (subdetId == CTPPSDetId::sdTrackingPixel)
152  mapQuantityIndeces[qcl][detId] = idxQuan++;
153  }
154 
155  if (qcl == qcShR2) {
156  if (subdetId == CTPPSDetId::sdTrackingStrip)
157  mapQuantityIndeces[qcl][detId] = idxQuan++;
158  if (subdetId == CTPPSDetId::sdTrackingPixel)
159  mapQuantityIndeces[qcl][detId] = idxQuan++;
160  }
161 
162  if (qcl == qcShZ) {
163  if (subdetId == CTPPSDetId::sdTrackingStrip)
164  mapQuantityIndeces[qcl][detId] = idxQuan++;
165  if (subdetId == CTPPSDetId::sdTimingDiamond)
166  mapQuantityIndeces[qcl][detId] = idxQuan++;
167  if (subdetId == CTPPSDetId::sdTrackingPixel)
168  mapQuantityIndeces[qcl][detId] = idxQuan++;
169  }
170 
171  if (qcl == qcRotZ) {
172  if (subdetId == CTPPSDetId::sdTrackingStrip)
173  mapQuantityIndeces[qcl][detId] = idxQuan++;
174  if (subdetId == CTPPSDetId::sdTimingDiamond)
175  mapQuantityIndeces[qcl][detId] = idxQuan++;
176  if (subdetId == CTPPSDetId::sdTrackingPixel)
177  mapQuantityIndeces[qcl][detId] = idxQuan++;
178  }
179  }
180  }
181 }
182 
183 //----------------------------------------------------------------------------------------------------
184 
185 signed int AlignmentTask::getMeasurementIndex(QuantityClass cl, unsigned int detId, unsigned int dirIdx) const {
186  auto clit = mapMeasurementIndeces.find(cl);
187  if (clit == mapMeasurementIndeces.end())
188  return -1;
189 
190  auto it = clit->second.find({detId, dirIdx});
191  if (it == clit->second.end())
192  return -1;
193 
194  return it->second;
195 }
196 
197 //----------------------------------------------------------------------------------------------------
198 
199 signed int AlignmentTask::getQuantityIndex(QuantityClass cl, unsigned int detId) const {
200  auto clit = mapQuantityIndeces.find(cl);
201  if (clit == mapQuantityIndeces.end())
202  return -1;
203 
204  auto it = clit->second.find(detId);
205  if (it == clit->second.end())
206  return -1;
207 
208  return it->second;
209 }
210 
211 //----------------------------------------------------------------------------------------------------
212 
214  switch (qc) {
215  case qcShR1:
216  return "ShR1";
217  case qcShR2:
218  return "ShR2";
219  case qcShZ:
220  return "ShZ";
221  case qcRotZ:
222  return "RotZ";
223  }
224 
225  throw cms::Exception("PPS") << "Unknown quantity class " << qc << ".";
226 }
227 
228 //----------------------------------------------------------------------------------------------------
229 
231  auto it = mapMeasurementIndeces.find(qc);
232  if (it == mapMeasurementIndeces.end())
233  return 0;
234  else
235  return it->second.size();
236 }
237 
238 //----------------------------------------------------------------------------------------------------
239 
241  auto it = mapQuantityIndeces.find(qc);
242  if (it == mapQuantityIndeces.end())
243  return 0;
244  else
245  return it->second.size();
246 }
247 
248 //----------------------------------------------------------------------------------------------------
249 
250 void AlignmentTask::buildFixedDetectorsConstraints(vector<AlignmentConstraint> &constraints) const {
251  for (auto &quantityClass : quantityClasses) {
252  // get input
253  const string &tag = quantityClassTag(quantityClass);
254 
255  const ParameterSet &classSettings = fixedDetectorsConstraints.getParameterSet(tag.c_str());
256  vector<unsigned int> ids(classSettings.getParameter<vector<unsigned int>>("ids"));
257  vector<double> values(classSettings.getParameter<vector<double>>("values"));
258 
259  if (ids.size() != values.size())
260  throw cms::Exception("PPS") << "Different number of constraint ids and values for " << tag << ".";
261 
262  // determine number of constraints
263  unsigned int size = ids.size();
264 
265  // just one basic constraint
266  if (oneRotZPerPot && quantityClass == qcRotZ) {
267  if (size > 1)
268  size = 1;
269  }
270 
271  // build constraints
272  for (unsigned int j = 0; j < size; j++) {
273  // prepare empty constraint
275 
276  for (auto &qcit : quantityClasses) {
277  ac.coef[qcit].ResizeTo(quantitiesOfClass(qcit));
278  ac.coef[qcit].Zero();
279  }
280 
281  // set constraint name
282  char buf[40];
283  sprintf(buf, "%s: fixed plane %4u", tag.c_str(), ids[j]);
284  ac.name = buf;
285 
286  // get quantity index
287  signed int qIndex = getQuantityIndex(quantityClass, ids[j]);
288  if (qIndex < 0)
289  throw cms::Exception("AlignmentTask::BuildFixedDetectorsConstraints")
290  << "Quantity index for class " << quantityClass << " and id " << ids[j] << " is " << qIndex;
291 
292  // set constraint coefficient and value
293  ac.coef[quantityClass][qIndex] = 1.;
294  ac.val = values[j] * 1E-3;
295 
296  // save constraint
297  constraints.push_back(ac);
298  }
299 
300  if (oneRotZPerPot && quantityClass == qcRotZ)
302  }
303 }
304 
305 //----------------------------------------------------------------------------------------------------
306 
307 void AlignmentTask::buildStandardConstraints(vector<AlignmentConstraint> &constraints) const {
308  const vector<unsigned int> &decUnitIds = standardConstraints.getParameter<vector<unsigned int>>("units");
309 
310  // count planes in RPs
311  map<unsigned int, unsigned int> planesPerPot;
312  for (const auto &it : geometry.getSensorMap()) {
313  CTPPSDetId detId(it.first);
314  planesPerPot[detId.rpId()]++;
315  }
316 
317  // ShR constraints
318  if (resolveShR) {
319  for (const auto &decUnitId : decUnitIds) {
320  // prepare empty constraints
321  AlignmentConstraint ac_X;
322  for (auto &qcit : quantityClasses) {
323  ac_X.coef[qcit].ResizeTo(quantitiesOfClass(qcit));
324  ac_X.coef[qcit].Zero();
325  }
326  ac_X.val = 0;
327 
328  AlignmentConstraint ac_Y(ac_X);
329 
330  // set constraint names
331  char buf[50];
332  sprintf(buf, "ShR: unit %u, MeanX=0", decUnitId);
333  ac_X.name = buf;
334  sprintf(buf, "ShR: unit %u, MeanY=0", decUnitId);
335  ac_Y.name = buf;
336 
337  // traverse geometry
338  for (const auto &git : geometry.getSensorMap()) {
339  // stop is sensor not in the selected arm
340  CTPPSDetId senId(git.first);
341  unsigned int senDecUnit = senId.arm() * 100 + senId.station() * 10;
342  if (senId.rp() > 2)
343  senDecUnit += 1;
344 
345  if (senDecUnit != decUnitId)
346  continue;
347 
348  // fill constraint for strip sensors
349  if (senId.subdetId() == CTPPSDetId::sdTrackingStrip) {
350  signed int qIndex = getQuantityIndex(qcShR2, git.first);
351  if (qIndex < 0)
352  throw cms::Exception("AlignmentTask::BuildStandardConstraints")
353  << "Cannot get quantity index for class " << qcShR2 << " and sensor id " << git.first << ".";
354 
355  // determine weight
356  const double weight = 1. / planesPerPot[senId.rpId()];
357 
358  // set constraint coefficients
359  ac_X.coef[qcShR2][qIndex] = git.second.getDirectionData(2).dx * weight;
360  ac_Y.coef[qcShR2][qIndex] = git.second.getDirectionData(2).dy * weight;
361  }
362 
363  // fill constraint for pixel sensors
364  if (senId.subdetId() == CTPPSDetId::sdTrackingPixel) {
365  // get quantity indeces
366  const signed int qIndex1 = getQuantityIndex(qcShR1, git.first);
367  if (qIndex1 < 0)
368  throw cms::Exception("AlignmentTask::BuildStandardConstraints")
369  << "Cannot get quantity index for class " << qcShR1 << " and sensor id " << git.first << ".";
370 
371  const signed int qIndex2 = getQuantityIndex(qcShR2, git.first);
372  if (qIndex2 < 0)
373  throw cms::Exception("AlignmentTask::BuildStandardConstraints")
374  << "Cannot get quantity index for class " << qcShR2 << " and sensor id " << git.first << ".";
375 
376  // determine weight (two constraints per plane)
377  const double weight = 0.5 / planesPerPot[senId.rpId()];
378 
379  // get geometry
380  const double d1x = git.second.getDirectionData(1).dx;
381  const double d1y = git.second.getDirectionData(1).dy;
382  const double d2x = git.second.getDirectionData(2).dx;
383  const double d2y = git.second.getDirectionData(2).dy;
384 
385  // calculate coefficients, by inversion of this matrix relation
386  // [ s1 ] = [ d1x d1y ] * [ de x ]
387  // [ s2 ] [ d2x d2y ] [ de y ]
388  const double D = d1x * d2y - d1y * d2x;
389  const double coef_x_s1 = +d2y / D;
390  const double coef_y_s1 = -d2x / D;
391  const double coef_x_s2 = -d1y / D;
392  const double coef_y_s2 = +d1x / D;
393 
394  // set constraint coefficients
395  ac_X.coef[qcShR1][qIndex1] = coef_x_s1 * weight;
396  ac_Y.coef[qcShR1][qIndex1] = coef_y_s1 * weight;
397  ac_X.coef[qcShR2][qIndex2] = coef_x_s2 * weight;
398  ac_Y.coef[qcShR2][qIndex2] = coef_y_s2 * weight;
399  }
400  }
401 
402  // add constraints
403  constraints.push_back(ac_X);
404  constraints.push_back(ac_Y);
405  }
406  }
407 
408  // RotZ constraints
409  if (resolveRotZ) {
410  for (const auto &decUnitId : decUnitIds) {
411  // prepare empty constraints
413  for (unsigned int i = 0; i < quantityClasses.size(); i++) {
415  ac.coef[quantityClasses[i]].Zero();
416  }
417  ac.val = 0;
418 
419  char buf[50];
420  sprintf(buf, "RotZ: unit %u, Mean=0", decUnitId);
421  ac.name = buf;
422 
423  // traverse geometry
424  for (const auto &git : geometry.getSensorMap()) {
425  // stop is sensor not in the selected arm
426  CTPPSDetId senId(git.first);
427  unsigned int senDecUnit = senId.arm() * 100 + senId.station() * 10;
428  if (senId.rp() > 2)
429  senDecUnit += 1;
430 
431  if (senDecUnit != decUnitId)
432  continue;
433 
434  // determine weight
435  const double weight = 1. / planesPerPot[senId.rpId()];
436 
437  // set coefficient
438  signed int qIndex = getQuantityIndex(qcRotZ, git.first);
439  ac.coef[qcRotZ][qIndex] = weight;
440  }
441 
442  constraints.push_back(ac);
443  }
444  }
445 
446  if (resolveRotZ && oneRotZPerPot)
448 
451 }
452 
453 //----------------------------------------------------------------------------------------------------
454 
455 void AlignmentTask::buildOneRotZPerPotConstraints(std::vector<AlignmentConstraint> &constraints) const {
456  // build map rp id --> sensor ids
457  map<unsigned int, vector<unsigned int>> m;
458  for (const auto &p : geometry.getSensorMap()) {
459  CTPPSDetId detId(p.first);
460  CTPPSDetId rpId = detId.rpId();
461  unsigned int decRPId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
462  m[decRPId].push_back(p.first);
463  }
464 
465  // traverse all RPs
466  for (const auto &p : m) {
467  // build n_planes-1 constraints
468  unsigned int prev_detId = 0;
469  for (const auto &detId : p.second) {
470  if (prev_detId != 0) {
472 
473  char buf[100];
474  sprintf(buf, "RotZ: RP %u, plane %u = plane %u", p.first, prev_detId, detId);
475  ac.name = buf;
476 
477  ac.val = 0;
478 
479  for (auto &qcit : quantityClasses) {
480  ac.coef[qcit].ResizeTo(quantitiesOfClass(qcit));
481  ac.coef[qcit].Zero();
482  }
483 
484  signed int qIdx1 = getQuantityIndex(qcRotZ, prev_detId);
485  signed int qIdx2 = getQuantityIndex(qcRotZ, detId);
486 
487  ac.coef[qcRotZ][qIdx1] = +1.;
488  ac.coef[qcRotZ][qIdx2] = -1.;
489 
490  constraints.push_back(ac);
491  }
492 
493  prev_detId = detId;
494  }
495  }
496 }
497 
498 //----------------------------------------------------------------------------------------------------
499 
500 void AlignmentTask::buildEqualMeanUMeanVRotZConstraints(vector<AlignmentConstraint> &constraints) const {
501  // build map strip rp id --> pair( vector of U planes, vector of V planes )
502  map<unsigned int, pair<vector<unsigned int>, vector<unsigned int>>> m;
503  for (const auto &p : geometry.getSensorMap()) {
504  CTPPSDetId detId(p.first);
505 
506  if (detId.subdetId() != CTPPSDetId::sdTrackingStrip)
507  continue;
508 
509  CTPPSDetId rpId = detId.rpId();
510  unsigned int decRPId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
511 
512  if (p.second.isU)
513  m[decRPId].first.push_back(p.first);
514  else
515  m[decRPId].second.push_back(p.first);
516  }
517 
518  // loop over RPs
519  for (const auto &p : m) {
521 
522  char buf[100];
523  sprintf(buf, "RotZ: RP %u, MeanU = MeanV", p.first);
524  ac.name = buf;
525 
526  ac.val = 0;
527 
528  for (auto &qcit : quantityClasses) {
529  ac.coef[qcit].ResizeTo(quantitiesOfClass(qcit));
530  ac.coef[qcit].Zero();
531  }
532 
533  for (auto &&proj : {"U", "V"}) {
534  const auto &planes = (proj == string("U")) ? p.second.first : p.second.second;
535  const double c = ((proj == string("U")) ? -1. : +1.) / planes.size();
536 
537  for (const auto &plane : planes) {
538  signed int qIdx = getQuantityIndex(qcRotZ, plane);
539  ac.coef[qcRotZ][qIdx] = c;
540 
541  TotemRPDetId plId(plane);
542  }
543  }
544 
545  constraints.push_back(ac);
546  }
547 }
size
Write out results.
Detector ID class for TOTEM Si strip detectors.
Definition: TotemRPDetId.h:30
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
A structure to hold relevant geometrical information about one detector/sensor.
void buildEqualMeanUMeanVRotZConstraints(std::vector< AlignmentConstraint > &constraints) const
adds constraints such that only mean-U and mean-V RotZ are equal for each strip RP ...
std::map< QuantityClass, std::map< DetIdDirIdxPair, unsigned int > > mapMeasurementIndeces
for each quantity class contains mapping (detector id, direction) –> measurement index ...
Definition: AlignmentTask.h:90
std::string quantityClassTag(QuantityClass) const
returns a string tag for the given quantity class
bool resolveShZ
whether to resolve detector shifts in z
Definition: AlignmentTask.h:28
void buildStandardConstraints(std::vector< AlignmentConstraint > &) const
builds the standard constraints
uint32_t arm() const
Definition: CTPPSDetId.h:57
ParameterSet const & getParameterSet(std::string const &) const
AlignmentTask()
dummy constructor (not to be used)
void setDirection(unsigned int idx, double dx, double dy, double dz)
Definition: weight.py:1
void buildOneRotZPerPotConstraints(std::vector< AlignmentConstraint > &) const
adds constraints such that only 1 rot_z per RP is left
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
signed int getMeasurementIndex(QuantityClass cl, unsigned int detId, unsigned int dirIdx) const
returns measurement index (if non-existent, returns -1)
std::vector< QuantityClass > quantityClasses
list of quantity classes to be optimized
Definition: AlignmentTask.h:68
void buildIndexMaps()
builds "mapMatrixIndeces" from "geometry"
DetGeomDesc::Translation Vector
Definition: CTPPSGeometry.h:36
static void buildGeometry(const std::vector< unsigned int > &rpDecIds, const std::vector< unsigned int > &excludedSensors, const CTPPSGeometry *, double z0, AlignmentGeometry &geometry)
builds the alignment geometry
static std::string const input
Definition: EdmProvDump.cc:50
uint32_t plane() const
Definition: TotemRPDetId.h:46
edm::ParameterSet fixedDetectorsConstraints
fixed detectors constraints from config file
Definition: AlignmentTask.h:40
bool resolveRotZ
whether to resolve detector rotations around z
Definition: AlignmentTask.h:31
detector shifts in first readout direction
Definition: AlignmentTask.h:61
An alignment constraint.
CTPPSDetId rpId() const
Definition: CTPPSDetId.h:84
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
bool oneRotZPerPot
whether to resolve only 1 rot_z per RP
Definition: AlignmentTask.h:34
The manager class for TOTEM RP geometry.
Definition: CTPPSGeometry.h:30
detector shifts in second readout direction
Definition: AlignmentTask.h:62
QuantityClass
quantity classes
Definition: AlignmentTask.h:60
double val
constraint value
std::map< unsigned int, TVectorD > coef
map: AlignmentAlgorithm::QuantityClass -> constraint coefficients
unsigned int measurementsOfClass(QuantityClass) const
returns the number of quantities of the given class
uint32_t rp() const
Definition: CTPPSDetId.h:71
signed int getQuantityIndex(QuantityClass cl, unsigned int detId) const
returns measurement index (if non-existent, returns -1)
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:141
bool useEqualMeanUMeanVRotZConstraints
whether to apply the constraint mean U = mean V RotZ for strips ("standard" set of constraints only) ...
Definition: AlignmentTask.h:37
bool resolveShR
whether to resolve detector shifts in readout direction(s)
Definition: AlignmentTask.h:25
detector rotations around z
Definition: AlignmentTask.h:64
uint32_t station() const
Definition: CTPPSDetId.h:64
std::map< QuantityClass, std::map< unsigned int, unsigned int > > mapQuantityIndeces
for each quantity class contains mapping detector id –> quantity index
Definition: AlignmentTask.h:93
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
ParameterSet const & getParameterSet(ParameterSetID const &id)
HLT enums.
std::string name
label of the constraint
unsigned int quantitiesOfClass(QuantityClass) const
returns the number of quantities of the given class
static constexpr float d1
detector shifts in z
Definition: AlignmentTask.h:63
edm::ParameterSet standardConstraints
settings of "standard" constraints from config file
Definition: AlignmentTask.h:43
void buildFixedDetectorsConstraints(std::vector< AlignmentConstraint > &) const
builds a set of fixed-detector constraints