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