CMS 3D CMS Logo

MuonAlignmentOutputXML.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: MuonAlignment
4 // Class : MuonAlignmentOutputXML
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author:
10 // Created: Fri Mar 14 18:02:33 CDT 2008
11 // $Id: MuonAlignmentOutputXML.cc,v 1.9 2011/06/07 19:38:24 khotilov Exp $
12 //
13 
14 // system include files
17 
18 // user include files
32 
33 //
34 // constants, enums and typedefs
35 //
36 
37 //
38 // static data member definitions
39 //
40 
41 //
42 // constructors and destructor
43 //
45  : m_fileName(iConfig.getParameter<std::string>("fileName")),
46  m_survey(iConfig.getParameter<bool>("survey")),
47  m_rawIds(iConfig.getParameter<bool>("rawIds")),
48  m_eulerAngles(iConfig.getParameter<bool>("eulerAngles")),
49  m_precision(iConfig.getParameter<int>("precision")),
50  m_suppressDTBarrel(iConfig.getUntrackedParameter<bool>("suppressDTBarrel", false)),
51  m_suppressDTWheels(iConfig.getUntrackedParameter<bool>("suppressDTWheels", false)),
52  m_suppressDTStations(iConfig.getUntrackedParameter<bool>("suppressDTStations", false)),
53  m_suppressDTChambers(iConfig.getUntrackedParameter<bool>("suppressDTChambers", false)),
54  m_suppressDTSuperLayers(iConfig.getUntrackedParameter<bool>("suppressDTSuperLayers", false)),
55  m_suppressDTLayers(iConfig.getUntrackedParameter<bool>("suppressDTLayers", false)),
56  m_suppressCSCEndcaps(iConfig.getUntrackedParameter<bool>("suppressCSCEndcaps", false)),
57  m_suppressCSCStations(iConfig.getUntrackedParameter<bool>("suppressCSCStations", false)),
58  m_suppressCSCRings(iConfig.getUntrackedParameter<bool>("suppressCSCRings", false)),
59  m_suppressCSCChambers(iConfig.getUntrackedParameter<bool>("suppressCSCChambers", false)),
60  m_suppressCSCLayers(iConfig.getUntrackedParameter<bool>("suppressCSCLayers", false)) {
61  std::string str_relativeto = iConfig.getParameter<std::string>("relativeto");
62 
63  if (str_relativeto == std::string("none")) {
64  m_relativeto = 0;
65  } else if (str_relativeto == std::string("ideal")) {
66  m_relativeto = 1;
67  } else if (str_relativeto == std::string("container")) {
68  m_relativeto = 2;
69  } else {
70  throw cms::Exception("BadConfig") << "relativeto must be \"none\", \"ideal\", or \"container\"" << std::endl;
71  }
72 }
73 
74 // MuonAlignmentOutputXML::MuonAlignmentOutputXML(const MuonAlignmentOutputXML& rhs)
75 // {
76 // // do actual copying here;
77 // }
78 
80 
81 //
82 // assignment operators
83 //
84 // const MuonAlignmentOutputXML& MuonAlignmentOutputXML::operator=(const MuonAlignmentOutputXML& rhs)
85 // {
86 // //An exception safe implementation is
87 // MuonAlignmentOutputXML temp(rhs);
88 // swap(rhs);
89 //
90 // return *this;
91 // }
92 
93 //
94 // member functions
95 //
96 
97 void MuonAlignmentOutputXML::write(AlignableMuon *alignableMuon, const edm::EventSetup &iSetup) const {
98  std::ofstream outputFile(m_fileName.c_str());
99  outputFile << std::setprecision(m_precision) << std::fixed;
100 
101  outputFile << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl;
102  outputFile << "<?xml-stylesheet type=\"text/xml\" href=\"MuonAlignment.xsl\"?>" << std::endl;
103  outputFile << "<MuonAlignment>" << std::endl << std::endl;
104 
105  std::map<align::ID, CLHEP::HepSymMatrix> errors;
106  AlignmentErrorsExtended *dtErrors = alignableMuon->dtAlignmentErrorsExtended();
107  AlignmentErrorsExtended *cscErrors = alignableMuon->cscAlignmentErrorsExtended();
108  for (std::vector<AlignTransformErrorExtended>::const_iterator dtError = dtErrors->m_alignError.begin();
109  dtError != dtErrors->m_alignError.end();
110  ++dtError) {
111  errors[dtError->rawId()] = dtError->matrix();
112  }
113  for (std::vector<AlignTransformErrorExtended>::const_iterator cscError = cscErrors->m_alignError.begin();
114  cscError != cscErrors->m_alignError.end();
115  ++cscError) {
116  errors[cscError->rawId()] = cscError->matrix();
117  }
118 
119  align::Alignables barrels = alignableMuon->DTBarrel();
120  align::Alignables endcaps = alignableMuon->CSCEndcaps();
121 
122  if (m_relativeto == 1) {
124  iSetup.get<IdealGeometryRecord>().get(cpv);
125 
127  iSetup.get<MuonNumberingRecord>().get(mdc);
130 
131  auto dtGeometry = std::make_shared<DTGeometry>();
132  DTGeometryBuilder.build(*dtGeometry, &(*cpv), *mdc);
133 
134  auto boost_cscGeometry = std::make_shared<CSCGeometry>();
135  CSCGeometryBuilder.build(*boost_cscGeometry, &(*cpv), *mdc);
136 
137  AlignableMuon ideal_alignableMuon(&(*dtGeometry), &(*boost_cscGeometry));
138 
139  align::Alignables ideal_barrels = ideal_alignableMuon.DTBarrel();
140  align::Alignables ideal_endcaps = ideal_alignableMuon.CSCEndcaps();
141 
142  writeComponents(barrels, ideal_barrels, errors, outputFile, true, alignableMuon->objectIdProvider());
143  writeComponents(endcaps, ideal_endcaps, errors, outputFile, false, alignableMuon->objectIdProvider());
144  } else {
145  align::Alignables empty1, empty2;
146 
147  writeComponents(barrels, empty1, errors, outputFile, true, alignableMuon->objectIdProvider());
148  writeComponents(endcaps, empty2, errors, outputFile, false, alignableMuon->objectIdProvider());
149  }
150 
151  outputFile << "</MuonAlignment>" << std::endl;
152 }
153 
155  align::Alignables &ideals,
156  std::map<align::ID, CLHEP::HepSymMatrix> &errors,
157  std::ofstream &outputFile,
158  bool DT,
159  const AlignableObjectId &objectIdProvider) const {
160  align::Alignables::const_iterator ideal = ideals.begin();
161  for (align::Alignables::const_iterator alignable = alignables.begin(); alignable != alignables.end(); ++alignable) {
162  if (m_survey && (*alignable)->survey() == nullptr) {
163  throw cms::Exception("Alignment") << "SurveyDets must all be defined when writing to XML" << std::endl;
164  } // now I can assume it's okay everywhere
165 
166  align::StructureType alignableObjectId = (*alignable)->alignableObjectId();
167 
168  if ((alignableObjectId == align::AlignableDTBarrel && !m_suppressDTBarrel) ||
169  (alignableObjectId == align::AlignableDTWheel && !m_suppressDTWheels) ||
170  (alignableObjectId == align::AlignableDTStation && !m_suppressDTStations) ||
171  (alignableObjectId == align::AlignableDTChamber && !m_suppressDTChambers) ||
172  (DT && alignableObjectId == align::AlignableDTSuperLayer && !m_suppressDTSuperLayers) ||
173  (DT && alignableObjectId == align::AlignableDetUnit && !m_suppressDTLayers) ||
174  (alignableObjectId == align::AlignableCSCEndcap && !m_suppressCSCEndcaps) ||
175  (alignableObjectId == align::AlignableCSCStation && !m_suppressCSCStations) ||
176  (alignableObjectId == align::AlignableCSCRing && !m_suppressCSCRings) ||
177  (alignableObjectId == align::AlignableCSCChamber && !m_suppressCSCChambers) ||
178  (!DT && alignableObjectId == align::AlignableDetUnit && !m_suppressCSCLayers)) {
179  unsigned int rawId = (*alignable)->geomDetId().rawId();
180  outputFile << "<operation>" << std::endl;
181 
182  if (DT) {
183  if (m_rawIds && rawId != 0) {
184  std::string typeName = objectIdProvider.idToString(alignableObjectId);
185  if (alignableObjectId == align::AlignableDTSuperLayer)
186  typeName = std::string("DTSuperLayer");
187  if (alignableObjectId == align::AlignableDetUnit)
188  typeName = std::string("DTLayer");
189  outputFile << " <" << typeName << " rawId=\"" << rawId << "\" />" << std::endl;
190  } else {
191  if (alignableObjectId == align::AlignableDetUnit) {
192  DTLayerId id(rawId);
193  outputFile << " <DTLayer wheel=\"" << id.wheel() << "\" station=\"" << id.station() << "\" sector=\""
194  << id.sector() << "\" superlayer=\"" << id.superlayer() << "\" layer=\"" << id.layer() << "\" />"
195  << std::endl;
196  } else if (alignableObjectId == align::AlignableDTSuperLayer) {
197  DTSuperLayerId id(rawId);
198  outputFile << " <DTSuperLayer wheel=\"" << id.wheel() << "\" station=\"" << id.station() << "\" sector=\""
199  << id.sector() << "\" superlayer=\"" << id.superlayer() << "\" />" << std::endl;
200  } else if (alignableObjectId == align::AlignableDTChamber) {
201  DTChamberId id(rawId);
202  outputFile << " <DTChamber wheel=\"" << id.wheel() << "\" station=\"" << id.station() << "\" sector=\""
203  << id.sector() << "\" />" << std::endl;
204  }
205 
206  else {
207  DTChamberId id((*alignable)->id());
208  if (alignableObjectId == align::AlignableDTStation) {
209  outputFile << " <DTStation wheel=\"" << id.wheel() << "\" station=\"" << id.station() << "\" />"
210  << std::endl;
211  } else if (alignableObjectId == align::AlignableDTWheel) {
212  outputFile << " <DTWheel wheel=\"" << id.wheel() << "\" />" << std::endl;
213  } else if (alignableObjectId == align::AlignableDTBarrel) {
214  outputFile << " <DTBarrel />" << std::endl;
215  } else
216  throw cms::Exception("Alignment") << "Unknown DT Alignable StructureType" << std::endl;
217  }
218 
219  } // end if not rawId
220  } // end if DT
221 
222  else { // CSC
223  if (m_rawIds && rawId != 0) {
224  std::string typeName = objectIdProvider.idToString(alignableObjectId);
225  if (alignableObjectId == align::AlignableDetUnit)
226  typeName = std::string("CSCLayer");
227  outputFile << " <" << typeName << " rawId=\"" << rawId << "\" />" << std::endl;
228  } else {
229  if (alignableObjectId == align::AlignableDetUnit) {
230  CSCDetId id(rawId);
231  outputFile << " <CSCLayer endcap=\"" << id.endcap() << "\" station=\"" << id.station() << "\" ring=\""
232  << id.ring() << "\" chamber=\"" << id.chamber() << "\" layer=\"" << id.layer() << "\" />"
233  << std::endl;
234  } else if (alignableObjectId == align::AlignableCSCChamber) {
235  CSCDetId id(rawId);
236  outputFile << " <CSCChamber endcap=\"" << id.endcap() << "\" station=\"" << id.station() << "\" ring=\""
237  << id.ring() << "\" chamber=\"" << id.chamber() << "\" />" << std::endl;
238  } else {
239  CSCDetId id((*alignable)->id());
240  if (alignableObjectId == align::AlignableCSCRing) {
241  outputFile << " <CSCRing endcap=\"" << id.endcap() << "\" station=\"" << id.station() << "\" ring=\""
242  << id.ring() << "\" />" << std::endl;
243  } else if (alignableObjectId == align::AlignableCSCStation) {
244  outputFile << " <CSCStation endcap=\"" << id.endcap() << "\" station=\"" << id.station() << "\" />"
245  << std::endl;
246  } else if (alignableObjectId == align::AlignableCSCEndcap) {
247  outputFile << " <CSCEndcap endcap=\"" << id.endcap() << "\" />" << std::endl;
248  } else
249  throw cms::Exception("Alignment") << "Unknown CSC Alignable StructureType" << std::endl;
250  }
251 
252  } // end if not rawId
253  } // end if CSC
254 
255  align::PositionType pos = (*alignable)->globalPosition();
256  align::RotationType rot = (*alignable)->globalRotation();
257 
258  if (m_survey) {
259  pos = (*alignable)->survey()->position();
260  rot = (*alignable)->survey()->rotation();
261  }
262 
263  std::string str_relativeto;
264  if (m_relativeto == 0) {
265  str_relativeto = std::string("none");
266  }
267 
268  else if (m_relativeto == 1) {
269  if (ideal == ideals.end() || (*ideal)->alignableObjectId() != alignableObjectId ||
270  (*ideal)->id() != (*alignable)->id()) {
271  throw cms::Exception("Alignment") << "AlignableMuon and ideal_AlignableMuon are out of sync!" << std::endl;
272  }
273 
274  align::PositionType idealPosition = (*ideal)->globalPosition();
275  align::RotationType idealRotation = (*ideal)->globalRotation();
276 
277  pos = align::PositionType(idealRotation * (pos.basicVector() - idealPosition.basicVector()));
278  rot = rot * idealRotation.transposed();
279 
280  str_relativeto = std::string("ideal");
281 
282  bool csc_debug = false;
283  if (csc_debug && !DT) {
284  CSCDetId id(rawId);
285  if (id.endcap() == 1 && id.station() == 1 && id.ring() == 1 && id.chamber() == 33) {
286  std::cout << " investigating " << id << std::endl
287  << (*alignable)->globalRotation() << std::endl
288  << std::endl
289  << idealRotation.transposed() << std::endl
290  << std::endl
291  << rot << std::endl
292  << std::endl;
293  double phix = atan2(rot.yz(), rot.zz());
294  double phiy = asin(-rot.xz());
295  double phiz = atan2(rot.xy(), rot.xx());
296 
297  std::cout << "phix=\"" << phix << "\" phiy=\"" << phiy << "\" phiz=\"" << phiz << std::endl;
298 
299  align::EulerAngles eulerAngles = align::toAngles((*alignable)->globalRotation());
300  std::cout << "alpha=\"" << eulerAngles(1) << "\" beta=\"" << eulerAngles(2) << "\" gamma=\""
301  << eulerAngles(3) << std::endl;
302  eulerAngles = align::toAngles(idealRotation);
303  std::cout << "alpha=\"" << eulerAngles(1) << "\" beta=\"" << eulerAngles(2) << "\" gamma=\""
304  << eulerAngles(3) << std::endl;
305  eulerAngles = align::toAngles(rot);
306  std::cout << "alpha=\"" << eulerAngles(1) << "\" beta=\"" << eulerAngles(2) << "\" gamma=\""
307  << eulerAngles(3) << std::endl;
308  }
309  }
310  }
311 
312  else if (m_relativeto == 2 && (*alignable)->mother() != nullptr) {
313  align::PositionType globalPosition = (*alignable)->mother()->globalPosition();
314  align::RotationType globalRotation = (*alignable)->mother()->globalRotation();
315 
316  pos = align::PositionType(globalRotation * (pos.basicVector() - globalPosition.basicVector()));
317  rot = rot * globalRotation.transposed();
318 
319  str_relativeto = std::string("container");
320  }
321 
322  else
323  assert(false); // can't happen: see constructor
324 
325  outputFile << " <setposition relativeto=\"" << str_relativeto << "\" "
326  << "x=\"" << pos.x() << "\" y=\"" << pos.y() << "\" z=\"" << pos.z() << "\" ";
327 
328  if (m_eulerAngles) {
329  align::EulerAngles eulerAngles = align::toAngles(rot);
330  outputFile << "alpha=\"" << eulerAngles(1) << "\" beta=\"" << eulerAngles(2) << "\" gamma=\"" << eulerAngles(3)
331  << "\" />" << std::endl;
332  }
333 
334  else {
335  // the angle convention originally used in alignment, also known as "non-standard Euler angles with a Z-Y-X convention"
336  // this also gets the sign convention right
337  double phix = atan2(rot.yz(), rot.zz());
338  double phiy = asin(-rot.xz());
339  double phiz = atan2(rot.xy(), rot.xx());
340 
341  outputFile << "phix=\"" << phix << "\" phiy=\"" << phiy << "\" phiz=\"" << phiz << "\" />" << std::endl;
342  }
343 
344  if (m_survey) {
345  align::ErrorMatrix err = (*alignable)->survey()->errors();
346 
347  outputFile << " <setsurveyerr"
348  << " xx=\"" << err(0, 0) << "\" xy=\"" << err(0, 1) << "\" xz=\"" << err(0, 2) << "\" xa=\""
349  << err(0, 3) << "\" xb=\"" << err(0, 4) << "\" xc=\"" << err(0, 5) << "\" yy=\"" << err(1, 1)
350  << "\" yz=\"" << err(1, 2) << "\" ya=\"" << err(1, 3) << "\" yb=\"" << err(1, 4) << "\" yc=\""
351  << err(1, 5) << "\" zz=\"" << err(2, 2) << "\" za=\"" << err(2, 3) << "\" zb=\"" << err(2, 4)
352  << "\" zc=\"" << err(2, 5) << "\" aa=\"" << err(3, 3) << "\" ab=\"" << err(3, 4) << "\" ac=\""
353  << err(3, 5) << "\" bb=\"" << err(4, 4) << "\" bc=\"" << err(4, 5) << "\" cc=\"" << err(5, 5)
354  << "\" />" << std::endl;
355  }
356 
357  else if (rawId != 0) {
358  CLHEP::HepSymMatrix err = errors[(*alignable)->id()];
359 
360  outputFile << " <setape xx=\"" << err(1, 1) << "\" xy=\"" << err(1, 2) << "\" xz=\"" << err(1, 3) << "\" xa=\""
361  << err(1, 4) << "\" xb=\"" << err(1, 5) << "\" xc=\"" << err(1, 6) << "\" yy=\"" << err(2, 2)
362  << "\" yz=\"" << err(2, 3) << "\" ya=\"" << err(2, 4) << "\" yb=\"" << err(2, 5) << "\" yc=\""
363  << err(2, 6) << "\" zz=\"" << err(3, 3) << "\" za=\"" << err(3, 4) << "\" zb=\"" << err(3, 5)
364  << "\" zc=\"" << err(3, 6) << "\" aa=\"" << err(4, 4) << "\" ab=\"" << err(4, 5) << "\" ac=\""
365  << err(4, 6) << "\" bb=\"" << err(5, 5) << "\" bc=\"" << err(5, 6) << "\" cc=\"" << err(6, 6)
366  << "\" />" << std::endl;
367  }
368 
369  outputFile << "</operation>" << std::endl << std::endl;
370 
371  } // end if not suppressed
372 
373  // write superstructures before substructures: this is important because <setape> overwrites all substructures' APEs
374  if (ideal != ideals.end()) {
375  align::Alignables components = (*alignable)->components();
376  align::Alignables ideal_components = (*ideal)->components();
377  writeComponents(components, ideal_components, errors, outputFile, DT, objectIdProvider);
378  ++ideal; // important for synchronization in the "for" loop!
379  } else {
380  align::Alignables components = (*alignable)->components();
382  writeComponents(components, dummy, errors, outputFile, DT, objectIdProvider);
383  }
384 
385  } // end loop over alignables
386 }
387 
388 //
389 // const member functions
390 //
391 
392 //
393 // static member functions
394 //
T xx() const
T getParameter(std::string const &) const
void write(AlignableMuon *alignableMuon, const edm::EventSetup &iSetup) const
align::Alignables DTBarrel()
T y() const
Definition: PV3DBase.h:60
const AlignableObjectId & objectIdProvider() const
Return muon alignable object ID provider derived from the muon system geometry.
Definition: AlignableMuon.h:77
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:28
T xy() const
T zz() const
align::Alignables CSCEndcaps()
void build(CSCGeometry &geom, const DDCompactView *fv, const MuonDDDConstants &muonConstants)
Build the geometry.
void build(DTGeometry &theGeometry, const DDCompactView *cview, const MuonDDDConstants &muonConstants)
T z() const
Definition: PV3DBase.h:61
Allows conversion between type and name, and vice-versa.
EulerAngles toAngles(const RotationType &)
Convert rotation matrix to angles about x-, y-, z-axes (frame rotation).
Definition: Utilities.cc:8
AlignmentErrorsExtended * cscAlignmentErrorsExtended()
Get CSC alignment errors sorted by DetId.
MuonAlignmentOutputXML(const edm::ParameterSet &iConfig)
AlgebraicVector EulerAngles
Definition: Definitions.h:34
const char * idToString(align::StructureType type) const
std::vector< AlignTransformErrorExtended > m_alignError
void writeComponents(align::Alignables &alignables, align::Alignables &ideals, std::map< align::ID, CLHEP::HepSymMatrix > &errors, std::ofstream &outputFile, bool DT, const AlignableObjectId &) const
AlignmentErrorsExtended * dtAlignmentErrorsExtended()
Get DT alignment errors sorted by DetId.
std::vector< Alignable * > Alignables
Definition: Utilities.h:31
T xz() const
T get() const
Definition: EventSetup.h:73
TkRotation transposed() const
Definition: errors.py:1
math::Error< 6 >::type ErrorMatrix
Definition: Definitions.h:37
Constructor of the full muon geometry.
Definition: AlignableMuon.h:33
T x() const
Definition: PV3DBase.h:59
const BasicVectorType & basicVector() const
Definition: PV3DBase.h:53
T yz() const