diff --git a/DDCore/include/DD4hep/DetElement.h b/DDCore/include/DD4hep/DetElement.h index 909d1ad4d268a7545043b8c4d94d3a0484f26e1d..3fcff9d4537240355576b38323d01ecb898acb37 100644 --- a/DDCore/include/DD4hep/DetElement.h +++ b/DDCore/include/DD4hep/DetElement.h @@ -332,6 +332,8 @@ namespace dd4hep { /// Reflect (Deep copy) the DetElement structure with a new name and new identifier std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id) const; + /// Reflect (Deep copy) the DetElement structure with a new name and new identifier and new sensitive detector + std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id, SensitiveDetector sd) const; /// Add an extension object to the detector element void* addExtension(ExtensionEntry* entry) const; diff --git a/DDCore/include/DD4hep/MatrixHelpers.h b/DDCore/include/DD4hep/MatrixHelpers.h index 78e801e4b008d0c08188627b189e880ac0d13228..54bd8c8042f6a9b75ee17ad3156f4734f9c245c8 100644 --- a/DDCore/include/DD4hep/MatrixHelpers.h +++ b/DDCore/include/DD4hep/MatrixHelpers.h @@ -65,6 +65,14 @@ namespace dd4hep { Transform3D _transform(const TGeoMatrix* matrix); Transform3D _transform(const TGeoMatrix& matrix); + /// Decompose a generic ROOT Matrix into a translation (Position) and a Rotation3D \ingroup DD4HEP \ingroup DD4HEP_CORE + void _decompose(const TGeoMatrix& trafo, Position& pos, Rotation3D& rot); + /// Decompose a generic ROOT Matrix into a translation (Position) and a RotationZYX \ingroup DD4HEP \ingroup DD4HEP_CORE + void _decompose(const TGeoMatrix& trafo, Position& pos, RotationZYX& rot); + /// Decompose a generic ROOT Matrix into a translation (Position) and XYZAngles \ingroup DD4HEP \ingroup DD4HEP_CORE + void _decompose(const TGeoMatrix& trafo, Position& pos, XYZAngles& rot); + /// Decompose a generic Transform3D into a translation (Position) and a Rotation3D \ingroup DD4HEP \ingroup DD4HEP_CORE + void _decompose(const Transform3D& trafo, Position& pos, Rotation3D& rot); /// Decompose a generic Transform3D into a translation (Position) and a RotationZYX \ingroup DD4HEP \ingroup DD4HEP_CORE void _decompose(const Transform3D& trafo, Position& pos, RotationZYX& rot); /// Decompose a generic Transform3D into a translation (Position) and XYZAngles \ingroup DD4HEP \ingroup DD4HEP_CORE diff --git a/DDCore/include/DD4hep/Volumes.h b/DDCore/include/DD4hep/Volumes.h index 1b382fcd5e6d002a546bdd791fba0d1776c1048b..981df2f9a847f48413689bfef5d1fc7f51650ab6 100644 --- a/DDCore/include/DD4hep/Volumes.h +++ b/DDCore/include/DD4hep/Volumes.h @@ -320,8 +320,13 @@ namespace dd4hep { /// Check if placement is properly instrumented Object* data() const; - /// Create a reflected volume. The reflected volume has left-handed coordinates + /// Create a reflected volume tree. The reflected volume has left-handed coordinates Volume reflect() const; + + /// Create a reflected volume tree. The reflected volume has left-handed coordinates. + /** Swap the sensitive detector - if valid - on all sensitive sub-volumes + */ + Volume reflect(SensitiveDetector sd) const; /// If we import volumes from external sources, we have to attach the extensions to the tree Volume& import(); diff --git a/DDCore/include/DD4hep/detail/DetectorInterna.h b/DDCore/include/DD4hep/detail/DetectorInterna.h index c383fe225658db292619eda788d49096c7c21b05..e64a1658679bb74097687f98b705c53ac62b857a 100644 --- a/DDCore/include/DD4hep/detail/DetectorInterna.h +++ b/DDCore/include/DD4hep/detail/DetectorInterna.h @@ -179,7 +179,7 @@ namespace dd4hep { /// Revalidate the caches void revalidate(); /// Reflect all volumes in a DetElement sub-tree and re-attach the placements - std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id); + std::pair<DetElement,Volume> reflect(const std::string& new_name, int new_id, SensitiveDetector sd); }; /// Data class with properties of a detector element diff --git a/DDCore/src/DetElement.cpp b/DDCore/src/DetElement.cpp index 89b41922c39c582ee5f8b407a4cbad0dd2f00da7..2fdaea5e51839b585e9919f83ecbc3387c864c63 100644 --- a/DDCore/src/DetElement.cpp +++ b/DDCore/src/DetElement.cpp @@ -278,8 +278,12 @@ pair<DetElement,Volume> DetElement::reflect(const string& new_name) const { } pair<DetElement,Volume> DetElement::reflect(const string& new_name, int new_id) const { + return reflect(new_name, new_id, SensitiveDetector(0)); +} + +pair<DetElement,Volume> DetElement::reflect(const string& new_name, int new_id, SensitiveDetector sd) const { if ( placement().isValid() ) { - return m_element->reflect(new_name, new_id); + return m_element->reflect(new_name, new_id, sd); } except("DetElement","reflect: Only placed DetElement objects can be reflected: %s", path().c_str()); diff --git a/DDCore/src/DetectorInterna.cpp b/DDCore/src/DetectorInterna.cpp index 915a52e07d168e9824c3cb836065c7ea42ba87b5..ed5dd5cbd2838258590669b1d2c00e7dfadb21aa 100644 --- a/DDCore/src/DetectorInterna.cpp +++ b/DDCore/src/DetectorInterna.cpp @@ -134,7 +134,7 @@ DetElementObject* DetElementObject::clone(int new_id, int flg) const { } /// Reflect all volumes in a DetElement sub-tree and re-attach the placements -pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, int new_id) { +pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, int new_id, SensitiveDetector sd) { struct ChildMapper { std::map<TGeoNode*,TGeoNode*> nodes; void match(DetElement de) { @@ -148,7 +148,7 @@ pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, i match(c.second); } void map(TGeoNode* n1, TGeoNode* n2) { - if ( nodes.find(n1) != nodes.end() ) { + if ( nodes.find(n1) == nodes.end() ) { TGeoVolume* v1 = n1->GetVolume(); TGeoVolume* v2 = n2->GetVolume(); nodes.insert(make_pair(n1,n2)); @@ -161,7 +161,7 @@ pair<DetElement,Volume> DetElementObject::reflect(const std::string& new_name, i DetElement det_ref = det.clone(new_name, new_id); Volume vol = det.volume(); TGeoVolume* vol_det = vol.ptr(); - TGeoVolume* vol_ref = vol.reflect(); + TGeoVolume* vol_ref = vol.reflect(sd); const auto& childrens = det.children(); for(Int_t i=0; i<vol_det->GetNdaughters(); ++i) diff --git a/DDCore/src/MatrixHelpers.cpp b/DDCore/src/MatrixHelpers.cpp index 27a4121f498e66eaf6a12e36d2ed8705dff92dbf..3df683bfd43b4543a910b408749b0d4d570f9391 100644 --- a/DDCore/src/MatrixHelpers.cpp +++ b/DDCore/src/MatrixHelpers.cpp @@ -144,8 +144,24 @@ dd4hep::XYZAngles dd4hep::detail::matrix::_xyzAngles(const double* r) { return XYZAngles(atan2(-r[7], r[4]),atan2(-r[2], cosb),0); } +void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, Rotation3D& rot) { + _decompose(_transform(trafo), pos, rot); +} + +void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, RotationZYX& rot) { + _decompose(_transform(trafo), pos, rot); +} + +void dd4hep::detail::matrix::_decompose(const TGeoMatrix& trafo, Position& pos, XYZAngles& rot) { + _decompose(_transform(trafo), pos, rot); +} + +void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Position& pos, Rotation3D& rot) { + trafo.GetDecomposition(rot, pos); +} + void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Translation3D& pos, RotationZYX& rot) { - trafo.GetDecomposition(rot,pos); + trafo.GetDecomposition(rot, pos); } void dd4hep::detail::matrix::_decompose(const Transform3D& trafo, Translation3D& pos, XYZAngles& rot) { diff --git a/DDCore/src/Volumes.cpp b/DDCore/src/Volumes.cpp index 4ad085f5c00e15b8f15acdb0f96f466265d376c1..14d532fb4426f0c490c5128d63ceb31eabaabfa0 100644 --- a/DDCore/src/Volumes.cpp +++ b/DDCore/src/Volumes.cpp @@ -120,7 +120,7 @@ namespace { } } /// Callback for clone imports, where the user extension should be copied - void operator()(TGeoVolume* new_v, TGeoVolume* old_v, int set_bit) { + void operator()(TGeoVolume* new_v, TGeoVolume* old_v, SensitiveDetector sd, int set_bit) { if ( !new_v || !old_v ) { except("dd4hep","VolumeImport: ERROR: The refected volume is INVALID!"); } @@ -131,6 +131,9 @@ namespace { TClass* c = new_v->IsA(); Volume old_vol(old_v); Volume new_vol(new_v); + if ( sd.isValid() && old_vol.isSensitive() ) { + new_vol.setSensitiveDetector(sd); + } if ( c == geo_volume_t::Class() ) { Volume::Object *new_e, *old_e = (Volume::Object*)_data(old_vol); old_e->reflected = new_v; @@ -151,7 +154,7 @@ namespace { old_e->reflected = new_v; new_e->reflected = old_v; for(int i=0, n=new_mv->GetNvolumes(); i<n; ++i) - (*this)(new_mv->GetVolume(i), old_mv->GetVolume(i), set_bit); + (*this)(new_mv->GetVolume(i), old_mv->GetVolume(i), sd, set_bit); } else except("dd4hep","VolumeImport: Unknown TGeoVolume sub-class: %s",new_v->IsA()->GetName()); @@ -169,7 +172,7 @@ namespace { auto* e = (PlacedVolume::Object*)ov->geo_node_t::GetUserExtension(); pv->geo_node_t::SetUserExtension(new PlacedVolume::Object(*e)); } - (*this)(pv->GetVolume(), ov->GetVolume(), set_bit); + (*this)(pv->GetVolume(), ov->GetVolume(), sd, set_bit); } } } @@ -178,8 +181,7 @@ namespace { TGeoVolume *MakeReflection(TGeoVolume* v, const char *newname=0) { static TMap map(100); TGeoVolume *vol = (TGeoVolume*)map.GetValue(v); - if (vol) { - if (newname && newname[0]) vol->SetName(newname); + if ( vol ) { return vol; } vol = v->CloneVolume(); @@ -188,7 +190,15 @@ namespace { return nullptr; } map.Add((TObject*)v, vol); - if (newname && newname[0]) vol->SetName(newname); + string nam; + if (newname && newname[0]) { + nam = newname; + vol->SetName(newname); + } + else { + nam = v->GetName(); + vol->SetName((nam+"_refl").c_str()); + } delete vol->GetNodes(); vol->SetNodes(NULL); vol->SetBit(TGeoVolume::kVolumeImportNodes, kFALSE); @@ -198,7 +208,7 @@ namespace { if (v->GetShape()) { TGeoScale* scale = new TGeoScale( 1., 1.,-1.); TGeoShape *reflected_shape = - TGeoScaledShape::MakeScaledShape("", v->GetShape(), scale); + TGeoScaledShape::MakeScaledShape((nam+"_shape_refl").c_str(), v->GetShape(), scale); vol->SetShape(reflected_shape); } // Reflect the daughters. @@ -484,16 +494,19 @@ Volume::Object* Volume::data() const { return o; } -/// Create a reflected volume. The reflected volume has left-handed coordinates +/// Create a reflected volume tree. The reflected volume has left-handed coordinates Volume Volume::reflect() const { + return reflect(SensitiveDetector(0)); +} + +/// Create a reflected volume tree. The reflected volume has left-handed coordinates +Volume Volume::reflect(SensitiveDetector sd) const { if ( m_element ) { VolumeImport imp; - string nam = name(); - nam += "_refl"; Object* o = data(); if ( !o->reflected.isValid() ) { - TGeoVolume* vol = MakeReflection(m_element, nam.c_str()); - imp(vol, m_element, Volume::REFLECTED); + TGeoVolume* vol = MakeReflection(m_element); + imp(vol, m_element, sd, Volume::REFLECTED); o->reflected = vol; } return o->reflected; diff --git a/DDDetectors/compact/SiD.xml b/DDDetectors/compact/SiD.xml index 63e96b33dedf13d584aa5e6766632fa344607678..3effefbea5d245c7dd9b2bffbc92200556213575 100644 --- a/DDDetectors/compact/SiD.xml +++ b/DDDetectors/compact/SiD.xml @@ -17,165 +17,7 @@ </includes> <define> - <constant name="world_side" value="30000*mm"/> - <constant name="world_x" value="world_side"/> - <constant name="world_y" value="world_side"/> - <constant name="world_z" value="world_side"/> - - <constant name="CrossingAngle" value="0.020*rad"/> - - <constant name="CaloSides" value="12"/> - <constant name="MuonSides" value="8"/> - - <constant name="EcalBarrel_ID" value="6"/> - <constant name="EcalBarrel_rmin" value="126.50*cm + world_side - world_side"/> - <constant name="EcalBarrel_rmin" value="126.50*cm"/> - <constant name="EcalBarrel_zmax" value="176.50*cm"/> - - <constant name="EcalEndcap_ID" value="7"/> - <constant name="EcalEndcap_rmin" value="21.0*cm"/> - <!-- Correction from going from inner circle to outer circle --> - <constant name="EcalEndcap_rmax" value="(EcalBarrel_rmin - 1.5*cm) / (cos(pi/CaloSides))"/> - <constant name="EcalEndcap_zmin" value="165.70*cm"/> - - <constant name="HcalBarrel_ID" value="8"/> - <constant name="HcalBarrel_rmin" value="141.90*cm"/> - <constant name="HcalBarrel_layers" value="(int) 75"/> - <constant name="HcalBarrel_layer_thickness" value="1.0*cm + 0.65*cm"/> - - <constant name="HcalEndcap_ID" value="9"/> - <constant name="HcalEndcap_zmin" value="EcalBarrel_zmax + 4.0*cm"/> <!-- Gap for cables --> - <constant name="HcalEndcap_rmin" value="50.0*cm"/> - <!-- Correction from going from inner circle to outer circle --> - <constant name="HcalEndcap_rmax" value="(HcalBarrel_rmin + HcalBarrel_layers * HcalBarrel_layer_thickness) / (cos(pi/CaloSides))"/> - <constant name="HcalEndcap_layers" value="60"/> - <constant name="HcalEndcap_layer_thickness" value="2.0*cm + 0.65*cm"/> - <constant name="HcalEndcap_zmax" value="HcalEndcap_zmin + HcalEndcap_layers * HcalEndcap_layer_thickness"/> - - <constant name="HcalPlug_ID" value="10"/> - - - <constant name="tracking_region_radius" value="EcalBarrel_rmin - 1.0*mm"/> - <constant name="tracking_region_zmax" value="EcalEndcap_zmin - 1.0*mm"/> - <constant name="VXD_CF_sensor" value="0.026*cm"/> - <constant name="VXD_CF_support" value="0.05*cm"/> - - <constant name="SolenoidBarrelInnerRadius" value="HcalEndcap_rmax + 2.0*cm"/> - <constant name="SolenoidCoilOuterZ" value="HcalEndcap_zmax"/> <!-- Aligned with HCAL endcap --> - <constant name="SolenoidBarrelInnerCryostatThickness" value="3.0*cm"/> - <constant name="SolenoidBarrelInnerAirgapThickness" value="11.0*cm"/> - <constant name="SolenoidBarrelAlConductorThickness" value="38.4*cm"/> - <constant name="SolenoidBarrelQuenchbackThickness" value="5.0*cm"/> - <constant name="SolenoidBarrelOuterAirgapThickness" value="18.7*cm"/> - <constant name="SolenoidBarrelOuterCryostatThickness" value="4.0*cm"/> - <constant name="SolenoidEndcapCryostatThickness" value="6.0*cm"/> - <constant name="SolenoidEndcapAirgapThickness" value="12.0*cm"/> - <constant name="SolenoidBarrelOuterZ" value="SolenoidCoilOuterZ+SolenoidEndcapAirgapThickness"/> - <constant name="SolenoidBarrelConductorInnerRadius" value="SolenoidBarrelInnerRadius + SolenoidBarrelInnerCryostatThickness + SolenoidBarrelInnerAirgapThickness"/> - <constant name="SolenoidBarrelOuterCryostatInnerRadius" value="SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/> - <constant name="SolenoidBarrelOuterRadius" value="SolenoidBarrelOuterCryostatInnerRadius + SolenoidBarrelOuterAirgapThickness + SolenoidBarrelOuterCryostatThickness"/> - <constant name="SolenoidalFieldRadius" value="(SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness / 2.0)"/> - - - <constant name="MuonBarrel_ID" value="11"/> - <constant name="MuonBarrel_rmin" value="SolenoidBarrelOuterRadius + 1.0*cm"/> - <constant name="MuonBarrel_zmax" value="SolenoidBarrelOuterZ + SolenoidEndcapCryostatThickness"/> - <constant name="MuonBarrel_layers" value="15"/> - <constant name="MuonBarrel_layer_thickness" value="10.0*cm + 4.0*cm"/> - - <constant name="MuonEndcap_ID" value="12"/> - <constant name="MuonEndcap_zmin" value="MuonBarrel_zmax + 10.0*cm"/> <!-- Space for cables etc. --> - <constant name="MuonEndcap_rmin" value="69.0*cm"/> <!-- Space for QD0 and anti-solenoid--> - <!-- Correction from going from inner circle to outer circle --> - <constant name="MuonEndcap_rmax" value="(MuonBarrel_rmin + 57.0*cm + MuonBarrel_layers*MuonBarrel_layer_thickness) / (cos(pi/MuonSides))"/> - <constant name="MuonEndcap_layers" value="18"/> - <constant name="MuonEndcap_layer_thickness" value="10.0*cm + 4.0*cm"/> - <constant name="MuonEndcap_zmax" value="MuonEndcap_zmin + MuonEndcap_layers * MuonEndcap_layer_thickness"/> - - <constant name="LumiCal_rmin" value="6.4*cm"/> - <constant name="LumiCal_rmax" value="EcalEndcap_rmin + 3.0*cm"/> - <constant name="LumiCal_zmin" value="HcalEndcap_zmin"/> - <constant name="LumiCal_thickness" value="20*0.371*cm + 15*0.643*cm"/> - <constant name="LumiCal_zmax" value="LumiCal_zmin + LumiCal_thickness"/> - <constant name="LumiCalElectronics_rmax" value="LumiCal_rmax+5.0*cm"/> - - <constant name="SupportTube_thickness" value="1.0*cm"/> - <constant name="ForwardVacuumValve_thickness" value="36.0*cm"/> - <constant name="ForwardShielding_thickness" value="5.0*cm"/> - <constant name="ForwardMask_thickness" value="10.0*cm"/> - <constant name="ForwardMask_zmin" value="LumiCal_zmax + ForwardShielding_thickness + ForwardVacuumValve_thickness"/> - - <constant name="VertexSupport_r1" value="16.87*cm"/> - <constant name="VertexSupport_r2" value="18.42*cm"/> - <constant name="VertexSupport_zmax" value="89.48*cm"/> - - - <constant name="VertexBarrel_ID" value="1"/> - <constant name="VertexBarrel_zmax" value="10.0*cm"/> - <constant name="VertexBarrel_r1" value="2.7*cm"/> - <constant name="VertexBarrel_r2" value="3.8*cm"/> - <constant name="VertexBarrel_r3" value="5.1*cm"/> - <constant name="VertexBarrel_r4" value="6.4*cm"/> - <constant name="VertexBarrel_r5" value="7.7*cm"/> - - - <constant name="CentralBeamPipe_zmax" value="23.0*cm"/> - <constant name="CentralBeamPipe_rmax" value="VertexBarrel_r1 - 0.2*cm"/> - <constant name="CentralBeamPipe_thickness" value="CentralBeamPipe_rmax * 0.02"/> <!-- 1% of the diameter --> - <constant name="CentralBeamPipe_rmin" value="CentralBeamPipe_rmax - CentralBeamPipe_thickness"/> - <constant name="BeamPipe_thickness" value="0.4*cm"/> - <constant name="BeamPipe_endThickness" value="0.1*cm"/> - <constant name="BeamPipe_zmax" value="LumiCal_zmin - 0.5*cm"/> - <constant name="BeamPipe_rmax" value="19.0*cm"/> - <constant name="BeamPipe_rmin" value="BeamPipe_rmax - BeamPipe_thickness"/> - <constant name="bp_cone_slope" value="(BeamPipe_rmax-CentralBeamPipe_rmax)/(tracking_region_zmax-CentralBeamPipe_zmax)"/> - <constant name="BeamPipe_zmin" value="CentralBeamPipe_zmax + (BeamPipe_thickness - CentralBeamPipe_thickness)/bp_cone_slope"/> - <constant name="BeamPipeLiner_thickness" value="0.0*cm"/> - - <constant name="VertexEndcap_ID" value="2"/> - <constant name="VertexEndcap_rmax" value="11.5*cm"/> - <constant name="VertexEndcap_z1" value="12.0*cm"/> - <constant name="VertexEndcap_z2" value="16.0*cm"/> - <constant name="VertexEndcap_z3" value="20.0*cm"/> - <constant name="VertexEndcap_z4" value="24.0*cm"/> - <constant name="VertexEndcap_offset" value="0.2*cm"/> - <constant name="VertexEndcapModules" value="16"/> - <constant name="VertexEndcap_rmin1" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> - <constant name="VertexEndcap_rmin2" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> - <constant name="VertexEndcap_rmin3" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> - <constant name="VertexEndcap_rmin4" value="(VertexEndcap_z4 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + VertexEndcap_offset"/> - - <constant name="SiTrackerBarrel_ID" value="3"/> - <constant name="SiTrackerEndcap_ID" value="4"/> - - <constant name="ForwardTracker_ID" value="5"/> - <constant name="ForwardTrackerModules" value="16"/> - <constant name="ForwardTracker_rmax" value="16.87*cm"/> - <constant name="ForwardTracker_z1" value="28.0*cm"/> - <constant name="ForwardTracker_z2" value="50.0*cm"/> - <constant name="ForwardTracker_z3" value="83.0*cm"/> - <constant name="ForwardTracker_offset" value="0.2*cm"/> - <constant name="ForwardTracker_rmin1" value="(ForwardTracker_z1 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> - <constant name="ForwardTracker_rmin2" value="(ForwardTracker_z2 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> - <constant name="ForwardTracker_rmin3" value="(ForwardTracker_z3 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> - - <constant name="VertexService_zmin" value="ForwardTracker_z1 + 1.0*cm"/> - <constant name="VertexService_zmax" value="VertexService_zmin + 2.0*cm"/> - <constant name="VertexServiceThickness" value="0.3*cm"/> - <constant name="VertexCableThickness" value="0.005*cm"/> - - <constant name="BeamCal_rmax" value="13.0*cm"/> - <constant name="BeamCal_zmin" value="ForwardMask_zmin + ForwardMask_thickness"/> - - <constant name="IncomingBP_radius" value="0.25*cm"/> - <constant name="IncomingBP_thickness" value="0.05*cm"/> - <constant name="OutgoingBP_radius" value="tan(CrossingAngle/2/rad)*BeamCal_zmin"/> - <constant name="OutgoingBP_thickness" value="0.1*cm"/> - - <constant name="BeamCal_crossingAngle" value="CrossingAngle"/> - <constant name="BeamCal_outgoing_r" value="OutgoingBP_radius + 0.05*cm"/> - <constant name="BeamCal_incoming_r" value="IncomingBP_radius + 0.05*cm"/> - + <include ref="SiDConstants.xml"/> </define> diff --git a/DDDetectors/compact/SiD/SiD_HcalEndcap.xml b/DDDetectors/compact/SiD/SiD_HcalEndcap.xml index ec64195ee377d6b98f41e614f1269bc0073a9c4a..95f1b16f3c442e1c9b2ad8b8f45c293b9f65a12d 100644 --- a/DDDetectors/compact/SiD/SiD_HcalEndcap.xml +++ b/DDDetectors/compact/SiD/SiD_HcalEndcap.xml @@ -6,13 +6,13 @@ <!-- ====================================================================== --> <detectors> - <detector id="9" name="HcalEndcap" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapHits" vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP"> + <detector id="HcalEndcap_ID" name="HcalEndcap" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapHits" reflect="true" vis="HcalEndcapVis" calorimeterType="HAD_ENDCAP"> <comment>Hadron Calorimeter Endcaps</comment> <dimensions numsides="(int) CaloSides" zmin="HcalEndcap_zmin" rmin="HcalEndcap_rmin" rmax="HcalEndcap_rmax" /> <layer repeat="(int) HcalEndcap_layers"> - <slice material = "Steel235" thickness = "2.0*cm" /> + <slice material = "Steel235" thickness = "2.0*cm" /> <slice material = "Polystyrene" thickness = "0.50*cm" sensitive = "yes" limits="cal_limits" /> <slice material = "Air" thickness = "0.15*cm" /> </layer> diff --git a/DDDetectors/compact/SiDConstants.xml b/DDDetectors/compact/SiDConstants.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce549d5e46efbc71976285e1b3bcad7502bbe294 --- /dev/null +++ b/DDDetectors/compact/SiDConstants.xml @@ -0,0 +1,159 @@ + <define> + <constant name="world_side" value="30000*mm"/> + <constant name="world_x" value="world_side"/> + <constant name="world_y" value="world_side"/> + <constant name="world_z" value="world_side"/> + + <constant name="CrossingAngle" value="0.020*rad"/> + + <constant name="CaloSides" value="12"/> + <constant name="MuonSides" value="8"/> + + <constant name="EcalBarrel_ID" value="6"/> + <constant name="EcalBarrel_rmin" value="126.50*cm"/> + <constant name="EcalBarrel_zmax" value="176.50*cm"/> + + <constant name="EcalEndcap_ID" value="7"/> + <constant name="EcalEndcap_rmin" value="21.0*cm"/> + <!-- Correction from going from inner circle to outer circle --> + <constant name="EcalEndcap_rmax" value="(EcalBarrel_rmin - 1.5*cm) / (cos(pi/CaloSides))"/> + <constant name="EcalEndcap_zmin" value="165.70*cm"/> + + <constant name="HcalBarrel_ID" value="8"/> + <constant name="HcalBarrel_rmin" value="141.90*cm"/> + <constant name="HcalBarrel_layers" value="(int) 75"/> + <constant name="HcalBarrel_layer_thickness" value="1.0*cm + 0.65*cm"/> + + <constant name="HcalEndcap_ID" value="9"/> + <constant name="HcalEndcap_zmin" value="EcalBarrel_zmax + 4.0*cm"/> <!-- Gap for cables --> + <constant name="HcalEndcap_rmin" value="50.0*cm"/> + <!-- Correction from going from inner circle to outer circle --> + <constant name="HcalEndcap_rmax" value="(HcalBarrel_rmin + HcalBarrel_layers * HcalBarrel_layer_thickness) / (cos(pi/CaloSides))"/> + <constant name="HcalEndcap_layers" value="60"/> + <constant name="HcalEndcap_layer_thickness" value="2.0*cm + 0.65*cm"/> + <constant name="HcalEndcap_zmax" value="HcalEndcap_zmin + HcalEndcap_layers * HcalEndcap_layer_thickness"/> + + <constant name="HcalPlug_ID" value="10"/> + + + <constant name="tracking_region_radius" value="EcalBarrel_rmin - 1.0*mm"/> + <constant name="tracking_region_zmax" value="EcalEndcap_zmin - 1.0*mm"/> + <constant name="VXD_CF_sensor" value="0.026*cm"/> + <constant name="VXD_CF_support" value="0.05*cm"/> + + <constant name="SolenoidBarrelInnerRadius" value="HcalEndcap_rmax + 2.0*cm"/> + <constant name="SolenoidCoilOuterZ" value="HcalEndcap_zmax"/> <!-- Aligned with HCAL endcap --> + <constant name="SolenoidBarrelInnerCryostatThickness" value="3.0*cm"/> + <constant name="SolenoidBarrelInnerAirgapThickness" value="11.0*cm"/> + <constant name="SolenoidBarrelAlConductorThickness" value="38.4*cm"/> + <constant name="SolenoidBarrelQuenchbackThickness" value="5.0*cm"/> + <constant name="SolenoidBarrelOuterAirgapThickness" value="18.7*cm"/> + <constant name="SolenoidBarrelOuterCryostatThickness" value="4.0*cm"/> + <constant name="SolenoidEndcapCryostatThickness" value="6.0*cm"/> + <constant name="SolenoidEndcapAirgapThickness" value="12.0*cm"/> + <constant name="SolenoidBarrelOuterZ" value="SolenoidCoilOuterZ+SolenoidEndcapAirgapThickness"/> + <constant name="SolenoidBarrelConductorInnerRadius" value="SolenoidBarrelInnerRadius + SolenoidBarrelInnerCryostatThickness + SolenoidBarrelInnerAirgapThickness"/> + <constant name="SolenoidBarrelOuterCryostatInnerRadius" value="SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness + SolenoidBarrelQuenchbackThickness"/> + <constant name="SolenoidBarrelOuterRadius" value="SolenoidBarrelOuterCryostatInnerRadius + SolenoidBarrelOuterAirgapThickness + SolenoidBarrelOuterCryostatThickness"/> + <constant name="SolenoidalFieldRadius" value="(SolenoidBarrelConductorInnerRadius + SolenoidBarrelAlConductorThickness / 2.0)"/> + + + <constant name="MuonBarrel_ID" value="11"/> + <constant name="MuonBarrel_rmin" value="SolenoidBarrelOuterRadius + 1.0*cm"/> + <constant name="MuonBarrel_zmax" value="SolenoidBarrelOuterZ + SolenoidEndcapCryostatThickness"/> + <constant name="MuonBarrel_layers" value="15"/> + <constant name="MuonBarrel_layer_thickness" value="10.0*cm + 4.0*cm"/> + + <constant name="MuonEndcap_ID" value="12"/> + <constant name="MuonEndcap_zmin" value="MuonBarrel_zmax + 10.0*cm"/> <!-- Space for cables etc. --> + <constant name="MuonEndcap_rmin" value="69.0*cm"/> <!-- Space for QD0 and anti-solenoid--> + <!-- Correction from going from inner circle to outer circle --> + <constant name="MuonEndcap_rmax" value="(MuonBarrel_rmin + 57.0*cm + MuonBarrel_layers*MuonBarrel_layer_thickness) / (cos(pi/MuonSides))"/> + <constant name="MuonEndcap_layers" value="18"/> + <constant name="MuonEndcap_layer_thickness" value="10.0*cm + 4.0*cm"/> + <constant name="MuonEndcap_zmax" value="MuonEndcap_zmin + MuonEndcap_layers * MuonEndcap_layer_thickness"/> + + <constant name="LumiCal_rmin" value="6.4*cm"/> + <constant name="LumiCal_rmax" value="EcalEndcap_rmin + 3.0*cm"/> + <constant name="LumiCal_zmin" value="HcalEndcap_zmin"/> + <constant name="LumiCal_thickness" value="20*0.371*cm + 15*0.643*cm"/> + <constant name="LumiCal_zmax" value="LumiCal_zmin + LumiCal_thickness"/> + <constant name="LumiCalElectronics_rmax" value="LumiCal_rmax+5.0*cm"/> + + <constant name="SupportTube_thickness" value="1.0*cm"/> + <constant name="ForwardVacuumValve_thickness" value="36.0*cm"/> + <constant name="ForwardShielding_thickness" value="5.0*cm"/> + <constant name="ForwardMask_thickness" value="10.0*cm"/> + <constant name="ForwardMask_zmin" value="LumiCal_zmax + ForwardShielding_thickness + ForwardVacuumValve_thickness"/> + + <constant name="VertexSupport_r1" value="16.87*cm"/> + <constant name="VertexSupport_r2" value="18.42*cm"/> + <constant name="VertexSupport_zmax" value="89.48*cm"/> + + + <constant name="VertexBarrel_ID" value="1"/> + <constant name="VertexBarrel_zmax" value="10.0*cm"/> + <constant name="VertexBarrel_r1" value="2.7*cm"/> + <constant name="VertexBarrel_r2" value="3.8*cm"/> + <constant name="VertexBarrel_r3" value="5.1*cm"/> + <constant name="VertexBarrel_r4" value="6.4*cm"/> + <constant name="VertexBarrel_r5" value="7.7*cm"/> + + + <constant name="CentralBeamPipe_zmax" value="23.0*cm"/> + <constant name="CentralBeamPipe_rmax" value="VertexBarrel_r1 - 0.2*cm"/> + <constant name="CentralBeamPipe_thickness" value="CentralBeamPipe_rmax * 0.02"/> <!-- 1% of the diameter --> + <constant name="CentralBeamPipe_rmin" value="CentralBeamPipe_rmax - CentralBeamPipe_thickness"/> + <constant name="BeamPipe_thickness" value="0.4*cm"/> + <constant name="BeamPipe_endThickness" value="0.1*cm"/> + <constant name="BeamPipe_zmax" value="LumiCal_zmin - 0.5*cm"/> + <constant name="BeamPipe_rmax" value="19.0*cm"/> + <constant name="BeamPipe_rmin" value="BeamPipe_rmax - BeamPipe_thickness"/> + <constant name="bp_cone_slope" value="(BeamPipe_rmax-CentralBeamPipe_rmax)/(tracking_region_zmax-CentralBeamPipe_zmax)"/> + <constant name="BeamPipe_zmin" value="CentralBeamPipe_zmax + (BeamPipe_thickness - CentralBeamPipe_thickness)/bp_cone_slope"/> + <constant name="BeamPipeLiner_thickness" value="0.0*cm"/> + + <constant name="VertexEndcap_ID" value="2"/> + <constant name="VertexEndcap_rmax" value="11.5*cm"/> + <constant name="VertexEndcap_z1" value="12.0*cm"/> + <constant name="VertexEndcap_z2" value="16.0*cm"/> + <constant name="VertexEndcap_z3" value="20.0*cm"/> + <constant name="VertexEndcap_z4" value="24.0*cm"/> + <constant name="VertexEndcap_offset" value="0.2*cm"/> + <constant name="VertexEndcapModules" value="16"/> + <constant name="VertexEndcap_rmin1" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> + <constant name="VertexEndcap_rmin2" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> + <constant name="VertexEndcap_rmin3" value="CentralBeamPipe_rmax + VertexEndcap_offset"/> + <constant name="VertexEndcap_rmin4" value="(VertexEndcap_z4 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + VertexEndcap_offset"/> + + <constant name="SiTrackerBarrel_ID" value="3"/> + <constant name="SiTrackerEndcap_ID" value="4"/> + + <constant name="ForwardTracker_ID" value="5"/> + <constant name="ForwardTrackerModules" value="16"/> + <constant name="ForwardTracker_rmax" value="16.87*cm"/> + <constant name="ForwardTracker_z1" value="28.0*cm"/> + <constant name="ForwardTracker_z2" value="50.0*cm"/> + <constant name="ForwardTracker_z3" value="83.0*cm"/> + <constant name="ForwardTracker_offset" value="0.2*cm"/> + <constant name="ForwardTracker_rmin1" value="(ForwardTracker_z1 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> + <constant name="ForwardTracker_rmin2" value="(ForwardTracker_z2 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> + <constant name="ForwardTracker_rmin3" value="(ForwardTracker_z3 - CentralBeamPipe_zmax)*bp_cone_slope + CentralBeamPipe_rmax + ForwardTracker_offset"/> + + <constant name="VertexService_zmin" value="ForwardTracker_z1 + 1.0*cm"/> + <constant name="VertexService_zmax" value="VertexService_zmin + 2.0*cm"/> + <constant name="VertexServiceThickness" value="0.3*cm"/> + <constant name="VertexCableThickness" value="0.005*cm"/> + + <constant name="BeamCal_rmax" value="13.0*cm"/> + <constant name="BeamCal_zmin" value="ForwardMask_zmin + ForwardMask_thickness"/> + + <constant name="IncomingBP_radius" value="0.25*cm"/> + <constant name="IncomingBP_thickness" value="0.05*cm"/> + <constant name="OutgoingBP_radius" value="tan(CrossingAngle/2/rad)*BeamCal_zmin"/> + <constant name="OutgoingBP_thickness" value="0.1*cm"/> + + <constant name="BeamCal_crossingAngle" value="CrossingAngle"/> + <constant name="BeamCal_outgoing_r" value="OutgoingBP_radius + 0.05*cm"/> + <constant name="BeamCal_incoming_r" value="IncomingBP_radius + 0.05*cm"/> + </define> diff --git a/DDDetectors/src/ReflectedDetector_geo.cpp b/DDDetectors/src/ReflectedDetector_geo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cb717643eb34ee1d3dc84038d56d5feb4d8fbb42 --- /dev/null +++ b/DDDetectors/src/ReflectedDetector_geo.cpp @@ -0,0 +1,80 @@ +//========================================================================== +// AIDA Detector description implementation +//-------------------------------------------------------------------------- +// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN) +// All rights reserved. +// +// For the licensing terms see $DD4hepINSTALL/LICENSE. +// For the list of contributors see $DD4hepINSTALL/doc/CREDITS. +// +// Author : M.Frank +// +//========================================================================== +// +// Specialized generic detector constructor +// +//========================================================================== +#include "DD4hep/Printout.h" +#include "DD4hep/DD4hepUnits.h" +#include "DD4hep/MatrixHelpers.h" +#include "DD4hep/DetFactoryHelper.h" + +using namespace std; +using namespace dd4hep; +using namespace dd4hep::detail; + +static Ref_t create_element(Detector& description, xml_h e, Ref_t sens) { + xml_det_t x_det (e); + SensitiveDetector sd = sens; + xml_dim_t pos = x_det.child(_U(position),false); + xml_dim_t rot = x_det.child(_U(rotation),false); + string ref_nam = x_det.attr<string>(_U(sdref)); + DetElement ref_det = description.detector(ref_nam); + auto refl = ref_det.reflect(x_det.nameStr(), x_det.id(), sd); + Volume vol = refl.second; + DetElement sdet = refl.first; + + if ( !x_det.visStr().empty() ) + vol.setVisAttributes(description, x_det.visStr()); + if ( !x_det.limitsStr().empty() ) + vol.setLimitSet(description, x_det.limitsStr()); + if ( !x_det.regionStr().empty() ) + vol.setRegion(description, x_det.regionStr()); + if ( x_det.isSensitive() ) { + xml_dim_t sd_typ = x_det.child(_U(sensitive)); + sd.setType(sd_typ.typeStr()); + } + PlacedVolume pv; + Volume mother = description.pickMotherVolume(sdet); + if ( pos && rot ) { + pv = mother.placeVolume(vol,Transform3D(RotationZYX(rot.z(0),rot.y(0),rot.x(0)),Position(pos.x(0),pos.y(0),pos.z(0)))); + printout(INFO,"ReflectedDet","Transform3D placement at pos: %f %f %f rot: %f %f %f", + pos.x(0),pos.y(0),pos.z(0), rot.x(0),rot.y(0),rot.z(0)); + } + else if ( rot ) { + printout(INFO,"ReflectedDet","Rotation placement at %f %f %f",rot.x(0),rot.y(0),rot.z(0)); + pv = mother.placeVolume(vol,RotationZYX(rot.z(0),rot.y(0),rot.x(0))); + } + else if ( pos ) { + printout(INFO,"ReflectedDet","Positional placing at %f %f %f",pos.x(0),pos.y(0),pos.z(0)); + pv = mother.placeVolume(vol,Position(pos.x(0),pos.y(0),pos.z(0))); + } + else { + auto ref_pv = ref_det.placement(); + RotationZYX rot3D; + Position tr3D; + matrix::_decompose(ref_pv.matrix(), tr3D, rot3D); + tr3D = tr3D * (-1.0 / dd4hep::mm); + rot3D = rot3D * RotationZ(); + pv = mother.placeVolume(vol, Transform3D(rot3D, tr3D)); + printout(INFO,"ReflectedDet","Transform3D placement at pos: %f %f %f rot: %f %f %f", + tr3D.X(),tr3D.Y(),tr3D.Z(), rot3D.Phi(),rot3D.Theta(),rot3D.Psi()); + } + if ( x_det.hasAttr(_U(id)) ) { + pv.addPhysVolID("system",x_det.id()); + } + sdet.setPlacement(pv); + return sdet; +} + +DECLARE_DETELEMENT(DD4hep_ReflectedDetector,create_element) diff --git a/DDG4/CMakeLists.txt b/DDG4/CMakeLists.txt index ff705904a21b4e455cdc6a984923f60111515dba..d7a97e4154db4f7a33039a3509e7abca2dc639d0 100644 --- a/DDG4/CMakeLists.txt +++ b/DDG4/CMakeLists.txt @@ -101,7 +101,8 @@ IF(TARGET LCIO::LCIO) set_target_properties(DDG4LCIO PROPERTIES VERSION ${DD4hep_VERSION} SOVERSION ${DD4hep_SOVERSION}) ENDIF() -# #--------------------------- DDRec dependent Plugins ----------------------------- +# +#--------------------------- DDRec dependent Plugins ----------------------------- #This does not compile at the moment # IF(TARGET DDRec) # dd4hep_add_plugin(DDG4Reco diff --git a/examples/ClientTests/CMakeLists.txt b/examples/ClientTests/CMakeLists.txt index bd6c6b7f1d79cd363ef02985fbb41dfe49baef41..efd651a6a409a38f16a27bada3c62a37cb4416a9 100644 --- a/examples/ClientTests/CMakeLists.txt +++ b/examples/ClientTests/CMakeLists.txt @@ -183,7 +183,7 @@ dd4hep_add_test_reg( ClientTests_Save_ROOT_MiniTel_LONGTEST # # Test basic shapes by comparing mesh vertices with reference file foreach (test Box Cone ConeSegment Tube ElTube - CutTube Hyperboloid Paraboloid EightPointSolid + CutTube Hyperboloid Paraboloid EightPointSolid Eightpoint_Reflect_Volume Eightpoint_Reflect_DetElement Polycone PseudoTrap PseudoTrap2 Sphere Torus Trap Trd1 Trd2 TruncatedTube ExtrudedPolygon) dd4hep_add_test_reg( ClientTests_Check_Shape_${test} @@ -204,7 +204,7 @@ dd4hep_add_test_reg( ClientTests_Check_VolumeDivisionTest # # only if root version > 6.19: MaterialTester # -foreach (test Assemblies BoxTrafos IronCylinder LheD_tracker MagnetFields +foreach (test Assemblies BoxTrafos CaloEndcapReflection IronCylinder LheD_tracker MagnetFields MiniTel SectorBarrelCalorimeter SiliconBlock NestedSimple NestedDetectors MultiCollections MultiSegmentations ) @@ -239,7 +239,7 @@ endforeach() # IronCylinder has no segmentation! # MaterialTester no geometry # SectorBarrelCalorimeter is bad -foreach (test Assemblies BoxTrafos LheD_tracker MagnetFields MiniTel SiliconBlock +foreach (test Assemblies BoxTrafos CaloEndcapReflection LheD_tracker MagnetFields MiniTel SiliconBlock NestedSimple NestedDetectors MultiCollections ) # # Test material scans in [origine to 10 meters in y] @@ -261,7 +261,7 @@ endforeach() # # # -foreach (test BoxTrafos IronCylinder MiniTel SiliconBlock NestedSimple MultiCollections ) +foreach (test BoxTrafos CaloEndcapReflection IronCylinder MiniTel SiliconBlock NestedSimple MultiCollections ) # # Read data from XML file. Then parse the pure XML string. dd4hep_add_test_reg( ClientTests_parse_xml_string_${test} diff --git a/examples/ClientTests/compact/CaloEndcapReflection.xml b/examples/ClientTests/compact/CaloEndcapReflection.xml new file mode 100644 index 0000000000000000000000000000000000000000..547f2d53d84c3278907ffed0a11cd0091d504541 --- /dev/null +++ b/examples/ClientTests/compact/CaloEndcapReflection.xml @@ -0,0 +1,115 @@ +<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"> + + <info name="clic_sid_cdr" + title="CLIC Silicon Detector CDR" + author="Markus Frank" + url="https://twiki.cern.ch/twiki/bin/view/CLIC/ClicSidCdr" + status="development" + version="1.0"> + <comment>Test for reflections with left handed coordinates of the ECAL/HCAL encap</comment> + </info> + + <define> + <include ref="${DD4hepINSTALL}/DDDetectors/compact/SiDConstants.xml"/> + </define> + + <includes> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/elements.xml"/> + <gdmlFile ref="${DD4hepINSTALL}/DDDetectors/compact/materials.xml"/> + </includes> + + <comment>Common Generic visualization attributes</comment> + <display> + <vis name="InvisibleNoDaughters" showDaughters="false" visible="false"/> + <vis name="InvisibleWithDaughters" showDaughters="true" visible="false"/> + <vis name="GreenVis" alpha="1" r="0.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="RedVis" alpha="1" r="1.0" g="0.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="BlueVis" alpha="1" r="0.0" g="0.0" b="1.0" showDaughters="true" visible="true"/> + <vis name="YellowVis" alpha="1" r="1.0" g="1.0" b="0.0" showDaughters="true" visible="true"/> + <vis name="PinkVis" alpha="1" r="0.9" g="0.3" b="0.8" showDaughters="true" visible="true"/> + </display> + + <detectors> + <detector id="EcalEndcap_ID" name="EcalEndcapA" type="DD4hep_PolyhedraEndcapCalorimeter2" reflect="false" readout="EcalEndcapAHits" vis="InvisibleWithDaughters" calorimeterType="EM_ENDCAP"> + + <dimensions numsides="(int) CaloSides" zmin="EcalEndcap_zmin" rmin="EcalEndcap_rmin" rmax="EcalEndcap_rmax" /> + <layer repeat="3" vis="YellowVis"> + <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="3" vis="RedVis"> + <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="3" vis="BlueVis"> + <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="3" vis="PinkVis"> + <slice material = "Silicon" thickness = "1*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + </detector> + <detector id="EcalEndcap_ID+100" name="EcalEndcapB" type="DD4hep_ReflectedDetector" + sensitive="true" sdref="EcalEndcapA" readout="EcalEndcapBHits"> + <sensitive type="calorimeter"/> + </detector> + + </detectors> + + <!-- Definition of the readout segmentation/definition --> + <readouts> + <readout name="EcalEndcapAHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.5" grid_size_y="3.5" /> + <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> + </readout> + <readout name="EcalEndcapBHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.5" grid_size_y="3.5" /> + <id>system:8,barrel:3,module:4,layer:6,slice:5,x:32:-16,y:-16</id> + </readout> + </readouts> + + <detectors> + <detector id="HcalEndcap_ID" name="HcalEndcapA" type="DD4hep_PolyhedraEndcapCalorimeter2" readout="HcalEndcapAHits" reflect="false" vis="InvisibleWithDaughters" calorimeterType="HAD_ENDCAP"> + <dimensions numsides="(int) CaloSides" zmin="HcalEndcap_zmin" rmin="HcalEndcap_rmin" rmax="HcalEndcap_rmax" /> + <layer repeat="2" vis="YellowVis"> + <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="2" vis="RedVis"> + <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="2" vis="BlueVis"> + <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + <layer repeat="2" vis="PinkVis"> + <slice material="Polystyrene" thickness="3*cm" sensitive="yes" limits="cal_limits" vis="InvisibleNoDaughters"/> + </layer> + </detector> + <detector id="HcalEndcap_ID+100" name="HcalEndcapB" type="DD4hep_ReflectedDetector" + sensitive="true" sdref="HcalEndcapA" readout="HcalEndcapBHits"> + <sensitive type="calorimeter"/> + </detector> + </detectors> + + <!-- Definition of the readout segmentation/definition --> + <readouts> + <readout name="HcalEndcapAHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.0*cm" grid_size_y="3.0*cm" /> + <id>system:8,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> + </readout> + <readout name="HcalEndcapBHits"> + <segmentation type="CartesianGridXY" grid_size_x="3.0*cm" grid_size_y="3.0*cm" /> + <id>system:8,barrel:3,module:4,layer:8,slice:5,x:32:-16,y:-16</id> + </readout> + </readouts> + + <comment>Beampipe</comment> + <include ref="${DD4hepINSTALL}/DDDetectors/compact/SiD/SiD_Beampipe.xml"/> + + <fields> + <field name="GlobalSolenoid" type="solenoid" + inner_field="5.0*tesla" + outer_field="-1.5*tesla" + zmax="SolenoidCoilOuterZ" + outer_radius="SolenoidalFieldRadius"> + </field> + </fields> +</lccdd> diff --git a/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml b/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml new file mode 100644 index 0000000000000000000000000000000000000000..540a149e72ba1c125588ec043dd4bf9674f2e3ae --- /dev/null +++ b/examples/ClientTests/compact/Check_Shape_Eightpoint_Reflect_DetElement.xml @@ -0,0 +1,26 @@ +<lccdd> + <includes> + <gdmlFile ref="CheckShape.xml"/> + </includes> + + <detectors> + <detector id="1" name="Shape_Trapezoid" type="DD4hep_TestShape_Creator"> + <check vis="Shape1_vis"> + <shape type="EightPointSolid" dz="30*cm"> + <vertex x="-30*cm" y="-25*cm"/> + <vertex x="-25*cm" y=" 25*cm"/> + <vertex x=" 5*cm" y=" 25*cm"/> + <vertex x=" 25*cm" y="-25*cm"/> + <vertex x="-28*cm" y="-23*cm"/> + <vertex x="-23*cm" y=" 27*cm"/> + <vertex x="-23*cm" y=" 27*cm"/> + <vertex x=" 13*cm" y="-27*cm"/> + </shape> + <position x="0" y="0" z="100"/> + <rotation x="0" y="0" z="0"/> + </check> + <reflect vis="Shape2_vis"/> + <test type="DD4hep_Mesh_Verifier" ref="${DD4hepExamplesINSTALL}/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt" create="CheckShape_create"/> + </detector> + </detectors> +</lccdd> diff --git a/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt b/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt new file mode 100644 index 0000000000000000000000000000000000000000..d7712f2ff954800211f618621615d8d68284f528 --- /dev/null +++ b/examples/ClientTests/ref/Ref_Eightpoint_Reflect_DetElement.txt @@ -0,0 +1,24 @@ +ShapeCheck[0] TGeoArb8 8 Mesh-points: +TGeoArb8 EightPointSolid N(mesh)=8 N(vert)=8 N(seg)=12 N(pols)=6 +TGeoArb8 0 Local ( -30.00, -25.00, -30.00) Global ( -30.00, -25.00, 70.00) +TGeoArb8 1 Local ( -25.00, 25.00, -30.00) Global ( -25.00, 25.00, 70.00) +TGeoArb8 2 Local ( 5.00, 25.00, -30.00) Global ( 5.00, 25.00, 70.00) +TGeoArb8 3 Local ( 25.00, -25.00, -30.00) Global ( 25.00, -25.00, 70.00) +TGeoArb8 4 Local ( -28.00, -23.00, 30.00) Global ( -28.00, -23.00, 130.00) +TGeoArb8 5 Local ( -23.00, 27.00, 30.00) Global ( -23.00, 27.00, 130.00) +TGeoArb8 6 Local ( -23.00, 27.00, 30.00) Global ( -23.00, 27.00, 130.00) +TGeoArb8 7 Local ( 13.00, -27.00, 30.00) Global ( 13.00, -27.00, 130.00) +TGeoArb8 Bounding box: dx= 27.50 dy= 27.00 dz= 30.00 Origin: x= -2.50 y= 0.00 z= 0.00 + +ShapeCheck[1] TGeoScaledShape 8 Mesh-points: +TGeoScaledShape Shape_Trapezoid_vol_0_shape_refl N(mesh)=8 N(vert)=8 N(seg)=12 N(pols)=6 +TGeoScaledShape 0 Local ( -30.00, -25.00, 30.00) Global ( -30.00, -25.00, -70.00) +TGeoScaledShape 1 Local ( -25.00, 25.00, 30.00) Global ( -25.00, 25.00, -70.00) +TGeoScaledShape 2 Local ( 5.00, 25.00, 30.00) Global ( 5.00, 25.00, -70.00) +TGeoScaledShape 3 Local ( 25.00, -25.00, 30.00) Global ( 25.00, -25.00, -70.00) +TGeoScaledShape 4 Local ( -28.00, -23.00, -30.00) Global ( -28.00, -23.00, -130.00) +TGeoScaledShape 5 Local ( -23.00, 27.00, -30.00) Global ( -23.00, 27.00, -130.00) +TGeoScaledShape 6 Local ( -23.00, 27.00, -30.00) Global ( -23.00, 27.00, -130.00) +TGeoScaledShape 7 Local ( 13.00, -27.00, -30.00) Global ( 13.00, -27.00, -130.00) +TGeoScaledShape Bounding box: dx= 27.50 dy= 27.00 dz= 30.00 Origin: x= -2.50 y= 0.00 z= -0.00 + diff --git a/examples/ClientTests/scripts/Check_shape.py b/examples/ClientTests/scripts/Check_shape.py new file mode 100644 index 0000000000000000000000000000000000000000..0672f99fc72c8674fa4ee71d0966ca2bf3b2fb73 --- /dev/null +++ b/examples/ClientTests/scripts/Check_shape.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, unicode_literals +import os, sys, DDG4 +# +""" + dd4hep example setup using the python configuration + + \author M.Frank + \version 1.0 + +""" + + +def run(): + kernel = DDG4.Kernel() + install_dir = os.environ['DD4hepExamplesINSTALL'] + # Configure UI + geant4 = DDG4.Geant4(kernel, tracker='Geant4TrackerCombineAction') + geant4.setupCshUI(vis=True) + if len(sys.argv) >= 2 and sys.argv[1] == "batch": + kernel.UI = '' + elif len(sys.argv) >= 3 and (sys.argv[1] == "batch" or sys.argv[2] == "batch"): + kernel.UI = '' + elif len(sys.argv) == 2 and sys.argv[1] != "batch": + kernel.loadGeometry(sys.argv[1]) + elif len(sys.argv) == 3 and sys.argv[1] != "batch": + kernel.loadGeometry(sys.argv[2]) + elif len(sys.argv) == 3 and sys.argv[2] != "batch": + kernel.loadGeometry(sys.argv[1]) + # + # Configure field + geant4.setupTrackingField(prt=True) + # Now build the physics list: + phys = kernel.physicsList() + phys.extends = 'QGSP_BERT' + phys.enableUI() + phys.dump() + + DDG4.setPrintLevel(DDG4.OutputLevel.DEBUG) + geant4.execute() + + +if __name__ == "__main__": + run() diff --git a/examples/ClientTests/scripts/Check_shape_vis.mac b/examples/ClientTests/scripts/Check_shape_vis.mac new file mode 100644 index 0000000000000000000000000000000000000000..484297ba4fa8cbd13ea280bfd4e5dbd7a779d50c --- /dev/null +++ b/examples/ClientTests/scripts/Check_shape_vis.mac @@ -0,0 +1,9 @@ +/control/verbose 2 +/run/initialize +/vis/open OGL +/vis/verbose errors +/vis/drawVolume +/vis/viewer/set/viewpointThetaPhi 55. 45. +/vis/scene/add/axes 0 0 0 1 m +/vis/viewer/refresh +