CMS 3D CMS Logo

OptOMirror.cc
Go to the documentation of this file.
1 // COCOA class implementation file
2 //Id: OptOMirror.cc
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  //---------- Default behaviour: create a LightRay object
25 {
26  detailedDeviatesLightRay( lightray );
27 }
28 
29 
30 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
31 //@@ Detailed simulation of Reflection in Mirror
32 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
34 {
35  if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED REFLECTION IN MIRROR " << name() << std::endl;
36  if (ALIUtils::debug >= 3) ALIUtils::dump3v( centreGlob(), " centre Global ");
37 
38  //---------- Get forward plate and intersect lightray with it
39  ALIPlane plate = getPlate(true, false);
40  lightray.intersect( plate );
41  CLHEP::Hep3Vector inters = lightray.point( );
42 
43  //---------- Get centre of forward plate
44  //----- Get Z axis
45  CLHEP::Hep3Vector ZAxis = getZAxis();
46  CLHEP::HepRotation rmt = rmGlob();
47  ZAxis = rmt * ZAxis;
48  //----- Get centre
49  ALIdouble width = findExtraEntryValue("width");
50  CLHEP::Hep3Vector plate_centre = centreGlob() - 0.5 * width * ZAxis;
51  //- if(ALIUtils::debug >= 4) std::cout << " mirror width " << width << std::endl;
52 
53  //---------- Get the distance between the intersection point and the centre of the forward plate
54  ALIdouble distance = ( plate_centre - inters ).mag();
55 
56  //---------- Get normal to mirror at intersection point
57  //------- Get angle of mirror surface (angle between plate centre and intersection)
58  ALIdouble flatness = findExtraEntryValue("flatness");
59  //-- flatness is defined as number of 632 nm wavelengths
60  flatness *= 632.E-9;
61  ALIdouble length = 0.;
62 
63  ALIdouble curvature_radius;
64  ALIdouble angFlatness;
65  if( flatness != 0) {
66  length = findExtraEntryValueMustExist("length");
67  curvature_radius = (flatness*flatness + length*length) / (2*flatness);
68  angFlatness = asin( distance / curvature_radius);
69  } else {
70  curvature_radius = ALI_DBL_MAX;
71  angFlatness = 0;
72  }
73 
74  if (ALIUtils::debug >= 3) {
75  std::cout << " intersection with plate " << inters << std::endl;
76  std::cout << " plate_centre " << plate_centre << std::endl;
77  std::cout << " distance plate_centre - intersection " << distance << std::endl;
78  std::cout << " flatness " << flatness << ", length " << length;
79  std::cout << ", curvature radius " << curvature_radius << " angle of flatness " << angFlatness << std::endl;
80  }
81 
82  //----- Axis of rotation is perpendicular to Z Axis and to line plate_centre - intersection
83  CLHEP::Hep3Vector ipcV = inters - plate_centre;
84  if( ipcV.mag() != 0) ipcV *= 1./ipcV.mag();
85  CLHEP::HepRotation rtm = rmGlob();
86  ipcV = rtm*ipcV;
87  CLHEP::Hep3Vector rotationAxis = ipcV.cross(ZAxis);
88  //----- normal is object normal rotated around this axis
89  CLHEP::Hep3Vector inters_normal = CLHEP::Hep3Vector(0.,0.,1.);
90  inters_normal.rotate( angFlatness, rotationAxis );
91  inters_normal = rmt * inters_normal;
92 
93  if (ALIUtils::debug >= 2) {
94  ALIUtils::dump3v( ipcV, " intersection - plate_centre std::vector ");
95  std::cout << "rotation Axis " << rotationAxis << std::endl;
96  std::cout << " plate normal at intersection point " << inters_normal << std::endl;
97 }
98  //---------- Reflect in plate
99  ALIdouble cosang = -( inters_normal * lightray.direction() ) /
100  inters_normal.mag() / lightray.direction().mag();
101  CLHEP::Hep3Vector lrold = lightray.direction();
102  lightray.setDirection( lightray.direction() + inters_normal*2*cosang );
103 
104  if (ALIUtils::debug >= 2) {
105  lightray.dumpData("Reflected in mirror");
106  }
107 
108 }
109 
110 
111 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
112 //@@ Fast simulation of Reflection in Mirror
113 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
115 {
116  if (ALIUtils::debug >= 2) std::cout << "LR: FAST REFLECTION IN MIRROR " << name() << std::endl;
117 
118  //---------- Get forward plate
119  ALIPlane plate = getPlate(true, false);
120 
121  //---------- Reflect in plate (including intersection with it)
122  lightray.reflect( plate );
123  if (ALIUtils::debug >= 2) {
124  lightray.dumpData("Reflected in plate");
125  }
126  //---------- Deviate Lightray
127  // ALIdouble deviX = findExtraEntryValue("deviX");
128  // ALIdouble deviY = findExtraEntryValue("deviY");
129  // lightray.shiftAndDeviateWhileTraversing( this, 0., 0., 0., deviX, deviY, 0.);
130  lightray.shiftAndDeviateWhileTraversing( this, 'R' );
131  if (ALIUtils::debug >= 2) {
132  lightray.dumpData("Deviated ");
133  }
134 
135 }
136 
137 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
139 {
140  if (ALIUtils::debug >= 2) std::cout << "LR: DETAILED TRAVERSE IN MIRROR " << name() << std::endl;
141 
142  //---------- Get forward plate
143  ALIPlane plate = getPlate(true, true);
144  //---------- If width is 0, just keep the same point
145  ALIdouble width = findExtraEntryValue("width");
146  if( width == 0 ) {
147  if(ALIUtils::debug >= 3) lightray.dumpData("Traversed with 0 width");
148  return;
149  }
150 
151  //---------- Refract while entering mirror
152  ALIdouble refra_ind1 = 1.;
153  ALIdouble refra_ind2 = findExtraEntryValue("refra_ind");
154  lightray.refract( plate, refra_ind1, refra_ind2 );
155  if (ALIUtils::debug >= 2) {
156  lightray.dumpData("Refracted in first plate");
157  }
158 
159  //---------- Get backward plate
160  plate = getPlate(false, true);
161  //---------- Refract while exiting mirror
162  lightray.refract( plate, refra_ind2, refra_ind1 );
163  if (ALIUtils::debug >= 2) {
164  lightray.dumpData("Refracted in first plate");
165  }
166 
167 }
168 
169 
170 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
172 {
173  if (ALIUtils::debug >= 2) std::cout << "LR: TRAVERSE MIRROR " << name() << std::endl;
174 
175  //---------- Get backward plate
176  ALIPlane plate = getPlate(false, false);
177  lightray.intersect( plate );
178  if (ALIUtils::debug >= 2) {
179  lightray.dumpData("Intersected with plate");
180  }
181  //---------- Shift and Deviate
182  lightray.shiftAndDeviateWhileTraversing( this, 'T' );
183  if (ALIUtils::debug >= 2) {
184  lightray.dumpData("Shifted and Deviated");
185  }
186 
187 }
188 
189 
190 
191 #ifdef COCOA_VIS
192 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
194 {
196  ALIbool wexists = findExtraEntryValueIfExists("width",width);
197  if( !wexists ) width = 1.;
198  ALIdouble length;
199  wexists = findExtraEntryValueIfExists("length",length);
200  if( !wexists ) length = 4.;
201 
202  ALIColour* col = new ALIColour( 0., 0., 1., 0. );
203  std::vector<ALIdouble> spar;
204  spar.push_back(length);
205  spar.push_back(length);
206  spar.push_back(width);
207  IgCocoaFileMgr::getInstance().addSolid( *this, "BOX", spar, col);
208 }
209 #endif
210 
211 
212 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
214 {
215  ALIdouble go;
217  gomgr->getGlobalOptionValue("VisScale", go );
218 
219  theSolidShape = new CocoaSolidShapeBox( "Box", go*5.*cm/m, go*5.*cm/m, go*1.*cm/m ); //COCOA internal units are meters
220 }
long double ALIdouble
Definition: CocoaGlobals.h:11
void detailedTraversesLightRay(LightRay &lightray) override
Definition: OptOMirror.cc:138
void shiftAndDeviateWhileTraversing(const OpticalObject *opto, char behav)
Definition: LightRay.cc:241
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
void detailedDeviatesLightRay(LightRay &lightray) override
Definition: OptOMirror.cc:33
void refract(const ALIPlane &plate, const ALIdouble refra_ind1, const ALIdouble refra_ind2)
Definition: LightRay.cc:163
void fastTraversesLightRay(LightRay &lightray) override
Definition: OptOMirror.cc:171
static ALIint debug
Definition: ALIUtils.h:36
static GlobalOptionMgr * getInstance()
void setDirection(const CLHEP::Hep3Vector &direc)
Definition: LightRay.h:61
void constructSolidShape() override
Definition: OptOMirror.cc:213
int getGlobalOptionValue(const ALIstring &sstr, ALIdouble &val)
--— Search a string in theGlobalOptions and return 1 if found
bool ALIbool
Definition: CocoaGlobals.h:19
const CLHEP::Hep3Vector & point() const
Definition: LightRay.h:52
void fastDeviatesLightRay(LightRay &lightray) override
Definition: OptOMirror.cc:114
static void dump3v(const CLHEP::Hep3Vector &vec, const std::string &msg)
Definition: ALIUtils.cc:61
void defaultBehaviour(LightRay &lightray, Measurement &meas) override
Definition: OptOMirror.cc:24
void intersect(const ALIPlane &plane)
Definition: LightRay.cc:101
virtual void fillIguana()
Definition: OpticalObject.h:56
col
Definition: cuy.py:1009
void dumpData(const ALIstring &str) const
Definition: LightRay.cc:382
void reflect(const ALIPlane &plane)
Definition: LightRay.cc:142
const CLHEP::Hep3Vector & direction() const
Definition: LightRay.h:55
const double ALI_DBL_MAX
Definition: CocoaGlobals.h:24