diff --git a/compact/ecal.xml b/compact/ecal.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ab9ced0eeb2ec5ec626a65b97337adbc55b7f5b --- /dev/null +++ b/compact/ecal.xml @@ -0,0 +1,182 @@ +<lccdd> + + <define> + <constant name="CrystalEndcap_rmin" value="VertexTrackerInnerRadius"/> + <constant name="CrystalEndcap_rmax" value="EcalEndcapN_rmin"/> + <constant name="CrystalBox_x_length" value="20.0*mm"/> + <constant name="CrystalBox_y_length" value="20.0*mm"/> + <constant name="CrystalBox_z_length" value="200.0*mm"/> + <constant name="CrystalBox_offset" value="0.000001*mm"/> + <constant name="CrystalEndcap_x_pos" value="0.0*m"/> + <constant name="CrystalEndcap_y_pos" value="0.0*m"/> + <constant name="CrystalEndcap_z_pos" value="-EcalEndcap_zmin"/> + </define> + + <limits> + </limits> + + <regions> + </regions> + + <!-- Common Generic visualization attributes --> + <comment>Common Generic visualization attributes</comment> + <display> + </display> + + <detectors> + + <comment> + --------------------- + Barrel EM Calorimeter + --------------------- + A layered EM calorimeter with tungsten and silicon (or scintillator) strips + </comment> + <detector + id="ECalBarrel_ID" + name="EcalBarrel" + type="DD4hep_EcalBarrel" + readout="EcalBarrelHits" + calorimeterType="EM_BARREL"> + <dimensions + numsides="CaloSides" + rmin="EcalBarrel_rmin" + z="EcalBarrelLength"/> + <staves vis="EcalBarrelVis"/> + <layer repeat="1"> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalBarrelThinLayers"> + <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalBarrelThickLayers"> + <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + </detector> + + <comment> + ----------------------------- + Forward Endcap EM Calorimeter + ----------------------------- + A layered EM calorimeter with tungsten and silicon (or scintillator) strips + </comment> + <detector id="ECalEndcapP_ID" + name="EcalEndcapP" + type="DD4hep_PolyhedraEndcapCalorimeter2" + reflect="false" + readout="EcalEndcapHits" + vis="EcalEndcapVis" + calorimeterType="EM_ENDCAP" > + <dimensions + numsides="CaloSides" + zmin="EcalEndcap_zmin" + rmin="EcalEndcapP_rmin" + rmax="EcalBarrel_rmax " /> + <layer repeat="1"> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapThinLayers"> + <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapThickLayers"> + <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + </detector> + + + <comment> + ------------------------------- + Backwards Endcap EM Calorimeter + ------------------------------- + A layered EM calorimeter with tungsten and silicon (or scintillator) strips + </comment> + <detector id="ECalEndcapN_ID" + name="EcalEndcapN" + type="topside_PolyhedraEndcapCalorimeter2" + reflect="true" + readout="EcalEndcapHits" + vis="EcalEndcapVis" + calorimeterType="EM_ENDCAP"> + <dimensions + numsides="CaloSides" + zmin="EcalEndcap_zmin" + rmin="EcalEndcapN_rmin" + rmax="EcalBarrel_rmax " /> + <layer repeat="1"> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapThinLayers"> + <slice material="TungstenDens24" thickness="EcalThinTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + <layer repeat="EcalEndcapThickLayers"> + <slice material="TungstenDens24" thickness="EcalThickTungstenThickness"/> + <slice material="Air" thickness="EcalAir2Thickness"/> + <slice material="Silicon" thickness="EcalSiliconThickness" sensitive="yes" limits="cal_limits"/> + <slice material="Copper" thickness="EcalCopperThickness"/> + <slice material="Kapton" thickness="EcalKaptonThickness"/> + <slice material="Air" thickness="EcalAir1Thickness"/> + </layer> + </detector> + </detectors> + + <!-- Definition of the readout segmentation/definition --> + <readouts> + <!-- + <readout name="PlaneTrackerHits"> + <segmentation type="CartesianGridXY" grid_size_x="20.0*mm" grid_size_y="20.0*mm" /> + <id>system:5,module:4,x:32:-16,y:-16</id> + </readout> + --> + <readout name="CrystalEcalHits"> + <segmentation type="CartesianGridXY" grid_size_x="CrystalBox_x_length" grid_size_y="CrystalBox_y_length" /> + <id>system:8,sector:4,module:20,x:48:-8,y:-8</id> + </readout> + <readout name="EcalBarrelHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/> + <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> + </readout> + <readout name="EcalEndcapHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.5 * mm" grid_size_y="3.5 * mm"/> + <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> + </readout> + </readouts> + + <plugins> + </plugins> + +<fields> +</fields> +</lccdd> diff --git a/src/cb_EMCAL.cpp b/src/cb_EMCAL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c54e4b1f076b225c7f405c32c3d60c443c63a212 --- /dev/null +++ b/src/cb_EMCAL.cpp @@ -0,0 +1,103 @@ +#include <XML/Helper.h> + +using namespace dd4hep; + +static Ref_t createDetector(Detector& desc, xml_h handle, SensitiveDetector sens) { + xml::DetElement detElem = handle; + std::string detName = detElem.nameStr(); + int detID = detElem.id(); + + xml::Component dims = detElem.dimensions(); + double rInner = dims.inner_radius(); + double rMin = dims.rmin(); + double thickness = dims.thickness(); + double innerZ = dims.inner_z(); + double angle = dims.angle(); + + Material mat = desc.material(detElem.materialStr()); + + Tube outerTubeShape(rMin, rInner + thickness, innerZ + thickness); + Tube innerTubeShape(0, rInner, innerZ); + SubtractionSolid unchamferedShape(outerTubeShape, innerTubeShape); + Cone chamferShape(thickness, 0, rMin, 0, rMin + 2 * tan(angle) * thickness); + SubtractionSolid detShape(unchamferedShape, chamferShape, Position(0, 0, innerZ + thickness)); + Volume detVol(detName, detShape, mat); + + detVol.setVisAttributes(desc.visAttributes(detElem.visStr())); + + DetElement det(detName, detID); + Volume motherVol = desc.pickMotherVolume(det); + PlacedVolume detPV = motherVol.placeVolume(detVol); + det.setPlacement(detPV); + return det; + + +//struct cb_EMCAL_Config +//{ +// double RIn; +// double ROut; +// double ROutshift = 5 * cm; +// double Thickness = 40 * cm; +// double SizeZ; +//}; +// +// +//class cb_EMCAL_Design +//{ +//public: +// inline void Construct(cb_EMCAL_Config cfg, cb_Solenoid_Config cfgsolenoid, G4Material *worldMaterial, G4VPhysicalVolume *motherVolume) +// { +// spdlog::debug("Begin cb_EMCAL volume \n"); +// +// ConstructionConfig = cfg; +// +// //........................EMCAL Barrel detector---------------------------------------------- +// +// // working +// +// // G4double EMCALB_R_cone[4]={cb_EMCAL_GVol_RIn, cb_EMCAL_GVol_ROut, cb_EMCAL_GVol_ROut, cb_EMCAL_GVol_RIn }; +// // G4double cb_EMCAL_GVol_ConeZ[4]={ -SizeZ/2, -SizeZ/2+60*cm, SizeZ/2-60*cm, SizeZ/2}; +// +// +// double coneROut[4] = {cfg.ROut, cfg.ROut, cfg.ROut, cfg.ROut}; +// double coneRIn[4] = {cfg.ROut - 1. * cm, cfg.RIn, cfg.RIn, cfg.ROut - 1. * cm}; +// double coneZ[4] = {-cfgsolenoid.SizeZ / 2, -cfgsolenoid.SizeZ / 2 + 30 * cm, cfgsolenoid.SizeZ / 2 - 30 * cm, cfgsolenoid.SizeZ / 2}; +// +// Solid = new G4Polycone("cb_EMCAL_GVol_Solid", 0. * deg, 360. * deg, 4, coneZ, coneRIn, coneROut); +// Logic = new G4LogicalVolume(Solid, worldMaterial, "cb_EMCAL_GVol_Logic"); +// Phys = new G4PVPlacement(0, G4ThreeVector(), "cb_EMCAL_GVol_Phys", Logic, motherVolume, false, 0); +// +// +// G4VisAttributes *visAttr = new G4VisAttributes(G4Color(0.3, 0.5, 0.9, 1.)); +// visAttr->SetLineWidth(1); +// visAttr->SetForceSolid(false); +// Logic->SetVisAttributes(visAttr); +// } +// +// +// inline void ConstructBars() +// { +// // Setting material +// cb_EMCAL_det_Material = fMat->GetMaterial("PbWO4"); +// Logic->SetMaterial(cb_EMCAL_det_Material); +// +// // Visualising it differently +// auto visualAttributes = new G4VisAttributes(G4Color(0.3, 0.5, 0.9, 1.)); +// visualAttributes->SetLineWidth(1); +// visualAttributes->SetForceSolid(true); +// Logic->SetVisAttributes(visualAttributes); +// // fPhysicsEMCAL = new G4PVPlacement(0, G4ThreeVector(0,0,-40*cm), "EMCALbSolPhys",fLogicEMCAL, +// // cb_EMCAL_GVol_Phys, false, 0 ); +// } +// +// G4Polycone *Solid; //pointer to the solid +// G4LogicalVolume *Logic; //pointer to the logical +// G4VPhysicalVolume *Phys; //pointer to the physical +// +// /// Parameters that was used in the moment of construction +// cb_EMCAL_Config ConstructionConfig; + +} + +// clang-format off +DECLARE_DETELEMENT(cb_EMCAL, createDetector)