Skip to content
Snippets Groups Projects
Commit 9b3aae4d authored by Whitney Armstrong's avatar Whitney Armstrong
Browse files

Added the vertex endcaps.

- Implemented using SimpleDiskTracker
parent d70bfa12
No related branches found
No related tags found
No related merge requests found
......@@ -373,15 +373,15 @@
</comment>
<constant name="VertexTrackerBarrel_rmin" value="Beampipe_rmax+5.0*mm"/>
<constant name="VertexTrackerBarrel_rmax" value="150.0*mm"/>
<constant name="VertexTrackerBarrel_length" value="400.0*mm"/>
<constant name="VertexTrackerBarrel_length" value="300.0*mm"/>
<constant name="VertexTrackerBarrel_zmax" value="VertexTrackerBarrel_length/2.0"/>
<constant name="VertexTrackerEndcapP_rmax" value="VertexTrackerBarrel_rmax"/>
<constant name="VertexTrackerEndcapN_rmax" value="VertexTrackerBarrel_rmax"/>
<constant name="VertexTrackerEndcapP_rmin" value="VertexTrackerBarrel_rmin"/>
<constant name="VertexTrackerEndcapN_rmin" value="VertexTrackerBarrel_rmin"/>
<constant name="VertexTrackerEndcapP_zmax" value="600.0*mm"/>
<constant name="VertexTrackerEndcapN_zmax" value="600.0*mm"/>
<constant name="VertexTrackerEndcapP_zmax" value="500.0*mm/2.0"/>
<constant name="VertexTrackerEndcapN_zmax" value="500.0*mm/2.0"/>
<comment>
Vertex Tracking Region
......
......@@ -2,16 +2,16 @@
<lccdd>
<define>
<constant name="ITS3Thickness" value="0.03*mm"/>
<constant name="VertexBarrel_rmin1" value="3.3*cm"/>
<constant name="VertexBarrel_rmin2" value="5.7*cm"/>
<constant name="ITS3Thickness" value="0.03*mm"/>
<constant name="VertexBarrel_rmin1" value="3.3*cm"/>
<constant name="VertexBarrel_rmin2" value="5.7*cm"/>
<constant name="VertexBarrelModule_maxThickness" value="VertexBarrel_rmin2 - VertexBarrel_rmin1"/>
<constant name="VertexBarrel_length" value="30*cm"/>
<constant name="VertexBarrel_thickness" value="0.05/100*9.37*cm"/>
<constant name="VertexBarrelService_thickness" value="VertexBarrel_thickness-ITS3Thickness"/>
<constant name="VertexBarrel_rmin" value="VertexBarrel_rmin1"/>
<constant name="VertexBarrel_rmax" value="VertexBarrel_rmin2+VertexBarrelModule_maxThickness"/>
<constant name="VertexBarrelLayer_rOffset" value="4.0*mm"/>
<constant name="VertexBarrel_length" value="VertexTrackerBarrel_length"/>
<constant name="VertexBarrel_thickness" value="0.05/100*9.37*cm"/>
<constant name="VertexBarrelService_thickness" value="VertexBarrel_thickness-ITS3Thickness"/>
<constant name="VertexBarrel_rmin" value="VertexBarrel_rmin1"/>
<constant name="VertexBarrel_rmax" value="VertexBarrel_rmin2+VertexBarrelModule_maxThickness"/>
<constant name="VertexBarrelLayer_rOffset" value="4.0*mm"/>
<comment> TODO: These should be computed </comment>
<constant name="VertexBarrel_NModules1" value="14"/>
......@@ -30,7 +30,7 @@
<constant name="VertexTrackerEndcapN_zmin" value="VertexTrackerBarrel_zmax"/>
<constant name="VertexTrackerEndcapP_zmin" value="VertexTrackerBarrel_zmax"/>
<constant name="VertexEndcap_NLayers" value="5"/>
<constant name="VertexEndcap_NLayers" value="2"/>
<constant name="VertexTrackerEndcap_delta" value="(VertexTrackerEndcapP_zmax - VertexTrackerEndcapP_zmin)/VertexEndcap_NLayers"/>
......@@ -47,8 +47,8 @@
name="VertexSubAssembly"
type="DD4hep_SubdetectorAssembly"
vis="TrackerSubAssemblyVis">
<composite name="VertexTrackerEndcapN"/>
<composite name="VertexTrackerEndcapP"/>
<composite name="VertexEndcapN"/>
<composite name="VertexEndcapP"/>
<composite name="VertexBarrel"/>
</detector>
......@@ -59,17 +59,19 @@
type="athena_VertexBarrel"
readout="VertexBarrelHits"
insideTrackingVolume="true">
<dimensions rmin="VertexBarrel_rmin-VertexBarrelLayer_rOffset" rmax="VertexBarrel_rmax-VertexBarrelLayer_rOffset" length="VertexBarrel_length"/>
<dimensions
rmin="VertexBarrel_rmin-VertexBarrelLayer_rOffset"
rmax="VertexBarrel_rmax-VertexBarrelLayer_rOffset"
length="VertexBarrel_length"/>
<comment> Define available modules </comment>
<module name="Module1" vis="PurpleVis">
<frame width="15*mm" height="10.0*mm" length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" />
<frame width="15*mm" height="10.0*mm"
length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" />
<module_component name="silicon"
width="14.0*mm" length="VertexBarrel_length-0.1*mm" thickness="0.05*mm" material="Silicon" sensitive="true">
<position z="-0.025*mm" y="0*mm"/>
</module_component>
</module>
<module name="Module2">
<frame width="15*mm" height="10.0*mm" length="VertexBarrel_length" thickness="0.1 * mm" material="CarbonFiber_25percent" vis="BlueGreenVis" />
<module_component name="silicon"
......@@ -77,7 +79,6 @@
<position z="-0.025*mm" y="0*mm"/>
</module_component>
</module>
<comment> Layers composed of many arrayed modules </comment>
<layer module="Module1" id="1" vis="VertexVis">
<barrel_envelope
......@@ -95,12 +96,13 @@
<rphi_layout phi_tilt="10.0*degree" nphi="VertexBarrel_NModules2" phi0="0.0" rc="VertexBarrel_rmin2" dr="0.0 * mm"/>
<z_layout dr="0.0 * mm" z0="0.0 * mm" nz="1"/>
</layer>
</detector>
<!--
<detector id="VertexEndcapP_ID" name="VertexTrackerEndcapP" type="ref_DiskTracker"
insideTrackingVolume="true" reflect="false" vis="AnlRed">
<detector id="VertexEndcapP_ID"
name="VertexEndcapP"
type="athena_SimpleDiskTracker"
insideTrackingVolume="true"
reflect="false" vis="AnlRed">
<position x="0" y="0" z="0"/>
<layer id="1" vis="AnlOrange"
inner_z="VertexTrackerEndcapP_zmin + 0*VertexTrackerEndcap_delta"
......@@ -114,27 +116,11 @@
outer_r="VertexTrackerEndcapP_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="3" vis="AnlOrange"
inner_z="VertexTrackerEndcapP_zmin + 2*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapP_rmin"
outer_r="VertexTrackerEndcapP_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="4" vis="AnlOrange"
inner_z="VertexTrackerEndcapP_zmin + 3*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapP_rmin"
outer_r="VertexTrackerEndcapP_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="5" vis="AnlOrange"
inner_z="VertexTrackerEndcapP_zmin + 4*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapP_rmin"
outer_r="VertexTrackerEndcapP_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
</detector>
<detector id="VertexEndcapN_ID" name="VertexTrackerEndcapN" type="ref_DiskTracker"
<detector id="VertexEndcapN_ID"
name="VertexEndcapN"
type="ref_DiskTracker"
insideTrackingVolume="true" reflect="true" vis="AnlRed">
<position x="0" y="0" z="0"/>
<layer id="1" vis="AnlOrange"
......@@ -149,26 +135,7 @@
outer_r="VertexTrackerEndcapN_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="3" vis="AnlOrange"
inner_z="VertexTrackerEndcapN_zmin + 2*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapN_rmin"
outer_r="VertexTrackerEndcapN_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="4" vis="AnlOrange"
inner_z="VertexTrackerEndcapN_zmin + 3*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapN_rmin"
outer_r="VertexTrackerEndcapN_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
<layer id="5" vis="AnlOrange"
inner_z="VertexTrackerEndcapN_zmin + 4*VertexTrackerEndcap_delta"
inner_r="VertexTrackerEndcapN_rmin"
outer_r="VertexTrackerEndcapN_rmax">
<slice material="Air" thickness="1.0*mm" vis="AnlOrange" />
</layer>
</detector>
-->
</detectors>
......
......@@ -15,6 +15,8 @@
//
//==========================================================================
#include "DD4hep/DetFactoryHelper.h"
#include "Acts/Plugins/DD4hep/ActsExtension.hpp"
#include "Acts/Plugins/DD4hep/ConvertDD4hepMaterial.hpp"
using namespace std;
using namespace dd4hep;
......@@ -32,6 +34,10 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
int l_num = 0;
xml::Component pos = x_det.position();
Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
detWorldExt->addType("endcap", "detector");
sdet.addExtension<Acts::ActsExtension>(detWorldExt);
for (xml_coll_t i(x_det, _U(layer)); i; ++i, ++l_num) {
xml_comp_t x_layer = i;
string l_nam = det_name + _toString(l_num, "_layer%d");
......@@ -49,37 +55,52 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
Tube l_tub(rmin, rmax, layerWidth/2.0, 2 * M_PI);
Volume l_vol(l_nam, l_tub, air);
l_vol.setVisAttributes(description, x_layer.visStr());
DetElement layer;
if (!reflect) {
layer = DetElement(sdet, l_nam + "_pos", l_num);
pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.));
pv.addPhysVolID("layer", l_num);
pv.addPhysVolID("barrel", 3);
layer.setPlacement(pv);
} else {
layer = DetElement(sdet, l_nam + "_neg", l_num);
(sdet, l_nam + "_pos", l_num);
pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2)));
pv.addPhysVolID("layer", l_num);
pv.addPhysVolID("barrel", 2);
layer.setPlacement(pv);
// DetElement layerR = layer.clone(l_nam+"_neg");
// sdet.add(layerR.setPlacement(pv));
}
Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
layerExtension->addType("layer", "layer");
//layerExtension->addType("axes", "definitions", "XZY");
layer.addExtension<Acts::ActsExtension>(layerExtension);
for (xml_coll_t j(x_layer, _U(slice)); j; ++j, ++s_num) {
xml_comp_t x_slice = j;
double thick = x_slice.thickness();
Material mat = description.material(x_slice.materialStr());
string s_nam = l_nam + _toString(s_num, "_slice%d");
Volume s_vol(s_nam, Tube(rmin, rmax, thick/2.0), mat);
if(!reflect){
s_nam += "_pos";
} else {
s_nam += "_neg";
}
DetElement slice_de(layer, s_nam , s_num);
if (x_slice.isSensitive()) {
sens.setType("tracker");
s_vol.setSensitiveDetector(sens);
Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY");
slice_de.addExtension<Acts::ActsExtension>(moduleExtension);
}
s_vol.setAttributes(description, x_slice.regionStr(), x_slice.limitsStr(), x_slice.visStr());
pv = l_vol.placeVolume(s_vol, Position(0, 0, z - zmin - layerWidth / 2 + thick / 2));
pv.addPhysVolID("slice", s_num);
slice_de.setPlacement(pv);
}
if (!reflect) {
DetElement layer(sdet, l_nam + "_pos", l_num);
pv = assembly.placeVolume(l_vol, Position(0, 0, zmin + layerWidth / 2.));
pv.addPhysVolID("layer", l_num);
pv.addPhysVolID("barrel", 1);
layer.setPlacement(pv);
} else {
DetElement layer(sdet, l_nam + "_neg", l_num);
pv = assembly.placeVolume(l_vol, Transform3D(RotationY(M_PI), Position(0, 0, -zmin - layerWidth / 2)));
pv.addPhysVolID("layer", l_num);
pv.addPhysVolID("barrel", 1);
layer.setPlacement(pv);
// DetElement layerR = layer.clone(l_nam+"_neg");
// sdet.add(layerR.setPlacement(pv));
}
}
if (x_det.hasAttr(_U(combineHits))) {
sdet.setCombineHits(x_det.attr<bool>(_U(combineHits)), sens);
......@@ -90,5 +111,6 @@ static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector s
return sdet;
}
DECLARE_DETELEMENT(athena_SimpleDiskTracker, create_detector)
DECLARE_DETELEMENT(ref_DiskTracker, create_detector)
DECLARE_DETELEMENT(ref_SolenoidEndcap, create_detector)
......@@ -16,127 +16,170 @@
//==========================================================================
#include <map>
#include "DD4hep/DetFactoryHelper.h"
#include "Acts/Plugins/DD4hep/ActsExtension.hpp"
#include "Acts/Definitions/Units.hpp"
using namespace std;
using namespace dd4hep;
using namespace dd4hep::detail;
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens) {
typedef vector<PlacedVolume> Placements;
xml_det_t x_det = e;
Material vacuum = description.vacuum();
int det_id = x_det.id();
string det_name = x_det.nameStr();
bool reflect = x_det.reflect(false);
DetElement sdet(det_name, det_id);
Assembly assembly(det_name);
// Volume assembly (det_name,Box(10000,10000,10000),vacuum);
Volume motherVol = description.pickMotherVolume(sdet);
int m_id = 0, c_id = 0, n_sensor = 0;
map<string, Volume> modules;
map<string, Placements> sensitives;
PlacedVolume pv;
assembly.setVisAttributes(description.invisible());
sens.setType("tracker");
for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) {
xml_comp_t x_mod = mi;
string m_nam = x_mod.nameStr();
xml_comp_t trd = x_mod.trd();
double posY;
double x1 = trd.x1();
double x2 = trd.x2();
double z = trd.z();
double y1, y2, total_thickness = 0.;
xml_coll_t ci(x_mod, _U(module_component));
for (ci.reset(), total_thickness = 0.0; ci; ++ci) total_thickness += xml_comp_t(ci).thickness();
y1 = y2 = total_thickness / 2;
Volume m_volume(m_nam, Trapezoid(x1, x2, y1, y2, z), vacuum);
m_volume.setVisAttributes(description.visAttributes(x_mod.visStr()));
for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) {
xml_comp_t c = ci;
double c_thick = c.thickness();
auto comp_x1 = getAttrOrDefault(c, _Unicode(x1), x1);
auto comp_x2 = getAttrOrDefault(c, _Unicode(x2), x2);
auto comp_height = getAttrOrDefault(c, _Unicode(height), z);
Material c_mat = description.material(c.materialStr());
string c_name = _toString(c_id, "component%d");
Volume c_vol(c_name, Trapezoid(comp_x1, comp_x2, c_thick / 2e0, c_thick / 2e0, comp_height), c_mat);
c_vol.setVisAttributes(description.visAttributes(c.visStr()));
pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0));
if (c.isSensitive()) {
sdet.check(n_sensor > 2,
"SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!");
pv.addPhysVolID("sensor", n_sensor);
c_vol.setSensitiveDetector(sens);
sensitives[m_nam].push_back(pv);
++n_sensor;
}
posY += c_thick;
}
modules[m_nam] = m_volume;
static Ref_t create_detector(Detector& description, xml_h e, SensitiveDetector sens)
{
typedef vector<PlacedVolume> Placements;
xml_det_t x_det = e;
Material vacuum = description.vacuum();
int det_id = x_det.id();
string det_name = x_det.nameStr();
bool reflect = x_det.reflect(false);
DetElement sdet(det_name, det_id);
Assembly assembly(det_name);
// Volume assembly (det_name,Box(10000,10000,10000),vacuum);
Volume motherVol = description.pickMotherVolume(sdet);
int m_id = 0, c_id = 0, n_sensor = 0;
map<string, Volume> modules;
map<string, Placements> sensitives;
PlacedVolume pv;
Acts::ActsExtension* detWorldExt = new Acts::ActsExtension();
detWorldExt->addType("endcap", "detector");
sdet.addExtension<Acts::ActsExtension>(detWorldExt);
assembly.setVisAttributes(description.invisible());
sens.setType("tracker");
for (xml_coll_t mi(x_det, _U(module)); mi; ++mi, ++m_id) {
xml_comp_t x_mod = mi;
string m_nam = x_mod.nameStr();
xml_comp_t trd = x_mod.trd();
double posY;
double x1 = trd.x1();
double x2 = trd.x2();
double z = trd.z();
double y1, y2, total_thickness = 0.;
xml_coll_t ci(x_mod, _U(module_component));
for (ci.reset(), total_thickness = 0.0; ci; ++ci)
total_thickness += xml_comp_t(ci).thickness();
y1 = y2 = total_thickness / 2;
Volume m_volume(m_nam, Trapezoid(x1, x2, y1, y2, z), vacuum);
m_volume.setVisAttributes(description.visAttributes(x_mod.visStr()));
for (ci.reset(), n_sensor = 1, c_id = 0, posY = -y1; ci; ++ci, ++c_id) {
xml_comp_t c = ci;
double c_thick = c.thickness();
auto comp_x1 = getAttrOrDefault(c, _Unicode(x1), x1);
auto comp_x2 = getAttrOrDefault(c, _Unicode(x2), x2);
auto comp_height = getAttrOrDefault(c, _Unicode(height), z);
Material c_mat = description.material(c.materialStr());
string c_name = _toString(c_id, "component%d");
Volume c_vol(c_name, Trapezoid(comp_x1, comp_x2, c_thick / 2e0, c_thick / 2e0, comp_height), c_mat);
c_vol.setVisAttributes(description.visAttributes(c.visStr()));
pv = m_volume.placeVolume(c_vol, Position(0, posY + c_thick / 2, 0));
if (c.isSensitive()) {
sdet.check(n_sensor > 2, "SiTrackerEndcap2::fromCompact: " + c_name + " Max of 2 modules allowed!");
pv.addPhysVolID("sensor", n_sensor);
c_vol.setSensitiveDetector(sens);
sensitives[m_nam].push_back(pv);
++n_sensor;
}
posY += c_thick;
}
modules[m_nam] = m_volume;
}
for (xml_coll_t li(x_det, _U(layer)); li; ++li) {
xml_comp_t x_layer(li);
int l_id = x_layer.id();
int mod_num = 1;
//xml_comp_t l_env = x_layer.child(_U(envelope));
string layer_name = det_name + std::string("_layer") + std::to_string(l_id);
//std::string layer_vis = l_env.attr<std::string>(_Unicode(vis));
//double layer_rmin = l_env.attr<double>(_Unicode(rmin));
//double layer_rmax = l_env.attr<double>(_Unicode(rmax));
//double layer_length = l_env.attr<double>(_Unicode(length));
//double layer_zstart = l_env.attr<double>(_Unicode(zstart));
//printout(INFO,"ROOTGDMLParse","+++ Read geometry from GDML file file:%s",input.c_str());
//std::cout << "SiTracker Endcap layer " << l_id << " zstart = " << layer_zstart/dd4hep::mm << "mm ( " << layer_length/dd4hep::mm << " mm thick )\n";
Assembly layer_assembly(layer_name);
//assembly.placeVolume(layer_assembly);
//Tube layer_tub(layer_rmin, layer_rmax, layer_length / 2);
//Volume layer_vol(layer_name, layer_tub, air); // Create the layer envelope volume.
//layer_assembly.setVisAttributes(description.visAttributes(layer_vis));
PlacedVolume layer_pv;
if (reflect) {
layer_pv = assembly.placeVolume(layer_assembly, Position(0,0,-1.0e-9));//-layer_zstart-layer_length/2));
layer_pv.addPhysVolID("barrel", 3).addPhysVolID("layer", l_id);
layer_name += "_N";
} else {
layer_pv = assembly.placeVolume(layer_assembly);//, Position(0, 0, +layer_zstart + layer_length / 2));
layer_pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id);
layer_name += "_P";
}
DetElement layer_element(sdet, layer_name, l_id);
layer_element.setPlacement(layer_pv);
Acts::ActsExtension* layerExtension = new Acts::ActsExtension();
layerExtension->addType("layer", "layer");
//layerExtension->addType("axes", "definitions", "XZY");
layer_element.addExtension<Acts::ActsExtension>(layerExtension);
for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) {
xml_comp_t x_ring = ri;
double r = x_ring.r();
double phi0 = x_ring.phi0(0);
double zstart = x_ring.zstart();
double dz = x_ring.dz(0);
int nmodules = x_ring.nmodules();
string m_nam = x_ring.moduleStr();
Volume m_vol = modules[m_nam];
double iphi = 2 * M_PI / nmodules;
double phi = phi0;
Placements& sensVols = sensitives[m_nam];
for (int k = 0; k < nmodules; ++k) {
string m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d");
double x = -r * std::cos(phi);
double y = -r * std::sin(phi);
DetElement module(sdet, m_base + "_pos", det_id);
pv = assembly.placeVolume(m_vol,
Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, zstart + dz)));
pv.addPhysVolID("barrel", 1).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
module.setPlacement(pv);
for (size_t ic = 0; ic < sensVols.size(); ++ic) {
PlacedVolume sens_pv = sensVols[ic];
DetElement comp_elt(module, sens_pv.volume().name(), mod_num);
comp_elt.setPlacement(sens_pv);
}
for (xml_coll_t li(x_det, _U(layer)); li; ++li) {
xml_comp_t x_layer(li);
int l_id = x_layer.id();
int mod_num = 1;
for (xml_coll_t ri(x_layer, _U(ring)); ri; ++ri) {
xml_comp_t x_ring = ri;
double r = x_ring.r();
double phi0 = x_ring.phi0(0);
double zstart = x_ring.zstart();
double dz = x_ring.dz(0);
int nmodules = x_ring.nmodules();
string m_nam = x_ring.moduleStr();
Volume m_vol = modules[m_nam];
double iphi = 2 * M_PI / nmodules;
double phi = phi0;
Placements& sensVols = sensitives[m_nam];
for (int k = 0; k < nmodules; ++k) {
string m_base = _toString(l_id, "layer%d") + _toString(mod_num, "_module%d");
double x = -r * std::cos(phi);
double y = -r * std::sin(phi);
DetElement module(sdet, m_base + "_pos", det_id);
pv = assembly.placeVolume(m_vol, Transform3D(RotationZYX(0, -M_PI / 2 - phi, -M_PI / 2),
Position(x, y, zstart + dz)));
pv.addPhysVolID("barrel", 1).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
module.setPlacement(pv);
for (size_t ic = 0; ic < sensVols.size(); ++ic) {
PlacedVolume sens_pv = sensVols[ic];
DetElement comp_elt(module, sens_pv.volume().name(), mod_num);
comp_elt.setPlacement(sens_pv);
}
if (reflect) {
pv =
assembly.placeVolume(m_vol, Transform3D(RotationZYX(M_PI, -M_PI / 2 - phi, -M_PI / 2),
Position(x, y, -zstart - dz)));
pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
DetElement r_module(sdet, m_base + "_neg", det_id);
r_module.setPlacement(pv);
for (size_t ic = 0; ic < sensVols.size(); ++ic) {
PlacedVolume sens_pv = sensVols[ic];
DetElement comp_elt(r_module, sens_pv.volume().name(), mod_num);
comp_elt.setPlacement(sens_pv);
}
}
dz = -dz;
phi += iphi;
++mod_num;
}
if (reflect) {
pv = assembly.placeVolume(
m_vol, Transform3D(RotationZYX(M_PI, -M_PI / 2 - phi, -M_PI / 2), Position(x, y, -zstart - dz)));
pv.addPhysVolID("barrel", 2).addPhysVolID("layer", l_id).addPhysVolID("module", mod_num);
DetElement r_module(sdet, m_base + "_neg", det_id);
r_module.setPlacement(pv);
for (size_t ic = 0; ic < sensVols.size(); ++ic) {
PlacedVolume sens_pv = sensVols[ic];
DetElement comp_elt(r_module, sens_pv.volume().name(), mod_num);
comp_elt.setPlacement(sens_pv);
Acts::ActsExtension* moduleExtension = new Acts::ActsExtension("XZY");
comp_elt.addExtension<Acts::ActsExtension>(moduleExtension);
}
}
dz = -dz;
phi += iphi;
++mod_num;
}
}
pv = motherVol.placeVolume(assembly);
pv.addPhysVolID("system", det_id);
sdet.setPlacement(pv);
return sdet;
}
pv = motherVol.placeVolume(assembly);
pv.addPhysVolID("system", det_id);
sdet.setPlacement(pv);
return sdet;
}
// clang-format off
......
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