CMS 3D CMS Logo

OptOOpticalSquare.cc
Go to the documentation of this file.
1 // COCOA class implementation file
2 //Id: OptOOpticalSquare
3 //CAT: Model
4 //
5 // History: v1.0
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 deviation of the light ray
25 //@@ Refract at entering, reflect in two of the plates and gets deviated 90o, refract at exiting
26 //@@
27 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
29 {
30  if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED DEVIATION IN OPTICAL SQUARE " << name() << std::endl;
31 
32  calculateFaces( true );
33 
34  //---------- Deviate in prism
35  //---------- Refract after entering face 0, reflect in face 1, reflect in face 2, refract after face 3
36  const ALIdouble refra_ind = findExtraEntryValueMustExist("refra_ind");
37  const ALIdouble refra_ind0 = 1.;
38 
39  ALIint ii;
40  for( ii = 0; ii < 4; ii++ ) {
41  if(ii == 0) {
42  if( ALIUtils::debug >= 3 ) std::cout << "## OPTOOPTICALSQUARE: refract in face " << ii << std::endl;
43  lightray.refract( ALIPlane(faceP[ii],faceV[ii]), refra_ind0, refra_ind );
44  } else if( ii == 3) {
45  //---- interchange refraction index for exiting instead of entering
46  lightray.refract( ALIPlane(faceP[ii],faceV[ii]), refra_ind, refra_ind0 );
47  } else {
48  lightray.reflect( ALIPlane(faceP[ii],faceV[ii] ));
49  }
50  if (ALIUtils::debug >= 3) {
51  lightray.dumpData( "After face ");
52  }
53  }
54 
55  //----- checks that it is inside prism and the order of faces hit is the good one
56  //
57 
58 }
59 
60 
61 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
62 //@@ Detailed simulation of traversing of the light ray
63 //@@
64 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
66 {
67  if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED TRAVERSES OPTICAL SQUARE " << name() << std::endl;
68 
69  calculateFaces( true );
70  const ALIdouble refra_ind = findExtraEntryValueMustExist("refra_ind");
71  const ALIdouble refra_ind0 = 1.;
72 
73  lightray.refract( ALIPlane(faceP[0],faceV[0]), refra_ind0, refra_ind );
74  lightray.refract( ALIPlane(faceP[4],faceV[4]), refra_ind, refra_ind0 );
75 
76 }
77 
78 
79 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
80 //@@ Fast simulation of deviation of the light ray
81 //@@ Reflect in two of the plates and gets deviated 90o
82 //@@
83 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
85 {
86  if (ALIUtils::debug >= 2) std::cout << "LR: FAST DEVIATION IN OPTICAL SQUARE " << name() << std::endl;
87 
88  calculateFaces( false );
89 
90  //---------- Deviate in prism
91  lightray.reflect( ALIPlane(faceP[1],faceV[1] ));
92  if (ALIUtils::debug >= 3) {
93  lightray.dumpData( "After face 1");
94  }
95  lightray.reflect( ALIPlane(faceP[2],faceV[2] ));
96  if (ALIUtils::debug >= 3) {
97  lightray.dumpData( "After face 2");
98  }
99  lightray.intersect( ALIPlane(faceP[3],faceV[3] ));
100  if (ALIUtils::debug >= 3) {
101  lightray.dumpData( "intersected at face 3");
102  }
103 
104  //----- Deviates by 'devi' X & Y??
105  lightray.shiftAndDeviateWhileTraversing( this, 'R');
106  /* ALIdouble deviRX = findExtraEntryValue("deviRX");
107  ALIdouble deviRY = findExtraEntryValue("deviRY");
108  ALIdouble shiftRX = findExtraEntryValue("shiftRX");
109  ALIdouble shiftRY = findExtraEntryValue("shiftRY");
110  lightray.shiftAndDeviateWhileTraversing( this, shiftRX, shiftRY, deviRX, deviRY);
111  */
112 
113  if (ALIUtils::debug >= 2) {
114  // std::cout << " shiftRX " << shiftRX << " shiftRY " << shiftRY << std::endl;
115  // std::cout << " deviRX " << deviRX << " deviRY " << deviRY << std::endl;
116  lightray.dumpData("Deviated ");
117  }
118 
119 
120 }
121 
122 
123 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
124 //@@
125 //@@
126 //@@
127 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
128  //---------- Fast simulation of the light ray traversing
130 {
131  // std::cerr << " WARNING there should be an extra piece to make entering and exiting surfaces parallel (like in modified_rhomboid_prism) " << std::endl;
132 
133  calculateFaces( false );
134 
135  lightray.intersect( ALIPlane(faceP[1],faceV[1] ));
136  //---------- Shift and Deviate
137  lightray.shiftAndDeviateWhileTraversing( this, 'T');
138  /* ALIdouble shiftX = findExtraEntryValue("shiftTX");
139  ALIdouble shiftY = findExtraEntryValue("shiftTY");
140  ALIdouble deviTX = findExtraEntryValue("deviTX");
141  ALIdouble deviTY = findExtraEntryValue("deviTY");
142  lightray.shiftAndDeviateWhileTraversing( this, shiftX, shiftY, deviTX, deviTY);
143  */
144  if (ALIUtils::debug >= 2) {
145  lightray.dumpData("Shifted and Deviated");
146  }
147 }
148 
149 
150 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
151 //@@ Calculate the centre points and normal std::vector of each of the four pentaprism faces the light ray may touch
152 //@@ Build the four faces. 0: entry, 1: 1st reflection, 2: 2nd reflection, 3: exit (look at figure in documentation)
153 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
155 {
156 
157  ALIint numberOfFaces = 5;
158 
159  //----- useful variables
160  CLHEP::Hep3Vector opto_centre = centreGlob();
161  if(ALIUtils::debug >= 3) std::cout << "opto_centre " << opto_centre << std::endl;
162  const ALIdouble hlen1 = findExtraEntryValueMustExist("length1") / 2.;
163  const ALIdouble hlen2 = findExtraEntryValueMustExist("length2") / 2.;
164  ALIdouble ang = 67.5*acos(0.)/90.;
165 
166  //- if( ALIUtils::debug >= 3) std::cout << "length 1 " << 2*hlen1 << " length 2 " << hlen2 * 2 << std::endl;
167  faceP[0] = CLHEP::Hep3Vector( 0, 0 , -hlen1 );
168  faceV[0] = CLHEP::Hep3Vector( 0, 0, -1 );
169  faceP[1] = CLHEP::Hep3Vector( 0, hlen1 - hlen2*sin(ang), hlen1 + hlen2*cos(ang) );
170  faceV[1] = CLHEP::Hep3Vector( 0, cos(ang), sin(ang) );
171 
172  faceP[2] = CLHEP::Hep3Vector( 0, -hlen1 - hlen2*cos(ang), -hlen1 + hlen2*sin(ang) );
173  faceV[2] = CLHEP::Hep3Vector( 0, -sin(ang), -cos(ang) );
174  faceP[3] = CLHEP::Hep3Vector( 0, hlen1, 0 );
175  faceV[3] = CLHEP::Hep3Vector( 0, 1, 0 );
176 
177  // face of added piece (so that light when traversing finds parallel surfaces at entry and exit)
178  faceP[4] = CLHEP::Hep3Vector( 0, 0, hlen1 + 2*hlen2*cos(ang) );
179  faceV[4] = CLHEP::Hep3Vector( 0, 0, 1 );
180 
181  //--------- Put faces in global reference frame
182  CLHEP::HepRotation rmt = rmGlob();
183  ALIint ii;
184  if (ALIUtils::debug >= 3) {
185  std::cout << " optical_square centre" << opto_centre << std::endl;
186  }
187  for( ii = 0; ii < numberOfFaces; ii++ ) {
188  faceP[ii] = rmt * faceP[ii];
189  faceP[ii] += opto_centre;
190  faceV[ii] = rmt * faceV[ii];
191  if (ALIUtils::debug >= 3) {
192  std::cout << "point at face " << ii << ": " << faceP[ii] << std::endl;
193  std::cout << "normal at face " << ii << ": " << faceV[ii] << std::endl;
194  }
195  }
196 
197  //----------- Correct faces 1 & 2 by wedge: rotate each face normal 1/2 of the wedge around two axis perpendicular to normal
198  if( isDetailed ) {
199  ALIdouble wedge, wedgeX, wedgeY;
200  const ALIbool wxy = findExtraEntryValueIfExists("wedge", wedge);
201  if( !wxy ) {
202  wedgeX = findExtraEntryValue("wedgeX");
203  wedgeY = findExtraEntryValue("wedgeY");
204  } else {
205  wedgeX = wedge;
206  wedgeY = wedge;
207  }
208 
209  //----- One axis is along X axis for the two faces (X belong to both faces)
210  if(ALIUtils::debug >= 4) std::cout << "OptOOpticalSquare calculateFaces: wedgeX " << wedgeX << " wedgeY " << wedgeY << std::endl;
211  CLHEP::Hep3Vector Axis1(1.,0.,0.);
212  Axis1 = rmt * Axis1;
213  if( ALIUtils::debug >= 4) {
214  ALIUtils::dump3v(faceV[1], "faceV[1] before wedge");
215  ALIUtils::dump3v(faceV[2], "faceV[2] before wedge");
216  }
217  faceV[1].rotate(0.5* wedgeX, Axis1);
218  if( ALIUtils::debug >= 4) ALIUtils::dump3v( Axis1, " Axis1 in faceV[1] ");
219  faceV[2].rotate(-0.5* wedgeX, Axis1);
220  if( ALIUtils::debug >= 4) {
221  ALIUtils::dump3v( Axis1, " Axis1 in faceV[2] ");
222  ALIUtils::dump3v(faceV[1], "faceV[1] after wedge X");
223  ALIUtils::dump3v(faceV[2], "faceV[2] after wedge X");
224  }
225 
226  //----- Other axis perpendicular to first and to normal of each face
227  CLHEP::Hep3Vector Axis2 = Axis1;
228  Axis2 = Axis2.cross( faceV[1] );
229  faceV[1].rotate(0.5* wedgeY, Axis2);
230  if( ALIUtils::debug >= 4) ALIUtils::dump3v( Axis2, " Axis2 in faceV[1] ");
231  Axis2 = Axis1;
232  Axis2 = Axis2.cross( faceV[2] );
233  faceV[2].rotate(-0.5* wedgeY, Axis2);
234  if( ALIUtils::debug >= 4) {
235  ALIUtils::dump3v( Axis2, " Axis2 in faceV[2] ");
236  ALIUtils::dump3v(faceV[1], "faceV[1] after wedge Y");
237  ALIUtils::dump3v(faceV[2], "faceV[2] after wedge Y");
238  }
239 
240  }
241 
242 }
243 
244 
245 #ifdef COCOA_VIS
246 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
248 {
249  ALIColour* col = new ALIColour( 0., 0., 1., 0. );
250  ALIdouble length1;
251  ALIbool wexists = findExtraEntryValueIfExists("length1",length1);
252  if( !wexists ) length1 = 4.;
253  ALIdouble length2;
254  wexists = findExtraEntryValueIfExists("length2",length2);
255  if( !wexists ) length2 = 4.;
256 
257  std::vector<ALIdouble> spar;
258  spar.push_back(length1);
259  spar.push_back(length2);
260  IgCocoaFileMgr::getInstance().addSolid( *this, "OPTSQR", spar, col);
261 }
262 #endif
263 
264 
265 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
267 {
268  ALIdouble go;
270  gomgr->getGlobalOptionValue("VisScale", go );
271 
272  theSolidShape = new CocoaSolidShapeBox( "Box", go*5.*cm/m, go*5.*cm/m, go*5.*cm/m ); //COCOA internal units are meters
273 }
long double ALIdouble
Definition: CocoaGlobals.h:11
void shiftAndDeviateWhileTraversing(const OpticalObject *opto, char behav)
Definition: LightRay.cc:241
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
void refract(const ALIPlane &plate, const ALIdouble refra_ind1, const ALIdouble refra_ind2)
Definition: LightRay.cc:163
int ALIint
Definition: CocoaGlobals.h:15
static ALIint debug
Definition: ALIUtils.h:36
static GlobalOptionMgr * getInstance()
void detailedDeviatesLightRay(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
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
void fastTraversesLightRay(LightRay &lightray) override
void fastDeviatesLightRay(LightRay &lightray) override
void constructSolidShape() override
ii
Definition: cuy.py:589
static void dump3v(const CLHEP::Hep3Vector &vec, const std::string &msg)
Definition: ALIUtils.cc:61
void intersect(const ALIPlane &plane)
Definition: LightRay.cc:101
void calculateFaces(ALIbool isDetailed)
virtual void fillIguana()
Definition: OpticalObject.h:56
col
Definition: cuy.py:1009
void detailedTraversesLightRay(LightRay &lightray) override
void dumpData(const ALIstring &str) const
Definition: LightRay.cc:382
void reflect(const ALIPlane &plane)
Definition: LightRay.cc:142