CbmRoot
Loading...
Searching...
No Matches
CbmTrdGeoFactory.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 National Institute of Physics and Nuclear Engineering - Horia Hulubei, Bucharest
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Alexandru Bercuci [committer] */
4
11#include "CbmTrdGeoFactory.h"
12
13// #include "CbmTrdConstructionDB.h"
14#include "CbmTrdAddress.h"
15
16#include <Logger.h> // for LOG, Logger
17
18#include <TGeoBBox.h>
19#include <TGeoCompositeShape.h>
20#include <TGeoManager.h>
21#include <TGeoMatrix.h>
22#include <TGeoMedium.h>
23#include <TGeoVolume.h>
24#include <TROOT.h>
25
26#include <cassert>
27using namespace cbm::trd;
28using namespace cbm::trd::geo;
29
31 "Radiator", "Window", "Volume", "BackPanel", "FEB", "AUX"};
32//________________________________________________________________________________________
33const TGeoMedium* cbm::trd::geo::GetMaterial(const char* mname)
34{
35 if (fMaterial.find(mname) == fMaterial.end()) {
36 LOG(error) << "GetMaterial(" << mname << ") failed.";
37 return nullptr;
38 }
39 return fMaterial.at(mname);
40}
41
42//__________________________________________________________________
43bool cbm::trd::geo::ReadModuleInfo(const char* modTxt, info_t& info)
44{
45 // parse module info
46 string modName = modTxt;
47 auto posstart = modName.find("module") + 6;
48 uint ndigits = 0;
49 auto partoftype = modName.at(posstart);
50 while (std::isdigit(partoftype) && (ndigits + posstart) < modName.size()) {
51 partoftype = modName.at(posstart + ndigits);
52 ++ndigits;
53 }
54 info.type = stoi(modName.substr(posstart, ndigits)); // 6th element+ module type
55
56 posstart += ndigits;
57 int modCopyNo = stoi(modName.substr(posstart, string::npos));
58 if ((modCopyNo / 100000000) < 0) {
59 LOG(warning) << modTxt << " Module in ancient (< 2013) format. Ask expert.";
60 return false;
61 }
62
63 // >= 2014 format has 9 digits
64 // In TGeoManager numbering starts with 1, so we have to subtract 1.
65 // int modCopy = ((modCopyNo / 1000000) % 100); // from module copy number
66 info.id = (modCopyNo % 1000) - 1;
67 info.superId = ((modCopyNo / 1000) % 100) - 1;
68 info.rotation = ((modCopyNo / 100000) % 10); // from module copy number
69 info.address = CbmTrdAddress::GetAddress(info.superId, info.id, 0, 0, 0);
70 return true;
71}
72
73//__________________________________________________________________
74bool cbm::trd::geo::ReadFebInfo(const char* febTxt, info_t& info)
75{
76 // parse FEB info
77 string febName = febTxt;
78 auto posstart = febName.find("FEB") + 3;
79 try {
80 info.type = stoi(febName.substr(posstart, 2));
81 info.superType = info.type / 10;
82 if (info.superType < 0 || info.superType > 2) throw eException::invalid_type;
83 info.type = info.type % 10;
84
85 int febNo = stoi(febName.substr(posstart + 3, string::npos));
86 info.id = febNo % 100;
87 if (info.superType == 0 && info.id >= faspFeb[info.type].nmax) throw eException::invalid_id;
88 info.superId = (febNo / 100) % 1000;
89 info.rotation = (febNo / 100000) % 10;
90 if (info.rotation > 1) throw eException::invalid_id;
91 }
92 catch (invalid_argument a) { // syntax exceptions
93 LOG(error) << "FEB name does not follow syntax rules : \"FEBxy_identifier\", \"x\" = superType, \"y\" = Type. "
94 "Couldn't initialize.";
95 return false;
96 }
97 catch (eException e) { // TRD exceptions
98 LOG(error) << "FEB name does not follow syntax rules";
99 switch (e) {
100 case eException::invalid_type: LOG(info) << " : Family type not recognized"; break;
101 case eException::invalid_id: LOG(info) << " : Local id not recognized"; break;
102 default: LOG(info) << " : Un-identified violation."; break;
103 }
104 return false;
105 }
106
107 return true;
108}
109
110//__________________________________________________________________
112{
122 int modInfo = 0; //info.id + info.superId * 100;
123 return modInfo;
124}
125
126//__________________________________________________________________
128{
138 if (info == nullptr) {
139 LOG(error) << "WriteFebInfo : Info for FEB is missing";
140 return -1;
141 }
142 if (info->id < 0 || info->superId < 0 || info->rotation < 0) {
143 LOG(warning) << "WriteFebInfo : Info for FEB is incomplete : id=" << info->id << " superId=" << info->superId
144 << " rotatation=" << info->rotation;
145 return -1;
146 }
147 int febInfo = info->id + 100 * info->superId + 100000 * info->rotation;
148 return febInfo;
149}
150
151//________________________________________________________________________________________
152ChamberBuilder::ChamberBuilder(int typ) : FairTask(Form("module%d", typ))
153{
154 fChmbTyp = typ;
155
156 fMaterial["air"] = nullptr;
157 fMaterial["TRDpefoam20"] = nullptr;
158 fMaterial["TRDG10"] = nullptr;
159 fMaterial["TRDkapton"] = nullptr;
160 fMaterial["TRDgas"] = nullptr;
161 fMaterial["TRDcopper"] = nullptr;
162 fMaterial["TRDaramide"] = nullptr;
163 fMaterial["TRDcarbon"] = nullptr;
164 fMaterial["aluminium"] = nullptr;
165 fMaterial["polypropylene"] = nullptr;
166 fMaterial["silicon"] = nullptr;
167
168 fComponent[(int) eGeoPart::kRadiator] = nullptr;
172 fComponent[(int) eGeoPart::kFEB] = nullptr;
173 fComponent[(int) eGeoPart::kAUX] = nullptr;
174}
175
176//________________________________________________________________________________________
178{
180 if (HasFEB()) {
181 fComponent[(int) eGeoPart::kFEB] = new FEB;
182 fComponent[(int) eGeoPart::kAUX] = new AUX;
183 }
184 switch (fChmbTyp) {
185 case 1:
186 LOG(info) << "Init for TRD2D.";
187 SetFEE(fConfig, (bool) eAsic::kFasp);
190 sizeX = sizeY = 57;
191 break;
197 LOG(info) << "Init for TRD1D type " << fChmbTyp << ".";
198 break;
199 default: LOG(fatal) << "Unknown TRD chamber type " << fChmbTyp << ". Abort."; break;
200 }
201
202 // Activate materials od the TRD geometry
203 TGeoManager* gGeoMan = (TGeoManager*) gROOT->FindObject("FAIRGeom");
204 assert(gGeoMan);
205 for (auto& imat : fMaterial) {
206 imat.second = gGeoMan->GetMedium(imat.first.data());
207 assert(imat.second);
208 }
209
210 // Instantiate the construction data base of the TRD system
211 // if (!gDB) {
212 // assert((gDB = ConstructionDB::Instantiate()));
213 // }
214
215 // Init sub-components
216 for (auto icomp : fComponent) {
217 if (!icomp) continue;
218 auto status = icomp->Init();
219 if (status != kSUCCESS) return status;
220 }
221 return kSUCCESS;
222}
223
224//________________________________________________________________________________________
225void ChamberBuilder::Exec(Option_t*)
226{
227 // estimate total module height and define center
228 int idx(0);
229 double vh[(int) eGeoPart::kNparts];
230 bool kAdd(true);
231 double hTot(0.);
232 for (auto icomp : fComponent) {
233 if (!icomp) continue;
234 vh[idx] = icomp->GetHeight();
235 hTot += vh[idx];
236 if (kAdd) {
237 if (idx == (int) eGeoPart::kVolume) kAdd = false;
238 }
239 idx++;
240 }
241 // add global z offset
242 fVol = new TGeoVolume(Form("module%d", fChmbTyp), new TGeoBBox("", sizeX / 2, sizeY / 2, hTot / 2),
244 fVol->SetLineColor(kGreen);
245 fVol->SetTransparency(80);
246
247 // Stack-up all sub-components
248 idx = 0;
249 double hh(-hTot / 2);
250 info_t infoFeb;
251 for (auto icomp : fComponent) {
252 if (!icomp) continue;
253 hh += 0.5 * vh[idx];
254 switch (idx) {
255 case (int) eGeoPart::kFEB: { // special case for feb multiple placement.
256 // FEB characteristics and identification stored in geometry
257 auto vFeb =
258 new TGeoVolume("FEB", new TGeoBBox("", sizeX / 2, sizeY / 2, vh[idx] / 2), cbm::trd::geo::GetMaterial("air"));
259 for (int ifeb(0), jfeb(0); ifeb < Nfebs; ifeb++) {
260 infoFeb.id = ifeb;
261 infoFeb.superId = 0; // gDB.GetFebId(imod, ifeb);
262 infoFeb.rotation = 0; // gDB.GetFebRot(imod, ifeb);
263 if ((jfeb = WriteFebInfo(&infoFeb)) < 0) continue;
264 vFeb->AddNode(icomp->fVol, jfeb, new TGeoTranslation("", feb_pos[ifeb][0], feb_pos[ifeb][1], 0.));
265 }
266 fVol->AddNode(vFeb, 1, new TGeoTranslation("", 0, 0, hh));
267 } break;
268 default: fVol->AddNode(icomp->fVol, 1, new TGeoTranslation("", 0., 0., hh)); break;
269 }
270
271 hh += 0.5 * vh[idx++];
272 }
273}
274//________________________________________________________________________________________
276{
277 if (!fVol) return 0.;
278 double zlo, zhi;
279 fVol->GetShape()->GetAxisRange(3., zlo, zhi);
280 return 0.5 * (zlo + zhi);
281}
282// double ChamberBuilder::Component::GetHeight() const
283// {
284// if (!fVol) return 0.;
285// double zlo, zhi, hh = fVol->GetShape()->GetAxisRange(2, zlo, zhi);
286// return hh;
287// }
288
289//________________________________________________________________________________________
291
293{
294 const double hc_size_x = activeAreaX;
295 const double hc_size_y = 2 * 0.3 + activeAreaY;
296 const double win_size_x = hc_size_x + 2 * WIN_FrameX_thickness;
297 const double win_size_y = hc_size_y + 2 * WIN_FrameY_thickness;
298
299 // Carbon fiber layers
300 TGeoBBox* winIn_C = new TGeoBBox("winIn_C", win_size_x / 2., win_size_y / 2., winIn_C_thickness / 2.);
301 TGeoVolume* vol_winIn_C =
302 new TGeoVolume("winIn_C", winIn_C, cbm::trd::geo::GetMaterial("TRDcarbon") /*carbonVolMed*/);
303 vol_winIn_C->SetLineColor(kBlack); //kGray);
305
306 // Honeycomb layer
307 TGeoBBox* winIn_HC = new TGeoBBox("winIn_HC", hc_size_x / 2., hc_size_y / 2., winIn_HC_thickness / 2.);
308 TGeoVolume* vol_winIn_HC = new TGeoVolume("winIn_HC", winIn_HC, cbm::trd::geo::GetMaterial("TRDaramide"));
309 vol_winIn_HC->SetLineColor(kOrange);
311
312 // framex
313 TGeoBBox* winIn_fx = new TGeoBBox("winIn_fx", (hc_size_x + 2 * WIN_FrameX_thickness) / 2, WIN_FrameY_thickness / 2,
314 winIn_HC_thickness / 2.);
315 TGeoVolume* vol_winIn_fx = new TGeoVolume("winIn_fx", winIn_fx, /*frameVolMed*/ cbm::trd::geo::GetMaterial("TRDG10"));
316 vol_winIn_fx->SetLineColor(kBlue);
317 TGeoBBox* winIn_xout = new TGeoBBox("winIn_xout", hc_size_x / 2 + 2 * WIN_FrameX_thickness, WIN_OutY_thickness / 2,
318 winIn_HC_thickness / 2.);
319 TGeoVolume* vol_winIn_xout =
320 new TGeoVolume("winIn_xout", winIn_xout, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
321 vol_winIn_xout->SetLineColor(kBlue + 2);
322
323 // framey
324 TGeoBBox* winIn_fy = new TGeoBBox("winIn_fy", WIN_FrameX_thickness / 2, hc_size_y / 2, winIn_HC_thickness / 2.);
325 TGeoVolume* vol_winIn_fy = new TGeoVolume("winIn_fy", winIn_fy, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
326 vol_winIn_fy->SetLineColor(kCyan);
327 TGeoBBox* winIn_k =
328 new TGeoBBox("winIn_k", WIN_FrameX_thickness / 2, hc_size_y / 2 + WIN_FrameY_thickness, winIn_HC_thickness / 2.);
329 TGeoVolume* vol_winIn_k = new TGeoVolume("winIn_k", winIn_k, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
330 vol_winIn_k->SetLineColor(kViolet);
331 TGeoBBox* winIn_yout =
332 new TGeoBBox("winIn_yout", WIN_OutX_thickness / 2, hc_size_y / 2 + WIN_FrameY_thickness + WIN_OutY_thickness,
333 winIn_HC_thickness / 2.);
334 TGeoVolume* vol_winIn_yout =
335 new TGeoVolume("winIn_yout", winIn_yout, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
336 vol_winIn_yout->SetLineColor(kViolet + 5);
337
338 // Add up all sub-components
339 fVol =
340 new TGeoVolume(GetName(), new TGeoBBox("", sizeX / 2, sizeY / 2, fHeight / 2), cbm::trd::geo::GetMaterial("air"));
341 fVol->SetLineColor(kOrange);
342 fVol->SetTransparency(50);
343
344 double x, y;
346 fVol->AddNode(vol_winIn_HC, 1, new TGeoTranslation("", 0., 0., fHeight));
347 y = (hc_size_y + WIN_FrameY_thickness) / 2.;
348 fVol->AddNode(vol_winIn_fx, 1, new TGeoTranslation("", 0., y, fHeight));
349 fVol->AddNode(vol_winIn_fx, 2, new TGeoTranslation("", 0., -y, fHeight));
351 fVol->AddNode(vol_winIn_xout, 1, new TGeoTranslation("", 0., y, fHeight));
352 fVol->AddNode(vol_winIn_xout, 2, new TGeoTranslation("", 0., -y, fHeight));
353 x = (hc_size_x + WIN_FrameX_thickness) / 2.;
354 fVol->AddNode(vol_winIn_fy, 1, new TGeoTranslation("", x, 0., fHeight));
355 fVol->AddNode(vol_winIn_fy, 2, new TGeoTranslation("", -x, 0., fHeight));
357 fVol->AddNode(vol_winIn_k, 1, new TGeoTranslation("", x, 0., fHeight));
358 fVol->AddNode(vol_winIn_k, 2, new TGeoTranslation("", -x, 0., fHeight));
360 fVol->AddNode(vol_winIn_yout, 1, new TGeoTranslation("", x, 0., fHeight));
361 fVol->AddNode(vol_winIn_yout, 2, new TGeoTranslation("", -x, 0., fHeight));
362
364 fVol->AddNode(vol_winIn_C, 1, new TGeoTranslation("", 0., 0., fHeight));
365 fHeight += 0.5 * winIn_C_thickness;
366 fHeight *= 2;
367 return kSUCCESS;
368}
369
370//________________________________________________________________________________________
372
374{
375 // Gas. The volume has to be defined only for pads (read-out) area. Take care in the DigiPara definition
376 TGeoBBox* gas = new TGeoBBox("trd_gas", 0.5 * activeAreaX, 0.5 * activeAreaY, 0.5 * gas_thickness);
377 TGeoVolume* vol_gas = new TGeoVolume("gas", gas, cbm::trd::geo::GetMaterial("TRDgas") /*gasVolMed*/);
378 vol_gas->SetLineColor(kRed);
379 //vol_gas->SetTransparency(80);
380 TGeoBBox* gas_ext = new TGeoBBox("trd_gas_dstr", 0.5 * activeAreaX, 0.5 * gas_extra, 0.5 * gas_thickness);
381 TGeoVolume* vol_gas_ext = new TGeoVolume("gas_ext", gas_ext, cbm::trd::geo::GetMaterial("TRDgas") /*gasVolMed*/);
382 vol_gas_ext->SetLineColor(kMagenta);
383 //vol_gas_ext->SetTransparency(80);
385
386 const double gas_size_x = activeAreaX;
387 const double gas_size_y = activeAreaY + 2 * gas_extra;
388
389 // framex
390 auto* gas_xin = new TGeoBBox("gas_xin", gas_size_x / 2 + cathode_width, WIN_OutY_thickness / 2, gas_thickness / 2.);
391 auto* vol_gas_xin = new TGeoVolume("gas_xin", gas_xin, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
392 vol_gas_xin->SetLineColor(kViolet + 5);
393 auto* gas_xout = new TGeoBBox("gas_xout", gas_size_x / 2 + cathode_width, WIN_OutY_thickness / 2,
394 (gas_thickness /*+ ridge_height*/) / 2.);
395 TGeoVolume* vol_gas_xout = new TGeoVolume("gas_xout", gas_xout, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
396 vol_gas_xout->SetLineColor(kViolet + 5);
397 // framey
398 TGeoBBox* gas_k = new TGeoBBox("gas_k", cathode_width / 2, gas_size_y / 2, ledge_thickness / 2.);
399 TGeoVolume* vol_gas_k = new TGeoVolume("gas_k", gas_k, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
400 vol_gas_k->SetLineColor(kViolet);
401 TGeoBBox* gas_a = new TGeoBBox("gas_a", anode_width / 2, gas_size_y / 2, ledge_thickness / 2.);
402 TGeoVolume* vol_gas_a = new TGeoVolume("gas_a", gas_a, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
403 vol_gas_a->SetLineColor(kViolet + 2);
404 TGeoBBox* gas_d = new TGeoBBox("gas_d", dist_width / 2, gas_size_y / 2, ledge_thickness / 2.);
405 TGeoVolume* vol_gas_d = new TGeoVolume("gas_d", gas_d, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
406 vol_gas_d->SetLineColor(kViolet + 4);
407 TGeoBBox* gas_yout = new TGeoBBox("gas_yout", WIN_OutX_thickness / 2, 2 * WIN_OutY_thickness + gas_size_y / 2,
408 (gas_thickness /*+ ridge_height*/) / 2.);
409 TGeoVolume* vol_gas_yout = new TGeoVolume("gas_yout", gas_yout, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
410 vol_gas_yout->SetLineColor(kViolet + 5);
411
412 // Add up all sub-components
413 fVol =
414 new TGeoVolume(GetName(), new TGeoBBox("", sizeX / 2, sizeY / 2, fHeight / 2), cbm::trd::geo::GetMaterial("air"));
415 fVol->SetLineColor(kYellow);
416 fVol->SetTransparency(50);
417
418 double x, y;
419 fHeight = 0.;
420 fVol->AddNode(vol_gas, 0, new TGeoTranslation("", 0., 0., fHeight));
421 x = 0.5 * (gas_size_x + cathode_width);
422 fVol->AddNode(vol_gas_k, 1, new TGeoTranslation("", x, 0., fHeight - ledge_thickness));
423 fVol->AddNode(vol_gas_k, 2, new TGeoTranslation("", -x, 0., fHeight - ledge_thickness));
424 x = 0.5 * (gas_size_x + anode_width);
425 fVol->AddNode(vol_gas_a, 1, new TGeoTranslation("", x, 0., fHeight));
426 fVol->AddNode(vol_gas_a, 2, new TGeoTranslation("", -x, 0., fHeight));
427 x = 0.5 * (gas_size_x + dist_width);
428 fVol->AddNode(vol_gas_d, 1, new TGeoTranslation("", x, 0., fHeight + ledge_thickness));
429 fVol->AddNode(vol_gas_d, 2, new TGeoTranslation("", -x, 0., fHeight + ledge_thickness));
430 x = 0.5 * gas_size_x + cathode_width + 0.5 * WIN_OutX_thickness;
431 fVol->AddNode(vol_gas_yout, 1, new TGeoTranslation("", x, 0., fHeight /* + ridge_height / 2*/));
432 fVol->AddNode(vol_gas_yout, 2, new TGeoTranslation("", -x, 0., fHeight /* + ridge_height / 2*/));
433 y = 0.5 * (activeAreaY + gas_extra);
434 fVol->AddNode(vol_gas_ext, 0, new TGeoTranslation("", 0., y, fHeight));
435 fVol->AddNode(vol_gas_ext, 1, new TGeoTranslation("", 0., -y, fHeight));
436 y += 0.5 * (gas_extra + WIN_OutY_thickness);
437 fVol->AddNode(vol_gas_xin, 1, new TGeoTranslation("", 0, y, fHeight));
438 fVol->AddNode(vol_gas_xin, 2, new TGeoTranslation("", 0, -y, fHeight));
440 fVol->AddNode(vol_gas_xout, 1, new TGeoTranslation("", 0, y, fHeight /* + ridge_height / 2*/));
441 fVol->AddNode(vol_gas_xout, 2, new TGeoTranslation("", 0, -y, fHeight /* + ridge_height / 2*/));
443 return kSUCCESS;
444}
445
446//________________________________________________________________________________________
449{
450 const double hc_size_x = activeAreaX;
451 const double hc_size_y = activeAreaY - 2 * BKP_OutY_correct;
452 const double bkp_size_x = hc_size_x + 2 * BKP_Frame_width;
453 const double bkp_size_y = hc_size_y + 2 * BKP_Frame_width;
454
455 // Pad Copper
456 TGeoBBox* pp = new TGeoBBox("pp_cu", activeAreaX / 2., activeAreaY / 2., pp_pads_thickness / 2.);
457 TGeoVolume* vol_pp = new TGeoVolume("pp_cu", pp, /*padcopperVolMed*/ cbm::trd::geo::GetMaterial("TRDcopper"));
458 vol_pp->SetLineColor(kBlue);
460
461 // Pad Plane
462 TGeoBBox* pp_PCB = new TGeoBBox("pp_pcb", bkp_size_x / 2., bkp_size_y / 2., pp_pcb_thickness / 2.);
463 TGeoVolume* vol_pp_PCB = new TGeoVolume("pp_pcb2d", pp_PCB, /*padpcbVolMed*/ cbm::trd::geo::GetMaterial("TRDG10"));
464 vol_pp_PCB->SetLineColor(kGreen);
466
467 // Perforated BackPanel structure
468 auto vol_bp = new TGeoVolumeAssembly("bkp_int");
469 auto vol_bp_ASIC = new TGeoVolumeAssembly("");
470 // HC : 3 components (HC, PCB, Cu) with 2 sizes
471 Color_t bp_col[3] = {kOrange, kGray, kRed + 2};
472 const char* matName[3] = {"TRDaramide", "TRDG10", "TRDcopper"};
473 // build one BP unit
474 double dxHC[2] = {hc_unitx / 2., (hc_unitx - hc_holex) / 4.}, dyHC[2] = {(hc_unity - hc_holey) / 4., hc_holey / 2.},
475 hHCx((hc_unitx + hc_holex) / 4.), hHCy((hc_unity + hc_holey) / 4.), hHC(0.),
477 for (int ibpz(0); ibpz < 3; ibpz++) {
478 hHC += 0.5 * hHCz[ibpz];
479 for (int ibpy(-1), jbp(0); ibpy < 2; ibpy += 2) {
480 auto bpShp = new TGeoBBox("", dxHC[0], dyHC[0], hHCz[ibpz] / 2.);
481 auto vol_cmp = new TGeoVolume("", bpShp, cbm::trd::geo::GetMaterial(matName[ibpz]));
482 vol_cmp->SetLineColor(bp_col[ibpz]);
483 vol_bp_ASIC->AddNode(vol_cmp, jbp++, new TGeoTranslation("", 0., ibpy * hHCy, hHC));
484 }
485 for (int ibpx(-1), jbp(0); ibpx < 2; ibpx += 2) {
486 auto bpShp = new TGeoBBox("", dxHC[1], dyHC[1], hHCz[ibpz] / 2.);
487 auto vol_cmp = new TGeoVolume("", bpShp, cbm::trd::geo::GetMaterial(matName[ibpz]));
488 vol_cmp->SetLineColor(bp_col[ibpz]);
489 vol_bp_ASIC->AddNode(vol_cmp, jbp++, new TGeoTranslation("", ibpx * hHCx, 0., hHC));
490 }
491 hHC += 0.5 * hHCz[ibpz];
492 }
493 // build BP plate
494 for (Int_t c(0), ifc(0); c < 9; c++) {
495 for (Int_t r(0); r < 10; r++) {
496 vol_bp->AddNode(vol_bp_ASIC, ifc++, new TGeoTranslation("", (c - 4) * hc_unitx, hc_unity * (0.5 + r), 0.));
497 vol_bp->AddNode(vol_bp_ASIC, ifc++, new TGeoTranslation("", (c - 4) * hc_unitx, -hc_unity * (r + 0.5), 0.));
498 }
499 }
500 fHeight += hHC;
501 // supports for electronics
502 TGeoBBox* faspro_fy = new TGeoBBox("faspro_fy", 1.0 / 2, 0.5 * activeAreaY, 0.5 * ChamberBuilder::FEB::FASPRO_zspace);
503 TGeoVolume* vol_faspro_fy =
504 new TGeoVolume("faspro_fy", faspro_fy, cbm::trd::geo::GetMaterial("TRDG10") /*frameVolMed*/);
505 vol_faspro_fy->SetLineColor(kViolet + 2); // vol_faspro_fy->SetTransparency(50);
507
508 // framex
509 auto xoutBd =
510 new TGeoBBox("", hc_size_x / 2, (BKP_OutY_thickness - BKP_OutY_correct) / 2, (hHC - BKP_Frame_closure) / 2.);
511 auto xvolBd = new TGeoVolume("", xoutBd, cbm::trd::geo::GetMaterial("TRDG10"));
512 auto xoutFc = new TGeoBBox("", hc_size_x / 2, (BKP_Frame_width - BKP_OutY_correct) / 2, BKP_Frame_closure / 2.);
513 auto xvolFc = new TGeoVolume("", xoutFc, cbm::trd::geo::GetMaterial("TRDG10"));
514 auto vol_bkp_xout = new TGeoVolumeAssembly("bkp_xout");
515 vol_bkp_xout->AddNode(
516 xvolFc, 1, new TGeoTranslation("", 0, (BKP_Frame_width - BKP_OutY_thickness) / 2, (BKP_Frame_closure - hHC) / 2));
517 vol_bkp_xout->AddNode(xvolBd, 1, new TGeoTranslation("", 0., 0., BKP_Frame_closure / 2));
518 vol_bkp_xout->SetLineColor(kViolet + 2);
519
520 // framey
521 auto youtBd =
522 new TGeoBBox("", BKP_OutX_thickness / 2, hc_size_y / 2 + BKP_OutY_thickness, (hHC - BKP_Frame_closure) / 2.);
523 auto yvolBd = new TGeoVolume("", youtBd, cbm::trd::geo::GetMaterial("TRDG10"));
524 auto youtFc = new TGeoBBox("", BKP_Frame_width / 2, hc_size_y / 2 + BKP_Frame_width, BKP_Frame_closure / 2.);
525 auto yvolFc = new TGeoVolume("", youtFc, cbm::trd::geo::GetMaterial("TRDG10"));
526 auto vol_bkp_yout = new TGeoVolumeAssembly("bkp_yout");
527 vol_bkp_yout->AddNode(yvolFc, 1,
528 new TGeoTranslation("t_bkp_yout_fc", (BKP_Frame_width - BKP_OutX_thickness) / 2, 0.,
529 (BKP_Frame_closure - hHC) / 2));
530 vol_bkp_yout->AddNode(yvolBd, 1, new TGeoTranslation("t_bkp_yout_bd", 0., 0., BKP_Frame_closure / 2));
531 vol_bkp_yout->SetLineColor(kViolet + 2);
532
533 // Add up all components
534 float height(fHeight);
535 fVol = new TGeoVolume(GetName(), new TGeoBBox("", bkp_size_x / 2, bkp_size_y / 2, height / 2),
537 fVol->SetLineColor(kOrange);
538 fVol->SetTransparency(50);
539
540 double x, y;
541 fHeight = -height / 2 + 0.5 * pp_pads_thickness;
542 fVol->AddNode(vol_pp, 1, new TGeoTranslation("", 0., 0., fHeight));
544 fVol->AddNode(vol_pp_PCB, 1, new TGeoTranslation("", 0., 0., fHeight));
545 fHeight += 0.5 * pp_pcb_thickness;
546 fVol->AddNode(vol_bp, 1, new TGeoTranslation("", 0., 0., fHeight));
547 fHeight += 0.5 * hHC;
548
549 x = 0.5 * (hc_size_x + BKP_OutX_thickness);
550 auto* fy_tra = new TGeoTranslation("", x, 0., fHeight);
551 fVol->AddNode(vol_bkp_yout, 1, fy_tra);
552 auto* fy_rot = new TGeoRotation();
553 fy_rot->RotateZ(180.);
554 auto* fy_mat = new TGeoHMatrix("");
555 (*fy_mat) = (*fy_rot) * (*fy_tra);
556 fVol->AddNode(vol_bkp_yout, 2, fy_mat);
557 y = 0.5 * (hc_size_y + BKP_OutY_thickness + BKP_OutY_correct);
558 fy_tra = new TGeoTranslation("", 0., y, fHeight);
559 fVol->AddNode(vol_bkp_xout, 1, fy_tra);
560 fy_mat = new TGeoHMatrix("");
561 (*fy_mat) = (*fy_rot) * (*fy_tra);
562 fVol->AddNode(vol_bkp_xout, 2, fy_mat);
564
565 int cFeb(0);
566 for (int ifeb(0); ifeb < Nfebs; ifeb++) {
567 if (ifeb % 5 != 0) continue;
568 // add support
569 fVol->AddNode(
570 vol_faspro_fy, cFeb,
571 new TGeoTranslation("", feb_pos[ifeb][0] - 0.5 * (ChamberBuilder::FEB::FASPRO_length + 0.2), 0., fHeight));
572 cFeb++;
573 }
574 fVol->AddNode(
575 vol_faspro_fy, cFeb,
576 new TGeoTranslation("", feb_pos[Nfebs - 1][0] + 0.5 * (ChamberBuilder::FEB::FASPRO_length + 0.2), 0., fHeight));
577
579 fHeight *= 2;
580
581 return kSUCCESS;
582}
583
584//________________________________________________________________________________________
586
588{
589 // Create the FASPRO FEBs out of all CU/PCB layers
590 TString scu = "", spcb = "";
591 TGeoTranslation* tr(nullptr);
592 double FASPRO_thickness(0.);
593 for (int ily(0); ily < FASPRO_Nly; ily++) {
594 // effective Cu layer thickness = h [um * 10-4] * coverage [% * 10-2]
595 double lyThickEff = FASPRO_ly_cu[ily][0] * FASPRO_ly_cu[ily][1] * 1.e-6;
596 new TGeoBBox(Form("faspro_ly%02d", ily), FASPRO_length / 2., FASPRO_width / 2., lyThickEff / 2.);
597 FASPRO_thickness += lyThickEff / 2;
598 tr = new TGeoTranslation(Form("t_faspro_ly%02d", ily), 0., 0., FASPRO_thickness);
599 tr->RegisterYourself();
600 scu += Form("%cfaspro_ly%02d:t_faspro_ly%02d", (ily ? '+' : ' '), ily, ily);
601 FASPRO_thickness += lyThickEff / 2;
602 if (ily == FASPRO_Nly - 1) break; // skip for FR4
603 // the FEB dielectric made of PCB
604 double lyThickPcb = 1.e-4 * FASPRO_ly_pcb[ily] / 2.;
605 new TGeoBBox(Form("faspro_ly%02d_pcb", ily), FASPRO_length / 2., FASPRO_width / 2., lyThickPcb);
606 FASPRO_thickness += lyThickPcb;
607 tr = new TGeoTranslation(Form("t_faspro_ly%02d_pcb", ily), 0., 0., FASPRO_thickness);
608 tr->RegisterYourself();
609 spcb += Form("%cfaspro_ly%02d_pcb:t_faspro_ly%02d_pcb", (ily ? '+' : ' '), ily, ily);
610 FASPRO_thickness += lyThickPcb;
611 }
612 for (int ihole(0); ihole < FASPRO_Nfasp; ihole++) {
613 new TGeoBBox(Form("faspro_hole%d", ihole), FASPRO_hole_x / 2., FASPRO_hole_y / 2., 1.e-4 + FASPRO_thickness / 2.);
614 tr =
615 new TGeoTranslation(Form("t_faspro_hole%d", ihole), HOLE_pos[ihole][0], HOLE_pos[ihole][1], FASPRO_thickness / 2);
616 tr->RegisterYourself();
617 scu += Form("-faspro_hole%d:t_faspro_hole%d", ihole, ihole);
618 spcb += Form("-faspro_hole%d:t_faspro_hole%d", ihole, ihole);
619 }
620 auto faspro_cu = new TGeoCompositeShape("faspro_cu", scu.Data());
621 auto vol_faspro_cu = new TGeoVolume("faspro_cu", faspro_cu, cbm::trd::geo::GetMaterial("TRDcopper"));
622 vol_faspro_cu->SetLineColor(kRed - 3); //vol_faspro_cu->SetTransparency(50);
623 auto faspro_pcb = new TGeoCompositeShape("faspro_pcb", spcb.Data());
624 auto vol_faspro_pcb = new TGeoVolume("faspro_pcb", faspro_pcb,
625 cbm::trd::geo::GetMaterial("TRDG10") /*febVolMed*/); // the FEB made of PCB
626 vol_faspro_pcb->SetLineColor(kGreen + 3);
627 //vol_faspro_pcb->SetTransparency(50);
628 fHeight = FASPRO_thickness;
629
630 // create FASP ASIC
631 auto fasp = new TGeoBBox("fasp", FASP_x / 2., FASP_y / 2., FASP_z / 2.);
632 auto vol_fasp = new TGeoVolume("fasp", fasp, cbm::trd::geo::GetMaterial("silicon"));
633 vol_fasp->SetLineColor(kBlack);
634 // create ADC ASIC
635 auto adc = new TGeoBBox("adc", ADC_x / 2., ADC_y / 2., ADC_z / 2.);
636 auto vol_adc = new TGeoVolume("adc", adc, cbm::trd::geo::GetMaterial("silicon"));
637 vol_adc->SetLineColor(kBlack);
638 // create FPGA ASIC
639 auto fpga = new TGeoBBox("fpga", FPGA_x / 2., FPGA_y / 2., FPGA_z / 2.);
640 auto vol_fpga = new TGeoVolume("fpga", fpga, cbm::trd::geo::GetMaterial("silicon"));
641 vol_fpga->SetLineColor(kBlack);
642 // create DCDC ASIC
643 auto dcdc = new TGeoBBox("dcdc", DCDC_x / 2., DCDC_y / 2., DCDC_z / 2.);
644 auto vol_dcdc = new TGeoVolume("dcdc", dcdc, cbm::trd::geo::GetMaterial("silicon"));
645 vol_dcdc->SetLineColor(kBlack);
646 // create FC Coonector
647 auto connFc = new TGeoBBox("connFc", ConnFC_x / 2., ConnFC_y / 2., ConnFC_z / 2.);
648 auto vol_conn_fc = new TGeoVolume("connFc", connFc, cbm::trd::geo::GetMaterial("polypropylene"));
649 vol_conn_fc->SetLineColor(kYellow);
650 // create BRIDGE Coonector
651 auto connBrg = new TGeoBBox("connBrg", ConnBRG_x / 2., ConnBRG_y / 2., ConnBRG_z / 2.);
652 auto vol_conn_brg = new TGeoVolume("connBrg", connBrg, cbm::trd::geo::GetMaterial("polypropylene"));
653 vol_conn_brg->SetLineColor(kYellow + 2);
654 fHeight += FASP_z;
656
657 // Init volume:
658 // FEB family FASPRO
659 // FEB type v1 (12 FASPs)
660 int fType = 1;
661 fVol = new TGeoVolume(Form("%s1%d", GetName(), fType),
662 new TGeoBBox("", FASPRO_length / 2., FASPRO_width / 2., fHeight / 2.),
664 fVol->SetLineColor(kGreen);
665 fVol->SetTransparency(50);
666
667 // Add up all components
668 double offset = -0.5 * fHeight;
669 fHeight = offset + FASP_z / 2;
670 // add FASPs on the back side of the FEB
671 //info_t infoAsic;
672 for (int ifasp(0), jfasp(0); ifasp < faspFeb[fType].nasic; ifasp++) {
673 vol_fasp->SetTitle(Form("%x", 0xff /*gDB->GetASICMask*/));
674 // if ((jfasp = WriteAsicInfo(&infoAsic)) < 0) continue;
675 fVol->AddNode(vol_fasp, jfasp, new TGeoTranslation("", FASP_pos[ifasp][0], FASP_pos[ifasp][1], fHeight));
676 }
677 fHeight += 0.5 * FASP_z;
678 fVol->AddNode(vol_faspro_cu, 1, new TGeoTranslation("", 0., 0., fHeight));
679 fVol->AddNode(vol_faspro_pcb, 1, new TGeoTranslation("", 0., 0., fHeight));
680 fHeight += FASPRO_thickness;
681
682 // add ADCs, FPGAs and DCDC converters on the tob side of the FEB
683 for (int iadc(0); iadc < FASPRO_Nadc; iadc++)
684 fVol->AddNode(vol_adc, iadc + 1, new TGeoTranslation("", ADC_pos[iadc][0], ADC_pos[iadc][1], fHeight + ADC_z / 2));
685 for (int ifpga(0); ifpga < FASPRO_Nfpga; ifpga++)
686 fVol->AddNode(vol_fpga, ifpga + 1,
687 new TGeoTranslation("", FPGA_pos[ifpga][0], FPGA_pos[ifpga][1], fHeight + FPGA_z / 2));
688 for (int idcdc(0); idcdc < FASPRO_Ndcdc; idcdc++)
689 fVol->AddNode(vol_dcdc, idcdc + 1,
690 new TGeoTranslation("", DCDC_pos[idcdc][0], DCDC_pos[idcdc][1], fHeight + DCDC_z / 2));
691 // add connectors to the FEB
692 for (int ifasp(0); ifasp < FASPRO_Nfasp; ifasp++)
693 fVol->AddNode(vol_conn_fc, ifasp + 1,
694 new TGeoTranslation("", ConnFC_pos[ifasp][0], ConnFC_pos[ifasp][1], fHeight + ConnFC_z / 2));
695 for (int iconn(0); iconn < 2; iconn++)
696 fVol->AddNode(vol_conn_brg, iconn + 1,
697 new TGeoTranslation("", ConnBRG_pos[iconn][0], ConnBRG_pos[iconn][1], fHeight + ConnBRG_z / 2));
699 fHeight -= offset;
700 return kSUCCESS;
701}
702
703
704//________________________________________________________________________________________
706
708{
709 // create BRIDGE Coonector (see also FEB::Init())
710 auto connBrg = new TGeoBBox("connBrg", ChamberBuilder::FEB::ConnBRG_x / 2., ChamberBuilder::FEB::ConnBRG_y / 2.,
712 auto vol_conn_brg = new TGeoVolume("connBrg", connBrg, cbm::trd::geo::GetMaterial("polypropylene"));
713 vol_conn_brg->SetLineColor(kYellow + 2);
714
715 // GA01 board - create
717 TGeoBBox* ga01_bd = new TGeoBBox("ga01_bd", GA01_x / 2., GA01_y / 2., GA01_z / 2.);
718 TGeoVolume* vol_ga01_bd = new TGeoVolume("ga01_bd", ga01_bd, cbm::trd::geo::GetMaterial("TRDG10"));
719 vol_ga01_bd->SetLineColor(kGreen + 7);
720 // GA01 board - create SATA connectors
721 TGeoBBox* sata_conn = new TGeoBBox("sata_conn", 0.5 * SATAx, 0.5 * SATAy, 0.5 * SATAz);
722 TGeoVolume* vol_conn_sata = new TGeoVolume("sata_conn", sata_conn, cbm::trd::geo::GetMaterial("TRDG10"));
723 vol_conn_sata->SetLineColor(kGray + 2);
724 // GA01 board - assembly
725 TGeoVolumeAssembly* ga01 = new TGeoVolumeAssembly("GA01");
726 ga01->AddNode(vol_ga01_bd, 1, new TGeoTranslation("", 0., 0., 0.5 * ga01_z - SATAz - 0.5 * GA01_z));
727 Float_t sataConnPosX[] = {2, 1.2, -1.}, sataConnPosY[] = {0, 1.5, 1};
728 for (Int_t ic(-2); ic <= 2; ic++) {
729 ga01->AddNode(vol_conn_sata, ic + 2,
730 new TGeoTranslation("", sataConnPosX[abs(ic)], (ic > 0 ? 1 : -1) * sataConnPosY[abs(ic)],
731 0.5 * ga01_z - 0.5 * SATAz));
732 }
733 ga01->AddNode(vol_conn_brg, 1,
734 new TGeoTranslation("", -0.5 * GA01_x + ChamberBuilder::FEB::ConnBRG_x, 0,
735 -0.5 * ga01_z + 0.5 * ChamberBuilder::FEB::ConnBRG_z));
736
737 // Board to Board (B2B) - create
738 TGeoBBox* b2b_bd = new TGeoBBox("b2b_bd", B2B_y / 2., B2B_x / 2., B2B_z / 2.);
739 TGeoVolume* vol_b2b_bd = new TGeoVolume("b2b_bd", b2b_bd, cbm::trd::geo::GetMaterial("TRDG10"));
740 vol_b2b_bd->SetLineColor(kGreen + 7);
741 // B2B board - assembly
743 TGeoVolumeAssembly* b2b = new TGeoVolumeAssembly("B2B");
744 b2b->AddNode(vol_b2b_bd, 1, new TGeoTranslation("", 0., 0., 0.5 * b2b_z - 0.5 * B2B_z));
745 b2b->AddNode(vol_conn_brg, 1, new TGeoTranslation("", -0.6, 0., -0.5 * b2b_z + 0.5 * ChamberBuilder::FEB::ConnBRG_z));
746 b2b->AddNode(vol_conn_brg, 2, new TGeoTranslation("", +0.6, 0., -0.5 * b2b_z + 0.5 * ChamberBuilder::FEB::ConnBRG_z));
747 // VTTX Board - create
748 float vttx_z = VTTX_z + ChamberBuilder::FEB::ConnBRG_z;
749 new TGeoBBox("vttx_bd0", VTTX_y / 2., VTTX_x / 2., VTTX_z / 2.);
750 new TGeoBBox("vttx_bd1", VTTX_y1 / 2. + 0.01, VTTX_x1 / 2. + 0.01, VTTX_z / 2. + 0.01);
751 auto tr = new TGeoTranslation("t_vttx_bd1", -0.5 * (VTTX_y - VTTX_y1), 0.5 * (VTTX_x - VTTX_x1), 0.);
752 tr->RegisterYourself();
753 new TGeoBBox("vttx_bd2", VTTX_y2 / 2. + 0.01, VTTX_x2 / 2. + 0.01, VTTX_z / 2. + 0.01);
754 tr = new TGeoTranslation("t_vttx_bd2", -0.5 * (VTTX_y - VTTX_y2), 0.5 * (VTTX_x - VTTX_x2) - VTTX_x1, 0.);
755 tr->RegisterYourself();
756 auto vttx_bd = new TGeoCompositeShape("vttx_bd", "vttx_bd0 - vttx_bd1:t_vttx_bd1 - vttx_bd2:t_vttx_bd2");
757 TGeoVolume* vol_vttx_bd = new TGeoVolume("vttx_bd", vttx_bd, cbm::trd::geo::GetMaterial("TRDG10"));
758 vol_vttx_bd->SetLineColor(kGreen + 7);
759 // VTTX board - assembly
760 TGeoVolumeAssembly* vttx = new TGeoVolumeAssembly("VTTX");
761 vttx->AddNode(vol_vttx_bd, 1, new TGeoTranslation("", 0., 0., 0.5 * vttx_z - 0.5 * VTTX_z));
762 vttx->AddNode(vol_conn_brg, 1,
763 new TGeoTranslation("", 0.5 * VTTX_y - ChamberBuilder::FEB::ConnBRG_x, 0.,
764 -0.5 * vttx_z + 0.5 * ChamberBuilder::FEB::ConnBRG_z));
765
767
768 // Init volume:
769 // FEB - AUX family FASPRO type v1 (12 FASPs)
770 fVol =
771 new TGeoVolume(GetName(), new TGeoBBox("", sizeX / 2, sizeY / 2, fHeight / 2.), cbm::trd::geo::GetMaterial("air"));
772 fVol->SetLineColor(kGreen);
773 fVol->SetTransparency(50);
774
775 int cFeb(0);
776 for (int ifeb(0), ib2b(0), ivttx(0); ifeb < Nfebs; ifeb++) {
777 cFeb = ifeb % 3;
778
779 if (cFeb > 0) // add B2B boards
780 fVol->AddNode(b2b, ib2b++,
781 new TGeoTranslation("", feb_pos[ifeb][0] - 0.5 * (ChamberBuilder::FEB::FASPRO_length + 0.2),
782 feb_pos[ifeb][1], -0.5 * fHeight + 0.5 * b2b_z));
783 if (cFeb > 1) // add VTTX boards
784 fVol->AddNode(vttx, ivttx++,
785 new TGeoTranslation(
786 "", feb_pos[ifeb][0] + 0.5 * (ChamberBuilder::FEB::FASPRO_length + 0.2) - 0.5 * VTTX_y - 0.1,
787 feb_pos[ifeb][1], -0.5 * fHeight + 0.5 * vttx_z));
788 }
789 fVol->AddNode(
790 ga01, 1,
791 new TGeoTranslation("", feb_pos[0][0] - 0.5 * (ChamberBuilder::FEB::FASPRO_length + 0.2) + 0.5 * GA01_y + 0.05,
792 feb_pos[0][1], -0.5 * fHeight + 0.5 * ga01_z));
793
794 return kSUCCESS;
795}
796
797//________________________________________________________________________________________
799
801{
802 TGeoBBox* trd_radiator = new TGeoBBox("trd_radiator", sizeX / 2., sizeY / 2., radiator_thickness / 2.);
803 fVol = new TGeoVolume("Radiator", trd_radiator, cbm::trd::geo::GetMaterial("TRDpefoam20") /*radVolMed*/);
804 fVol->SetLineColor(kRed);
805 //trdmod1_radvol->SetTransparency(50); // set transparency for the TRD radiator
806
808 return kSUCCESS;
809}
810/* clang-format off */
811// NamespaceImp(cbm::trd::geo)
820 /* clang-format on */
ClassImp(CbmConverterManager)
Helper class to convert unique channel ID back and forth.
Builder class for the TRD chamber geometry.
float Float_t
int Int_t
static uint32_t GetAddress(int32_t layerId, int32_t moduleId, int32_t sectorId, int32_t rowId, int32_t columnId)
Return address from system ID, layer, module, sector, column and row IDs.
Inner class describing the geometry of the TRD AUXILIARY boards (FEE):
virtual InitStatus Init()
Init task.
Inner class describing the back panel of composed of.
const double BKP_Frame_closure
Global width of the perimetral frame (including indentation)
const double hc_holey
dimension of flat-cable hole x-dimension (along wires)
const double BKP_OutY_thickness
outside framing
const double BKP_OutY_correct
outside framing
const double hc_holex
area opearted by one FASP 6 x 2.7 cm2
const double pp_pcb_thickness
cu coverage of PP PCB
const double cu_pcb_thickness
dimension of flat-cable hole x-dimension (along wires)
const double hc_unity
area opearted by one FASP 6 x 2.7 cm2
const double BKP_OutX_thickness
Perimetral frame indentation.
const double hc_unitx
Honneycomb backpanel support thickness.
const double hc_thickness
PP support PCB thickness.
const double BKP_Frame_width
Electric shield Cu covarage thickness.
const double cu_thickness
Electric shield PCB support thickness.
static const char * fgName[(int) eGeoPart::kNparts]
Component(const char *name)
Constructor of the TRD chamber component. It links the chamber class.
Inner class describing the geometry of the TRD Front End Electronics (FEE):
const double FPGA_pos[FASPRO_Nfpga][2]
const double FASPRO_ly_cu[FASPRO_Nly][2]
static constexpr double FASPRO_width
length of FASP FEBs in cm
static constexpr double FASPRO_length
gap size between boards
virtual InitStatus Init()
Init task.
const double DCDC_pos[FASPRO_Ndcdc][2]
const double ConnFC_pos[FASPRO_Nfasp][2]
const double FASPRO_ly_pcb[FASPRO_Nly - 1]
static constexpr double ConnBRG_pos[2][2]
const double FASP_pos[FASPRO_Nfasp][2]
const double ADC_pos[FASPRO_Nadc][2]
const double HOLE_pos[FASPRO_Nfasp][2]
static constexpr double FASPRO_zspace
virtual InitStatus Init()
Init task.
virtual InitStatus Init()
Init task.
const double ledge_thickness
closure to pad-plane dimension
const double gas_thickness
extra volume of gas parallel to wires
const double WIN_OutX_thickness
distance from anode to PP
const double WIN_OutY_thickness
outside framing
const double cathode_width
ledge thickness supporting A/K wires
const double WIN_FrameX_thickness
9mm HC structure
const double WIN_OutY_thickness
outside framing at win 3.5x9 mm2
const double WIN_FrameY_thickness
entrance window framing 5x9 mm2
Window()
Constructor of entrance window for the TRD chamber.
const double WIN_OutX_thickness
entrance window framing 5x9 mm2
const double winIn_HC_thickness
100um C foil + 25um KaptonAl
virtual InitStatus Init()
Init task.
Generic Chamber builder.
array< Component *,(int) eGeoPart::kNparts > fComponent
chamber type [1, 3, 5, 7]
ChamberBuilder(int typ=1)
Constructor for the chamber. Adds all elements according to config.
short fChmbTyp
bit map of the setter flags
virtual void Exec(Option_t *)
Executed task.
static constexpr double feb_pos[Nfebs][2]
static const int Nfebs
list of chamber component builders
virtual InitStatus Init()
Init task.
const TGeoMedium * GetMaterial(const char *mname)
material mapping (name, value)
bool ReadModuleInfo(const char *modTxt, info_t &info)
Identify information related to the module encrypted in the geoManager path. Based on legacy function...
bool ReadFebInfo(const char *febTxt, info_t &info)
Identify information related to one FEB encrypted in the geoManager path.
int WriteFebInfo(info_t *info)
Put up information related to the FEB and store it in the geoManager path.
static double sizeX
static double sizeY
int WriteModuleInfo(info_t *info)
Put up information related to the module and store it in the geoManager path. Based on legacy version...
static double activeAreaY
static map< const string, const TGeoMedium * > fMaterial
active area
static double activeAreaX
total area
static constexpr FEB faspFeb[2]
Definition CbmTrdDefs.h:158
@ k1d
rectangular 1D case
Definition CbmTrdDefs.h:27
@ k2d
triangular 2D case
Definition CbmTrdDefs.h:29
@ kSpadic
SPADIC type definition.
Definition CbmTrdDefs.h:19
@ kFasp
FASP ASIC definition.
Definition CbmTrdDefs.h:21
void SetPP(uint16_t config, bool twod=true)
Define the pad-plane type of the chamber.
void SetFEE(uint16_t config, bool fasp=true)
Define the read-out FEE type of the module.
Information to be storred in the geoManager path. Based on legacy class CbmTrdGeoHandler.
int id
global addressing of element
int type
global (wrt setup) id of element
int superType
version of element wrt superType family
int superId
local (wrt installation) id of element
int rotation
global type wrt TRD design