1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
// COCOA class implementation file
//Id: OptOPlateSplitter.cc
//CAT: Model
//
// History: v1.0
// Pedro Arce
#include "Alignment/CocoaModel/interface/OptOPlateSplitter.h"
#include "Alignment/CocoaModel/interface/LightRay.h"
#include "Alignment/CocoaModel/interface/ALIPlane.h"
#include "Alignment/CocoaUtilities/interface/ALIUtils.h"
#ifdef COCOA_VIS
#include "Alignment/IgCocoaFileWriter/interface/IgCocoaFileMgr.h"
#include "Alignment/CocoaVisMgr/interface/ALIColour.h"
#endif
#include "Alignment/CocoaDDLObjects/interface/CocoaSolidShapeBox.h"
#include "Alignment/CocoaUtilities/interface/GlobalOptionMgr.h"
using namespace CLHEP;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ Detailed simulation of Reflection in Plate Splitter
//@@ The software gets the plane of reflection as the forward splitter plane
//@@ Then the beam is reflected in this plane.
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::detailedDeviatesLightRay(LightRay& lightray) {
if (ALIUtils::debug >= 2)
std::cout << "LR: DETAILED REFLECTION IN PLATE SPLITTER " << name() << std::endl;
if (ALIUtils::debug >= 3)
ALIUtils::dump3v(centreGlob(), " centre Global RF ");
//---------- Get forward plate
ALIPlane plate = getPlate(true, true);
//---------- Reflect
lightray.reflect(plate);
if (ALIUtils::debug >= 2) {
std::cout << "Reflected in plate" << std::endl;
lightray.dumpData(" ");
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ Detailed simulation of the light ray traversing
//@@ The beam enters the splitter, is refracted, traverses the splitter and finally is again refracted when it exits:
//@@ Get the intersection with the forward splitter plane
//@@ Refract the beam and propagate until it intersects the backward splitter plane.
//@@ Finally the beam is refracted again.
//@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::detailedTraversesLightRay(LightRay& lightray) {
if (ALIUtils::debug >= 2)
std::cout << "LR: DETAILED TRAVERSE IN PLATE SPLITTER " << name() << std::endl;
//---------- Get forward plate
ALIPlane plate = getPlate(true, true);
//---------- If width is 0, just keep the same point
ALIdouble width = findExtraEntryValue("width");
if (width == 0) {
if (ALIUtils::debug >= 3)
lightray.dumpData("Traversed with 0 width");
return;
}
//---------- Refract while entering splitter
ALIdouble refra_ind1 = 1.;
ALIdouble refra_ind2 = findExtraEntryValue("refra_ind");
lightray.refract(plate, refra_ind1, refra_ind2);
if (ALIUtils::debug >= 2) {
lightray.dumpData("Refracted in first plate");
}
//---------- Get backward plate
plate = getPlate(false, true);
//---------- Refract while exiting splitter
lightray.refract(plate, refra_ind2, refra_ind1);
if (ALIUtils::debug >= 2) {
lightray.dumpData("Refracted in first plate");
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ Fast simulation of deviation of the light ray:
//@@ Reflect in a Plate Splitter
//@@ The beam is reflected in the first plate of the plate splitter, which is obtained without applying the rotation by 'wedge'.
//@@ After the beam is reflected, it is rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
//@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::fastDeviatesLightRay(LightRay& lightray) {
if (ALIUtils::debug >= 2)
std::cout << "LR: REFLECTION IN PLATE SPLITTER " << name() << std::endl;
//---------- Get forward plate
ALIPlane plate = getPlate(true, false);
//---------- Reflect in plate (including intersection with it)
lightray.reflect(plate);
if (ALIUtils::debug >= 2) {
lightray.dumpData("Reflected in plate");
}
//---------- Deviate Lightray
lightray.shiftAndDeviateWhileTraversing(this, 'R');
if (ALIUtils::debug >= 2) {
lightray.dumpData("Deviated ");
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ Fast simulation of the light ray traversing
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@ Traverse Plane Parallel Plate
//@@ Traslated to the backward plate of the plate splitter
//@@ Shifted in the splitter X direction by 'shiftX', and in the Y direction by 'shiftY'
//@@ and rotated around the splitter X axis by 'deviX' and around the Y axis by 'deviY'.
//@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::fastTraversesLightRay(LightRay& lightray) {
if (ALIUtils::debug >= 2)
std::cout << "LR: TRAVERSE PLATE SPLITTER " << name() << std::endl;
//---------- Get backward plate
ALIPlane plate = getPlate(false, false);
lightray.intersect(plate);
if (ALIUtils::debug >= 2) {
lightray.dumpData("Intersected with plate");
}
//---------- Shift and Deviate
lightray.shiftAndDeviateWhileTraversing(this, 'T');
if (ALIUtils::debug >= 2) {
lightray.dumpData("Shifted and Deviated");
}
}
#ifdef COCOA_VIS
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::fillIguana() {
ALIColour* col = new ALIColour(0., 0., 0., 0.);
ALIdouble width;
ALIbool wexists = findExtraEntryValueIfExists("width", width);
if (!wexists)
width = 1.;
std::vector<ALIdouble> spar;
spar.push_back(4.);
spar.push_back(4.);
spar.push_back(width);
IgCocoaFileMgr::getInstance().addSolid(*this, "BOX", spar, col);
}
#endif
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void OptOPlateSplitter::constructSolidShape() {
ALIdouble go;
GlobalOptionMgr* gomgr = GlobalOptionMgr::getInstance();
gomgr->getGlobalOptionValue("VisScale", go);
theSolidShape = new CocoaSolidShapeBox(
"Box", go * 5. * cm / m, go * 5. * cm / m, go * 1. * cm / m); //COCOA internal units are meters
}
|