__all__ = ["getLArBarrelCfg"]
import os
from CaloCell.CaloDefs import Detector, CaloSampling
from GaugiKernel.constants import m,cm,mm,MeV,pi
from .Calorimeter import Calorimeter
from .PhysicalVolume import PhysicalVolume, Plates
from .SensitiveDetector import SensitiveDetector
[docs]
def getLArBarrelCfg():
"""
Defines the geometry and readout configuration for the Liquid Argon (LAr) Barrel Calorimeter.
Constructs the physical volumes (PreSampler, Back, Middle, Strips) and assigns
readout parameters such as pulse shapes, noise levels, and Optimal Filter weights.
Returns:
List[Calorimeter]: A list of configured Calorimeter detector objects for the LAr Barrel.
"""
basepath = os.environ['LORENZETTI_GEOMETRY_DATA_DIR']
# ECal
ecal_barrel_start = 0*m
ecal_barrel_end = 3.4*m
ecal_barrel_z = (ecal_barrel_start + ecal_barrel_end) * 2
psb_pv = PhysicalVolume( Name = "LAr::PSB",
Plates = Plates.Horizontal, # Logical type
AbsorberMaterial = "Vacuum", # absorber
GapMaterial = "liquidArgon", # gap
NofLayers = 1, # layers
AbsorberThickness = 0.01*mm, # abso
GapThickness = 1.1*cm, # gap
RMin = 146*cm, # radio min,
RMax = 146*cm + 1*(0.01*mm + 1.1*cm), # radio max
ZSize = ecal_barrel_z ,# z (3.4 left and 3.4 right)
X=0,Y=0,Z=0, # x,y,z (center in 0,0,0)
# Visualization
Visualization = True,
Color = 'orange'
)
emb1_pv = PhysicalVolume( Name = "LAr::EMB1",
Plates = Plates.Horizontal, # Logical type
AbsorberMaterial = "G4_Pb", # absorber
GapMaterial = "liquidArgon", # gap
NofLayers = 16, # layers
AbsorberThickness = 1.51*mm, # abso
GapThickness = 4.49*mm, # gap
RMin = 150*cm, # radio min,
RMax = 150*cm + 16*(1.51*mm + 4.49*mm), # radio max
ZSize = ecal_barrel_z ,# z (3.4 left and 3.4 right)
X=0,Y=0,Z=0, # x,y,z (center in 0,0,0)
Visualization = True,
Color = 'aquamarine'
)
emb2_pv = PhysicalVolume( Name = "LAr::EMB2",
Plates = Plates.Horizontal, # Logical type
AbsorberMaterial = "G4_Pb", # absorber
GapMaterial = "liquidArgon", # gap
NofLayers = 55, # layers
AbsorberThickness = 1.7*mm, # abso
GapThickness = 4.3*mm, # gap
RMin = emb1_pv.RMax, # radio min,
RMax = emb1_pv.RMax + 55*(1.7*mm + 4.3*mm), # radio max
ZSize = ecal_barrel_z ,# z (3.4 left and 3.4 right)
X=0,Y=0,Z=0, # x,y,z (center in 0,0,0)
Visualization = True,
Color = 'cornflowerblue'
)
emb3_pv = PhysicalVolume( Name = "LAr::EMB3",
Plates = Plates.Horizontal, # Logical type
AbsorberMaterial = "G4_Pb", # absorber
GapMaterial = "liquidArgon", # gap
NofLayers = 9, # layers
AbsorberThickness = 1.7*mm, # abso
GapThickness = 4.3*mm, # gap
RMin = emb2_pv.RMax, # radio min,
RMax = emb2_pv.RMax + 9*(1.7*mm + 4.3*mm), # radio max
ZSize = ecal_barrel_z ,# z (3.4 left and 3.4 right)
X=0,Y=0,Z=0, # x,y,z (center in 0,0,0)
Visualization = True,
Color = 'cyan'
)
psb_sv = SensitiveDetector( psb_pv , DeltaEta = 0.025 , DeltaPhi = pi/32 )
emb1_sv = SensitiveDetector( emb1_pv, DeltaEta = 0.00325, DeltaPhi = pi/32 )
emb2_sv = SensitiveDetector( emb2_pv, DeltaEta = 0.025 , DeltaPhi = pi/128 )
emb3_sv = SensitiveDetector( emb3_pv, DeltaEta = 0.050 , DeltaPhi = pi/128 )
# Configure the electronic frontend and the detector parameters
psb_det = Calorimeter( psb_sv, -21, 3, -2, # sensitive volume, bunch start, bunch end, sampling start,
CollectionKey = "Collection_PSB", # collection key
Detector = Detector.TTEM, # detector type
Sampling = CaloSampling.PSB, # sampling type
Shaper = basepath + "/pulseLar.dat", # pulse shaper
Noise = 90*MeV, # electronic noise
Samples = 5, # how many samples
OFWeightsEnergy = [-0.0000853580, 0.265132, 0.594162, 0.389505, 0.124353], # optimal filter parameters for energy estimation
OFWeightsTime = [-0.0000853580, -12.870312690734863, -27.39136505126953, 8.075883865356445, 13.768877029418945] # EMB1 ATLAS sample to test (fake first number to add to 5)
)
# Configure the electronic frontend and the detector parameters
emb1_det = Calorimeter( emb1_sv, -21, 3, -2, # sensitive volume, bunch start, bunch end, sampling start,
CollectionKey = "Collection_EMB1", # collection key
Detector = Detector.TTEM, # detector type
Sampling = CaloSampling.EMB1, # sampling type
Shaper = basepath + "/pulseLar.dat", # pulse shaper
Noise = 26*MeV, # electronic noise
Samples = 5, # how many samples
OFWeightsEnergy = [-0.0000853580, 0.265132, 0.594162, 0.389505, 0.124353], # optimal filter parameters for energy estimation
OFWeightsTime = [-0.0000853580, -12.870312690734863, -27.39136505126953, 8.075883865356445, 13.768877029418945] # EMB1 ATLAS sample to test (fake first number to add to 5)
)
# Configure the electronic frontend and the detector parameters
emb2_det = Calorimeter( emb2_sv, -21, 3, -2, # sensitive volume, bunch start, bunch end, sampling start,
CollectionKey = "Collection_EMB2", # collection key
Detector = Detector.TTEM, # detector type
Sampling = CaloSampling.EMB2, # sampling type
Shaper = basepath + "/pulseLar.dat", # pulse shaper
Noise = 60*MeV, # electronic noise
Samples = 5, # how many samples
OFWeightsEnergy = [-0.0000853580, 0.265132, 0.594162, 0.389505, 0.124353], # optimal filter parameters for energy estimation
OFWeightsTime = [-0.0000853580, -12.870312690734863, -27.39136505126953, 8.075883865356445, 13.768877029418945] # EMB1 ATLAS sample to test (fake first number to add to 5)
)
# Configure the electronic frontend and the detector parameters
emb3_det = Calorimeter( emb3_sv, -21, 3, -2, # sensitive volume, bunch start, bunch end, sampling start,
CollectionKey = "Collection_EMB3", # collection key
Detector = Detector.TTEM, # detector type
Sampling = CaloSampling.EMB3, # sampling type
Shaper = basepath + "/pulseLar.dat", # pulse shaper
Noise = 40*MeV, # electronic noise
Samples = 5, # how many samples
OFWeightsEnergy = [-0.0000853580, 0.265132, 0.594162, 0.389505, 0.124353], # optimal filter parameters for energy estimation
OFWeightsTime = [-0.0000853580, -12.870312690734863, -27.39136505126953, 8.075883865356445, 13.768877029418945] # EMB1 ATLAS sample to test (fake first number to add to 5)
)
return [psb_det, emb1_det, emb2_det, emb3_det]