Skip to content
Snippets Groups Projects
Commit 235a4c2a authored by Marshall Scott's avatar Marshall Scott
Browse files

Resolve "ZDC sampling detector"

parent 5af8f344
No related branches found
No related tags found
1 merge request!59Resolve "ZDC sampling detector"
Pipeline #10950 failed
...@@ -284,7 +284,9 @@ ...@@ -284,7 +284,9 @@
<constant name="ForwardRomanPotC_ID" value="157"/> <constant name="ForwardRomanPotC_ID" value="157"/>
<constant name="ForwardOffMTracker_ID" value="159"/> <constant name="ForwardOffMTracker_ID" value="159"/>
<constant name="ffi_ZDC_ID" value="160"/> <constant name="ffi_ZDC_ID" value="160"/>
<constant name="ffi_ZDC_HCAL_ID" value="161"/>
<comment> <comment>
===================================== =====================================
...@@ -654,7 +656,7 @@ ...@@ -654,7 +656,7 @@
<comment> Global parameters </comment> <comment> Global parameters </comment>
<constant name="ffi_ZDC_width" value="60.0 * cm"/> <constant name="ffi_ZDC_width" value="60.0 * cm"/>
<constant name="ffi_ZDC_thickness" value="200.0 * cm"/> <constant name="ffi_ZDC_thickness" value="61.0 * cm"/><comment> Changed from 200.0 cm </comment>
<comment> Original Global parameters </comment> <comment> Original Global parameters </comment>
<!-- <!--
<constant name="ffi_ZDC_thickness" value="250.0 * cm"/> <constant name="ffi_ZDC_thickness" value="250.0 * cm"/>
...@@ -670,6 +672,21 @@ ...@@ -670,6 +672,21 @@
<constant name="ffi_ZDC_ECAL_ntower" value="20"/> <constant name="ffi_ZDC_ECAL_ntower" value="20"/>
--> -->
<comment> ZDC HCAL parameters </comment>
<constant name="ffi_ZDC_HCAL_CrossingAngle" value="0.020*rad"/>
<constant name="ffi_ZDC_HCAL_tracker_region_zmax" value="5*m"/>
<constant name="ffi_ZDC_HCAL_tracker_region_rmax" value="5*m"/>
<constant name="ffi_ZDC_HCAL_offset" value="5.0*mm"/>
<constant name="ffi_ZDC_HCAL_st_length" value="20.0*mm"/>
<constant name="ffi_ZDC_HCAL_lt_length" value="ffi_ZDC_width"/><comment> Changed from 40.0mm </comment>
<constant name="ffi_ZDC_HCAL_st_x_pos" value="0.60*m"/>
<constant name="ffi_ZDC_HCAL_st_y_pos" value="0.0*m"/>
<constant name="ffi_ZDC_HCAL_st_z_pos" value="ffi_ZDC_z_pos + ffi_ZDC_ECAL_thickness + 1*cm"/> <comment> Was 34 m, changed to be placed right after ZDC(The ecal) </comment>
<constant name="ffi_ZDC_HCAL_lt_x_pos" value="ffi_ZDC_x_pos"/>
<constant name="ffi_ZDC_HCAL_lt_y_pos" value="ffi_ZDC_y_pos"/>
<constant name="ffi_ZDC_HCAL_lt_z_pos" value="ffi_ZDC_z_pos + ffi_ZDC_ECAL_thickness + 1*cm"/> <comment> Was 34 m, changed to be placed right after ZDC(The ecal) </comment>
<comment> <comment>
----------------------- -----------------------
Gaseous RICH Parameters Gaseous RICH Parameters
......
<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
<!-- Some information about detector -->
<info name="ZDC" title="Zero Degree Calorimeter"
author="Marshall Scott"
url="https://eicweb.phy.anl.gov/EIC/detectors/reference_detector.git"
status="development"
version="v1 2021-04-20">
<comment>Zero Degree Calorimeter detector</comment>
<comment>Copied from https://eicweb.phy.anl.gov/EIC/NPDet/-/blob/master/src/detectors/calorimeters/compact/ZDC_example.xml</comment>
</info>
<!-- Use DD4hep elements and materials definitions -->
<includes>
</includes>
<define>
</define>
<limits>
</limits>
<regions>
</regions>
<display>
</display>
<!-- Define detector -->
<detectors>
<detector id="ffi_ZDC_HCAL_ID" name="largeZDC" type="ffi_ZDC_HCAL" readout="ZDCHits" vis="RedVis">
<position x="ffi_ZDC_HCAL_lt_x_pos" y="ffi_ZDC_HCAL_lt_y_pos" z="ffi_ZDC_HCAL_lt_z_pos"/>
<dimensions x = "ffi_ZDC_HCAL_lt_length" y = "ffi_ZDC_HCAL_lt_length"/>
<layer repeat="2">
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
</layer>
<layer repeat="1">
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
<slice name="SciFi_belt" material="PlasticScint" thickness="1*mm" vis = "RedVis" sensitive = "true"/>
<slice name="SciFi_belt" material="PlasticScint" thickness="1*mm" vis = "RedVis" sensitive = "true"/>
</layer>
<layer repeat="2">
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
</layer>
<layer repeat="2">
<slice name="SciFi_belt" material="PlasticScint" thickness="1*mm" vis = "RedVis" sensitive = "true"/>
</layer>
<layer repeat="7">
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
</layer>
<layer repeat="1">
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
</layer>
<layer repeat="2">
<slice name="SciFi_belt" material="PlasticScint" thickness="1*mm" vis = "RedVis" sensitive = "true"/>
</layer>
<layer repeat="3">
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
</layer>
<layer repeat="2">
<slice name="SciFi_belt" material="PlasticScint" thickness="1*mm" vis = "RedVis" sensitive = "true"/>
</layer>
<layer repeat="1">
<slice name="Scint_slice" material="PlasticScint" thickness="3*mm" vis = "BlueVis" sensitive = "true"/>
<slice name="Tungsten_slice" material="TungstenDens24" thickness="7*mm" vis = "GrayVis"/>
</layer>
</detector>
</detectors>
<!-- Definition of the readout segmentation/definition -->
<readouts>
<readout name="ZDCHits">
<segmentation type="CartesianGridXY" grid_size_x="1.0*mm" grid_size_y="1.0*mm" />
<id>system:8,layer:12,slice:12,x:48:-8,y:-8</id>
</readout>
</readouts>
<plugins>
</plugins>
<fields>
</fields>
</lccdd>
...@@ -131,6 +131,10 @@ ...@@ -131,6 +131,10 @@
<include ref="compact/far_forward_romanpots.xml"/> <include ref="compact/far_forward_romanpots.xml"/>
<include ref="compact/far_forward_detectors.xml"/> <include ref="compact/far_forward_detectors.xml"/>
<include ref="compact/ffi_ZDC_HCAL.xml"/>
<!-- <!--
<include ref="compact/mm_tracker_barrel.xml"/> <include ref="compact/mm_tracker_barrel.xml"/>
<include ref="compact/cb_VTX_Barrel.xml"/> <include ref="compact/cb_VTX_Barrel.xml"/>
......
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"
#include <XML/Helper.h>
#include "TMath.h"
#include "DDRec/Surface.h"
#include "DDRec/DetectorData.h"
#include "XML/Layering.h"
#include "Math/Transform3D.h"
///////////////////////////
// Zero Degree Hadron Calorimeter
///////////////////////////
using namespace std;
using namespace dd4hep;
using namespace dd4hep::rec;
using namespace dd4hep::detail;
static Ref_t createDetector(Detector& lcdd, xml_h e, SensitiveDetector sens) {
xml_det_t x_det = e;
int det_id = x_det.id();
string det_name = x_det.nameStr();
xml_dim_t pos = x_det.position();
double x_pos = dd4hep::getAttrOrDefault(pos, _Unicode(x),0.0);
double y_pos = dd4hep::getAttrOrDefault(pos, _Unicode(y),0.0);
double z_pos = dd4hep::getAttrOrDefault(pos, _Unicode(z),0.0);
xml_dim_t dim = x_det.dimensions();
double pixel_x = dim.x();
double pixel_y = dim.y();
Material air = lcdd.material("Air");
double z = z_pos;
double zmin = z_pos;
DetElement det(det_name, det_id);
int layer_num = 1;
int slice_num = 1;
double totWidth = Layering(x_det).totalThickness();
Box envelope (pixel_x/2.0, pixel_y/2.0, totWidth/2.0);
Volume envelopeVol(det_name+"_envelope", envelope, air);
PlacedVolume pv;
xml_comp_t x_layer = x_det.child(_U(layer));
// Read layers
for(xml_coll_t c(x_det,_U(layer)); c; ++c)
{
xml_comp_t x_layer = c;
int repeat = x_layer.repeat();
double layerWidth = 0;
for(xml_coll_t l(x_layer,_U(slice)); l; ++l)
layerWidth += xml_comp_t(l).thickness();
// Loop over repeat#
for(int i=0; i< repeat; i++)
{
double zlayer = z;
string layer_name = det_name + _toString(layer_num,"_layer%d");
Volume layer_vol(layer_name,Box(pixel_x/2.0, pixel_y/2.0,layerWidth/2.0),air);
// Loop over slices
for(xml_coll_t l(x_layer,_U(slice)); l; ++l)
{
xml_comp_t x_slice = l;
double w = x_slice.thickness();
string slice_name = layer_name + _toString(slice_num,"slice%d");
Material slice_mat = lcdd.material(x_slice.materialStr());
Volume slice_vol (slice_name,Box(pixel_x/2.0, pixel_y/2.0,w/2.0),slice_mat);
if(x_slice.isSensitive())
{
sens.setType("calorimeter");
slice_vol.setSensitiveDetector(sens);
}
slice_vol.setAttributes(lcdd,x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr());
pv = layer_vol.placeVolume(slice_vol, Transform3D(RotationZYX(0, 0, 0),Position(0.0,0.0,z-zlayer-layerWidth/2.0+w/2.0)));
pv.addPhysVolID("slice", slice_num);
z += w;
++slice_num;
}
string layer_vis = dd4hep::getAttrOrDefault(x_layer, _Unicode(vis), "InvisibleWithDaughters");
layer_vol.setAttributes(lcdd, x_layer.regionStr(), x_layer.limitsStr(), layer_vis);
pv = envelopeVol.placeVolume(layer_vol, Transform3D(RotationZYX(0, 0, 0), Position(0,0,zlayer-zmin-totWidth/2.0+layerWidth/2.0)));
pv.addPhysVolID("layer", layer_num);
++layer_num;
}
}
envelopeVol.setAttributes(lcdd, x_det.regionStr(), x_det.limitsStr(), "InvisibleWithDaughters");
Volume motherVol = lcdd.pickMotherVolume(det);
PlacedVolume phv = motherVol.placeVolume(envelopeVol, Position(x_pos,y_pos,z_pos+totWidth/2.0));
phv.addPhysVolID("system", det.id());
det.setPlacement(phv);
return det;
}
DECLARE_DETELEMENT(ffi_ZDC_HCAL, createDetector)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment