Skip to content
Snippets Groups Projects
Commit 76028957 authored by Jihee Kim's avatar Jihee Kim Committed by Sylvester Joosten
Browse files

Resolve "Update on ZDC EMCAL"

parent c9f939aa
No related branches found
No related tags found
1 merge request!87Resolve "Update on ZDC EMCAL"
Pipeline #25093 failed
......@@ -26,6 +26,7 @@ dd4hep_add_plugin(${a_lib_name}
src/IP6BeamPipe.cpp
src/magnetVacuumFF.cpp
src/OffMomentumTracker_geo.cpp
src/ZeroDegreeCalorimeterEcalWSciFi_geo.cpp
src/ZeroDegreeCalorimeterEcal_geo.cpp
src/ZeroDegreeCalorimeterSampling_geo.cpp
USES ActsCore ActsPluginDD4hep ROOT::Core ROOT::Gdml
......
<lccdd>
<comment>
//////////////////////////////////////////////////
// Far Forward Ion Zero Degree Calorimeter
// W power + SciFi for Ecal
//////////////////////////////////////////////////
</comment>
<define>
<constant name="ffi_ZDC_ECAL_FiberRadius" value="0.235*mm"/>
<constant name="ffi_ZDC_ECAL_FiberOffset" value="0.5*mm"/>
<constant name="ffi_ZDC_ECAL_FiberSpaceX" value="0.265*mm"/>
<constant name="ffi_ZDC_ECAL_FiberSpaceY" value="0.425*mm"/>
</define>
<detectors>
<detector id="ffi_ZDC_ECAL_ID"
name="ffi_ZDC_ECAL"
type="ZDCEcalScFiCalorimeter"
vis="ffi_ZDC_ECAL_Vis"
readout="ffi_ZDC_ECAL_Hits">
<position x="ffi_ZDC_ECAL_x_pos" y="ffi_ZDC_ECAL_y_pos" z="ffi_ZDC_ECAL_z_pos"/>
<rotation x="ffi_ZDC_ECAL_rotateX_angle" y="ffi_ZDC_ECAL_rotateY_angle" z="ffi_ZDC_ECAL_rotateZ_angle"/>
<dimensions x="ffi_ZDC_ECAL_width" z="ffi_ZDC_ECAL_length"/>
<module sizex="25*mm" sizey="25*mm" sizez="170*mm" material="WSciFi_UCLA_Abs" vis="ffi_ZDC_ECAL_module_Vis">
<fiber material="PlasticScint"
radius="ffi_ZDC_ECAL_FiberRadius"
offset="ffi_ZDC_ECAL_FiberOffset"
spacex="ffi_ZDC_ECAL_FiberSpaceX"
spacey="ffi_ZDC_ECAL_FiberSpaceY"/>
</module>
</detector>
</detectors>
<readouts>
<readout name="ffi_ZDC_ECAL_Hits">
<segmentation type="NoSegmentation"/>
<id>system:8,module:28,fiber_x:8,fiber_y:8</id>
</readout>
</readouts>
</lccdd>
......@@ -11,55 +11,26 @@
<position x="ffi_ZDC_HCAL_x_pos" y="ffi_ZDC_HCAL_y_pos" z="ffi_ZDC_HCAL_z_pos"/>
<rotation x="ffi_ZDC_HCAL_rotateX_angle" y="ffi_ZDC_HCAL_rotateY_angle" z="ffi_ZDC_HCAL_rotateZ_angle"/>
<dimensions x="ffi_ZDC_HCAL_width" z="ffi_ZDC_HCAL_length"/>
<layer repeat="ffi_ZDC_Gap_NRepeat">
<slice name="Gap_slice" material="Air" thickness="ffi_ZDC_Gap_Thickness" vis="InvisibleNoDaughters"/>
</layer>
<layer repeat="ffi_ZDC_PbScint_NRepeat">
<slice name="Lead_slice" material="Pb" thickness="ffi_ZDC_Lead_Thickness" vis="BlueGreenVis"/>
<slice name="Scint_slice" material="ZDC_Scintillator" thickness="ffi_ZDC_Scint_Thickness" vis="AnlOrange" sensitive="true"/>
<slice name="Air_4_slice" material="Air" thickness="ffi_ZDC_Air_4_Thickness" vis="InvisibleNoDaughters"/>
</layer>
<layer repeat="ffi_ZDC_SiPb_NRepeat">
<slice name="Lead_slice" material="Pb" thickness="ffi_ZDC_Lead_Thickness" vis="BlueGreenVis"/>
<slice name="Glue_1_slice" material="ZDC_EpoxyGlue" thickness="ffi_ZDC_Glue_1_Thickness" vis="AnlGold"/>
<slice name="Silicon_2_slice" material="Silicon" thickness="ffi_ZDC_Silicon_2_Thickness" vis="RedVis" sensitive="true"/>
<slice name="Glue_2_slice" material="ZDC_EpoxyGlue" thickness="ffi_ZDC_Glue_2_Thickness" vis="AnlGold"/>
<slice name="FPC_slice" material="ZDC_EpoxyGlue" thickness="ffi_ZDC_FPC_Thickness" vis="AnlGold"/>
<slice name="Air_3_slice" material="Air" thickness="ffi_ZDC_Air_3_Thickness" vis="InvisibleNoDaughters"/>
</layer>
<layer repeat="ffi_ZDC_Gap_NRepeat">
<slice name="Gap_slice" material="Air" thickness="ffi_ZDC_Gap_Thickness" vis="InvisibleNoDaughters"/>
</layer>
<layer repeat="ffi_ZDC_PbScint_NRepeat">
<slice name="Lead_slice" material="Pb" thickness="ffi_ZDC_Lead_Thickness" vis="BlueGreenVis"/>
<slice name="Lead_slice" material="Pb" thickness="ffi_ZDC_Lead_Thickness" vis="AnlGray"/>
<slice name="Scint_slice" material="ZDC_Scintillator" thickness="ffi_ZDC_Scint_Thickness" vis="AnlOrange" sensitive="true"/>
<slice name="Air_4_slice" material="Air" thickness="ffi_ZDC_Air_4_Thickness" vis="InvisibleNoDaughters"/>
<slice name="Air_4_slice" material="Air" thickness="ffi_ZDC_Air_4_Thickness" vis="InvisibleNoDaughters"/>
</layer>
</detector>
</detectors>
<define>
<constant name="ZDC_HCAL_PbScint1Min_index" value="1 + ffi_ZDC_Gap_NRepeat" />
<constant name="ZDC_HCAL_PbScint1Max_index" value="ZDC_HCAL_PbScint1Min_index + ffi_ZDC_PbScint_NRepeat - 1" />
<constant name="ZDC_HCAL_SiPbMin_index" value="ZDC_HCAL_PbScint1Max_index + 1" />
<constant name="ZDC_HCAL_SiPbMax_index" value="ZDC_HCAL_SiPbMin_index + ffi_ZDC_SiPb_NRepeat - 1" />
<constant name="ZDC_HCAL_PbScint2Min_index" value="1 + ZDC_HCAL_SiPbMin_index + ffi_ZDC_Gap_NRepeat" />
<constant name="ZDC_HCAL_PbScint2Max_index" value="ZDC_HCAL_PbScint2Min_index + ffi_ZDC_PbScint_NRepeat - 1" />
<constant name="ZDC_HCAL_PbScintMin_index" value="1" />
<constant name="ZDC_HCAL_PbScintMax_index" value="ZDC_HCAL_PbScintMin_index + ffi_ZDC_PbScint_NRepeat - 1" />
</define>
<readouts>
<readout name="ffi_ZDC_HCAL_Hits">
<segmentation type="MultiSegmentation" key="layer">
<segmentation name="Si_LG_grid" type="CartesianGridXY" key_min="ZDC_HCAL_SiPbMin_index" key_max="ZDC_HCAL_SiPbMax_index" grid_size_x="1.0*cm" grid_size_y="1.0*cm"/>
<segmentation name="Scint_grid" type="CartesianGridXY" key_min="ZDC_HCAL_PbScint1Min_index" key_max="ZDC_HCAL_PbScint1Max_index" grid_size_x="10.0*cm" grid_size_y="10.0*cm"/>
<segmentation name="Scint_grid" type="CartesianGridXY" key_min="ZDC_HCAL_PbScint2Min_index" key_max="ZDC_HCAL_PbScint2Max_index" grid_size_x="10.0*cm" grid_size_y="10.0*cm"/>
<segmentation name="Scint_grid" type="CartesianGridXY" key_min="ZDC_HCAL_PbScintMin_index" key_max="ZDC_HCAL_PbScintMax_index" grid_size_x="10.0*cm" grid_size_y="10.0*cm"/>
</segmentation>
<hits_collections>
<hits_collection name="ffiZDCScintHits" key="layer" key_min="ZDC_HCAL_PbScint1Min_index" key_max="ZDC_HCAL_PbScint1Max_index"/>
<hits_collection name="ffiZDCSiPbHits" key="layer" key_min="ZDC_HCAL_SiPbMin_index" key_max="ZDC_HCAL_SiPbMax_index"/>
<hits_collection name="ffiZDCScintHits" key="layer" key_min="ZDC_HCAL_PbScint2Min_index" key_max="ZDC_HCAL_PbScint2Max_index"/>
<hits_collection name="ffiZDCPbScintHits" key="layer" key_min="ZDC_HCAL_PbScintMin_index" key_max="ZDC_HCAL_PbScintMax_index"/>
</hits_collections>
<id>system:8,layer:12,slice:12,x:32:-16,y:-16</id>
</readout>
......
......@@ -40,7 +40,8 @@
<constant name="ffi_ZDC_Air_2_Thickness" value="3.0 * cm"/>
<constant name="ffi_ZDC_ECAL_layer_thickness" value="ffi_ZDC_Silicon_1_Thickness + ffi_ZDC_Glue_1_Thickness + ffi_ZDC_FPC_Thickness + ffi_ZDC_Air_1_Thickness + ffi_ZDC_WSciFi_Thickness + ffi_ZDC_Air_2_Thickness"/>
<constant name="ffi_ZDC_ECAL_length" value="ffi_ZDC_SiWSciFi_NRepeat * ffi_ZDC_ECAL_layer_thickness"/>
<!--<constant name="ffi_ZDC_ECAL_length" value="ffi_ZDC_SiWSciFi_NRepeat * ffi_ZDC_ECAL_layer_thickness"/>-->
<constant name="ffi_ZDC_ECAL_length" value="170.0 * mm"/>
<comment>
-------------------------------
......@@ -56,9 +57,9 @@
<constant name="ffi_ZDC_HCAL_width" value="ffi_ZDC_width"/>
<constant name="ffi_ZDC_HCAL_length" value="ffi_ZDC_length"/>
<constant name="ffi_ZDC_SiPb_NRepeat" value="2"/> <!-- changed from 12 -->
<constant name="ffi_ZDC_PbScint_NRepeat" value="19"/>
<constant name="ffi_ZDC_Gap_NRepeat" value="1"/>
<constant name="ffi_ZDC_SiPb_NRepeat" value="0"/> <!-- changed from 12 -->
<constant name="ffi_ZDC_PbScint_NRepeat" value="35"/>
<constant name="ffi_ZDC_Gap_NRepeat" value="0"/>
<constant name="ffi_ZDC_Silicon_2_Thickness" value="320.0 * um"/>
<constant name="ffi_ZDC_Tungsten_Thickness" value="3.5 * mm"/>
......@@ -79,7 +80,7 @@
<display>
</display>
<include ref="far_forward_ZDC_Ecal.xml"/>
<include ref="far_forward_ZDC_Ecal_WSciFi.xml"/>
<include ref="far_forward_ZDC_Hcal.xml"/>
<detectors>
......
......@@ -44,12 +44,12 @@
<comment>
Old visualization code that should be integrated in the new color scheme
ZDC visualization
</comment>
<vis name="ffi_ZDC_ECAL_Vis" alpha="0.1" r= "0.1" g="0.0" b="1.0" showDaughters="true" visible="true"/>
<vis name="ffi_ZDC_ECAL_module_Vis" alpha="1.0" r= "0.1" g="1.0" b="0.9" showDaughters="true" visible="true"/>
<vis name="ffi_ZDC_HCAL_Vis" alpha="0.1" r= "0.1" g="0.0" b="1.0" showDaughters="true" visible="true"/>
<vis name="ffi_ZDC_ECAL_Vis" ref="AnlGreen" showDaughters="true" visible="true"/>
<vis name="ffi_ZDC_ECAL_module_Vis" ref="AnlRed" showDaughters="false" visible="true"/>
<vis name="ffi_ZDC_HCAL_Vis" ref="AnlBlue" showDaughters="true" visible="true"/>
<comment>
Deprecated color scheme
......
......@@ -214,4 +214,9 @@
<composite n="0.009" ref="H"/>
<composite n="0.041" ref="C"/>
</material>
<material name="WSciFi_UCLA_Abs">
<D type="density" value="12.4" unit="g / cm3"/>
<fraction n="0.96" ref="W"/>
<fraction n="0.04" ref="Polystyrene"/>
</material>
</materials>
#include "DDRec/Surface.h"
#include "DDRec/DetectorData.h"
#include "DD4hep/OpticalSurfaces.h"
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"
#include <XML/Helper.h>
#include <iostream>
#include <algorithm>
#include <tuple>
#include <math.h>
//////////////////////////////////////////////////
// Far Forward Ion Zero Degree Calorimeter - Ecal
// Reference from ATHENA ScFiCalorimeter_geo.cpp
//////////////////////////////////////////////////
using namespace std;
using namespace dd4hep;
// main
static Ref_t create_detector(Detector& desc, xml::Handle_t handle, SensitiveDetector sens)
{
xml::DetElement detElem = handle;
std::string detName = detElem.nameStr();
int detID = detElem.id();
DetElement det(detName, detID);
sens.setType("calorimeter");
auto dim = detElem.dimensions();
auto width = dim.x();
auto length = dim.z();
xml_dim_t pos = detElem.position();
xml_dim_t rot = detElem.rotation();
// envelope
Box envShape(width * 0.5, width * 0.5, length * 0.5);
Volume env(detName + "_envelope", envShape, desc.material("Air"));
env.setVisAttributes(desc.visAttributes(detElem.visStr()));
// build module
xml_comp_t mod_x = detElem.child(_Unicode(module));
auto sx = mod_x.attr<double>(_Unicode(sizex));
auto sy = mod_x.attr<double>(_Unicode(sizey));
auto sz = mod_x.attr<double>(_Unicode(sizez));
Box modShape(sx/2., sy/2., sz/2.);
auto modMat = desc.material(mod_x.attr<std::string>(_Unicode(material)));
Volume modVol("module_vol", modShape, modMat);
modVol.setVisAttributes(desc.visAttributes(mod_x.visStr()));
//modVol.setSensitiveDetector(sens);
if (mod_x.hasChild("fiber")) {
auto fiber_x = mod_x.child(_Unicode(fiber));
auto fr = fiber_x.attr<double>(_Unicode(radius));
auto fsx = fiber_x.attr<double>(_Unicode(spacex));
auto fsy = fiber_x.attr<double>(_Unicode(spacey));
auto foff = dd4hep::getAttrOrDefault<double>(fiber_x, _Unicode(offset), 0.5*mm);
auto fiberMat = desc.material(fiber_x.attr<std::string>(_Unicode(material)));
Tube fiberShape(0., fr, sz/2. - 1.*mm);
Volume fiberVol("fiber_vol", fiberShape, fiberMat);
fiberVol.setSensitiveDetector(sens);
// Fibers are placed in a honeycomb with the radius = sqrt(3)/2. * hexagon side length
// So each fiber is fully contained in a regular hexagon, which are placed as
// the parameters space x and space y are used to add additional spaces between the hexagons
double fside = 2. / std::sqrt(3.) * fr;
double fdistx = 2. * fside + fsx;
double fdisty = 2. * fr + fsy;
// maximum numbers of the fibers, help narrow the loop range
int nx = int(sx / (2.*fr)) + 1;
int ny = int(sy / (2.*fr)) + 1;
// place the fibers
double y0 = (foff + fside);
int nfibers = 0;
for (int iy = 0; iy < ny; ++iy) {
double y = y0 + fdisty * iy;
// about to touch the boundary
if ((sy - y) < y0) { break; }
double x0 = (iy % 2) ? (foff + fside) : (foff + fside + fdistx / 2.);
for (int ix = 0; ix < nx; ++ix) {
double x = x0 + fdistx * ix;
// about to touch the boundary
if ((sx - x) < x0) { break; }
auto fiberPV = modVol.placeVolume(fiberVol, nfibers++, Position{x - sx/2., y - sy/2., 0});
fiberPV.addPhysVolID("fiber_x", ix + 1).addPhysVolID("fiber_y", iy + 1);
}
}
// if no fibers we make the module itself sensitive
} else {
modVol.setSensitiveDetector(sens);
}
// Module Position
double mod_x_pos = 0.0;
double mod_y_pos = 0.0;
double mod_z_pos = 0.0 * mm;
double mgap = sx/100.; // 0.000001 * mm;
int mNTowers = floor(width / (sx+mgap));
//std::cout << "mNTowers: " << mNTowers << std::endl;
int k = 0;
// Place Modules
for (int j=0; j < mNTowers; j++)
{
if (j == 0)
mod_y_pos = width * 0.5 - (sy + mgap) * 0.5;
else
mod_y_pos -= (sy + mgap);
for (int i=0; i < mNTowers; i++)
{
if (i == 0)
mod_x_pos = width * 0.5 - (sx + mgap) * 0.5;
else
mod_x_pos -= (sx + mgap);
PlacedVolume pv_mod = env.placeVolume(modVol, Position(mod_x_pos,mod_y_pos,mod_z_pos));
pv_mod.addPhysVolID("module",k++);
//std::cout << "j: " << j << "i: " << i << " Position: " << mod_x_pos << " " << mod_y_pos << " " << mod_z_pos << std::endl;
}
}
// detector position and rotation
Volume motherVol = desc.pickMotherVolume(det);
Transform3D tr(RotationZYX(rot.z(), -rot.y(), rot.x()), Position(pos.x(), pos.y(), pos.z()));
PlacedVolume envPV = motherVol.placeVolume(env, tr);
envPV.addPhysVolID("system", detID);
det.setPlacement(envPV);
return det;
}
DECLARE_DETELEMENT(ZDCEcalScFiCalorimeter, create_detector)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment