10from ShipGeoConfig
import AttrDict
15def configure_snd_old(yaml_file: str, emulsion_target_z_end, cave_floorHeightMuonShield) ->
None:
16 with open(yaml_file)
as file:
17 config = yaml.safe_load(file)
18 nuTarget_geo =
AttrDict(config[
"nuTarget"])
19 nuTauTT_geo =
AttrDict(config[
"nuTauTT"])
24 nuTauTT_geo.n_hor_planes * nuTauTT_geo.scifimat_width + 2.9 * u.cm
27 nuTauTT_geo.n_vert_planes * nuTauTT_geo.scifimat_width + 2.9
30 snd_nuTauTT_TTZ = 2 * nuTauTT_geo.support_z + 2 * nuTauTT_geo.scifimat_z + nuTauTT_geo.honeycomb_z
34 nuTarget_geo.n_plates * nuTarget_geo.LeadTh
35 + (nuTarget_geo.n_plates + 1) * (2 * nuTarget_geo.EmTh + nuTarget_geo.PBTh)
36 + nuTarget_geo.BrPackZ
38 snd_nuTarget_BrX = nuTarget_geo.BrPackX + nuTarget_geo.EmX
39 snd_nuTarget_BrY = nuTarget_geo.BrPackY + nuTarget_geo.EmY
41 snd_nuTarget_zdim = nuTarget_geo.wall * snd_nuTarget_BrZ + (nuTarget_geo.wall + 1) * snd_nuTauTT_TTZ
42 snd_nuTarget_xdim = snd_nuTauTT_TTX
43 snd_nuTarget_ydim = snd_nuTauTT_TTY
45 snd_nuTarget_zC = emulsion_target_z_end - snd_nuTarget_zdim / 2.0
47 snd_nuTarget_PillarY = (
48 10 * u.m - snd_nuTarget_ydim / 2 - nuTarget_geo.BaseY - 0.1 * u.mm - cave_floorHeightMuonShield
50 NuTauTarget = ROOT.Target(
"NuTauTarget", nuTarget_geo.Ydist, ROOT.kTRUE)
51 NuTauTarget.MakeNuTargetPassive(nuTarget_geo.nuTargetPassive)
52 NuTauTarget.MergeTopBot(nuTarget_geo.SingleEmFilm)
53 NuTauTarget.SetDetectorDesign(nuTarget_geo.Design)
54 NuTauTarget.SetCenterZ(snd_nuTarget_zC)
55 NuTauTarget.SetNumberBricks(
60 NuTauTarget.SetDetectorDimension(
65 NuTauTarget.SetTargetWallDimension(
66 nuTarget_geo.col * snd_nuTarget_BrX,
67 nuTarget_geo.row * snd_nuTarget_BrY + (nuTarget_geo.row - 1) * nuTarget_geo.Ydist,
70 NuTauTarget.SetEmulsionParam(
75 2 * nuTarget_geo.EmTh + nuTarget_geo.PBTh,
77 nuTarget_geo.LeadTh + 2 * nuTarget_geo.EmTh + nuTarget_geo.PBTh,
79 NuTauTarget.SetBrickParam(
86 nuTarget_geo.n_plates,
88 NuTauTarget.SetCellParam(snd_nuTarget_BrZ)
89 NuTauTarget.SetPillarDimension(nuTarget_geo.PillarX, snd_nuTarget_PillarY, nuTarget_geo.PillarZ)
90 NuTauTarget.SetBaseDimension(snd_nuTarget_xdim + 20, nuTarget_geo.BaseY, snd_nuTarget_zdim + 10)
92 NuTauTT = ROOT.TargetTracker(
99 NuTauTT.SetDesign(nuTauTT_geo.design)
100 NuTauTT.SetSciFiParam(
101 nuTauTT_geo.scifimat_width,
104 nuTauTT_geo.scifimat_z,
105 nuTauTT_geo.support_z,
106 nuTauTT_geo.honeycomb_z,
108 NuTauTT.SetNumberSciFi(nuTauTT_geo.n_hor_planes, nuTauTT_geo.n_vert_planes)
109 NuTauTT.SetTargetTrackerParam(snd_nuTauTT_TTX, snd_nuTauTT_TTY, snd_nuTauTT_TTZ)
110 NuTauTT.SetBrickParam(snd_nuTarget_BrZ)
111 NuTauTT.SetTotZDimension(snd_nuTarget_zdim)
112 NuTauTT.SetNumberTT(nuTarget_geo.wall + 1)
114 NuTauTarget.SetTTzdimension(snd_nuTauTT_TTZ)
116 detectorList.append(NuTauTarget)
117 detectorList.append(NuTauTT)
121 with open(yaml_file)
as file:
122 config = yaml.safe_load(file)
124 ship_geo.mtc_geo =
AttrDict(config[
"MTC"])
126 if ship_geo.mtc_geo.zPosition ==
"auto":
129 ship_geo.mtc_geo.ironThick + ship_geo.mtc_geo.sciFiThick + ship_geo.mtc_geo.scintThick
130 ) * ship_geo.mtc_geo.nLayers
131 ship_geo.mtc_geo.zPosition = ship_geo.muShield.Entrance[-1] + mtc_total_length / 2
132 mtc = ROOT.MTCDetector(
"MTC", ROOT.kTRUE)
133 mtc.SetMTCParameters(
134 ship_geo.mtc_geo.width,
135 ship_geo.mtc_geo.height,
136 ship_geo.mtc_geo.angle,
137 ship_geo.mtc_geo.ironThick,
138 ship_geo.mtc_geo.sciFiThick,
139 ship_geo.mtc_geo.num_of_agg_channels,
140 ship_geo.mtc_geo.scint_cell_size,
141 ship_geo.mtc_geo.scintThick,
142 ship_geo.mtc_geo.nLayers,
143 ship_geo.mtc_geo.zPosition,
144 ship_geo.mtc_geo.fieldY,
146 detectorList.append(mtc)
150 with open(yaml_file)
as file:
151 config = yaml.safe_load(file)
153 ship_geo.SiliconTarget_geo =
AttrDict(config[
"SiliconTarget"])
155 if ship_geo.SiliconTarget_geo.zPosition ==
"auto":
159 SiliconTarget_total_length = ship_geo.SiliconTarget_geo.targetSpacing * ship_geo.SiliconTarget_geo.nLayers
160 ship_geo.SiliconTarget_geo.zPosition = (
161 ship_geo.muShield.Entrance[-1] - ship_geo.muShield.Zgap[-1] - SiliconTarget_total_length / 2
163 print(
"SiliconTarget zPosition set to ", ship_geo.SiliconTarget_geo.zPosition)
164 SiliconTarget = ROOT.SiliconTarget(
"SiliconTarget", ROOT.kTRUE)
166 ship_geo.SiliconTarget_geo.targetWidth,
167 ship_geo.SiliconTarget_geo.targetHeight,
168 ship_geo.SiliconTarget_geo.sensorWidth,
169 ship_geo.SiliconTarget_geo.sensorLength,
170 ship_geo.SiliconTarget_geo.nLayers,
171 ship_geo.SiliconTarget_geo.zPosition,
172 ship_geo.SiliconTarget_geo.targetThickness,
173 ship_geo.SiliconTarget_geo.targetSpacing,
174 ship_geo.SiliconTarget_geo.moduleOffset,
176 detectorList.append(SiliconTarget)
180 with open(yaml_file)
as file:
181 config = yaml.safe_load(file)
186 Veto.SetVesselDimensions(
187 veto_geo.xstartInner,
189 veto_geo.ystartInner,
194 Veto.SetLiquidVeto(1)
196 Veto.SetVesselStructure(
197 veto_geo.innerSupport,
198 veto_geo.sensitiveThickness,
199 veto_geo.outerSupport,
200 veto_geo.innerSupportMed,
201 veto_geo.lidThickness,
202 veto_geo.sensitiveMed,
203 veto_geo.outerSupportMed,
208 detectorList.append(Veto)
212 with open(yaml_file)
as file:
213 config = yaml.safe_load(file)
215 ship_geo.strawtubes_geo =
AttrDict(config[
"SST"])
218 ship_geo.strawtubes_geo.medium =
"vacuums" if ship_geo.DecayVolumeMedium ==
"vacuums" else "air"
221 if ship_geo.strawDesign == 4:
222 ship_geo.strawtubes_geo.frame_material =
"aluminium"
223 elif ship_geo.strawDesign == 10:
224 ship_geo.strawtubes_geo.frame_material =
"steel"
226 strawtubes = ROOT.strawtubes(ship_geo.strawtubes_geo.medium)
228 ship_geo.TrackStation1.z,
229 ship_geo.TrackStation2.z,
230 ship_geo.TrackStation3.z,
231 ship_geo.TrackStation4.z,
234 ship_geo.strawtubes_geo.width,
235 ship_geo.strawtubes_geo.height,
238 ship_geo.strawtubes_geo.outer_straw_diameter,
239 ship_geo.strawtubes_geo.wall_thickness,
242 ship_geo.strawtubes_geo.straw_pitch,
243 ship_geo.strawtubes_geo.y_layer_offset,
251 ship_geo.strawtubes_geo.station_width,
252 ship_geo.strawtubes_geo.station_height,
253 ship_geo.strawtubes_geo.station_length,
258 ship_geo.strawtubesDigi.v_drift,
259 ship_geo.strawtubesDigi.sigma_spatial,
262 detectorList.append(strawtubes)
267 if not hasattr(ship_geo,
"DecayVolumeMedium"):
268 raise ValueError(
"DecayVolumeMedium is not defined, possibly old (incompatible) geometry!")
269 if not hasattr(ship_geo,
"muShieldGeo"):
270 ship_geo.muShieldGeo =
None
271 if not hasattr(ship_geo.Bfield,
"x"):
272 ship_geo.Bfield.x = 3.0 * u.m
273 if not hasattr(ship_geo,
"cave"):
274 ship_geo.cave =
AttrDict(z=0 * u.cm)
275 ship_geo.cave.floorHeightMuonShield = 5 * u.m
276 ship_geo.cave.floorHeightTankA = 4.5 * u.m
277 ship_geo.cave.floorHeightTankB = 2.0 * u.m
278 if not hasattr(ship_geo,
"SND"):
282 run.SetMaterials(
"media.geo")
286 cave = ROOT.ShipCave(ship_geo.muShield.z)
287 cave.SetGeometryFileName(
"caveWithAir.geo")
288 detectorList.append(cave)
290 TargetStation = ROOT.ShipTargetStation(
292 ship_geo.target.length,
298 TargetStation.SetLayerPosMat(
299 ship_geo.target.xy, ship_geo.target.slices_length, ship_geo.target.slices_gap, ship_geo.target.slices_material
301 detectorList.append(TargetStation)
305 for design
in ship_geo.SND_design:
308 configure_snd_mtc(os.path.join(os.environ[
"FAIRSHIP"],
"geometry",
"MTC_config.yaml"), ship_geo)
310 os.path.join(os.environ[
"FAIRSHIP"],
"geometry",
"SiliconTarget_config.yaml"), ship_geo
314 os.path.join(os.environ[
"FAIRSHIP"],
"geometry",
"snd_config_old.yaml"),
315 ship_geo.UpstreamTagger.Z_Position
318 ship_geo.cave.floorHeightMuonShield,
321 print(f
"Warning: SND design {design} is not recognized.")
323 in_params = list(ship_geo.muShield.params)
325 MuonShield = ROOT.ShipMuonShield(
328 ship_geo.muShield.WithConstField,
334 if 2
in getattr(ship_geo,
"SND_design", []):
335 MuonShield.SetSNDSpace(
337 hole_dx=(ship_geo.mtc_geo.width + 5.0 * u.cm) / 2.0,
338 hole_dy=(ship_geo.mtc_geo.height + 5.0 * u.cm) / 2.0,
340 detectorList.append(MuonShield)
342 if not hasattr(ship_geo,
"magnetDesign"):
344 ship_geo.magnetDesign = 4
345 ship_geo.Bfield.YokeWidth = 200.0 * u.cm
346 ship_geo.Bfield.YokeDepth = 200.0 * u.cm
347 ship_geo.Bfield.CoilThick = 25.0 * u.cm
348 if ship_geo.strawDesign > 1:
349 if ship_geo.magnetDesign > 3:
351 magnet = ROOT.ShipMagnet(
355 ship_geo.magnetDesign,
358 ship_geo.cave.floorHeightTankB,
365 magnet = ROOT.ShipMagnet(
369 ship_geo.magnetDesign,
372 ship_geo.cave.floorHeightTankB,
375 magnet = ROOT.ShipMagnet(
"Magnet",
"SHiP Magnet", ship_geo.Bfield.z)
376 detectorList.append(magnet)
378 fairship = os.environ[
"FAIRSHIP"]
381 os.path.join(fairship, f
"geometry/veto_config_{ship_geo.DecayVolumeMedium}.yaml"),
382 ship_geo.decayVolume.z0,
386 os.path.join(os.environ[
"FAIRSHIP"],
"geometry",
"strawtubes_config.yaml"),
390 if ship_geo.EcalOption == 2:
391 SplitCal = ROOT.splitcal(
"SplitCal", ROOT.kTRUE)
392 x = ship_geo.SplitCal
393 SplitCal.SetThickness(
394 x.ActiveECALThickness,
395 x.ActiveHCALThickness,
396 x.FilterECALThickness,
397 x.FilterECALThickness_first,
398 x.FilterHCALThickness,
399 x.ActiveECAL_gas_Thickness,
401 SplitCal.SetMaterial(
402 x.ActiveECALMaterial,
403 x.ActiveHCALMaterial,
404 x.FilterECALMaterial,
405 x.FilterHCALMaterial,
407 SplitCal.SetNSamplings(x.nECALSamplings, x.nHCALSamplings, x.ActiveHCAL)
408 SplitCal.SetZStart(x.ZStart)
409 SplitCal.SetXMax(x.XMax)
410 SplitCal.SetYMax(x.YMax)
414 x.ActiveECAL_gas_gap,
415 x.first_precision_layer,
416 x.second_precision_layer,
417 x.third_precision_layer,
418 x.num_precision_layers,
420 SplitCal.SetNModules(x.NModulesInX, x.NModulesInY)
421 SplitCal.SetNStrips(x.NStripsPerModule)
422 SplitCal.SetStripSize(x.StripHalfWidth, x.StripHalfLength)
423 detectorList.append(SplitCal)
425 upstreamTagger = ROOT.UpstreamTagger(
"UpstreamTagger", ROOT.kTRUE)
426 upstreamTagger.SetZposition(ship_geo.UpstreamTagger.Z_Position)
427 upstreamTagger.SetBoxDimensions(
428 ship_geo.UpstreamTagger.BoxX, ship_geo.UpstreamTagger.BoxY, ship_geo.UpstreamTagger.BoxZ
430 detectorList.append(upstreamTagger)
432 timeDet = ROOT.TimeDet(
"TimeDet", ROOT.kTRUE)
433 timeDet.SetZposition(ship_geo.TimeDet.z)
434 timeDet.SetBarZspacing(ship_geo.TimeDet.dzBarRow, ship_geo.TimeDet.dzBarCol)
435 timeDet.SetBarZ(ship_geo.TimeDet.zBar)
436 timeDet.SetSizeX(2 * ship_geo.TimeDet.DX)
437 timeDet.SetSizeY(2 * ship_geo.TimeDet.DY)
438 detectorList.append(timeDet)
441 if not hasattr(ship_geo.Bfield,
"fieldMap"):
442 if ship_geo.strawDesign == 4
or ship_geo.strawDesign == 10:
443 fMagField = ROOT.ShipBellField(
448 ship_geo.Yheight / 2.0 * u.m,
451 fMagField = ROOT.ShipBellField(
456 ship_geo.Yheight / 2.0 * u.m,
458 run.SetField(fMagField)
464 for x
in detectorList:
465 if x.GetName()
in exclusionList:
470 for x
in run.GetListOfModules():
471 detElements[x.GetName()] = x
void SetSiliconTargetParameters(Double_t targetWidth, Double_t targetHeight, Double_t sensorWidth, Double_t sensorLength, Int_t nLayers, Double_t zPosition, Double_t targetThickness, Double_t targetSpacing, Double_t moduleOffset)
void SetDeltazView(Double_t delta_z_view)
void SetStrawResolution(Double_t a, Double_t b)
void SetDeltazLayer(Double_t delta_z_layer)
void SetStrawDiameter(Double_t outer_straw_diameter, Double_t wall_thickness)
void SetzPositions(Double_t z1, Double_t z2, Double_t z3, Double_t z4)
void SetStrawPitch(Double_t straw_pitch, Double_t layer_offset)
void SetFrameMaterial(TString frame_material)
void SetStereoAngle(Double_t stereo_angle)
void SetWireThickness(Double_t wire_thickness)
void SetApertureArea(Double_t width, Double_t height)
void SetStationEnvelope(Double_t x, Double_t y, Double_t z)
None configure_strawtubes(str yaml_file, ship_geo)
None configure_snd_old(str yaml_file, emulsion_target_z_end, cave_floorHeightMuonShield)
None configure_veto(str yaml_file, z0)
None configure_snd_siliconTarget(str yaml_file, ship_geo)
None configure_snd_mtc(str yaml_file, ship_geo)
def configure(run, ship_geo)
int open(const char *, int)
Opens a file descriptor.