CMS 3D CMS Logo

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