CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OpticalObject.cc
Go to the documentation of this file.
1 // COCOA class implementation file
2 //Id: OpticalObject.cc
3 //CAT: Model
4 //
5 // History: v1.0
6 // Pedro Arce
7 
29 
38 
41 
44 
45 #include "CLHEP/Units/GlobalSystemOfUnits.h"
46 
47 #include <cstdlib>
48 #include <iostream>
49 
50 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
51 //@@ Constructor: set OptO parent, type, name and fcopyData (if data is read or copied)
52 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
54  const ALIstring& type,
55  const ALIstring& name,
56  const ALIbool copy_data)
57  : theParent(parent), theType(type), theName(name), fcopyData(copy_data) {
58  if (ALIUtils::debug >= 4) {
59  std::cout << std::endl
60  << "@@@@ Creating OpticalObject: NAME= " << theName << " TYPE= " << theType << " fcopyData " << fcopyData
61  << std::endl;
62  }
63 
65 }
66 
67 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
68 //@@ construct: read centre and angles from file (or copy it) and create component OptOs
69 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71  //---------- Get file handler
73  /*- if(!filein) {
74  filein.ErrorInLine();
75  std::cerr << "cannot open file SystemDescription.txt" << std::endl;
76  exit(0);
77  }*/
78 
79  if (theParent != nullptr) { //----- OptO 'system' has no parent (and no affine frame)
80  //---------- Read or copy Data
81  if (!fcopyData) {
82  if (ALIUtils::debug >= 4)
83  std::cout << "@@@@ Reading data of Optical Object " << name() << std::endl;
84  readData(filein);
85  } else {
86  if (ALIUtils::debug >= 4)
87  std::cout << "Copy data of Optical Object " << name() << std::endl;
88  copyData();
89  }
90 
91  //---------- Set global coordinates
93  //---------- Set ValueDisplacementByFitting to 0. !!done at Entry construction
94  /* std::vector<Entry*>::const_iterator vecite;
95  for ( vecite = CoordinateEntryList().begin(); vecite != CoordinateEntryList().end(); vecite++) {
96  (*vecite)->setValueDisplacementByFitting( 0. );
97  }
98  */
99 
100  //---------- Set original entry values
102  }
103 
104  //---------- Create the OptO that compose this one
105  createComponentOptOs(filein);
106 
107  //---------- Construct material
109 
110  //---------- Construct solid shape
112 }
113 
114 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
115 //@@ Reads the affine frame (centre and angles) that every OpticalObject should have
116 //@@ If type is source, it may only read the center (and set the angles to 0)
117 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
119  //---------- See if there are extra entries and read them
120  std::vector<ALIstring> wordlist;
121  filein.getWordsInLine(wordlist);
122  if (wordlist[0] == ALIstring("ENTRY")) {
123  //---------- Read extra entries from file
124  readExtraEntries(filein);
125  filein.getWordsInLine(wordlist);
126  }
127 
128  //--------- set centre and angles not global (default behaviour)
129  centreIsGlobal = false;
130  anglesIsGlobal = false;
131 
132  //--------- readCoordinates
133  if (type() == ALIstring("source") || type() == ALIstring("pinhole")) {
134  readCoordinates(wordlist[0], "centre", filein);
135  setAnglesNull();
136  } else {
137  //---------- Read centre and angles
138  readCoordinates(wordlist[0], "centre", filein);
139  filein.getWordsInLine(wordlist);
140  readCoordinates(wordlist[0], "angles", filein);
141  }
142 }
143 
144 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
145 //@@ ReadExtraEntries: Reads extra entries from file
146 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
148  //---------- Loop extra entries until a '}'-line is found
149  std::vector<ALIstring> wordlist;
150  for (;;) {
151  filein.getWordsInLine(wordlist);
152  if (wordlist[0] != ALIstring("}")) {
153  fillExtraEntry(wordlist);
154  } else {
155  break;
156  }
157  }
158 }
159 
160 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
161 //@@ fillExtraEntry: create and fill an extra entry. Put it in lists and set link OptO it belongs to
162 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
163 void OpticalObject::fillExtraEntry(std::vector<ALIstring>& wordlist) {
164  //- if(ALIUtils::debug >= 5) std::cout << "fillExtraEntry wordlist0 " << wordlist[0].c_str() << std::endl;
165 
166  //---------- Check which type of entry to create
167  Entry* xentry;
168  if (wordlist[0] == ALIstring("length")) {
169  xentry = new EntryLength(wordlist[0]);
170  } else if (wordlist[0] == ALIstring("angle")) {
171  xentry = new EntryAngle(wordlist[0]);
172  } else if (wordlist[0] == ALIstring("nodim")) {
173  xentry = new EntryNoDim(wordlist[0]);
174  } else {
175  std::cerr << "!!ERROR: Exiting... unknown type of Extra Entry " << wordlist[0] << std::endl;
176  ALIUtils::dumpVS(wordlist, " Only 'length', 'angle' or 'nodim' are allowed ", std::cerr);
177  exit(2);
178  }
179 
180  if (ALIUtils::debug >= 99) {
181  ALIUtils::dumpVS(wordlist, "fillExtraEntry: ", std::cout);
182  }
183  //---------- Erase first word of line read (type of entry)
184  wordlist.erase(wordlist.begin());
185 
186  if (ALIUtils::debug >= 99) {
187  ALIUtils::dumpVS(wordlist, "fillExtraEntry: ", std::cout);
188  }
189 
190  //---------- Set link from entry to OptO it belongs to
191  xentry->setOptOCurrent(this);
192  //----- Name is filled from here to be consistent with fillCoordinate
193  xentry->fillName(wordlist[0]);
194  //---------- Fill entry with data in line read
195  xentry->fill(wordlist);
196 
197  //---------- Add entry to entry lists
198  Model::addEntryToList(xentry);
199  addExtraEntryToList(xentry);
200 
201  if (ALIUtils::debug >= 5)
202  std::cout << "fillExtraEntry: xentry_value" << xentry->value() << xentry->ValueDimensionFactor() << std::endl;
203 
204  //---------- Add entry value to list
205  addExtraEntryValueToList(xentry->value());
206 }
207 
208 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
209 //@@ readCoordinates: Read centre or angles ( following coor_type )
210 //@@ check that coordinate type is the expected one
211 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
212 void OpticalObject::readCoordinates(const ALIstring& coor_type_read,
213  const ALIstring& coor_type_expected,
214  ALIFileIn& filein) {
215  ALIstring coor_type_reads = coor_type_read.substr(0, 6);
216  if (coor_type_reads == "center")
217  coor_type_reads = "centre";
218  //---------- if after the first six letters ther is a 'G', it means they are global coordinates
219  //----- If data is read from a 'report.out', it is always local and this is not needed
220 
221  //TODO: check that if only one entry of the three is read from 'report.out', the input file does not give global coordinates (it would cause havoc)
222  if (EntryMgr::getInstance()->findEntryByLongName(longName(), "") == nullptr) {
223  if (coor_type_read.size() == 7) {
224  if (coor_type_read[6] == 'G') {
225  if (ALIUtils::debug >= 5)
226  std::cout << " coordinate global " << coor_type_read << std::endl;
227  if (coor_type_expected == "centre") {
228  centreIsGlobal = true;
229  } else if (coor_type_expected == "angles") {
230  anglesIsGlobal = true;
231  }
232  }
233  }
234  }
235 
236  std::vector<ALIstring> wordlist;
237  //---------- Read 4 lines: first is entry type, rest are three coordinates (each one will be an individual entry)
238  ALIstring coor_names[3]; // to check if using cartesian, cylindrical or spherical coordinates
239 
240  for (int ii = 0; ii < 4; ii++) {
241  if (ii == 0) {
242  //---------- Check that first line is of expected type
243  if (coor_type_reads != coor_type_expected) {
244  filein.ErrorInLine();
245  std::cerr << "readCoordinates: " << coor_type_expected << " should be read here, instead of " << coor_type_reads
246  << std::endl;
247  exit(1);
248  }
249  } else {
250  //----------- Fill entry Data
251  filein.getWordsInLine(wordlist);
252  coor_names[ii - 1] = wordlist[0];
253  fillCoordinateEntry(coor_type_expected, wordlist);
254  }
255  }
256 
257  //---- Transform coordinate system if cylindrical or spherical
258  if (coor_names[0] == ALIstring("X") && coor_names[1] == ALIstring("Y") && coor_names[2] == ALIstring("Z")) {
259  //do nothing
260  } else if (coor_names[0] == ALIstring("R") && coor_names[1] == ALIstring("PHI") && coor_names[2] == ALIstring("Z")) {
262  } else if (coor_names[0] == ALIstring("R") && coor_names[1] == ALIstring("THE") &&
263  coor_names[2] == ALIstring("PHI")) {
265  } else {
266  std::cerr << "!!!EXITING: coordinates have to be cartesian (X ,Y ,Z), or cylindrical (R, PHI, Z) or spherical (R, "
267  "THE, PHI) "
268  << std::endl
269  << " they are " << coor_names[0] << ", " << coor_names[1] << ", " << coor_names[2] << "." << std::endl;
270  exit(1);
271  }
272 }
273 
274 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276  ALIuint ii;
277  ALIuint siz = theCoordinateEntryVector.size();
278  ALIdouble R = theCoordinateEntryVector[0]->value();
281  if (siz != 3) {
282  throw cms::Exception("LogicError") << "@SUB=OpticalObject::transformCylindrical2Cartesian\n"
283  << "Transformation from cylindrical to cartesian coordinates requires the"
284  << " coordinate entry vector to have a size of three.";
285  }
286  ALIdouble newcoor[3] = {
287  R * cos(phi),
288  R * sin(phi),
289  theCoordinateEntryVector[2]->value() // Z
290  };
291  //- std::cout << " phi " << phi << std::endl;
292  //----- Name is filled from here to include 'centre' or 'angles'
293 
294  for (ii = 0; ii < siz; ii++) {
295  if (ALIUtils::debug >= 5)
296  std::cout << " OpticalObject::transformCylindrical2Cartesian " << ii << " " << newcoor[ii] << std::endl;
297  theCoordinateEntryVector[ii]->setValue(newcoor[ii]);
298  }
299  // change the names
300  ALIstring name = "centre_X";
301  theCoordinateEntryVector[0]->fillName(name);
302  name = "centre_Y";
303  theCoordinateEntryVector[1]->fillName(name);
304  name = "centre_Z";
305  theCoordinateEntryVector[2]->fillName(name);
306 }
307 
308 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
310 
311 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
312 //@@ fillCoordinateEntry: fill data of Coordinate Entry with data read
313 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
314 void OpticalObject::fillCoordinateEntry(const ALIstring& coor_type, const std::vector<ALIstring>& wordlist) {
315  //---------- Select which type of entry to create
316  Entry* entry = nullptr;
317  if (coor_type == ALIstring("centre")) {
318  entry = new EntryLengthAffCentre(coor_type);
319  } else if (coor_type == ALIstring("angles")) {
320  entry = new EntryAngleAffAngles(coor_type);
321  } else {
322  std::cerr << " !!! FATAL ERROR at OpticalObject::fillCoordinateEntry : wrong coordinate type " << coor_type
323  << std::endl;
324  exit(1);
325  }
326 
327  //---------- Set link from entry to OptO it belongs to
328  entry->setOptOCurrent(this);
329  //----- Name is filled from here to include 'centre' or 'angles'
330  ALIstring name = coor_type + "_" + wordlist[0];
331  entry->fillName(name);
332  //---------- Fill entry with data read
333  entry->fill(wordlist);
334 
335  //---------- Add entry to lists
336  Model::addEntryToList(entry);
338 }
339 
340 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
341 //@@ SetAnglesNull: create three angle entries and set values to zero
342 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
345  //---------- three names will be X, Y and Z
346  ALIstring coor("XYZ");
347 
348  //---------- Fill the three entries
349  for (int ii = 0; ii < 3; ii++) {
350  entry = new EntryAngleAffAngles("angles");
351 
352  //---------- Set link from entry to OptO it belongs to
353  entry->setOptOCurrent(this);
354  //----- Name is filled from here to be consistent with fillCoordinate
355  ALIstring name = "angles_" + coor.substr(ii, 1);
356  entry->fillName(name);
357  //---------- Set entry data to zero
358  entry->fillNull();
359 
360  // entry.fillNull( tt );
361 
362  //---------- Add entry to lists
363  Model::addEntryToList(entry);
365  }
366 }
367 
368 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
369 //@@ copyData: look for OptO of the same type as this one and copy its components as the components of present OptO
370 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
372  centreIsGlobal = false;
373  anglesIsGlobal = false;
374  if (ALIUtils::debug >= 5)
375  std::cout << "entering copyData()" << std::endl;
376 
377  //---------- Get copied OptO
379 
380  //---------- build name: for a copied OptO, now name is parent name, add the last part of the copied OptO
381  ALIint copy_name_last_slash = opto->name().rfind('/');
382  ALIint copy_name_size = opto->name().length();
383  //- if(ALIUtils::debug >= 9) std::cout << "BUILD UP NAME0 " << theName << std::endl;
384  theName.append(opto->name(), copy_name_last_slash, copy_name_size);
385  if (ALIUtils::debug >= 5)
386  std::cout << "copying OptO: " << opto->name() << " to OptO " << theName << std::endl;
387 
388  //---------- Copy Extra Entries from copied OptO
389  std::vector<Entry*>::const_iterator vecite;
390  for (vecite = opto->ExtraEntryList().begin(); vecite != opto->ExtraEntryList().end(); ++vecite) {
391  std::vector<ALIstring> wordlist;
392  wordlist.push_back((*vecite)->type());
393  buildWordList((*vecite), wordlist);
394  if (ALIUtils::debug >= 9) {
395  ALIUtils::dumpVS(wordlist, "copyData: ", std::cout);
396  }
397  fillExtraEntry(wordlist);
398  }
399 
400  //---------- Copy Coordinate Entries from copied OptO
401  for (vecite = opto->CoordinateEntryList().begin(); vecite != opto->CoordinateEntryList().end(); ++vecite) {
402  std::vector<ALIstring> wordlist;
403  buildWordList((*vecite), wordlist);
404  //----- first three coordinates centre, second three coordinates angles!!PROTECT AGAINST OTHER POSSIBILITIES!!
405  ALIstring coor_name;
406  if (vecite - opto->CoordinateEntryList().begin() < 3) {
407  coor_name = "centre";
408  } else {
409  coor_name = "angles";
410  }
411  fillCoordinateEntry(coor_name, wordlist);
412  }
413 }
414 
415 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
416 //@@ buildWordList: for copied OptOs, make a list of words to be passed to fillExtraEntry or fill CoordinateEntry
417 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
418 void OpticalObject::buildWordList(const Entry* entry, std::vector<ALIstring>& wordlist) {
419  //---------- 1st add name
420  wordlist.push_back(entry->name());
421 
422  //---------- 1st add value
423  char chartmp[20];
424  gcvt(entry->value() / entry->ValueDimensionFactor(), 10, chartmp);
425  wordlist.push_back(chartmp);
426 
427  //---------- 1st add sigma
428  gcvt(entry->sigma() / entry->SigmaDimensionFactor(), 10, chartmp);
429  wordlist.push_back(chartmp);
430 
431  //---------- 1st add quality
432  ALIstring strtmp;
433  ALIint inttmp = entry->quality();
434  switch (inttmp) {
435  case 0:
436  strtmp = "fix";
437  break;
438  case 1:
439  strtmp = "cal";
440  break;
441  case 2:
442  strtmp = "unk";
443  break;
444  default:
445  std::cerr << "buildWordList: entry " << entry->OptOCurrent()->name() << entry->name() << " quality not found "
446  << inttmp << std::endl;
447  break;
448  }
449  wordlist.push_back(strtmp);
450 
451  if (ALIUtils::debug >= 9) {
452  ALIUtils::dumpVS(wordlist, "buildWordList: ", std::cout);
453  }
454 }
455 
456 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
457 //@@ createComponentOptOs: create components objects of this Optical Object (and call their construct(), so that they read their own data)
458 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
460  //---------- flag to determine if components are copied or read (it is passed to the constructor of component OptOs)
461  ALIbool fcopyComponents = false;
462 
463  //---------- Get list of components of current OptO (copy it to 'vopto_types')
464  std::vector<ALIstring> vopto_types;
465  int igetood = Model::getComponentOptOTypes(type(), vopto_types);
466  if (!igetood) {
467  if (ALIUtils::debug >= 5)
468  std::cout << " NO MORE COMPONENTS IN THIS OptO" << name() << std::endl;
469  return;
470  }
471 
472  /* //---------- Dump component list
473  if(ALIUtils::debug >= 5) {
474  ALIUtils::dumpVS( wordlist, "SYSTEM: ", std::cout );
475  }*/
476 
477  //---------- Loop components (have to follow list in 'vopto_types')
478  std::vector<ALIstring>::iterator vsite;
479  std::vector<ALIstring> wordlist;
480  for (vsite = vopto_types.begin(); vsite != vopto_types.end(); ++vsite) {
481  //----- If it is not being copied, read first line describing object
482  //- std::cout << "fcopyy" << fcopyComponents << fcopyData << theName << *vsite << std::endl;
483  if (!fcopyData && !fcopyComponents)
484  filein.getWordsInLine(wordlist);
485  //t if( !fcopyData ) filein.getWordsInLine(wordlist);
486 
487  //----- Check first line describing object
488  //--- Don't check it if OptO is going to be copied (fcopyData = 1)
489  //--- If OptO is not copied, but components will be copied, check if only for the first component (for the second fcopyComponents=1)
490  if (fcopyData || fcopyComponents) {
491  fcopyComponents = true;
492  //--- If OptO not copied, but components will be copied
493  } else if (wordlist[0] == ALIstring("copy_components")) {
494  if (ALIUtils::debug >= 3)
495  std::cout << "createComponentOptOs: copy_components" << wordlist[0] << std::endl;
497  fcopyComponents = true; //--- for the second and following components
498  //----- If no copying: check that type is the expected one
499  } else if (wordlist[0] != (*vsite)) {
500  filein.ErrorInLine();
501  std::cerr << "!!! Badly placed OpticalObject: " << wordlist[0] << " should be = " << (*vsite) << std::endl;
502  exit(2);
503  }
504 
505  //---------- Make composite component name
506  ALIstring component_name = name();
507  //----- if component is not going to be copied add name of component to the parent (if OptO is not copied and components will be, wordlist = 'copy-components', there is no wordlist[1]
508  if (!fcopyComponents) {
509  component_name += '/';
510  component_name += wordlist[1];
511  }
512  // if ( ALIUtils::debug >= 6 ) std::cout << "MAKE NAME " << name() << " TO " << component_name << std::endl;
513 
514  //---------- Create OpticalObject of the corresponding type
515  OpticalObject* OptOcomponent = createNewOptO(this, *vsite, component_name, fcopyComponents);
516 
517  //----- Fill CMS software ID
518  if (wordlist.size() == 3) {
519  OptOcomponent->setID(ALIUtils::getInt(wordlist[2]));
520  } else {
521  OptOcomponent->setID(OpticalObjectMgr::getInstance()->buildCmsSwID());
522  }
523 
524  //---------- Construct it (read data and
525  OptOcomponent->construct();
526 
527  //---------- Fill OptO tree and OptO list
528  Model::OptOList().push_back(OptOcomponent);
529  }
530 }
531 
532 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
534  ALIstring optoType,
535  ALIstring optoName,
536  ALIbool fcopyComponents) {
537  if (ALIUtils::debug >= 3)
538  std::cout << " OpticalObject::createNewOptO optoType " << optoType << " optoName " << optoName << " parent "
539  << parent->name() << std::endl;
540  OpticalObject* OptOcomponent;
541  if (optoType == "laser") {
542  OptOcomponent = new OptOLaser(this, optoType, optoName, fcopyComponents);
543  } else if (optoType == "source") {
544  OptOcomponent = new OptOSource(this, optoType, optoName, fcopyComponents);
545  } else if (optoType == "Xlaser") {
546  OptOcomponent = new OptOXLaser(this, optoType, optoName, fcopyComponents);
547  } else if (optoType == "mirror") {
548  OptOcomponent = new OptOMirror(this, optoType, optoName, fcopyComponents);
549  } else if (optoType == "plate_splitter") {
550  OptOcomponent = new OptOPlateSplitter(this, optoType, optoName, fcopyComponents);
551  } else if (optoType == "cube_splitter") {
552  OptOcomponent = new OptOCubeSplitter(this, optoType, optoName, fcopyComponents);
553  } else if (optoType == "modified_rhomboid_prism") {
554  OptOcomponent = new OptOModifiedRhomboidPrism(this, optoType, optoName, fcopyComponents);
555  } else if (optoType == "pseudo_pentaprism" || optoType == "optical_square") {
556  OptOcomponent = new OptOOpticalSquare(this, optoType, optoName, fcopyComponents);
557  } else if (optoType == "lens") {
558  OptOcomponent = new OptOLens(this, optoType, optoName, fcopyComponents);
559  } else if (optoType == "Risley_prism") {
560  OptOcomponent = new OptORisleyPrism(this, optoType, optoName, fcopyComponents);
561  } else if (optoType == "sensor2D") {
562  OptOcomponent = new OptOSensor2D(this, optoType, optoName, fcopyComponents);
563  } else if (optoType == "distancemeter" || optoType == "distancemeter1dim") {
564  OptOcomponent = new OptODistancemeter(this, optoType, optoName, fcopyComponents);
565  } else if (optoType == "distancemeter3dim") {
566  OptOcomponent = new OptODistancemeter3dim(this, optoType, optoName, fcopyComponents);
567  } else if (optoType == "distance_target") {
568  OptOcomponent = new OptOScreen(this, optoType, optoName, fcopyComponents);
569  } else if (optoType == "tiltmeter") {
570  OptOcomponent = new OptOTiltmeter(this, optoType, optoName, fcopyComponents);
571  } else if (optoType == "pinhole") {
572  OptOcomponent = new OptOPinhole(this, optoType, optoName, fcopyComponents);
573  } else if (optoType == "COPS") {
574  OptOcomponent = new OptOCOPS(this, optoType, optoName, fcopyComponents);
575  } else {
576  OptOcomponent =
577  //o new OpticalObject( this, optoType, optoName, fcopyComponents );
578  new OptOUserDefined(this, optoType, optoName, fcopyComponents);
579  }
580 
581  return OptOcomponent;
582 }
583 
584 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
585 //@@ SetGlobalCoordinates
586 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
588  setGlobalCentre();
589  setGlobalRM();
590 }
591 
592 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
595  if (type() != ALIstring("system") && !centreIsGlobal) {
597  }
598  if (anglesIsGlobal) {
599  std::cerr << "!!!FATAL ERROR: angles in global coordinates not supported momentarily " << std::endl;
600  abort();
601  }
602 }
603 
604 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
607  if (!anglesIsGlobal) {
609  }
610 
611  // Calculate local rot axis with new rm glob
613 }
614 
615 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
616 void OpticalObject::setGlobalRMOriginalOriginal(const CLHEP::HepRotation& rmorioriLocal) {
617  CLHEP::HepRotation rmorioriold = rmGlobOriginalOriginal();
618  if (ALIUtils::debug >= 5) {
619  std::cout << " setGlobalRMOriginalOriginal OptO " << name() << std::endl;
620  ALIUtils::dumprm(rmorioriLocal, " setGlobalRMOriginalOriginal new local");
621  ALIUtils::dumprm(rmGlobOriginalOriginal(), " setGlobalRMOriginalOriginal old ");
622  }
623 
625 
626  /* //---- multiplyt it by parent rmGlobOriginalOriginal
627  if( parent()->type() != ALIstring("system") ) {
628  theRmGlobOriginalOriginal = parent()->rmGlobOriginalOriginal() * theRmGlobOriginalOriginal;
629  }*/
630 
631  if (ALIUtils::debug >= 5) {
632  ALIUtils::dumprm(parent()->rmGlobOriginalOriginal(), " parent rmoriori glob ");
633  ALIUtils::dumprm(rmGlobOriginalOriginal(), " setGlobalRMOriginalOriginal new ");
634  }
635 
636  //----------- Reset RMGlobOriginalOriginal() of every component
637  std::vector<OpticalObject*> vopto;
638  ALIbool igetood = Model::getComponentOptOs(name(), vopto);
639  if (!igetood) {
640  // std::cout << " NO MORE COMPONENTS IN THIS OptO" << name() << std::endl ;
641  return;
642  }
643  std::vector<OpticalObject*>::const_iterator vocite;
644  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
645  CLHEP::HepRotation rmorioriLocalChild = (*vocite)->buildRmFromEntryValuesOriginalOriginal();
646  (*vocite)->setGlobalRMOriginalOriginal(rmorioriLocalChild);
647  // (*vocite)->propagateGlobalRMOriginalOriginalChangeToChildren( rmorioriold, rmGlobOriginalOriginal() );
648  }
649 }
650 
651 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
652 void OpticalObject::propagateGlobalRMOriginalOriginalChangeToChildren(const CLHEP::HepRotation& rmorioriold,
653  const CLHEP::HepRotation& rmoriorinew) {
654  std::cout << " propagateGlobalRMOriginalOriginalChangeToChildren OptO " << name() << std::endl;
655  ALIUtils::dumprm(rmGlobOriginalOriginal(), " setGlobalRMOriginalOriginal old ");
656  theRmGlobOriginalOriginal = rmoriorinew.inverse() * theRmGlobOriginalOriginal;
658  ALIUtils::dumprm(rmGlobOriginalOriginal(), " setGlobalRMOriginalOriginal new ");
659 
660  //----------- Reset RMGlobOriginalOriginal() of every component
661  std::vector<OpticalObject*> vopto;
662  ALIbool igetood = Model::getComponentOptOs(name(), vopto);
663  if (!igetood) {
664  // std::cout << " NO MORE COMPONENTS IN THIS OptO" << name() << std::endl ;
665  return;
666  }
667  std::vector<OpticalObject*>::const_iterator vocite;
668  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
669  // CLHEP::HepRotation rmoriorid = buildRmFromEntryValues();
670  (*vocite)->propagateGlobalRMOriginalOriginalChangeToChildren(rmorioriold, rmoriorinew);
671  }
672 }
673 
674 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
676  CLHEP::HepRotation rm;
677  const OpticalObject* opto_par = this;
678  // if(Model::GlobalOptions()["rotateAroundLocal"] == 0) {
679  if (ALIUtils::debug >= 55)
680  std::cout << "rotate with parent: before X " << opto_par->parent()->name() << " "
681  << parent()->getEntryRMangle(XCoor) << std::endl;
682  const std::vector<Entry*>& cel = CoordinateEntryList();
683  rm.rotateX(cel[3]->valueOriginalOriginal());
684  if (ALIUtils::debug >= 55)
685  std::cout << "rotate with parent: before Y " << opto_par->parent()->name() << " "
686  << parent()->getEntryRMangle(YCoor) << std::endl;
687  rm.rotateY(cel[4]->valueOriginalOriginal());
688  if (ALIUtils::debug >= 55)
689  std::cout << "rotate with parent: before Z " << opto_par->parent()->name() << " "
690  << parent()->getEntryRMangle(ZCoor) << std::endl;
691  rm.rotateZ(cel[5]->valueOriginalOriginal());
692  //- rm.rotateZ( getEntryRMangle(ZCoor) );
693  if (ALIUtils::debug >= 54)
694  ALIUtils::dumprm(theRmGlob, "SetRMGlobFromRMLocal: RM GLOB after " + opto_par->parent()->longName());
695 
696  return rm;
697 }
698 
699 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
701  // std::vector<Entry*>::const_iterator vecite = CoordinateEntryList().begin();
702  //- std::cout << "PARENTSYSTEM" << name() << parent() <<"ZZ"<<vecite<< std::endl;
703  // std::cout << " OpticalObject::setGlobalCoordinates " << this->name() << std::endl;
704  //- std::cout << veite << "WW" << *vecite << std::endl;
705  //---------------------------------------- Set global centre
706  //----------------------------------- Get local centre from Entries
710  if (ALIUtils::debug >= 4)
711  ALIUtils::dump3v(centreGlob(), "SetCentreLocalFromEntryValues: CENTRE LOCAL ");
712 }
713 
714 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
716  //---------- Set global rotation matrix
717  //-------- Get rm from Entries
718  theRmGlob = CLHEP::HepRotation();
719  theRmGlob.rotateX(getEntryRMangle(XCoor));
720  if (ALIUtils::debug >= 4) {
721  std::cout << " getEntryRMangle(XCoor) )" << getEntryRMangle(XCoor) << std::endl;
722  ALIUtils::dumprm(theRmGlob, "SetRMLocalFromEntryValues: RM after X");
723  }
724  theRmGlob.rotateY(getEntryRMangle(YCoor));
725  if (ALIUtils::debug >= 4) {
726  std::cout << " getEntryRMangle(YCoor) )" << getEntryRMangle(YCoor) << std::endl;
727  ALIUtils::dumprm(theRmGlob, "SetRMLocalFromEntryValues: RM after Y");
728  }
729  theRmGlob.rotateZ(getEntryRMangle(ZCoor));
730  if (ALIUtils::debug >= 4) {
731  std::cout << " getEntryRMangle(ZCoor) )" << getEntryRMangle(ZCoor) << std::endl;
732  ALIUtils::dumprm(theRmGlob, "SetRMLocalFromEntryValues: RM FINAL");
733  }
734 
735  //----- angles are relative to parent, so rotate parent angles first
736  // RmGlob() = 0;
737  //- if(ALIUtils::debug >= 4) ALIUtils::dumprm( parent()->rmGlob(), "OPTO0: RM LOCAL ");
738  // if ( type() != ALIstring("system") ) theRmGlob.transform( parent()->rmGlob() );
739  //----- if anglesIsGlobal, RM is already in global coordinates, else multiply by ancestors
740 
741  /* /////////////
742  CLHEP::Hep3Vector ztest(0.,0.,1.);
743  ztest = theRmGlob * ztest;
744  if( ALIUtils::debug >= 5 ) ALIUtils::dump3v( ztest, "z rotated by theRmGlob ");
745  */
746 }
747 
748 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
750  //----------- Get global centre: parent centre plus local centre traslated to parent coordinate system
751  CLHEP::Hep3Vector cLocal = theCentreGlob;
753 
754  if (ALIUtils::debug >= 5)
755  ALIUtils::dump3v(theCentreGlob, "SetCentreGlobFromCentreLocal: CENTRE in parent local frame ");
757 
758  if (ALIUtils::debug >= 5)
759  ALIUtils::dump3v(theCentreGlob, "SetCentreGlobFromCentreLocal: CENTRE GLOBAL ");
760  if (ALIUtils::debug >= 5) {
761  ALIUtils::dump3v(parent()->centreGlob(), " parent centreGlob" + parent()->name());
762  ALIUtils::dumprm(parent()->rmGlob(), " parent rmGlob ");
763  }
764 
765  /* CLHEP::Hep3Vector cLocal2 = theCentreGlob - parent()->centreGlob();
766  CLHEP::HepRotation rmParentInv = inverseOf( parent()->rmGlob() );
767  cLocal2 = rmParentInv * cLocal2;
768  if( (cLocal2 - cLocal).mag() > 1.E-9 ) {
769  std::cerr << "!!!! CALCULATE LOCAL WRONG. Diff= " << (cLocal2 - cLocal).mag() << " " << cLocal2 << " " << cLocal << std::endl;
770  if( (cLocal2 - cLocal).mag() > 1.E-4 ) {
771  std::exception();
772  }
773  }*/
774 }
775 
776 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
778  const OpticalObject* opto_par = this;
780  if (gomgr->GlobalOptions()["rotateAroundLocal"] == 0) {
781  while (opto_par->parent()->type() != ALIstring("system")) {
782  //t vecite = opto_par->parent()->GetCoordinateEntry( CEanglesX );
783  if (ALIUtils::debug >= 5)
784  std::cout << "rotate with parent: before X " << opto_par->parent()->name() << " "
785  << parent()->getEntryRMangle(XCoor) << std::endl;
786  theRmGlob.rotateX(parent()->getEntryRMangle(XCoor));
787  if (ALIUtils::debug >= 5)
788  std::cout << "rotate with parent: before Y " << opto_par->parent()->name() << " "
789  << parent()->getEntryRMangle(YCoor) << std::endl;
790  theRmGlob.rotateY(parent()->getEntryRMangle(YCoor));
791  if (ALIUtils::debug >= 5)
792  std::cout << "rotate with parent: before Z " << opto_par->parent()->name() << " "
793  << parent()->getEntryRMangle(ZCoor) << std::endl;
794  theRmGlob.rotateZ(parent()->getEntryRMangle(ZCoor));
795  if (ALIUtils::debug >= 4)
796  ALIUtils::dumprm(theRmGlob, "SetRMGlobFromRMLocal: RM GLOB after " + opto_par->parent()->longName());
797  opto_par = opto_par->parent();
798  }
799  } else {
800  if (ALIUtils::debug >= 4) {
801  std::cout << " Composing rmGlob with parent " << parent()->name() << std::endl;
802  // ALIUtils::dumprm( theRmGlob, "SetRMGlobFromRMLocal: RM GLOB ");
803  }
804  theRmGlob = parent()->rmGlob() * theRmGlob;
805  }
806 
807  // std::cout << "rotate with parent (parent)" << opto_par->name() <<parent()->name() << (*vecite)->name() << (*vecite)->value() <<std::endl;
808  if (ALIUtils::debug >= 4) {
809  ALIUtils::dumprm(theRmGlob, "SetRMGlobFromRMLocal: final RM GLOB ");
810  ALIUtils::dumprm(parent()->rmGlob(), "parent rm glob ");
811  }
812 }
813 
814 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
815 void OpticalObject::SetRMGlobFromRMLocalOriginalOriginal(const CLHEP::HepRotation& rmoriori) {
816  theRmGlobOriginalOriginal = rmoriori;
818 }
819 
820 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
821 //@@ SetOriginalEntryValues: Set orig coordinates and extra entry values for backup
822 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
824  //---------- Set orig coordinates
827 
830 
831  /* if ( ALIUtils::debug >= 5 ) {
832  ALIUtils::dump3v( centreGlob(), "OPTO: CENTRE GLOB ");
833  ALIUtils::dumprm( rmGlob(), "OPTO: RM GLOB ");
834  }*/
835 
836  //---------- Set extra entry values
837  std::vector<ALIdouble>::const_iterator vdcite;
838  for (vdcite = ExtraEntryValueList().begin(); vdcite != ExtraEntryValueList().end(); ++vdcite) {
841  }
842  //- test();
843  if (ALIUtils::debug >= 6)
844  std::cout << " setOriginalEntryValues " << std::endl;
845 }
846 
847 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
848 //@@ Propagate the light ray with the behaviour 'behav'
849 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
851  //---------- see if light traverses or reflects
852  setMeas(&meas);
853  if (behav == " ") {
854  defaultBehaviour(lightray, meas);
855  } else if (behav == "D" || behav == "DD") {
856  detailedDeviatesLightRay(lightray);
857  } else if (behav == "T" || behav == "DT") {
858  detailedTraversesLightRay(lightray);
859  } else if (behav == "FD") {
860  fastDeviatesLightRay(lightray);
861  } else if (behav == "FT") {
862  fastTraversesLightRay(lightray);
863  } else if (behav == "M") {
864  makeMeasurement(lightray, meas);
865  } else {
866  userDefinedBehaviour(lightray, meas, behav);
867  }
868 }
869 
870 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
871 //@@ default behaviour (depends of subclass type). A default behaviour can be makeMeasurement(), therefore you have to pass 'meas'
872 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
874  std::cerr << "!!! Optical Object " << name() << " of type " << type() << " does not implement a default behaviour"
875  << std::endl;
876  std::cerr << " You have to specify some behaviour, like :D or :T or ..." << std::endl;
877  exit(1);
878 }
879 
880 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
881 //@@ Fast simulation of deviation of the light ray (reflection, shift, ...)
882 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
884  std::cerr << "!!! Optical Object " << name() << " of type " << type() << " does not implement deviation (:D)"
885  << std::endl;
886  std::cerr << " Please read documentation for this object type" << std::endl;
887  exit(1);
888 }
889 
890 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
891 //@@ Fast simulation of the light ray traversing
892 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
894  std::cerr << "!!! Optical Object " << name() << " of type " << type()
895  << " does not implement the light traversing (:T)" << std::endl;
896  std::cerr << " Please read documentation for this object type" << std::endl;
897  exit(1);
898 }
899 
900 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
901 //@@ Detailed simulation of deviation of the light ray (reflection, shift, ...)
902 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
904  std::cerr << "!!! Optical Object " << name() << " of type " << type()
905  << " does not implement detailed deviation (:DD / :D)" << std::endl;
906  std::cerr << " Please read documentation for this object type" << std::endl;
907  exit(1);
908 }
909 
910 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
911 //@@ Detailed simulation of the light ray traversing
912 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
914  std::cerr << "!!! Optical Object " << name() << " of type " << type()
915  << " does not implement detailed traversing of light ray (:DT / :T)" << std::endl;
916  std::cerr << " Please read documentation for this object type" << std::endl;
917  exit(1);
918 }
919 
920 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
921 //@@ Make the measurement
922 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
924  std::cerr << "!!! Optical Object " << name() << " of type " << type() << " does not implement making measurement (:M)"
925  << std::endl;
926  std::cerr << " Please read documentation for this object type" << std::endl;
927  exit(1);
928 }
929 
931  std::cerr << "!!! Optical Object " << name() << " of type " << type()
932  << " does not implement user defined behaviour = " << behav << std::endl;
933  std::cerr << " Please read documentation for this object type" << std::endl;
934  exit(1);
935 }
936 
937 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
938 //@@ Get one of the plates of an OptO
939 //@@
940 //@@ The point is defined taking the centre of the splitter,
941 //@@ and traslating it by +/-1/2 'width' in the direction of the splitter Z.
942 //@@ The normal of this plane is obtained as the splitter Z,
943 //@@ and then it is rotated with the global rotation matrix.
944 //@@ If applyWedge it is also rotated around the splitter X and Y axis by +/-1/2 of the wedge.
945 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
946 ALIPlane OpticalObject::getPlate(const ALIbool forwardPlate, const ALIbool applyWedge) {
947  if (ALIUtils::debug >= 4)
948  std::cout << "% LR: GET PLATE " << name() << " forward= " << forwardPlate << std::endl;
949  //---------- Get OptO variables
950  const ALIdouble width = (findExtraEntryValue("width"));
951 
952  //---------- Get centre and normal of plate
953  //----- Get plate normal before wedge (Z axis of OptO)
954  CLHEP::Hep3Vector ZAxis(0., 0., 1.);
955  CLHEP::HepRotation rmt = rmGlob();
956  CLHEP::Hep3Vector plate_normal = rmt * ZAxis;
957 
958  //----- plate centre = OptO centre +/- 1/2 width before wedge
959  CLHEP::Hep3Vector plate_point = centreGlob();
960  //--- Add to it half of the width following the direction of the plate normal. -1/2 if it is forward plate, +1/2 if it is backward plate
961  ALIdouble normal_sign = -forwardPlate * 2 + 1;
962  plate_point += normal_sign * width / 2. * plate_normal;
963  //- if (ALIUtils::debug >= 4) std::cout << "width = " << width <<std::endl;
964  if (ALIUtils::debug >= 3) {
965  ALIUtils::dump3v(plate_point, "plate_point");
966  ALIUtils::dump3v(plate_normal, "plate_normal before wedge");
967  ALIUtils::dumprm(rmt, "rmt before wedge");
968  }
969 
970  if (applyWedge) {
971  ALIdouble wedge;
972  wedge = findExtraEntryValue("wedge");
973  if (wedge != 0.) {
974  //---------- Rotate plate normal by 1/2 wedge angles
975  CLHEP::Hep3Vector XAxis(1., 0., 0.);
976  XAxis = rmt * XAxis;
977  plate_normal.rotate(normal_sign * wedge / 2., XAxis);
978  if (ALIUtils::debug >= 3)
979  ALIUtils::dump3v(plate_normal, "plate_normal after wedgeX ");
980  if (ALIUtils::debug >= 4)
981  ALIUtils::dump3v(XAxis, "X Axis for applying wedge ");
982  CLHEP::Hep3Vector YAxis(0., 1., 0.);
983  YAxis = rmt * YAxis;
984  plate_normal.rotate(normal_sign * wedge / 2., YAxis);
985  if (ALIUtils::debug >= 3)
986  ALIUtils::dump3v(plate_normal, "plate_normal after wedgeY ");
987  if (ALIUtils::debug >= 4)
988  ALIUtils::dump3v(YAxis, "Y Axis for applying wedge ");
989  }
990  }
991 
992  //---------- Return plate plane
993  return ALIPlane(plate_point, plate_normal);
994 }
995 
996 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
997 //@@ Displace the centre coordinate 'coor' to get the derivative
998 //@@ of a measurement w.r.t this entry
999 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1001  if (ALIUtils::debug >= 5)
1002  std::cout << name() << " displaceCentreGlob: coor " << coor << " disp = " << disp << std::endl;
1003 
1005  CLHEP::Hep3Vector dispVec = getDispVec(coor, disp);
1006  theCentreGlob += dispVec;
1007 
1008  //----------- Displace CentreGlob() of every component
1009  std::vector<OpticalObject*> vopto;
1010  ALIbool igetood = Model::getComponentOptOs(name(), vopto);
1011  if (!igetood) {
1012  // std::cout << " NO MORE COMPONENTS IN THIS OptO" << name() << std::endl ;
1013  return;
1014  }
1015  std::vector<OpticalObject*>::const_iterator vocite;
1016  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1017  (*vocite)->displaceCentreGlob(dispVec);
1018  }
1019 }
1020 
1021 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1022 CLHEP::Hep3Vector OpticalObject::getDisplacementInLocalCoordinates(const XYZcoor coor, const ALIdouble disp) {
1023  CLHEP::Hep3Vector dispVec;
1024  switch (coor) {
1025  case 0:
1026  dispVec = CLHEP::Hep3Vector(disp, 0., 0.);
1027  break;
1028  case 1:
1029  dispVec = CLHEP::Hep3Vector(0., disp, 0.);
1030  break;
1031  case 2:
1032  dispVec = CLHEP::Hep3Vector(0., 0., disp);
1033  break;
1034  default:
1035  std::cerr << "!!! DISPLACECENTREGLOB coordinate should be 0-2, not " << coor << std::endl;
1036  exit(2);
1037  }
1038 
1039  return dispVec;
1040 }
1041 
1042 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1043 //@@ Displace the centre coordinate 'coor' to get the derivative
1044 //@@ of a measurement w.r.t this entry
1045 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1046 void OpticalObject::displaceCentreGlob(const CLHEP::Hep3Vector& dispVec) {
1047  if (ALIUtils::debug >= 5)
1048  std::cout << name() << " displaceCentreGlob: dispVec = " << dispVec << std::endl;
1049 
1051  theCentreGlob += dispVec;
1052 
1053  //----------- Displace CentreGlob() of every component
1054  std::vector<OpticalObject*> vopto;
1055  ALIbool igetood = Model::getComponentOptOs(name(), vopto);
1056  if (!igetood) {
1057  return;
1058  }
1059  std::vector<OpticalObject*>::const_iterator vocite;
1060  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1061  (*vocite)->displaceCentreGlob(dispVec);
1062  }
1063 }
1064 
1065 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1066 //@@ displaceExtraEntry:
1067 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1068 void OpticalObject::displaceExtraEntry(const ALIuint entryNo, const ALIdouble disp) {
1069  ALIdouble Pentry_orig_value = *(theExtraEntryValueOriginalVector.begin() + entryNo);
1070  ALIdouble Pentry_value = (Pentry_orig_value) + disp;
1071  LogDebug("OpticalObject::displaceExtraEntry")
1072  << " displaceExtraEntry " << Pentry_value << " <> " << Pentry_orig_value << std::endl;
1073  theExtraEntryValueVector[entryNo] = Pentry_value;
1074 }
1075 
1076 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1078  theExtraEntryValueVector[entryNo] = val;
1079 }
1080 
1081 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1083  if (ALIUtils::debug >= 4)
1084  std::cout << "@@ OpticalObject::displaceCentreGloboriginal " << name() << " " << coor << " " << disp << std::endl;
1085  if (ALIUtils::debug >= 5)
1086  ALIUtils::dump3v(theCentreGlobOriginal, "the centre glob original 0");
1087  CLHEP::Hep3Vector dispVec = getDispVec(coor, disp);
1088  theCentreGlobOriginal += dispVec;
1089 
1090  if (ALIUtils::debug >= 5)
1091  ALIUtils::dump3v(theCentreGlobOriginal, "the centre glob original displaced");
1092 
1093  //----------- Displace CentreGlob() of every component
1094  std::vector<OpticalObject*> vopto;
1095  Model::getComponentOptOs(name(), vopto);
1096  std::vector<OpticalObject*>::const_iterator vocite;
1097  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1098  (*vocite)->displaceCentreGlobOriginal(dispVec);
1099  }
1100 }
1101 
1102 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1103 //@@ displaceCentreGlobOriginal:
1104 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1105 void OpticalObject::displaceCentreGlobOriginal(const CLHEP::Hep3Vector& dispVec) {
1106  if (ALIUtils::debug >= 4)
1107  std::cout << " OpticalObject::displaceCentreGloboriginal " << name() << " dispVec " << dispVec << std::endl;
1108 
1109  theCentreGlobOriginal += dispVec;
1110 
1111  if (ALIUtils::debug >= 5)
1112  ALIUtils::dump3v(theCentreGlobOriginal, "the centre glob original");
1113 
1114  //----------- Displace CentreGlob() of every component
1115  std::vector<OpticalObject*> vopto;
1116  Model::getComponentOptOs(name(), vopto);
1117  std::vector<OpticalObject*>::const_iterator vocite;
1118  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1119  (*vocite)->displaceCentreGlobOriginal(dispVec);
1120  }
1121 }
1122 
1123 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1125  if (ALIUtils::debug >= 4)
1126  std::cout << "@@ OpticalObject::displaceCentreGloboriginal " << name() << " " << coor << " " << disp << std::endl;
1127  if (ALIUtils::debug >= 5)
1128  ALIUtils::dump3v(theCentreGlobOriginalOriginal, "the centre glob originalOriginal 0");
1129  CLHEP::Hep3Vector dispVec = getDispVec(coor, disp);
1130  theCentreGlobOriginalOriginal += dispVec;
1131 
1132  if (ALIUtils::debug >= 5)
1133  ALIUtils::dump3v(theCentreGlobOriginalOriginal, "the centre glob original displaced");
1134 
1135  //----------- Displace CentreGlob() of every component
1136  std::vector<OpticalObject*> vopto;
1137  Model::getComponentOptOs(name(), vopto);
1138  std::vector<OpticalObject*>::const_iterator vocite;
1139  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1140  (*vocite)->displaceCentreGlobOriginalOriginal(dispVec);
1141  }
1142 }
1143 
1144 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1145 //@@ displaceCentreGlobOriginal:
1146 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1147 void OpticalObject::displaceCentreGlobOriginalOriginal(const CLHEP::Hep3Vector& dispVec) {
1148  if (ALIUtils::debug >= 4)
1149  std::cout << " OpticalObject::displaceCentreGloboriginal " << name() << " dispVec " << dispVec << std::endl;
1150 
1151  theCentreGlobOriginalOriginal += dispVec;
1152 
1153  if (ALIUtils::debug >= 5)
1154  ALIUtils::dump3v(theCentreGlobOriginalOriginal, "the centre glob original");
1155 
1156  //----------- Displace CentreGlob() of every component
1157  std::vector<OpticalObject*> vopto;
1158  Model::getComponentOptOs(name(), vopto);
1159  std::vector<OpticalObject*>::const_iterator vocite;
1160  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1161  (*vocite)->displaceCentreGlobOriginalOriginal(dispVec);
1162  }
1163 }
1164 
1165 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1166 //@@ Rotate around axis 'coor' to get the derivative of
1167 //@@ a measurement w.r.t this entry
1168 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1170  const XYZcoor coor,
1171  const ALIdouble disp) {
1172  if (ALIUtils::debug >= 5)
1173  std::cout << name() << "DISPLACERMGLOBAROUNDGLOBAL" << coor << "disp" << disp << std::endl;
1174  //-------------------- Rotate rotation matrix
1177  if (ALIUtils::debug >= 5) {
1178  std::cout << this->name() << std::endl;
1179  ALIUtils::dumprm(theRmGlob, "before disp rm ");
1180  }
1181  rotateItAroundGlobal(theRmGlob, coor, disp);
1182  if (ALIUtils::debug >= 5) {
1183  ALIUtils::dumprm(theRmGlob, "after disp rm ");
1184  }
1185  //-------------------- Rotation translate the centre of component OptO
1186  if (ALIUtils::debug >= 5)
1187  ALIUtils::dump3v(centreGlob(), " centre_glob before rotation");
1188  if (ALIUtils::debug >= 5)
1189  ALIUtils::dump3v(centreGlobOriginal(), " centreGlobOriginal before rotation");
1190  if (opto1stRotated != this) { //own _centre_glob is not displaced
1191  //---------- Distance to 1st rotated OptO
1192  CLHEP::Hep3Vector radiusOriginal = centreGlobOriginal() - opto1stRotated->centreGlobOriginal();
1193  CLHEP::Hep3Vector radius_rotated = radiusOriginal;
1194  rotateItAroundGlobal(radius_rotated, coor, disp);
1195  theCentreGlob = centreGlobOriginal() + (radius_rotated - radiusOriginal);
1196  if (ALIUtils::debug >= 5)
1197  ALIUtils::dump3v(centreGlob(), " centre_glob after rotation");
1198  if (ALIUtils::debug >= 5)
1199  ALIUtils::dump3v(centreGlobOriginal(), " centre_globOriginal() after rotation");
1200  }
1201 
1202  //----------- Displace every component
1203  std::vector<OpticalObject*> vopto;
1204  Model::getComponentOptOs(name(), vopto);
1205  std::vector<OpticalObject*>::const_iterator vocite;
1206  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1207  (*vocite)->displaceRmGlobAroundGlobal(opto1stRotated, coor, disp);
1208  }
1209 }
1210 
1211 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1212 //@@ Rotate around axis 'coor' to get the derivative of
1213 //@@ a measurement w.r.t this entry
1214 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1215 void OpticalObject::displaceRmGlobAroundLocal(OpticalObject* opto1stRotated, const XYZcoor coor, const ALIdouble disp) {
1216  if (anglesIsGlobal) {
1217  std::cerr << "!!!FATAL ERROR: angles in global coordinates not supported momentarily if 'rotateAroundGlobal' is "
1218  "set as a Global Option "
1219  << std::endl;
1220  abort();
1221  }
1222 
1223  if (ALIUtils::debug >= 5)
1224  std::cout << name() << " DISPLACE_RMGLOB_AROUND_LOCAL " << coor << " disp " << disp << std::endl;
1225  //---------- Build the rmGlob and centreGlob again, with displacement values
1226  //----- Local rotation is build with entry values plus displacement
1227  theRmGlob = CLHEP::HepRotation();
1228  //---------- Set global rotation matrix
1229  //-------- Get rm from Entries
1230  if (coor == XCoor) {
1231  theRmGlob.rotateX(getEntryRMangle(XCoor) + disp);
1232  if (ALIUtils::debug >= 5)
1233  std::cout << " rmglob rotated around x " << getEntryRMangle(XCoor) + disp << std::endl;
1234  } else {
1235  theRmGlob.rotateX(getEntryRMangle(XCoor));
1236  }
1237  if (ALIUtils::debug >= 4) {
1238  ALIUtils::dumprm(theRmGlob, "displaceRmGlobAroundLocal: rm local after X ");
1239  }
1240 
1241  //- std::cout << name() << " " << coor << " " << XCoor << " getEntryRMangle(coor) )" << getEntryRMangle(coor) << std::endl;
1242  if (coor == YCoor) {
1243  theRmGlob.rotateY(getEntryRMangle(YCoor) + disp);
1244  if (ALIUtils::debug >= 5)
1245  std::cout << " rmglob rotated around y " << getEntryRMangle(YCoor) + disp << std::endl;
1246  } else {
1247  theRmGlob.rotateY(getEntryRMangle(YCoor));
1248  }
1249  if (ALIUtils::debug >= 4) {
1250  std::cout << " getEntryRMangle(YCoor) " << getEntryRMangle(YCoor) << std::endl;
1251  ALIUtils::dumprm(theRmGlob, "displaceRmGlobAroundLocal: rm local after Y ");
1252  }
1253 
1254  if (coor == ZCoor) {
1255  theRmGlob.rotateZ(getEntryRMangle(ZCoor) + disp);
1256  if (ALIUtils::debug >= 5)
1257  std::cout << " rmglob rotated around z " << getEntryRMangle(ZCoor) + disp << std::endl;
1258  } else {
1259  theRmGlob.rotateZ(getEntryRMangle(ZCoor));
1260  }
1261  if (ALIUtils::debug >= 4) {
1262  std::cout << " getEntryRMangle(ZCoor) " << getEntryRMangle(ZCoor) << std::endl;
1263  ALIUtils::dumprm(theRmGlob, "SetRMLocalFromEntryValues: RM ");
1264  }
1265 
1266  //- theCentreGlob = CLHEP::Hep3Vector(0.,0.,0.);
1267  if (ALIUtils::debug >= 5 && disp != 0) {
1268  std::cout << this->name() << std::endl;
1269  ALIUtils::dumprm(theRmGlob, "displaceRmGlobAroundLocal: rm local ");
1270  }
1271 
1272  if (!anglesIsGlobal) {
1274  }
1275 
1276  //----- calculate local rot axis with new rm glob
1278 
1279  //- theCentreGlob = CLHEP::Hep3Vector(0.,0.,0.);
1280  if (ALIUtils::debug >= 5 && disp != 0) {
1281  std::cout << this->name() << std::endl;
1282  ALIUtils::dumprm(theRmGlob, "displaceRmGlobAroundLocal: rm global ");
1283  }
1284 
1285  if (opto1stRotated != this) { //own _centre_glob doesn't rotate
1286  setGlobalCentre();
1287  if (ALIUtils::debug >= 5) {
1288  ALIUtils::dump3v(centreGlob(), " centre_glob after rotation");
1289  ALIUtils::dump3v(centreGlobOriginal(), " centre_globOriginal() after rotation");
1290  }
1291  }
1292 
1293  //----------- Displace every component
1294  std::vector<OpticalObject*> vopto;
1295  Model::getComponentOptOs(name(), vopto);
1296  std::vector<OpticalObject*>::const_iterator vocite;
1297  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1298  (*vocite)->displaceRmGlobAroundLocal(opto1stRotated, coor, 0.);
1299  //for aroundglobal all components are explicitly rotated disp, for aroundLocal, they will be rotated automatically if the parent is rotated, as the rmGlob is built from scratch
1300  }
1301 }
1302 
1303 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1305  // Calculate the displaced centreGlob and rmGlob of components
1306  std::vector<OpticalObject*> vopto;
1307  Model::getComponentOptOs(name(), vopto);
1308  std::vector<OpticalObject*>::const_iterator vocite;
1309  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1310  (*vocite)->setGlobalCoordinates();
1311  }
1312 }
1313 
1314 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1316  const XYZcoor coor,
1317  const ALIdouble disp) {
1318  if (ALIUtils::debug >= 9)
1319  std::cout << name() << " DISPLACEORIGRMGLOB " << coor << " disp " << disp << std::endl;
1321  if (gomgr->GlobalOptions()["rotateAroundLocal"] == 0) {
1322  //-------------------- Rotate rotation matrix
1323  if (ALIUtils::debug >= 5)
1324  ALIUtils::dumprm(theRmGlobOriginal, name() + ALIstring(" theRmGlobOriginal before displaced "));
1325  switch (coor) {
1326  case 0:
1327  theRmGlobOriginal.rotateX(disp);
1328  break;
1329  case 1:
1330  theRmGlobOriginal.rotateY(disp);
1331  break;
1332  case 2:
1333  theRmGlobOriginal.rotateZ(disp);
1334  break;
1335  default:
1336  std::cerr << "!!! DISPLACERMGLOB coordinate should be 0-2, not " << coor << std::endl;
1337  exit(2);
1338  }
1339 
1340  //-------------------- Rotation translate the centre of component OptO
1341  if (ALIUtils::debug >= 98)
1342  ALIUtils::dump3v(centreGlob(), "angles rotate centre_glob");
1343  if (ALIUtils::debug >= 98)
1344  ALIUtils::dump3v(centreGlobOriginal(), " centreGlobOriginal");
1345  if (opto1stRotated != this) { //own _centre_glob doesn't rotate
1346  //---------- Distance to 1st rotated OptO
1347  CLHEP::Hep3Vector radiusOriginal = centreGlobOriginal() - opto1stRotated->centreGlobOriginal();
1348  CLHEP::Hep3Vector radius_rotated = radiusOriginal;
1349  switch (coor) {
1350  case 0:
1351  radius_rotated.rotateX(disp);
1352  break;
1353  case 1:
1354  radius_rotated.rotateY(disp);
1355  break;
1356  case 2:
1357  radius_rotated.rotateZ(disp);
1358  break;
1359  default:
1360  break; // already exited in previous switch
1361  }
1362  theCentreGlobOriginal = centreGlobOriginal() + (radius_rotated - radiusOriginal);
1363  if (ALIUtils::debug >= 98)
1364  ALIUtils::dump3v(centreGlob(), "angle rotate centre_glob");
1365  if (ALIUtils::debug >= 98)
1366  ALIUtils::dump3v(centreGlobOriginal(), " centre_globOriginal()");
1367  }
1368 
1369  if (ALIUtils::debug >= 5)
1370  ALIUtils::dumprm(theRmGlobOriginal, name() + ALIstring(" theRmGlobOriginal displaced "));
1371 
1372  //----------- Displace every OptO component
1373  std::vector<OpticalObject*> vopto;
1374  Model::getComponentOptOs(name(), vopto);
1375  std::vector<OpticalObject*>::const_iterator vocite;
1376  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1377  (*vocite)->displaceRmGlobOriginal(opto1stRotated, coor, disp);
1378  }
1379 
1380  } else {
1384  //----------- Displace every OptO component
1385  std::vector<OpticalObject*> vopto;
1386  Model::getComponentOptOs(name(), vopto);
1387  std::vector<OpticalObject*>::const_iterator vocite;
1388  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1389  (*vocite)->displaceRmGlobOriginal(opto1stRotated, coor, disp);
1390  }
1391  if (ALIUtils::debug >= 5) {
1392  ALIUtils::dump3v(theCentreGlob, " displaceRmGlobOriginal ");
1393  ALIUtils::dumprm(theRmGlob, " displaceRmGlobOriginal ");
1394  }
1395  }
1396 }
1397 
1398 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1400  const XYZcoor coor,
1401  const ALIdouble disp) {
1402  if (ALIUtils::debug >= 9)
1403  std::cout << name() << " DISPLACEORIGRMGLOB " << coor << " disp " << disp << std::endl;
1405  if (gomgr->GlobalOptions()["rotateAroundLocal"] == 0) {
1406  //-------------------- Rotate rotation matrix
1407  if (ALIUtils::debug >= 5)
1408  ALIUtils::dumprm(theRmGlobOriginalOriginal, name() + ALIstring(" theRmGlobOriginalOriginal before displaced"));
1409  switch (coor) {
1410  case 0:
1411  theRmGlobOriginalOriginal.rotateX(disp);
1412  break;
1413  case 1:
1414  theRmGlobOriginalOriginal.rotateY(disp);
1415  break;
1416  case 2:
1417  theRmGlobOriginalOriginal.rotateZ(disp);
1418  break;
1419  default:
1420  std::cerr << "!!! DISPLACERMGLOB coordinate should be 0-2, not " << coor << std::endl;
1421  exit(2);
1422  }
1423 
1424  //-------------------- Rotation translate the centre of component OptO
1425  if (ALIUtils::debug >= 98)
1426  ALIUtils::dump3v(centreGlob(), "angles rotate centre_glob");
1427  if (ALIUtils::debug >= 98)
1428  ALIUtils::dump3v(centreGlobOriginalOriginal(), " centreGlobOriginalOriginal");
1429  if (opto1stRotated != this) { //own _centre_glob doesn't rotate
1430  //---------- Distance to 1st rotated OptO
1431  CLHEP::Hep3Vector radiusOriginalOriginal =
1433  CLHEP::Hep3Vector radius_rotated = radiusOriginalOriginal;
1434  switch (coor) {
1435  case 0:
1436  radius_rotated.rotateX(disp);
1437  break;
1438  case 1:
1439  radius_rotated.rotateY(disp);
1440  break;
1441  case 2:
1442  radius_rotated.rotateZ(disp);
1443  break;
1444  default:
1445  break; // already exited in previous switch
1446  }
1447  theCentreGlobOriginalOriginal = centreGlobOriginalOriginal() + (radius_rotated - radiusOriginalOriginal);
1448  if (ALIUtils::debug >= 98)
1449  ALIUtils::dump3v(centreGlob(), "angle rotate centre_glob");
1450  if (ALIUtils::debug >= 98)
1451  ALIUtils::dump3v(centreGlobOriginalOriginal(), " centre_globOriginalOriginal()");
1452  }
1453 
1454  if (ALIUtils::debug >= 5)
1455  ALIUtils::dumprm(theRmGlobOriginalOriginal, name() + ALIstring(" theRmGlobOriginalOriginal displaced "));
1456 
1457  //----------- Displace every OptO component
1458  std::vector<OpticalObject*> vopto;
1459  Model::getComponentOptOs(name(), vopto);
1460  std::vector<OpticalObject*>::const_iterator vocite;
1461  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1462  (*vocite)->displaceRmGlobOriginalOriginal(opto1stRotated, coor, disp);
1463  }
1464 
1465  } else {
1469  //----------- Displace every OptO component
1470  std::vector<OpticalObject*> vopto;
1471  Model::getComponentOptOs(name(), vopto);
1472  std::vector<OpticalObject*>::const_iterator vocite;
1473  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1474  (*vocite)->displaceRmGlobOriginalOriginal(opto1stRotated, coor, disp);
1475  }
1476  if (ALIUtils::debug >= 5) {
1477  ALIUtils::dump3v(theCentreGlob, " displaceRmGlobOriginalOriginal ");
1478  ALIUtils::dumprm(theRmGlob, " displaceRmGlobOriginalOriginal ");
1479  }
1480  }
1481 }
1482 
1483 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1485  ALIdouble Pentry_orig_value = *(theExtraEntryValueOriginalVector.begin() + entryNo);
1486  Pentry_orig_value += disp;
1487  // std::cout << " displaceExtraEntryOriginal " << *(theExtraEntryValueOriginalVector.begin() + entryNo) << " + " << disp << std::endl;
1488  theExtraEntryValueOriginalVector[entryNo] = Pentry_orig_value;
1489 }
1490 
1491 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1493  ALIdouble Pentry_orig_value = *(theExtraEntryValueOriginalOriginalVector.begin() + entryNo);
1494  Pentry_orig_value += disp;
1495  // std::cout << " displaceExtraEntryOriginalOriginal " << *(theExtraEntryValueOriginalOriginalVector.begin() + entryNo) << " + " << disp << std::endl;
1496  theExtraEntryValueOriginalOriginalVector[entryNo] = Pentry_orig_value;
1497 }
1498 
1499 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1500 const ALIint OpticalObject::extraEntryNo(const ALIstring& entry_name) const {
1501  //- std::cout << ExtraEntryList().size() << "entry name " << entry_name << std::endl;
1502 
1503  std::vector<Entry*>::const_iterator vecite;
1504  for (vecite = ExtraEntryList().begin(); vecite != ExtraEntryList().end(); ++vecite) {
1505  //- std::cout <<"in entryno" << (*vecite)->name() << entry_name << std::endl;
1506  if ((*vecite)->name() == entry_name) {
1507  return (vecite - ExtraEntryList().begin());
1508  }
1509  //- std::cout <<"DD in entryno" << (*vecite)->name() << entry_name << std::endl;
1510  }
1511  //- std::cout << "!!: extra entry name not found: " << entry_name << " in OptO " << name() << std::endl;
1512  // exit(2);
1513  return ALIint(-1);
1514 }
1515 
1516 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1517 //@@ Find an extra Entry by name and return its value. If entry not found, return 0.
1518 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1520  ALIdouble retval;
1521  const ALIint entryNo = extraEntryNo(eename);
1522  if (entryNo >= 0) {
1523  const ALIdouble Pentry_value = *(theExtraEntryValueVector.begin() + entryNo);
1524  retval = (Pentry_value);
1525  } else {
1526  // if(ALIUtils::debug >= 0) std::cerr << "!!Warning: entry not found; " << eename << ", in object " << name() << " returns 0. " << std::endl;
1527  ALIdouble check;
1529  gomgr->getGlobalOptionValue("check_extra_entries", check);
1530  if (check == 1) {
1531  // if( check <= 1) {//exit temporarily
1532  std::cerr << "!!OpticalObject:ERROR: entry not found; " << eename << ", in object " << name() << std::endl;
1533  exit(1);
1534  } else {
1535  //- std::cerr << "!!temporal WARNING in OpticalObject::findExtraEntryValue: entry not found; " << eename << ", in object " << name() << std::endl;
1536  retval = 0.;
1537  }
1538  }
1539 
1540  if (ALIUtils::debug >= 5)
1541  std::cout << " OpticalObject::findExtraEntryValue: " << eename << " = " << retval << std::endl;
1542  return retval;
1543 }
1544 
1545 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1546 //@@ Find an extra Entry by name and return its value. If entry not found, stop.
1547 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1550  const ALIint entryNo = extraEntryNo(eename);
1551  if (entryNo < 0) {
1552  std::cerr << "!!OpticalObject::findExtraEntryValueMustExist: ERROR: entry not found; " << eename << ", in object "
1553  << name() << std::endl;
1554  exit(1);
1555  }
1556  // if(ALIUtils::debug >= 5) std::cout << " OpticalObject::findExtraEntryValueMustExist: " << eename << " = " << entry << std::endl;
1557  return entry;
1558 }
1559 
1560 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1561 //@@ Find an extra Entry by name and pass its value. Return if entry is found or not
1562 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1564  value = findExtraEntryValue(eename);
1565  const ALIint entryNo = extraEntryNo(eename);
1566  //- std::cout << eename << " entryNo " << entryNo << " value " << value << std::endl;
1567  return (entryNo >= 0);
1568 }
1569 
1570 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1571 //@@ resetGlobalCoordinates: Reset Global Coordinates (after derivative is finished)
1572 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1574  //---------- Reset centre and rm
1577 
1578  //---------- Reset extra entries
1579  //---------- Set extra entry values list
1580  std::vector<ALIdouble>::iterator vdite;
1581  std::vector<ALIdouble>::const_iterator vdcite_o = ExtraEntryValueOriginalList().begin();
1582  for (vdite = ExtraEntryValueList().begin(); vdite != ExtraEntryValueList().end(); ++vdite, ++vdcite_o) {
1583  (*vdite) = (*vdcite_o);
1584  }
1585 
1586  //----------- Reset entries of every component
1587  std::vector<OpticalObject*> vopto;
1588  Model::getComponentOptOs(name(), vopto);
1589  std::vector<OpticalObject*>::const_iterator vocite;
1590  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1591  (*vocite)->resetGlobalCoordinates();
1592  }
1593 
1595 }
1596 
1597 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1598 //@@ resetGlobalCoordinates: Reset Global Coordinates (after derivative is finished)
1599 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1601  // std::cout << " !!! CALLING resetOriginalOriginalCoordinates(). STOP " << std::endl;
1602 
1603  //---------- Reset centre and rm
1608 
1609  //---------- Reset extra entry values list
1610  std::vector<ALIdouble>::iterator vdite;
1611  std::vector<ALIdouble>::iterator vdite_o = theExtraEntryValueOriginalVector.begin();
1612  std::vector<ALIdouble>::const_iterator vdcite_oo = theExtraEntryValueOriginalOriginalVector.begin();
1613  std::vector<Entry*>::const_iterator vdciteE = ExtraEntryList().begin();
1614  for (vdite = ExtraEntryValueList().begin(); vdite != ExtraEntryValueList().end();
1615  ++vdite, ++vdite_o, ++vdcite_oo, ++vdciteE) {
1616  (*vdite) = (*vdcite_oo);
1617  (*vdite_o) = (*vdcite_oo);
1618  (*vdciteE)->addFittedDisplacementToValue(-(*vdciteE)->valueDisplacementByFitting());
1619  // std::cout << " resetting extra entry origorig " << (*vdciteE)->name() << " = " << (*vdite) << " ? " << (*vdcite_oo) << std::endl;
1620  // std::cout << " resetting extra entry origorig " << (*vdciteE)->name() << " = " << (*vdite) << " ? " << (*vdciteE)->value() << std::endl;
1621  // std::cout << " check extra entry " << (*vdciteE)->value() << " =? " << (*vdite) << std::endl;
1622  }
1623 
1624  /* std::vector< Entry* >::iterator eite;
1625  for( eite = theCoordinateEntryVector.begin(); eite != theCoordinateEntryVector.end(); eite++ ){
1626  (*eite)->addFittedDisplacementToValue( - (*eite)->valueDisplacementByFitting() );
1627  }
1628  */
1629 
1631 
1632  //----------- Reset entries of every component
1633  std::vector<OpticalObject*> vopto;
1634  Model::getComponentOptOs(name(), vopto);
1635  std::vector<OpticalObject*>::const_iterator vocite;
1636  for (vocite = vopto.begin(); vocite != vopto.end(); ++vocite) {
1637  (*vocite)->resetOriginalOriginalCoordinates();
1638  }
1639 }
1640 
1641 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1642 //@@ Destructor
1643 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1645 
1646 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1647 //@@ Return the name of the OptO without its path
1648 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1650  ALIint last_slash = name().rfind('/');
1651  ALIstring sname = name().substr(last_slash + 1, name().size() - 1);
1652  if (last_slash == -1) { //object of type "system"
1653  sname = name();
1654  } else {
1655  sname = name().substr(last_slash + 1, name().size() - 1);
1656  }
1657  return sname;
1658 }
1659 
1660 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1661 std::ostream& operator<<(std::ostream& os, const OpticalObject& c) {
1662  os << "OPTICALOBJECT: " << c.theName << " of type: " << c.theType << " " << c.theCentreGlob << c.theRmGlob
1663  << std::endl;
1664 
1665  return os;
1666 }
1667 
1668 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1669 const CLHEP::HepRotation OpticalObject::rmLocal() const {
1670  CLHEP::HepRotation rm;
1671  rm.rotateX(theCoordinateEntryVector[3]->value());
1672  rm.rotateY(theCoordinateEntryVector[4]->value());
1673  rm.rotateZ(theCoordinateEntryVector[5]->value());
1674 
1675  return rm;
1676 }
1677 
1678 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1679 std::vector<double> OpticalObject::getLocalRotationAngles(const std::vector<Entry*>& entries) const {
1680  return getRotationAnglesInOptOFrame(theParent, entries);
1681 }
1682 
1683 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1684 std::vector<double> OpticalObject::getRotationAnglesInOptOFrame(const OpticalObject* optoAncestor,
1685  const std::vector<Entry*>& entries) const {
1686  const CLHEP::HepRotation& rmParent = optoAncestor->rmGlob(); //ORIGINAL ?????????????????
1687  CLHEP::HepRotation rmLocal = rmParent.inverse() * theRmGlob;
1688 
1689  //I was using theRmGlobOriginal, assuming it has been set to theRmGlob already, check it, in case it may have other consequences
1690  if (theRmGlobOriginal != theRmGlob) {
1691  std::cerr << " !!!FATAL ERROR: OpticalObject::getRotationAnglesInOptOFrame theRmGlobOriginal != theRmGlob "
1692  << std::endl;
1693  ALIUtils::dumprm(theRmGlobOriginal, " theRmGlobOriginal ");
1694  ALIUtils::dumprm(theRmGlob, " theRmGlob ");
1695  exit(1);
1696  }
1697 
1698  if (ALIUtils::debug >= 5) {
1699  std::cout << " OpticalObject::getRotationAnglesInOptOFrame " << name() << " optoAncestor " << optoAncestor->name()
1700  << std::endl;
1701  ALIUtils::dumprm(rmParent, " rm parent ");
1702  ALIUtils::dumprm(rmLocal, " rm local ");
1703  ALIUtils::dumprm(theRmGlobOriginal, " theRmGlobOriginal ");
1704  ALIUtils::dumprm(theRmGlob, " theRmGlob ");
1705  }
1706  return getRotationAnglesFromMatrix(rmLocal, entries);
1707 }
1708 
1709 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1710 std::vector<double> OpticalObject::getRotationAnglesFromMatrix(CLHEP::HepRotation& rmLocal,
1711  const std::vector<Entry*>& entries) const {
1712  std::vector<double> newang(3);
1713  double angleX = entries[3]->value() + entries[3]->valueDisplacementByFitting();
1714  double angleY = entries[4]->value() + entries[4]->valueDisplacementByFitting();
1715  double angleZ = entries[5]->value() + entries[5]->valueDisplacementByFitting();
1716  if (ALIUtils::debug >= 5) {
1717  std::cout << " angles as value entries: X= " << angleX << " Y= " << angleY << " Z " << angleZ << std::endl;
1718  }
1719  return ALIUtils::getRotationAnglesFromMatrix(rmLocal, angleX, angleY, angleZ);
1720 }
1721 
1722 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1724  axisXLocalInGlobal = CLHEP::Hep3Vector(1., 0., 0.);
1726  axisYLocalInGlobal = CLHEP::Hep3Vector(0., 1., 0.);
1728  axisZLocalInGlobal = CLHEP::Hep3Vector(0., 0., 1.);
1730  if (ALIUtils::debug >= 4) {
1731  std::cout << name() << " axis X local in global " << axisXLocalInGlobal << std::endl;
1732  std::cout << name() << " axis Y local in global " << axisYLocalInGlobal << std::endl;
1733  std::cout << name() << " axis Z local in global " << axisZLocalInGlobal << std::endl;
1734  }
1735 }
1736 
1737 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1738 template <class T>
1739 void OpticalObject::rotateItAroundGlobal(T& object, const XYZcoor coor, const double disp) {
1740  switch (coor) {
1741  case 0:
1742  object.rotateX(disp);
1743  break;
1744  case 1:
1745  object.rotateY(disp);
1746  break;
1747  case 2:
1748  object.rotateZ(disp);
1749  break;
1750  }
1751  // CLHEP::Hep3Vector axisToRotate = GetAxisForDisplacement( coor );
1752  // object.rotate(disp, axisToRotate);
1753  if (ALIUtils::debug >= 5)
1754  std::cout << " rotateItAroundGlobal coor " << coor << " disp " << disp << std::endl;
1755 }
1756 
1757 /*
1758 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1759 CLHEP::Hep3Vector OpticalObject::GetAxisForDisplacement( const XYZcoor coor )
1760 {
1761  CLHEP::Hep3Vector axis;
1762  if(Model::GlobalOptions()["rotateAroundLocal"] == 0) {
1763  switch (coor) {
1764  case 0:
1765  axis = CLHEP::Hep3Vector( 1., 0., 0. );
1766  break;
1767  case 1:
1768  axis = CLHEP::Hep3Vector( 0., 1., 0. );
1769  break;
1770  case 2:
1771  axis = CLHEP::Hep3Vector( 0., 0., 1. );
1772  break;
1773  default:
1774  break; // already exited in previous switch
1775  }
1776  } else {
1777  switch (coor) {
1778  case 0:
1779  if( ALIUtils::debug >= 5 ) std::cout << coor << "rotate local " << axisXLocalInGlobal << std::endl;
1780  axis = axisXLocalInGlobal;
1781  break;
1782  case 1:
1783  if( ALIUtils::debug >= 5 ) std::cout << coor << "rotate local " << axisLocalInGlobal << std::endl;
1784  axis = axisYLocalInGlobal;
1785  break;
1786  case 2:
1787  if( ALIUtils::debug >= 5 ) std::cout << coor << "rotate local " << axisZLocalInGlobal << std::endl;
1788  axis = axisZLocalInGlobal;
1789  break;
1790  default:
1791  break; // already exited in previous switch
1792  }
1793  }
1794 
1795  return axis;
1796 }
1797 */
1798 
1799 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1800 double OpticalObject::diff2pi(double ang1, double ang2) {
1801  double diff = fabs(ang1 - ang2);
1802  diff = diff - int(diff / 2. / M_PI) * 2 * M_PI;
1803  return diff;
1804 }
1805 
1806 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1807 bool OpticalObject::eq2ang(double ang1, double ang2) {
1808  bool beq = true;
1809 
1810  double diff = diff2pi(ang1, ang2);
1811  if (diff > 0.00001) {
1812  if (fabs(diff - 2 * M_PI) > 0.00001) {
1813  //- std::cout << " diff " << diff << " " << ang1 << " " << ang2 << std::endl;
1814  beq = false;
1815  }
1816  }
1817 
1818  return beq;
1819 }
1820 
1821 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1823  double precision = 1.e-9;
1824  if (fabs(val) < precision)
1825  val = 0;
1826  return val;
1827 }
1828 
1829 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1830 double OpticalObject::addPii(double val) {
1831  if (val < M_PI) {
1832  val += M_PI;
1833  } else {
1834  val -= M_PI;
1835  }
1836 
1837  return val;
1838 }
1839 
1840 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1841 int OpticalObject::checkMatrixEquations(double angleX, double angleY, double angleZ, CLHEP::HepRotation* rot) {
1842  //- std::cout << " cme " << angleX << " " << angleY << " " << angleZ << std::endl;
1843  if (rot == nullptr) {
1844  rot = new CLHEP::HepRotation();
1845  rot->rotateX(angleX);
1846  rot->rotateY(angleY);
1847  rot->rotateZ(angleZ);
1848  }
1849  double sx = sin(angleX);
1850  double cx = cos(angleX);
1851  double sy = sin(angleY);
1852  double cy = cos(angleY);
1853  double sz = sin(angleZ);
1854  double cz = cos(angleZ);
1855 
1856  double rotxx = cy * cz;
1857  double rotxy = sx * sy * cz - cx * sz;
1858  double rotxz = cx * sy * cz + sx * sz;
1859  double rotyx = cy * sz;
1860  double rotyy = sx * sy * sz + cx * cz;
1861  double rotyz = cx * sy * sz - sx * cz;
1862  double rotzx = -sy;
1863  double rotzy = sx * cy;
1864  double rotzz = cx * cy;
1865 
1866  int matrixElemBad = 0;
1867  if (!eq2ang(rot->xx(), rotxx)) {
1868  std::cerr << " EQUATION for xx() IS BAD " << rot->xx() << " <> " << rotxx << std::endl;
1869  matrixElemBad++;
1870  }
1871  if (!eq2ang(rot->xy(), rotxy)) {
1872  std::cerr << " EQUATION for xy() IS BAD " << rot->xy() << " <> " << rotxy << std::endl;
1873  matrixElemBad++;
1874  }
1875  if (!eq2ang(rot->xz(), rotxz)) {
1876  std::cerr << " EQUATION for xz() IS BAD " << rot->xz() << " <> " << rotxz << std::endl;
1877  matrixElemBad++;
1878  }
1879  if (!eq2ang(rot->yx(), rotyx)) {
1880  std::cerr << " EQUATION for yx() IS BAD " << rot->yx() << " <> " << rotyx << std::endl;
1881  matrixElemBad++;
1882  }
1883  if (!eq2ang(rot->yy(), rotyy)) {
1884  std::cerr << " EQUATION for yy() IS BAD " << rot->yy() << " <> " << rotyy << std::endl;
1885  matrixElemBad++;
1886  }
1887  if (!eq2ang(rot->yz(), rotyz)) {
1888  std::cerr << " EQUATION for yz() IS BAD " << rot->yz() << " <> " << rotyz << std::endl;
1889  matrixElemBad++;
1890  }
1891  if (!eq2ang(rot->zx(), rotzx)) {
1892  std::cerr << " EQUATION for zx() IS BAD " << rot->zx() << " <> " << rotzx << std::endl;
1893  matrixElemBad++;
1894  }
1895  if (!eq2ang(rot->zy(), rotzy)) {
1896  std::cerr << " EQUATION for zy() IS BAD " << rot->zy() << " <> " << rotzy << std::endl;
1897  matrixElemBad++;
1898  }
1899  if (!eq2ang(rot->zz(), rotzz)) {
1900  std::cerr << " EQUATION for zz() IS BAD " << rot->zz() << " <> " << rotzz << std::endl;
1901  matrixElemBad++;
1902  }
1903 
1904  //- std::cout << " cme: matrixElemBad " << matrixElemBad << std::endl;
1905  return matrixElemBad;
1906 }
1907 
1908 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1909 CLHEP::Hep3Vector OpticalObject::getDispVec(const XYZcoor coor, const ALIdouble disp) {
1910  CLHEP::Hep3Vector dispVec;
1911  switch (coor) {
1912  case 0:
1913  dispVec = CLHEP::Hep3Vector(disp, 0., 0.);
1914  break;
1915  case 1:
1916  dispVec = CLHEP::Hep3Vector(0., disp, 0.);
1917  break;
1918  case 2:
1919  dispVec = CLHEP::Hep3Vector(0., 0., disp);
1920  break;
1921  default:
1922  break; // already exited in previous switch
1923  }
1924  //- CLHEP::Hep3Vector dispVec = getDisplacementInLocalCoordinates( coor, disp);
1925  if (ALIUtils::debug >= 5) {
1926  ALIUtils::dump3v(dispVec, " dispVec in local ");
1927  CLHEP::HepRotation rmt = parent()->rmGlob();
1928  ALIUtils::dumprm(rmt, "parent rmGlob ");
1929  }
1930  dispVec = parent()->rmGlob() * dispVec;
1931  if (ALIUtils::debug >= 5)
1932  ALIUtils::dump3v(dispVec, " dispVec in global ");
1933 
1934  return dispVec;
1935 }
1936 
1937 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1938 const CLHEP::Hep3Vector OpticalObject::centreLocal() const {
1939  CLHEP::Hep3Vector cLocal = theCentreGlob - parent()->centreGlob();
1940  CLHEP::HepRotation rmParentInv = inverseOf(parent()->rmGlob());
1941  cLocal = rmParentInv * cLocal;
1942 
1943  return cLocal;
1944  /*-
1945 
1946  if( theCoordinateEntryVector.size() >= 3 ) {
1947  return CLHEP::Hep3Vector( theCoordinateEntryVector[0]->value(), theCoordinateEntryVector[1]->value(), theCoordinateEntryVector[2]->value() );
1948  } else {
1949  return CLHEP::Hep3Vector(0.,0.,0.);
1950  }
1951  */
1952 }
1953 
1954 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1955 const double OpticalObject::getEntryCentre(const XYZcoor coor) const {
1956  Entry* ce = theCoordinateEntryVector[coor];
1957  // std::cout << coor << " getEntryCentre " << ce->value() << " + " << ce->valueDisplacementByFitting() << std::endl;
1958  return ce->value() + ce->valueDisplacementByFitting();
1959 }
1960 
1961 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1962 const double OpticalObject::getEntryCentre(const ALIstring& coorstr) const {
1963  XYZcoor coor = XCoor;
1964  if (coorstr == "X") {
1965  coor = XCoor;
1966  } else if (coorstr == "Y") {
1967  coor = YCoor;
1968  } else if (coorstr == "Z") {
1969  coor = ZCoor;
1970  }
1971  Entry* ce = theCoordinateEntryVector[coor];
1972  // std::cout << coor << " getEntryCentre " << ce->value() << " + " << ce->valueDisplacementByFitting() << std::endl;
1973  return ce->value() + ce->valueDisplacementByFitting();
1974 }
1975 
1976 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1977 const double OpticalObject::getEntryRMangle(const XYZcoor coor) const {
1978  Entry* ce = theCoordinateEntryVector[coor + 3];
1979  // std::cout << coor << " getEntryRMangle " << ce->value() << " + " << ce->valueDisplacementByFitting() << " size = " << theCoordinateEntryVector.size() << " ce = " << ce << " entry name " << ce->name() << " opto name " << name() << std::endl;
1980 
1981  return ce->value() + ce->valueDisplacementByFitting();
1982 }
1983 
1984 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1985 const double OpticalObject::getEntryRMangle(const ALIstring& coorstr) const {
1986  XYZcoor coor = XCoor;
1987  if (coorstr == "X") {
1988  coor = XCoor;
1989  } else if (coorstr == "Y") {
1990  coor = YCoor;
1991  } else if (coorstr == "Z") {
1992  coor = ZCoor;
1993  }
1994  Entry* ce = theCoordinateEntryVector[coor + 3];
1995  // std::cout << coor << " getEntryRMangle " << ce->value() << " + " << ce->valueDisplacementByFitting() << " size = " << theCoordinateEntryVector.size() << " ce = " << ce << " entry name " << ce->name() << " opto name " << name() << std::endl;
1996 
1997  return ce->value() + ce->valueDisplacementByFitting();
1998 }
1999 
2000 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2002  theMaterial = new CocoaMaterialElementary("Hydrogen", 70.8 * mg / cm3, "H", 1.00794f, 1);
2003 }
2004 
2005 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2007  ALIdouble go;
2009  gomgr->getGlobalOptionValue("VisScale", go);
2010 
2012  "Box", go * 5. * cm / m, go * 5. * cm / m, go * 5. * cm / m); //COCOA internal units are meters
2013 }
2014 
2015 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2017  if (theParent != nullptr) { //----- OptO 'system' has no parent (and no affine frame)
2018  //---------- Build Data
2019  //---------- See if there are extra entries and read them
2020  std::vector<OpticalAlignParam> exEnt = oaInfo.extraEntries_;
2021  std::vector<OpticalAlignParam>::iterator ite;
2022  std::vector<ALIstring> wordlist;
2023  for (ite = exEnt.begin(); ite != exEnt.end(); ++ite) {
2024  wordlist = getCoordinateFromOptAlignParam(*ite);
2025  wordlist.insert(wordlist.begin(), (*ite).dimType());
2026  fillExtraEntry(wordlist);
2027  }
2028 
2029  //--------- set centre and angles not global (default behaviour)
2030  centreIsGlobal = false;
2031  anglesIsGlobal = false;
2032 
2033  setCmsswID(oaInfo.ID_);
2034  //--------- build Coordinates
2041 
2042  //---------- Set global coordinates
2044 
2045  //---------- Set original entry values
2047  }
2048 
2049  //---------- Construct material
2051 
2052  //---------- Construct solid shape
2054 
2055  if (ALIUtils::debug >= 5) {
2056  std::cout << "constructFromOptAligInfo constructed: " << *this << std::endl;
2057  }
2058 
2059  //---------- Create the OptO that compose this one
2061 }
2062 
2063 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2065  char chartmp[20];
2066  std::vector<ALIstring> wordlist;
2067  wordlist.push_back(oaParam.name());
2068  gcvt(oaParam.value(), 10, chartmp);
2069  wordlist.push_back(chartmp);
2070  gcvt(oaParam.sigma(), 10, chartmp);
2071  wordlist.push_back(chartmp);
2072  if (oaParam.quality() == 0) {
2073  wordlist.push_back("fix");
2074  } else if (oaParam.quality() == 1) {
2075  wordlist.push_back("cal");
2076  } else if (oaParam.quality() == 2) {
2077  wordlist.push_back("unk");
2078  }
2079 
2080  if (ALIUtils::debug >= 5) {
2081  ALIUtils::dumpVS(wordlist, " getCoordinateFromOptAlignParam " + oaParam.name());
2082  }
2083 
2084  return wordlist;
2085 }
2086 
2087 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
2089  //----- Build children list of this object
2090  std::vector<OpticalAlignInfo> children;
2091 
2092  std::vector<OpticalAlignInfo>::const_iterator ite;
2093  if (ALIUtils::debug >= 5) {
2094  std::cout << " Model::getOpticalAlignments().size " << Model::getOpticalAlignments().size() << std::endl;
2095  }
2096  // for( ite = Model::getOpticalAlignments().begin(); ite != Model::getOpticalAlignments().end(); ite++ ){
2097  int siz = Model::getOpticalAlignments().size();
2098  for (int ii = 0; ii < siz; ii++) {
2099  // std::cout << " OpticalObject::getComponentOptOsFromOptAlignInfo name " << (*ite).name_ << std::endl;
2100  // std::cout << " OpticalObject::getComponentOptOsFromOptAlignInfo " << (*ite).parentName_ << " =? " << theName << std::endl;
2101  // std::cout << " OpticalObject::getComponentOptOsFromOptAlignInfo name " << ii << std::endl;
2102  // if( (*ite)parentName_. == oaInfo.name() && (*ite).name() != "simple2DWithMirror:mirror1" ) {
2103  if (Model::getOpticalAlignments()[ii].parentName_ == theName) {
2104  // if( (*ite).parentName_ == theName ) {
2105 
2106  // std::cout << "createComponentOptOsFromOptAlignInfo: 1 to push_back " << std::endl;
2107  std::vector<OpticalAlignParam> exent = Model::getOpticalAlignments()[ii].extraEntries_;
2108  // std::vector<OpticalAlignParam> exent = (*ite).extraEntries_;
2109  //- std::cout << "createComponentOptOsFromOptAlignInfo: 2 to push_back " << std::endl;
2110  /* for( ALIuint ij = 0; ij < exent.size(); ij++ ){
2111  std::cout << " extra entry " << exent[ij].name_;
2112  std::cout << " extra entry " << exent[ij].dimType();
2113  std::cout << " extra entry " << exent[ij].value_;
2114  std::cout << " extra entry " << exent[ij].error_;
2115  std::cout << " extra entry " << exent[ij].quality_;
2116  } */
2117  // std::cout << "createComponentOptOsFromOptAlignInfo: 3 to push_back " << Model::getOpticalAlignments()[ii] << std::endl;
2119  // OpticalAlignInfo oaInfochild = *ite;
2120  // std::cout << "createComponentOptOsFromOptAlignInfo: 4 to push_back " << std::endl;
2121  children.push_back(oaInfochild);
2122  if (ALIUtils::debug >= 5) {
2123  std::cout << theName << "createComponentOptOsFromOptAlignInfo: children added " << oaInfochild.name_
2124  << std::endl;
2125  }
2126  }
2127  // std::cout << "createComponentOptOsFromOptAlignInfo: 6 push_backed " << std::endl;
2128  }
2129  // std::cout << "createComponentOptOsFromOptAlignInfo: 10 push_backed " << std::endl;
2130 
2131  if (ALIUtils::debug >= 5) {
2132  std::cout << "OpticalObject::createComponentsFromAlignInfo: N components = " << children.size() << std::endl;
2133  }
2134  for (ite = children.begin(); ite != children.end(); ++ite) {
2135  //---------- Get component type
2136  ALIstring optoType = (*ite).type_;
2137  //- //---------- Get composite component name
2138  //- ALIstring optoName = name()+"/"+(*ite).name_;
2139  //---------- Get component name
2140  ALIstring optoName = (*ite).name_;
2141  ALIbool fcopyComponents = false;
2142 
2143  //---------- Create OpticalObject of the corresponding type
2144  OpticalObject* OptOcomponent = createNewOptO(this, optoType, optoName, fcopyComponents);
2145 
2146  //---------- Construct it (read data and
2147  OptOcomponent->constructFromOptAligInfo(*ite);
2148 
2149  //---------- Fill OptO tree and OptO list
2150  Model::OptOList().push_back(OptOcomponent);
2151  }
2152 }
const double getEntryRMangle(const XYZcoor coor) const
void fillCoordinateEntry(const ALIstring &coor_name, const std::vector< ALIstring > &wordlist)
void setGlobalRMOriginalOriginal(const CLHEP::HepRotation &rmoriori)
std::vector< ALIdouble > theExtraEntryValueVector
static ALIbool getComponentOptOs(const ALIstring &opto_name, std::vector< OpticalObject * > &vcomponents)
--— Get from theOptOList the list of pointers to component OptOs
Definition: Model.cc:697
ALIbool anglesIsGlobal
void setMeas(Measurement *meas)
set current measurement
long double ALIdouble
Definition: CocoaGlobals.h:11
void resetGlobalCoordinates()
double approxTo0(double val)
void transformCylindrical2Cartesian()
CLHEP::HepRotation theRmGlob
const edm::EventSetup & c
CLHEP::HepRotation buildRmFromEntryValuesOriginalOriginal()
int quality() const
void displaceExtraEntryOriginal(const ALIuint entryNo, const ALIdouble disp)
static ALIFileIn & getInstance(const ALIstring &name)
Definition: ALIFileIn.cc:22
ALIstring theName
void setID(ALIuint id)
Definition: OpticalObject.h:99
virtual void defaultBehaviour(LightRay &lightray, Measurement &meas)
CocoaSolidShape * theSolidShape
void SetCentreLocalFromEntryValues()
void setOptOCurrent(OpticalObject *opto)
Definition: Entry.h:82
OpticalAlignParam x_
virtual void fastDeviatesLightRay(LightRay &lightray)
const ALIdouble findExtraEntryValueMustExist(const ALIstring &eename) const
virtual void userDefinedBehaviour(LightRay &lightray, Measurement &meas, const ALIstring &behav)
void addExtraEntryToList(Entry *entry)
Definition: Entry.h:18
ALIdouble valueDisplacementByFitting() const
Definition: Entry.h:63
static std::vector< double > getRotationAnglesFromMatrix(const CLHEP::HepRotation &rmLocal, double origAngleX, double origAngleY, double origAngleZ)
Definition: ALIUtils.cc:549
OpticalObject * createNewOptO(OpticalObject *parent, ALIstring optoType, ALIstring optoName, ALIbool fcopyComponents)
std::string name() const
const CLHEP::HepRotation rmLocal() const
void displaceCentreGlobOriginal(const XYZcoor coor, const ALIdouble disp)
void displaceRmGlobOriginalOriginal(const OpticalObject *opto1stRotated, const XYZcoor coor, const ALIdouble disp)
static std::vector< OpticalObject * > & OptOList()
Definition: Model.h:84
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
static void dumprm(const CLHEP::HepRotation &rm, const std::string &msg, std::ostream &out=std::cout)
Definition: ALIUtils.cc:71
ALIdouble value() const
Definition: Entry.h:53
const ALIbool findExtraEntryValueIfExists(const ALIstring &eename, ALIdouble &value) const
int ALIint
Definition: CocoaGlobals.h:15
std::vector< ALIdouble > theExtraEntryValueOriginalOriginalVector
static ALIint debug
Definition: ALIUtils.h:34
static ALIstring & SDFName()
the name of the System Description File
Definition: Model.h:93
void displaceCentreGlobOriginalOriginal(const XYZcoor coor, const ALIdouble disp)
static OpticalObject * nextOptOToCopy()
Definition: Model.cc:788
CLHEP::HepRotation theRmGlobOriginalOriginal
static GlobalOptionMgr * getInstance()
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:167
double sigma() const
int ii
Definition: cuy.py:589
virtual void makeMeasurement(LightRay &lightray, Measurement &meas)
void addExtraEntryValueToList(ALIdouble entry_value)
const std::vector< Entry * > & CoordinateEntryList() const
Definition: OpticalObject.h:63
std::vector< double > getRotationAnglesInOptOFrame(const OpticalObject *optoAncestor, const std::vector< Entry * > &entries) const
const std::vector< ALIdouble > & ExtraEntryValueOriginalList()
Definition: OpticalObject.h:69
XYZcoor
Definition: OpticalObject.h:33
static OpticalObjectMgr * getInstance()
Get the only instance.
const CLHEP::HepRotation & rmGlob() const
Definition: OpticalObject.h:83
void displaceRmGlobAroundGlobal(OpticalObject *opto1stRotated, const XYZcoor coor, const ALIdouble disp)
void setOriginalEntryValues()
static std::vector< OpticalAlignInfo > getOpticalAlignments()
Definition: Model.h:137
void setGlobalCoordinatesOfComponents()
bool eq2ang(double ang1, double ang2)
void addExtraEntryValueOriginalToList(ALIdouble entry_value)
int getGlobalOptionValue(const ALIstring &sstr, ALIdouble &val)
--— Search a string in theGlobalOptions and return 1 if found
OpticalAlignParam angx_
bool ALIbool
Definition: CocoaGlobals.h:19
const CLHEP::HepRotation & rmGlobOriginalOriginal() const
Definition: OpticalObject.h:88
void setExtraEntryValue(const ALIuint entryNo, const ALIdouble disp)
std::vector< double > getLocalRotationAngles(const std::vector< Entry * > &entries) const
OpticalAlignParam y_
void calculateLocalRotationAxisInGlobal()
const CLHEP::Hep3Vector centreLocal() const
void displaceRmGlobAroundLocal(OpticalObject *opto1stRotated, const XYZcoor coor, const ALIdouble disp)
void readData(ALIFileIn &filein)
CLHEP::Hep3Vector theCentreGlobOriginal
virtual ALIdouble SigmaDimensionFactor() const
Definition: Entry.h:36
double value() const
void displaceCentreGlob(const XYZcoor coor, const ALIdouble disp)
const OpticalObject * parent() const
Definition: OpticalObject.h:60
virtual void constructSolidShape()
void setAnglesNull()
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
double addPii(double val)
const CLHEP::Hep3Vector & centreGlobOriginal() const
Definition: OpticalObject.h:81
void registerMe(OpticalObject *opto)
void SetRMGlobFromRMLocal()
CLHEP::HepRotation theRmGlobOriginal
void rotateItAroundGlobal(T &object, const XYZcoor coor, const double disp)
void displaceRmGlobOriginal(const OpticalObject *opto1stRotated, const XYZcoor coor, const ALIdouble disp)
CLHEP::Hep3Vector theCentreGlobOriginalOriginal
const ALIdouble findExtraEntryValue(const ALIstring &eename) const
ALIstring theType
CLHEP::Hep3Vector getDisplacementInLocalCoordinates(const XYZcoor coor, const ALIdouble disp)
virtual void fastTraversesLightRay(LightRay &lightray)
void displaceExtraEntryOriginalOriginal(const ALIuint entryNo, const ALIdouble disp)
const ALIstring longName() const
void fillNull()
Definition: Entry.cc:235
OpticalAlignParam angz_
static ALIbool createCopyComponentList(const ALIstring &optoname)
**************** FOR COPYING AN OPTO
Definition: Model.cc:742
void addExtraEntryValueOriginalOriginalToList(ALIdouble entry_value)
#define M_PI
void fill(const std::vector< ALIstring > &wordlist)
Definition: Entry.cc:31
std::vector< ALIdouble > theExtraEntryValueOriginalVector
std::vector< ALIstring > getCoordinateFromOptAlignParam(const OpticalAlignParam &oaParam)
const ALIstring & name() const
Definition: Entry.h:50
virtual void fillExtraEntry(std::vector< ALIstring > &wordlist)
void setCmsswID(ALIuint id)
Definition: OpticalObject.h:98
const CLHEP::HepRotation & rmGlobOriginal() const
Definition: OpticalObject.h:87
void readCoordinates(const ALIstring &coor_type_read, const ALIstring &coor_type_expected, ALIFileIn &filein)
std::vector< Entry * > theCoordinateEntryVector
ALIint getWordsInLine(std::vector< ALIstring > &wl)
Definition: ALIFileIn.cc:74
const double getEntryCentre(const XYZcoor coor) const
void resetOriginalOriginalCoordinates()
static ALIbool getComponentOptOTypes(const ALIstring &opto_type, std::vector< ALIstring > &vcomponents)
--— Get from theOptODictionary the list of component OptO types
Definition: Model.cc:666
OpticalAlignParam z_
OpticalObject * theParent
void ErrorInLine()
Definition: ALIFileIn.cc:196
CLHEP::Hep3Vector axisYLocalInGlobal
static void dump3v(const CLHEP::Hep3Vector &vec, const std::string &msg)
Definition: ALIUtils.cc:58
static void addEntryToList(Entry *entry)
***************** SET DATA MEMBERS
Definition: Model.h:140
CocoaMaterialElementary * theMaterial
void buildWordList(const Entry *entry, std::vector< ALIstring > &wordlist)
const ALIint extraEntryNo(const ALIstring &entry_name) const
std::vector< OpticalAlignParam > extraEntries_
static EntryMgr * getInstance()
Definition: EntryMgr.cc:16
ALIbool fcopyData
void propagateGlobalRMOriginalOriginalChangeToChildren(const CLHEP::HepRotation &rmorioriold, const CLHEP::HepRotation &rmoriorinew)
const CLHEP::Hep3Vector & centreGlobOriginalOriginal() const
Definition: OpticalObject.h:82
static void dumpVS(const std::vector< ALIstring > &wl, const std::string &msg, std::ostream &outs=std::cout)
dumps a vector of strings with a message to outs
Definition: ALIUtils.cc:465
void setGlobalCentre()
virtual ~OpticalObject()
void SetCentreGlobFromCentreLocal()
std::map< ALIstring, ALIdouble, std::less< ALIstring > > & GlobalOptions()
const CLHEP::Hep3Vector & centreGlob() const
Definition: OpticalObject.h:75
OpticalAlignParam angy_
ALIPlane getPlate(const ALIbool forwardPlate, const ALIbool applyWedge)
ALIbool centreIsGlobal
void displaceExtraEntry(const ALIuint entryNo, const ALIdouble disp)
std::vector< ALIdouble > & ExtraEntryValueList()
Definition: OpticalObject.h:67
virtual void detailedDeviatesLightRay(LightRay &lightray)
const ALIstring shortName() const
ALIint quality() const
Definition: Entry.h:57
virtual ALIdouble ValueDimensionFactor() const
Definition: Entry.h:35
CLHEP::Hep3Vector getDispVec(const XYZcoor coor, const ALIdouble disp)
void transformSpherical2Cartesian()
std::string ALIstring
Definition: CocoaGlobals.h:9
void SetRMLocalFromEntryValues()
int checkMatrixEquations(double angleX, double angleY, double angleZ, CLHEP::HepRotation *rot=nullptr)
void constructFromOptAligInfo(const OpticalAlignInfo &oaInfo)
list entry
Definition: mps_splice.py:68
double diff2pi(double ang1, double ang2)
virtual void participateInMeasurement(LightRay &lightray, Measurement &meas, const ALIstring &behav)
CLHEP::Hep3Vector axisXLocalInGlobal
std::vector< double > getRotationAnglesFromMatrix(CLHEP::HepRotation &rmLocal, const std::vector< Entry * > &entries) const
static ALIdouble AngleValueDimensionFactor()
Definition: ALIUtils.h:64
tuple cout
Definition: gather_cfg.py:144
void readExtraEntries(ALIFileIn &filein)
def rm
Definition: eostools.py:363
const ALIstring & name() const
Definition: OpticalObject.h:58
OpticalObject * OptOCurrent() const
Definition: Entry.h:59
void createComponentOptOs(ALIFileIn &filein)
virtual void detailedTraversesLightRay(LightRay &lightray)
static int getInt(const ALIstring &str)
Convert a string to an integer, checking that it is really an integer.
Definition: ALIUtils.cc:384
virtual void fillName(const ALIstring &name)
Definition: Entry.cc:230
void createComponentOptOsFromOptAlignInfo()
void SetRMGlobFromRMLocalOriginalOriginal(const CLHEP::HepRotation &rmoriori)
long double T
virtual void constructMaterial()
CLHEP::Hep3Vector theCentreGlob
void addCoordinateEntryToList(Entry *entry)
const std::vector< Entry * > & ExtraEntryList() const
Definition: OpticalObject.h:65
tuple size
Write out results.
void setGlobalCoordinates()
CLHEP::Hep3Vector axisZLocalInGlobal
static ALIdouble LengthValueDimensionFactor()
Definition: ALIUtils.h:62
unsigned int ID_
unsigned int ALIuint
Definition: CocoaGlobals.h:17
#define LogDebug(id)
const ALIstring & type() const
Definition: OpticalObject.h:59
ALIdouble sigma() const
Definition: Entry.h:55