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  if (ALIUtils::debug >= 2)
30  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)
48  std::cout << "$$$ LR: REFRACTION IN FORWARD PLATE " << std::endl;
49  //---------- Get forward plate
50  ALIPlane plate = getPlate(true, true);
51  //---------- Refract in plate while entering
52  ALIdouble refra_ind1 = 1.;
53  ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
54  lightray.refract(plate, refra_ind1, refra_ind2);
55  if (ALIUtils::debug >= 2) {
56  lightray.dumpData("LightRay after Refraction at entering: ");
57  }
58 
59  if (ALIUtils::debug >= 2)
60  std::cout << std::endl << "$$$ LR: REFLECTION IN FIRST PLATE " << std::endl;
61  //---------- Get up plate rotated
62  plate = getRotatedPlate(true);
63  //---------- Reflect in plate
64  lightray.reflect(plate);
65 
66  if (ALIUtils::debug >= 2)
67  std::cout << std::endl << "$$$ LR: REFLECTION IN SECOND PLATE " << std::endl;
68  //---------- Get up plate rotated
69  plate = getRotatedPlate(false);
70  //---------- Reflect in plate
71  lightray.reflect(plate);
72 
73  if (ALIUtils::debug >= 2)
74  std::cout << std::endl << "$$$ LR: REFRACTION IN BACKWARD PLATE " << std::endl;
75  //---------- Get backward plate
76  plate = getPlate(false, true);
77  //---------- Refract in plate while exiting
78  lightray.refract(plate, refra_ind2, refra_ind1);
79 }
80 
81 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
82 //@@ Detailed simulation of the light ray traversing
83 //@@ The beam enters the prism, is refracted, traverses the prism and finally is again refracted when it exits:
84 //@@ Get the intersection with the forward prism plane
85 //@@ Refract the beam and propagate until it intersects the backward plane.
86 //@@ Finally the beam is refracted again.
87 //@@
88 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
90  if (ALIUtils::debug >= 2)
91  std::cout << "LR: DETAILED TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
92 
93  //---------- Get forward plate
94  ALIPlane plate = getPlate(true, true);
95  //---------- Refract while entering splitter
96  ALIdouble refra_ind1 = 1.;
97  ALIdouble refra_ind2 = findExtraEntryValueMustExist("refra_ind");
98  lightray.refract(plate, refra_ind1, refra_ind2);
99  if (ALIUtils::debug >= 2) {
100  lightray.dumpData("Refracted in first plate");
101  }
102 
103  //---------- Get back ward plate (of triangular piiece)
104  plate = getPlate(true, false);
105  //---------- Refract while exiting prism
106  lightray.refract(plate, refra_ind2, refra_ind1);
107  if (ALIUtils::debug >= 2) {
108  lightray.dumpData("Refracted in first plate");
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  if (ALIUtils::debug >= 2)
121  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 //@@ Fast simulation of the light ray traversing
148 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
149 //@@ Traverse Plane Parallel Plate
150 //@@ Traslated to the backward plate of the plate splitter
151 //@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY'
152 //@@ and rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
153 //@@
154 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
156  if (ALIUtils::debug >= 2)
157  std::cout << "LR: FAST TRAVERSE MODIFIED RHOMBOID PRISM " << name() << std::endl;
158 
159  //---------- Get backward plate
160  ALIPlane plate = getPlate(false, false);
161  lightray.intersect(plate);
162  if (ALIUtils::debug >= 2) {
163  lightray.dumpData("Intersected with plate");
164  }
165  //---------- Shift and Deviate
166  lightray.shiftAndDeviateWhileTraversing(this, 'T');
167  /* ALIdouble shiftTX = findExtraEntryValue("shiftTX");
168  ALIdouble shiftTY = findExtraEntryValue("shiftTY");
169  ALIdouble deviTX = findExtraEntryValue("deviTX");
170  ALIdouble deviTY = findExtraEntryValue("deviTY");
171  lightray.shiftAndDeviateWhileTraversing( this, shiftTX, shiftTY, deviTX, deviTY);*/
172 
173  if (ALIUtils::debug >= 2) {
174  lightray.dumpData("Shifted and Deviated");
175  }
176 }
177 
178 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
179 //@@ Get one of the rotated plates of an OptO
180 //@@
181 //@@ The point is defined taking the centre of the prism,
182 //@@ and traslating it by +/-1/2 'shift' in the direction of the splitter Z.
183 //@@ The normal of this plane is obtained as the splitter Z,
184 //@@ and then it is rotated around X by 'angle' and with the global rotation matrix.
185 //@@ It is also rotated around the splitter X and Y axis by +/-1/2 of the 'wedgeR'.
186 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
188  if (ALIUtils::debug >= 4)
189  std::cout << "% LR: GET ROTATED PLATE " << name() << std::endl;
190  //---------- Get OptO variables
191  const ALIdouble shift = (findExtraEntryValue("shiftRY"));
192  ALIdouble wedgeR = findExtraEntryValue("wedgeR");
193 
194  //---------- Get centre of plate
195  //----- plate centre = OptO centre +/- 1/2 shift
196  CLHEP::Hep3Vector plate_point = centreGlob();
197  //--- 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
198  ALIdouble normal_sign = -forwardPlate * 2 + 1;
199  CLHEP::Hep3Vector YAxis(0., 1., 0.);
200  CLHEP::HepRotation rmt = rmGlob();
201  YAxis = rmt * YAxis;
202  plate_point += normal_sign * shift / 2. * YAxis;
203 
204  //---------- Get normal of plate
205  //----- Plate normal before wedgeR (Z axis of OptO rotated 'angle' around X)
206  CLHEP::Hep3Vector ZAxis(0., 0., 1.);
207  ALIdouble anglePlanes;
208  ALIbool we = findExtraEntryValueIfExists("anglePlanes", anglePlanes);
209  if (!we) {
210  anglePlanes = 45. * ALIUtils::deg;
211  }
212  ZAxis.rotateX(anglePlanes);
213 
214  //----- Rotate with global rotation matrix
215  CLHEP::Hep3Vector plate_normal = rmt * ZAxis;
216  if (ALIUtils::debug >= 3) {
217  ALIUtils::dump3v(plate_point, "plate_point");
218  ALIUtils::dump3v(plate_normal, "plate_normal before wedge");
219  ALIUtils::dumprm(rmt, "rmt before wedge angles");
220  }
221 
222  //----- Rotate plate normal by 1/2 wedgeR angles
223  //--- Around X axis
224  CLHEP::Hep3Vector XAxis(0., 0., 1.);
225  XAxis = rmt * XAxis;
226  plate_normal.rotate(normal_sign * wedgeR / 2., XAxis);
227  if (ALIUtils::debug >= 3)
228  ALIUtils::dump3v(plate_normal, "plate_normal after wedgeR around X ");
229  //--- Around the axis obtained rotating the prism Y axis by 'anglePlanes' around the prism X axis
230  YAxis = CLHEP::Hep3Vector(0., 1., 0.);
231  YAxis.rotateX(anglePlanes);
232  YAxis = rmt * YAxis;
233  plate_normal.rotate(normal_sign * wedgeR / 2., YAxis);
234  if (ALIUtils::debug >= 3)
235  ALIUtils::dump3v(plate_normal, "plate_normal after wedgeR around Y ");
236 
237  //---------- Return plate plane
238  return ALIPlane(plate_point, plate_normal);
239 }
240 
241 #ifdef COCOA_VIS
242 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
244  ALIColour* col = new ALIColour(0., 0., 1., 0.);
246  ALIbool wexists = findExtraEntryValueIfExists("width", width);
247  if (!wexists)
248  width = 1.;
250  wexists = findExtraEntryValueIfExists("shift", shift);
251  if (!wexists)
252  shift = 4.;
253  std::vector<ALIdouble> spar;
254  spar.push_back(shift);
255  spar.push_back(shift);
256  spar.push_back(width);
257  spar.push_back(0.);
258  spar.push_back(45.);
259  spar.push_back(0.);
260  IgCocoaFileMgr::getInstance().addSolid(*this, "PARAL", spar, col);
261  //add a triangle
262  std::vector<ALIdouble> spar2;
263  spar2.push_back(width);
264  spar2.push_back(width);
265  spar2.push_back(0.);
266  spar2.push_back(width);
267  spar2.push_back(width);
268  IgCocoaFileMgr::getInstance().addSolid(*this, "TRD", spar2, col);
269 }
270 
271 #endif
272 
273 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
275  ALIdouble go;
277  gomgr->getGlobalOptionValue("VisScale", go);
278 
279  theSolidShape = new CocoaSolidShapeBox(
280  "Box", go * 5. * cm / m, go * 5. * cm / m, go * 5. * cm / m); //COCOA internal units are meters
281 }
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:235
static void dumprm(const CLHEP::HepRotation &rm, const std::string &msg, std::ostream &out=std::cout)
Definition: ALIUtils.cc:71
void refract(const ALIPlane &plate, const ALIdouble refra_ind1, const ALIdouble refra_ind2)
Definition: LightRay.cc:157
static ALIint debug
Definition: ALIUtils.h:34
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
void dumpData(const ALIstring &str) const
Definition: LightRay.cc:374
ALIPlane getRotatedPlate(const ALIbool forwardPlate)
static ALIdouble deg
Definition: ALIUtils.h:35
static void dump3v(const CLHEP::Hep3Vector &vec, const std::string &msg)
Definition: ALIUtils.cc:58
void intersect(const ALIPlane &plane)
Definition: LightRay.cc:93
virtual void fillIguana()
Definition: OpticalObject.h:55
col
Definition: cuy.py:1009
static unsigned int const shift
void reflect(const ALIPlane &plane)
Definition: LightRay.cc:138