CMS 3D CMS Logo

OptOModifiedRhomboidPrism.cc
Go to the documentation of this file.
1 // COCOA class implementation file
2 //Id: OptOMOdifiedRhomboidPrism.cc
3 //CAT: Model
4 //
5 // History: v0.9 Dec 1999
6 // Pedro Arce
7 
12 #include <iostream>
13 #include <iomanip>
14 #ifdef COCOA_VIS
15 #include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
16 #include "Alignment/CocoaVisMgr/interface/ALIColour.h"
17 #endif
20 
21 using namespace CLHEP;
22 
23 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
24 //@@ Detailed simulation of Reflection in Plate Splitter
25 //@@ The software gets the plane of reflection as the forward splitter plane
26 //@@ Then the beam is reflected in this plane.
27 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
29 {
30  if (ALIUtils::debug >= 2) std::cout << "$$$$$ LR: DETAILED DEVIATION IN MODIFIED RHOMBOID PRISM " << name() << std::endl;
31 
32  CLHEP::Hep3Vector XAxis(1.,0.,0.);
33  CLHEP::HepRotation rmt = rmGlob();
34  XAxis = rmt*XAxis;
35  CLHEP::Hep3Vector YAxis(0.,1.,0.);
36  YAxis = rmt*YAxis;
37  CLHEP::Hep3Vector ZAxis(0.,0.,1.);
38  ZAxis = rmt*ZAxis;
39 
40  ALIUtils::dump3v( XAxis , " x axis ");
41  ALIUtils::dump3v( YAxis , " y axis ");
42  ALIUtils::dump3v( ZAxis , " z axis ");
43  if (ALIUtils::debug >= 5) {
44  ALIUtils::dump3v( centreGlob(), " centre ");
45  }
46 
47  if (ALIUtils::debug >= 2) std::cout << "$$$ LR: REFRACTION IN FORWARD PLATE " << std::endl;
48  //---------- Get forward plate
49  ALIPlane plate = getPlate( true, true );
50  //---------- Refract in plate while entering
51  ALIdouble refra_ind1 = 1.;
52  ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
53  lightray.refract( plate, refra_ind1, refra_ind2 );
54  if (ALIUtils::debug >= 2) {
55  lightray.dumpData("LightRay after Refraction at entering: ");
56  }
57 
58  if (ALIUtils::debug >= 2) std::cout << std::endl << "$$$ LR: REFLECTION IN FIRST PLATE " << std::endl;
59  //---------- Get up plate rotated
60  plate = getRotatedPlate( true );
61  //---------- Reflect in plate
62  lightray.reflect( plate );
63 
64  if (ALIUtils::debug >= 2) std::cout << std::endl << "$$$ LR: REFLECTION IN SECOND PLATE " << std::endl;
65  //---------- Get up plate rotated
66  plate = getRotatedPlate( false );
67  //---------- Reflect in plate
68  lightray.reflect( plate );
69 
70  if (ALIUtils::debug >= 2) std::cout << std::endl << "$$$ LR: REFRACTION IN BACKWARD PLATE " << std::endl;
71  //---------- Get backward plate
72  plate = getPlate( false, true );
73  //---------- Refract in plate while exiting
74  lightray.refract( plate, refra_ind2, refra_ind1 );
75 
76 }
77 
78 
79 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
80 //@@ Detailed simulation of the light ray traversing
81 //@@ The beam enters the prism, is refracted, traverses the prism and finally is again refracted when it exits:
82 //@@ Get the intersection with the forward prism plane
83 //@@ Refract the beam and propagate until it intersects the backward plane.
84 //@@ Finally the beam is refracted again.
85 //@@
86 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
88 {
89  if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
90 
91  //---------- Get forward plate
92  ALIPlane plate = getPlate(true, true);
93  //---------- Refract while entering splitter
94  ALIdouble refra_ind1 = 1.;
95  ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
96  lightray.refract( plate, refra_ind1, refra_ind2 );
97  if (ALIUtils::debug >= 2) {
98  lightray.dumpData("Refracted in first plate");
99  }
100 
101  //---------- Get back ward plate (of triangular piiece)
102  plate = getPlate(true, false);
103  //---------- Refract while exiting prism
104  lightray.refract( plate, refra_ind2, refra_ind1 );
105  if (ALIUtils::debug >= 2) {
106  lightray.dumpData("Refracted in first plate");
107  }
108 
109 }
110 
111 
112 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
113 //@@ Fast simulation of deviation of the light ray:
114 //@@ Reflect in a Plate Splitter
115 //@@ The beam is reflected in the first plate of the plate splitter, which is obtained without applying the rotation by 'wedge'.
116 //@@ After the beam is reflected, it is rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
117 //@@
118 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
120 {
121  if (ALIUtils::debug >= 2) std::cout << "LR: FAST REFLECTION IN MODIFIED RHOMBOID PRISM " << name() << std::endl;
122 
123  //---------- Get backward plate
124  ALIPlane plate = getPlate(false, false);
125  //---------- Intersect with plate
126  lightray.intersect( plate );
127  if (ALIUtils::debug >= 2) {
128  lightray.dumpData("Intersected in plate");
129  }
130  //---------- Deviate Lightray
131  lightray.shiftAndDeviateWhileTraversing( this, 'R');
132  /* ALIdouble deviRX = findExtraEntryValue("deviRX");
133  ALIdouble deviRY = findExtraEntryValue("deviRY");
134  ALIdouble shiftRX = findExtraEntryValue("shiftRX");
135  ALIdouble shiftRY = findExtraEntryValue("shiftRY");
136  lightray.shiftAndDeviateWhileTraversing( this, shiftRX, shiftRY, deviRX, deviRY);
137  */
138 
139  if (ALIUtils::debug >= 2) {
140  // std::cout << " shiftRX " << shiftRX << " shiftRY " << shiftRY << std::endl;
141  // std::cout << " deviRX " << deviRX << " deviRY " << deviRY << std::endl;
142  lightray.dumpData("Deviated ");
143  }
144 
145 }
146 
147 
148 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
149 //@@ Fast simulation of the light ray traversing
150 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
151 //@@ Traverse Plane Parallel Plate
152 //@@ Traslated to the backward plate of the plate splitter
153 //@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY'
154 //@@ and rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
155 //@@
156 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
158 {
159  if (ALIUtils::debug >= 2) std::cout << "LR: FAST TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
160 
161  //---------- Get backward plate
162  ALIPlane plate = getPlate(false, false);
163  lightray.intersect( plate );
164  if (ALIUtils::debug >= 2) {
165  lightray.dumpData("Intersected with plate");
166  }
167  //---------- Shift and Deviate
168  lightray.shiftAndDeviateWhileTraversing( this, 'T');
169  /* ALIdouble shiftTX = findExtraEntryValue("shiftTX");
170  ALIdouble shiftTY = findExtraEntryValue("shiftTY");
171  ALIdouble deviTX = findExtraEntryValue("deviTX");
172  ALIdouble deviTY = findExtraEntryValue("deviTY");
173  lightray.shiftAndDeviateWhileTraversing( this, shiftTX, shiftTY, deviTX, deviTY);*/
174 
175  if (ALIUtils::debug >= 2) {
176  lightray.dumpData("Shifted and Deviated");
177  }
178 
179 }
180 
181 
182 
183 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
184 //@@ Get one of the rotated plates of an OptO
185 //@@
186 //@@ The point is defined taking the centre of the prism,
187 //@@ and traslating it by +/-1/2 'shift' in the direction of the splitter Z.
188 //@@ The normal of this plane is obtained as the splitter Z,
189 //@@ and then it is rotated around X by 'angle' and with the global rotation matrix.
190 //@@ It is also rotated around the splitter X and Y axis by +/-1/2 of the 'wedgeR'.
191 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
193 {
194  if (ALIUtils::debug >= 4) std::cout << "% LR: GET ROTATED PLATE " << name() << std::endl;
195  //---------- Get OptO variables
196  const ALIdouble shift = (findExtraEntryValue("shiftRY"));
197  ALIdouble wedgeR = findExtraEntryValue("wedgeR");
198 
199  //---------- Get centre of plate
200  //----- plate centre = OptO centre +/- 1/2 shift
201  CLHEP::Hep3Vector plate_point = centreGlob();
202  //--- Add to it half of the shift following the direction of the prism Y. -1/2 if it is forward plate, +1/2 if it is backward plate
203  ALIdouble normal_sign = -forwardPlate*2 + 1;
204  CLHEP::Hep3Vector YAxis(0.,1.,0.);
205  CLHEP::HepRotation rmt = rmGlob();
206  YAxis = rmt*YAxis;
207  plate_point += normal_sign * shift/2. * YAxis;
208 
209  //---------- Get normal of plate
210  //----- Plate normal before wedgeR (Z axis of OptO rotated 'angle' around X)
211  CLHEP::Hep3Vector ZAxis(0.,0.,1.);
212  ALIdouble anglePlanes;
213  ALIbool we = findExtraEntryValueIfExists("anglePlanes", anglePlanes);
214  if( !we ) {
215  anglePlanes = 45.*ALIUtils::deg;
216  }
217  ZAxis.rotateX( anglePlanes );
218 
219  //----- Rotate with global rotation matrix
220  CLHEP::Hep3Vector plate_normal = rmt*ZAxis;
221  if (ALIUtils::debug >= 3) {
222  ALIUtils::dump3v( plate_point, "plate_point");
223  ALIUtils::dump3v( plate_normal, "plate_normal before wedge");
224  ALIUtils::dumprm( rmt, "rmt before wedge angles" );
225  }
226 
227  //----- Rotate plate normal by 1/2 wedgeR angles
228  //--- Around X axis
229  CLHEP::Hep3Vector XAxis(0.,0.,1.);
230  XAxis = rmt*XAxis;
231  plate_normal.rotate( normal_sign * wedgeR/2., XAxis );
232  if (ALIUtils::debug >= 3) ALIUtils::dump3v( plate_normal, "plate_normal after wedgeR around X ");
233  //--- Around the axis obtained rotating the prism Y axis by 'anglePlanes' around the prism X axis
234  YAxis = CLHEP::Hep3Vector(0.,1.,0.);
235  YAxis.rotateX( anglePlanes );
236  YAxis = rmt*YAxis;
237  plate_normal.rotate( normal_sign * wedgeR/2., YAxis );
238  if (ALIUtils::debug >= 3) ALIUtils::dump3v( plate_normal, "plate_normal after wedgeR around Y ");
239 
240  //---------- Return plate plane
241  return ALIPlane(plate_point, plate_normal);
242 
243 }
244 
245 
246 
247 #ifdef COCOA_VIS
248 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
250 {
251  ALIColour* col = new ALIColour( 0., 0., 1., 0. );
253  ALIbool wexists = findExtraEntryValueIfExists("width",width);
254  if( !wexists ) width = 1.;
256  wexists = findExtraEntryValueIfExists("shift",shift);
257  if( !wexists ) shift = 4.;
258  std::vector<ALIdouble> spar;
259  spar.push_back(shift);
260  spar.push_back(shift);
261  spar.push_back(width);
262  spar.push_back(0.);
263  spar.push_back(45.);
264  spar.push_back(0.);
265  IgCocoaFileMgr::getInstance().addSolid( *this, "PARAL", spar, col);
266  //add a triangle
267  std::vector<ALIdouble> spar2;
268  spar2.push_back(width);
269  spar2.push_back(width);
270  spar2.push_back(0.);
271  spar2.push_back(width);
272  spar2.push_back(width);
273  IgCocoaFileMgr::getInstance().addSolid( *this, "TRD", spar2, col);
274 
275 }
276 
277 #endif
278 
279 
280 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
282 {
283  ALIdouble go;
285  gomgr->getGlobalOptionValue("VisScale", go );
286 
287  theSolidShape = new CocoaSolidShapeBox( "Box", go*5.*cm/m, go*5.*cm/m, go*5.*cm/m ); //COCOA internal units are meters
288 }
long double ALIdouble
Definition: CocoaGlobals.h:11
void detailedTraversesLightRay(LightRay &lightray) override
void fastDeviatesLightRay(LightRay &lightray) override
void shiftAndDeviateWhileTraversing(const OpticalObject *opto, char behav)
Definition: LightRay.cc:241
static void dumprm(const CLHEP::HepRotation &rm, const std::string &msg, std::ostream &out=std::cout)
Definition: ALIUtils.cc:77
void refract(const ALIPlane &plate, const ALIdouble refra_ind1, const ALIdouble refra_ind2)
Definition: LightRay.cc:163
static ALIint debug
Definition: ALIUtils.h:36
static GlobalOptionMgr * getInstance()
void fastTraversesLightRay(LightRay &lightray) override
int getGlobalOptionValue(const ALIstring &sstr, ALIdouble &val)
--— Search a string in theGlobalOptions and return 1 if found
bool ALIbool
Definition: CocoaGlobals.h:19
void detailedDeviatesLightRay(LightRay &lightray) override
ALIPlane getRotatedPlate(const ALIbool forwardPlate)
static ALIdouble deg
Definition: ALIUtils.h:37
static void dump3v(const CLHEP::Hep3Vector &vec, const std::string &msg)
Definition: ALIUtils.cc:61
void intersect(const ALIPlane &plane)
Definition: LightRay.cc:101
virtual void fillIguana()
Definition: OpticalObject.h:56
col
Definition: cuy.py:1010
static unsigned int const shift
void dumpData(const ALIstring &str) const
Definition: LightRay.cc:382
void reflect(const ALIPlane &plane)
Definition: LightRay.cc:142