4 #include "KVFAZIABlock.h"
6 #include "KVMaterial.h"
43 centre_cross_thick = 0.12;
46 si_centre = 0.5 * centre_cross_thick + 0.5 * si_holder_side;
47 front_frame_depth = 0.3;
48 frame_depth_300 = 0.273;
49 frame_depth_500 = 0.24;
50 frame_edge_depth = 0.16;
51 si300_position = -0.5 * frame_depth_300 + frame_edge_depth;
52 si500_position = -0.5 * frame_depth_500 + frame_edge_depth;
53 full_width = front_frame_depth + frame_depth_300 + frame_depth_500;
56 full_length_quartet = full_width + dist_si2_csi + csi_depth;
57 thick_si1 = 300 * KVUnits::um;
58 thick_si2 = 500 * KVUnits::um;
59 dist_csi_sarco = 4.25;
63 sarco_epaisseur = 0.4;
76 TVector3 placement(2.231625, 2.230525, 99.950350);
85 TVector3 Q2(-placement.
X(), placement.
Y(), placement.
Z());
87 Q1.
SetMag(100 - front_frame_depth - frame_edge_depth);
88 Q2.
SetMag(100 - front_frame_depth - frame_edge_depth);
89 fTotSidWBld = frame_side + (Q1 - Q2).
Mag();
101 for (
Int_t nq = 1; nq <= 4; nq += 1) {
103 Centre.
SetXYZ(placement.
X()*tx[nq - 1], placement.
Y()*ty[nq - 1], placement.
Z());
112 AddNode(MakeSarco(), 1,
new TGeoTranslation(0, 0, 0.5 * (full_length_quartet + sarco_length) + dist_csi_sarco));
121 TGeoVolume* KVFAZIABlock::MakeCrossPieceCSI(
double front_side,
double separation,
double distPlane,
double depth)
125 Projector proj(distPlane, depth);
126 std::vector<TVector3> coins;
127 double sep = separation / 2.;
130 coins.emplace_back(-sep, sep + front_side, -depth / 2);
131 coins.emplace_back(sep, sep + front_side, -depth / 2);
132 coins.emplace_back(sep, -sep - front_side, -depth / 2);
133 coins.emplace_back(-sep, -sep - front_side, -depth / 2);
135 coins.push_back(
TVector3(-sep, sep + front_side, -depth / 2));
136 coins.push_back(
TVector3(sep, sep + front_side, -depth / 2));
137 coins.push_back(
TVector3(sep, -sep - front_side, -depth / 2));
138 coins.push_back(
TVector3(-sep, -sep - front_side, -depth / 2));
140 for (
int i = 0; i < 4; ++i) coins.push_back(proj(coins[i]));
141 std::vector<double> coords;
143 for (
auto&
vec : coins) {
144 coords.push_back(
vec.X());
145 coords.push_back(
vec.Y());
147 for (std::vector<TVector3>::iterator
vec = coins.begin();
vec != coins.end(); ++
vec) {
148 coords.push_back(
vec->X());
149 coords.push_back(
vec->Y());
167 TGeoVolume* KVFAZIABlock::MakeLeftCrossPieceCSI(
double front_side,
double separation,
double distPlane,
double depth)
170 Projector proj(distPlane, depth);
171 std::vector<TVector3> coins;
172 double sep = separation / 2.;
175 coins.emplace_back(-sep - front_side, sep, -depth / 2);
176 coins.emplace_back(-sep, sep, -depth / 2);
177 coins.emplace_back(-sep, -sep, -depth / 2);
178 coins.emplace_back(-sep - front_side, -sep, -depth / 2);
180 coins.push_back(
TVector3(-sep - front_side, sep, -depth / 2));
181 coins.push_back(
TVector3(-sep, sep, -depth / 2));
182 coins.push_back(
TVector3(-sep, -sep, -depth / 2));
183 coins.push_back(
TVector3(-sep - front_side, -sep, -depth / 2));
185 for (
int i = 0; i < 4; ++i) coins.push_back(proj(coins[i]));
186 std::vector<double> coords;
188 for (
auto&
vec : coins) {
189 coords.push_back(
vec.X());
190 coords.push_back(
vec.Y());
192 for (std::vector<TVector3>::iterator
vec = coins.begin();
vec != coins.end(); ++
vec) {
193 coords.push_back(
vec->X());
194 coords.push_back(
vec->Y());
212 TGeoVolume* KVFAZIABlock::MakeRightCrossPieceCSI(
double front_side,
double separation,
double distPlane,
double depth)
215 Projector proj(distPlane, depth);
216 std::vector<TVector3> coins;
217 double sep = separation / 2.;
220 coins.emplace_back(sep, sep, -depth / 2);
221 coins.emplace_back(sep + front_side, sep, -depth / 2);
222 coins.emplace_back(sep + front_side, -sep, -depth / 2);
223 coins.emplace_back(sep, -sep, -depth / 2);
225 coins.push_back(
TVector3(sep, sep, -depth / 2));
226 coins.push_back(
TVector3(sep + front_side, sep, -depth / 2));
227 coins.push_back(
TVector3(sep + front_side, -sep, -depth / 2));
228 coins.push_back(
TVector3(sep, -sep, -depth / 2));
230 for (
int i = 0; i < 4; ++i) coins.push_back(proj(coins[i]));
231 std::vector<double> coords;
233 for (
auto&
vec : coins) {
234 coords.push_back(
vec.X());
235 coords.push_back(
vec.Y());
237 for (std::vector<TVector3>::iterator
vec = coins.begin();
vec != coins.end(); ++
vec) {
238 coords.push_back(
vec->X());
239 coords.push_back(
vec->Y());
256 std::vector<double> KVFAZIABlock::GetCoordsCSI(
int tel_num,
double front_side,
double separation,
double distPlane,
double depth)
258 Projector proj(distPlane, depth);
259 std::vector<TVector3> coins;
260 double sep = separation / 2.;
265 coins.emplace_back(-sep - front_side, sep + front_side, -depth / 2);
266 coins.emplace_back(-sep, sep + front_side, -depth / 2);
267 coins.emplace_back(-sep, sep, -depth / 2);
268 coins.emplace_back(-sep - front_side, sep, -depth / 2);
270 coins.push_back(
TVector3(-sep - front_side, sep + front_side, -depth / 2));
271 coins.push_back(
TVector3(-sep, sep + front_side, -depth / 2));
272 coins.push_back(
TVector3(-sep, sep, -depth / 2));
273 coins.push_back(
TVector3(-sep - front_side, sep, -depth / 2));
279 coins.emplace_back(sep, sep + front_side, -depth / 2);
280 coins.emplace_back(sep + front_side, sep + front_side, -depth / 2);
281 coins.emplace_back(sep + front_side, sep, -depth / 2);
282 coins.emplace_back(sep, sep, -depth / 2);
284 coins.push_back(
TVector3(sep, sep + front_side, -depth / 2));
285 coins.push_back(
TVector3(sep + front_side, sep + front_side, -depth / 2));
286 coins.push_back(
TVector3(sep + front_side, sep, -depth / 2));
287 coins.push_back(
TVector3(sep, sep, -depth / 2));
293 coins.emplace_back(sep, -sep, -depth / 2);
294 coins.emplace_back(sep + front_side, -sep, -depth / 2);
295 coins.emplace_back(sep + front_side, -sep - front_side, -depth / 2);
296 coins.emplace_back(sep, -sep - front_side, -depth / 2);
298 coins.push_back(
TVector3(sep, -sep, -depth / 2));
299 coins.push_back(
TVector3(sep + front_side, -sep, -depth / 2));
300 coins.push_back(
TVector3(sep + front_side, -sep - front_side, -depth / 2));
301 coins.push_back(
TVector3(sep, -sep - front_side, -depth / 2));
307 coins.emplace_back(-sep - front_side, -sep, -depth / 2);
308 coins.emplace_back(-sep, -sep, -depth / 2);
309 coins.emplace_back(-sep, -sep - front_side, -depth / 2);
310 coins.emplace_back(-sep - front_side, -sep - front_side, -depth / 2);
312 coins.push_back(
TVector3(-sep - front_side, -sep, -depth / 2));
313 coins.push_back(
TVector3(-sep, -sep, -depth / 2));
314 coins.push_back(
TVector3(-sep, -sep - front_side, -depth / 2));
315 coins.push_back(
TVector3(-sep - front_side, -sep - front_side, -depth / 2));
318 for (
int i = 0; i < 4; ++i) coins.push_back(proj(coins[i]));
319 std::vector<double> coords;
321 for (
auto&
vec : coins) {
322 coords.push_back(
vec.X());
323 coords.push_back(
vec.Y());
325 for (std::vector<TVector3>::iterator
vec = coins.begin();
vec != coins.end(); ++
vec) {
326 coords.push_back(
vec->X());
327 coords.push_back(
vec->Y());
337 TGeoVolume* KVFAZIABlock::MakeErgalFrame(
double frame_depth,
double ergal_edge_depth)
343 0.5 * frame_side, 0.5 * side_thick, 0.5 * ergal_edge_depth);
345 gGeoManager->
MakeBox(
"ERG_B", alu.GetGeoMedium(), 0.5 * frame_side, 0.5 * centre_cross_thick, 0.5 * frame_depth);
348 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.,
349 0.5 * ergal_edge_depth);
352 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.,
356 ergal_frame->
AddNode(erg_a, 1,
new TGeoTranslation(0, frame_side / 2. - side_thick / 2., -0.5 * frame_depth + 0.5 * ergal_edge_depth));
357 ergal_frame->
AddNode(erg_a, 2,
new TGeoTranslation(0, -(frame_side / 2. - side_thick / 2.), -0.5 * frame_depth + 0.5 * ergal_edge_depth));
358 ergal_frame->
AddNode(erg_b, 1);
361 centre_cross_thick / 2.
362 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2., -0.5 * frame_depth + 0.5 * ergal_edge_depth));
365 centre_cross_thick / 2.
366 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2., -0.5 * frame_depth + 0.5 * ergal_edge_depth));
369 -(centre_cross_thick / 2.
370 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.), -0.5 * frame_depth + 0.5 * ergal_edge_depth));
373 -(centre_cross_thick / 2.
374 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.), -0.5 * frame_depth + 0.5 * ergal_edge_depth));
377 (centre_cross_thick / 2.
378 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.), 0));
381 -(centre_cross_thick / 2.
382 + 0.5 * (frame_side - 2 * side_thick - centre_cross_thick) / 2.), 0));
398 TGeoVolume* ergal_frame_300 = MakeErgalFrame(frame_depth_300, frame_edge_depth);
401 TGeoVolume* si300vol =
gGeoManager->
MakeBox(
"DET_SI1", silicon.GetGeoMedium(), 0.5 * si_holder_side, 0.5 * si_holder_side, thick_si1 / 2.);
403 si300frame->
AddNode(ergal_frame_300, 1);
414 TGeoVolume* ergal_frame_500 = MakeErgalFrame(frame_depth_500, frame_edge_depth);
415 TGeoVolume* si500vol =
gGeoManager->
MakeBox(
"DET_SI2", silicon.GetGeoMedium(), 0.5 * si_holder_side, 0.5 * si_holder_side, thick_si2 / 2.);
417 si500frame->
AddNode(ergal_frame_500, 1);
428 TGeoVolume* ergal_frame_front = MakeErgalFrame(front_frame_depth, front_frame_depth);
433 quartet->
AddNode(ergal_frame_front, 1,
new TGeoTranslation(0, 0, -0.5 * full_length_quartet + 0.5 * front_frame_depth));
434 quartet->
AddNode(si300frame, 1,
new TGeoTranslation(0, 0, -0.5 * full_length_quartet + front_frame_depth + 0.5 * frame_depth_300));
435 quartet->
AddNode(si500frame, 1,
new TGeoTranslation(0, 0, -0.5 * full_length_quartet + front_frame_depth + frame_depth_300 + .5 * frame_depth_500));
440 double dist_targ_csi = 100 - (front_frame_depth + frame_edge_depth) + full_width + dist_si2_csi;
441 for (
int tel_num = 1; tel_num <= 4; ++tel_num) {
444 GetCoordsCSI(tel_num, si_holder_side, centre_cross_thick, dist_targ_csi, csi_depth).data());
445 quartet->
AddNode(csi_vol, tel_num,
new TGeoTranslation(0, 0, 0.5 * full_length_quartet - 0.5 * csi_depth));
448 quartet->
AddNode(MakeCrossPieceCSI(si_holder_side, centre_cross_thick, dist_targ_csi, csi_depth),
449 1,
new TGeoTranslation(0, 0, 0.5 * full_length_quartet - 0.5 * csi_depth));
450 quartet->
AddNode(MakeLeftCrossPieceCSI(si_holder_side, centre_cross_thick, dist_targ_csi, csi_depth),
451 1,
new TGeoTranslation(0, 0, 0.5 * full_length_quartet - 0.5 * csi_depth));
452 quartet->
AddNode(MakeRightCrossPieceCSI(si_holder_side, centre_cross_thick, dist_targ_csi, csi_depth),
453 1,
new TGeoTranslation(0, 0, 0.5 * full_length_quartet - 0.5 * csi_depth));
466 TGeoVolume* side =
gGeoManager->
MakeBox(
"DEADZONE_SARCO_SIDE", al.GetGeoMedium(), .5 * sarco_height, .5 * sarco_epaisseur, .5 * sarco_length);
467 TGeoVolume* top =
gGeoManager->
MakeBox(
"DEADZONE_SARCO_TOP", al.GetGeoMedium(), .5 * sarco_epaisseur, .5 * (sarco_width - 2 * sarco_epaisseur), .5 * sarco_length);
468 TGeoVolume* bottom =
gGeoManager->
MakeBox(
"DEADZONE_SARCO_BOT", cu.GetGeoMedium(), sarco_epaisseur, .5 * (sarco_width - 2 * sarco_epaisseur), .5 * sarco_length);
469 TGeoVolume* back =
gGeoManager->
MakeBox(
"DEADZONE_SARCO_BACK", al.GetGeoMedium(), 0.5 * (sarco_height - 3 * sarco_epaisseur - sarco_uplift),
470 0.5 * (sarco_width - 2 * sarco_epaisseur), 0.5 * sarco_epaisseur);
476 sarco->
AddNode(bottom, 1,
new TGeoTranslation(-.5 * sarco_height + sarco_uplift + sarco_epaisseur, 0, 0));
477 sarco->
AddNode(back, 1,
new TGeoTranslation(0.5 * (sarco_epaisseur + sarco_uplift), 0, 0.5 * sarco_length - 0.5 * sarco_epaisseur));
R__EXTERN TGeoManager * gGeoManager
char * Form(const char *fmt,...)
Standard geometry of 16-telescope FAZIA block.
virtual void Build()
Set default dimensions for all parts of geometry.
Double_t GetNominalDistanceTargetBlockCentre(double dist_SI1=100.) const
static TGeoHMatrix * GetFAZIAVolumePositioningMatrix(Double_t distance, Double_t theta, Double_t phi, TGeoTranslation *postTrans=nullptr)
Description of physical materials used to construct detectors & targets; interface to range tables.
TGeoVolume * MakeArb8(const char *name, TGeoMedium *medium, Double_t dz, Double_t *vertices=nullptr)
TGeoVolume * MakeBox(const char *name, TGeoMedium *medium, Double_t dx, Double_t dy, Double_t dz)
TGeoMedium * GetMedium(const char *medium) const
TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="") override
virtual void SetMedium(TGeoMedium *medium)
virtual void SetName(const char *name)
TObject * Last() const override
void SetXYZ(Double_t x, Double_t y, Double_t z)
T Mag(const SVector< T, D > &rhs)
constexpr Double_t RadToDeg()