9#include "FairGeoBuilder.h"
10#include "FairGeoInterface.h"
11#include "FairGeoLoader.h"
12#include "FairGeoMedia.h"
13#include "FairGeoNode.h"
14#include "FairGeoVolume.h"
15#include "FairRootManager.h"
17#include "FairRuntimeDb.h"
18#include "FairVolume.h"
23#include "TClonesArray.h"
25#include "TGeoCompositeShape.h"
26#include "TGeoManager.h"
27#include "TGeoMaterial.h"
28#include "TGeoMedium.h"
29#include "TGeoShapeAssembly.h"
34#include "TVirtualMC.h"
47 if (gMC->IsTrackEntering()) {
49 fTime = gMC->TrackTime() * 1.0e09;
51 gMC->TrackPosition(
fPos);
52 gMC->TrackMomentum(
fMom);
59 if (gMC->IsTrackExiting() || gMC->IsTrackStop() ||
60 gMC->IsTrackDisappeared()) {
62 fTrackID = gMC->GetStack()->GetCurrentTrackNumber();
64 gMC->CurrentVolID(detID);
70 TParticle* p = gMC->GetStack()->GetCurrentTrack();
71 Int_t pdgCode = p->GetPdgCode();
87 Double_t ActiveECAL_gas_gap,
88 Double_t first_precision_layer,
89 Double_t second_precision_layer,
90 Double_t third_precision_layer,
91 Double_t num_precision_layers) {
102 Double_t ActiveHCALThickness,
103 Double_t FilterECALThickness,
104 Double_t FilterECALThickness_first,
105 Double_t FilterHCALThickness,
106 Double_t ActiveECAL_gas_Thickness) {
115 Double_t ActiveHCALMaterial,
116 Double_t FilterECALMaterial,
117 Double_t FilterHCALMaterial) {
125 Double_t ActiveHCAL) {
150 TGeoVolume* top = gGeoManager->GetTopVolume();
151 TGeoVolume* tSplitCal =
new TGeoVolumeAssembly(
"SplitCalDetector");
159 TGeoMedium* A2 = gGeoManager->GetMedium(
"iron");
160 TGeoMedium* A3 = gGeoManager->GetMedium(
"lead");
161 TGeoMedium* A4 = gGeoManager->GetMedium(
"GEMmixture");
162 TGeoMedium* A1 = gGeoManager->GetMedium(
"Scintillator");
164 Double_t zStartSplitCal =
fZStart;
166 TGeoVolume* newECALfilter_first;
167 TGeoVolume* newECALfilter;
168 TGeoVolume* newECALdet_gas;
169 TGeoVolume* stripGivingX;
170 TGeoVolume* stripGivingY;
172 TGeoVolume* newHCALfilter[100];
173 TGeoVolume* newHCALdet[100];
174 const char* char_labelHCALfilter[100];
175 TString labelHCALfilter;
176 const char* char_labelHCALdet[100];
177 TString labelHCALdet;
179 Double_t z_splitcal = 0;
183 newECALfilter_first = gGeoManager->MakeBox(
185 newECALfilter_first->SetLineColor(kGray);
186 newECALfilter = gGeoManager->MakeBox(
"ECALfilter", A3,
fXMax,
fYMax,
188 newECALfilter->SetLineColor(kGray);
193 stripGivingX->SetVisibility(kTRUE);
194 AddSensitiveVolume(stripGivingX);
195 stripGivingX->SetLineColor(kGreen);
200 stripGivingY->SetVisibility(kTRUE);
201 AddSensitiveVolume(stripGivingY);
202 stripGivingY->SetLineColor(kGreen);
205 newECALdet_gas = gGeoManager->MakeBox(
"ECALdet_gas", A4,
fXMax,
fYMax,
207 AddSensitiveVolume(newECALdet_gas);
208 newECALdet_gas->SetLineColor(kRed);
211 for (Int_t i_nlayECAL = 0; i_nlayECAL <
fnECALSamplings; i_nlayECAL++) {
214 if (i_nlayECAL == 0) {
216 tSplitCal->AddNode(newECALfilter_first, i_nlayECAL * 1e5,
217 new TGeoTranslation(0, 0, z_splitcal));
221 tSplitCal->AddNode(newECALfilter, i_nlayECAL * 1e5,
222 new TGeoTranslation(0, 0, z_splitcal));
229 if (i_nlayECAL == 7) z_splitcal +=
fBigGap;
237 tSplitCal->AddNode(newECALdet_gas, 1e8 + (i_nlayECAL + 1) * 1e5,
238 new TGeoTranslation(0, 0, z_splitcal));
243 tSplitCal->AddNode(newECALdet_gas, 1e8 + (i_nlayECAL + 1) * 1e5,
244 new TGeoTranslation(0, 0, z_splitcal));
250 if (i_nlayECAL % 2 == 0) {
255 int index = (i_nlayECAL + 1) * 1e5 + (mx + 1) * 1e4 +
256 (my + 1) * 1e3 + j + 1;
268 new TGeoTranslation(xCoordinate, yCoordinate, z_splitcal));
279 int index = (i_nlayECAL + 1) * 1e5 + (mx + 1) * 1e4 +
280 (my + 1) * 1e3 + j + 1;
292 new TGeoTranslation(xCoordinate, yCoordinate, z_splitcal));
304 for (Int_t i_nlayHCAL = 0; i_nlayHCAL < 1; i_nlayHCAL++) {
305 labelHCALfilter =
"HCALfilter_";
306 labelHCALfilter += i_nlayHCAL;
307 char_labelHCALfilter[i_nlayHCAL] = labelHCALfilter;
308 labelHCALdet =
"HCAL_det";
309 labelHCALdet += i_nlayHCAL;
310 char_labelHCALdet[i_nlayHCAL] = labelHCALdet;
311 newHCALfilter[i_nlayHCAL] =
312 gGeoManager->MakeBox(char_labelHCALfilter[i_nlayHCAL], A2,
fXMax,
fYMax,
315 newHCALdet[i_nlayHCAL] =
316 gGeoManager->MakeBox(char_labelHCALdet[i_nlayHCAL], A4,
fXMax,
fYMax,
319 AddSensitiveVolume(newHCALdet[i_nlayHCAL]);
321 newHCALdet[i_nlayHCAL]->SetLineColor(kRed);
323 newHCALfilter[i_nlayHCAL]->SetLineColor(kBlue);
325 for (Int_t i_nlayHCAL = 0; i_nlayHCAL <
fnHCALSamplings; i_nlayHCAL++) {
327 tSplitCal->AddNode(newHCALfilter[i_nlayHCAL], 1,
328 new TGeoTranslation(0, 0, z_splitcal));
333 tSplitCal->AddNode(newHCALdet[i_nlayHCAL], 1,
334 new TGeoTranslation(0, 0, z_splitcal));
339 TGeoShapeAssembly* asmb =
340 dynamic_cast<TGeoShapeAssembly*
>(tSplitCal->GetShape());
341 Double_t totLength = asmb->GetDZ();
342 top->AddNode(tSplitCal, 1,
343 new TGeoTranslation(0, 0, zStartSplitCal + totLength));
Int_t fTrackID
event index
Int_t fVolumeID
track index
TLorentzVector fPos
volume id
Double_t fTime
momentum at entrance
splitcalPoint * AddHit(Args &&... args)
TLorentzVector fMom
position at entrance
void SetStripSize(Double_t stripHalfWidth, Double_t stripHalfLength)
Double_t fFilterHCALThickness
Double_t fnum_precision_layers
Double_t fActiveHCALThickness
Bool_t ProcessHits(FairVolume *v=0) override
Double_t fFilterECALThickness_first
Double_t fActiveECALThickness
Double_t fFilterHCALMaterial
void SetNModules(Int_t nModulesInX, Int_t nModulesInY)
Double_t fActiveHCALMaterial
Double_t fthird_precision_layer
void SetXMax(Double_t xMax)
void SetZStart(Double_t ZStart)
void ConstructGeometry() override
void SetNSamplings(Int_t nECALSamplings, Int_t nHCALSamplings, Double_t ActiveHCAL)
void SetYMax(Double_t yMax)
void SetThickness(Double_t ActiveECALThickness, Double_t ActiveHCALThickness, Double_t FilterECALThickness, Double_t FilterECALThickness_first, Double_t FilterHCALThickness, Double_t ActiveECAL_gas_Thickness)
Double_t fFilterECALMaterial
Double_t fActiveECAL_gas_gap
Double_t fActiveECAL_gas_Thickness
Double_t fActiveECALMaterial
Double_t fStripHalfLength
void SetNStrips(Int_t nStrips)
Double_t fsecond_precision_layer
Double_t ffirst_precision_layer
Double_t fFilterECALThickness
void SetEmpty(Double_t Empty, Double_t BigGap, Double_t ActiveECAL_gas_gap, Double_t first_precision_layer, Double_t second_precision_layer, Double_t third_precision_layer, Double_t num_precision_layers)
void SetMaterial(Double_t ActiveECALMaterial, Double_t ActiveHCALMaterial, Double_t FilterECALMaterial, Double_t FilterHCALMaterial)
Int_t InitMedium(const char *name)