From 201dce2a571a9ef1264e1d61f2d9e800dfb931e0 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Sat, 2 May 2026 20:26:47 +0200 Subject: [PATCH 01/12] minimal changes to include WireTracker_info --- CMakeLists.txt | 1 + DCHdigi/CMakeLists.txt | 1 + DCHdigi/include/DCHdigi_v02.h | 10 +++++++--- DCHdigi/src/DCHdigi_v02.cpp | 18 ++++++++---------- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d070546..4105c91a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ find_package(ROOT COMPONENTS RIO Tree MathCore) find_package(podio 1.2 REQUIRED) find_package(EDM4HEP REQUIRED) find_package(k4FWCore 1.3 REQUIRED) +find_package(k4geo REQUIRED) find_package(Gaudi REQUIRED) find_package(Delphes REQUIRED) find_package(GSL REQUIRED) diff --git a/DCHdigi/CMakeLists.txt b/DCHdigi/CMakeLists.txt index 3f086de7..94e1508a 100644 --- a/DCHdigi/CMakeLists.txt +++ b/DCHdigi/CMakeLists.txt @@ -60,6 +60,7 @@ gaudi_add_module(${PackageName} LINK k4FWCore::k4FWCore k4FWCore::k4Interface + k4geo::detectorCommon Gaudi::GaudiKernel EDM4HEP::edm4hep extensionDict diff --git a/DCHdigi/include/DCHdigi_v02.h b/DCHdigi/include/DCHdigi_v02.h index d48a95fd..09470b6c 100644 --- a/DCHdigi/include/DCHdigi_v02.h +++ b/DCHdigi/include/DCHdigi_v02.h @@ -64,7 +64,11 @@ // k4FWCore #include "k4FWCore/Transformer.h" +// k4geo +#include "detectorCommon/WireTracker_info.h" + // k4Interface +#include #include #include @@ -78,7 +82,7 @@ #include "DDSegmentation/BitFieldCoder.h" // DDRec -#include "DDRec/DCH_info.h" +//#include "DDRec/DCH_info.h" // delphes #include "TrackCovariance/TrkUtil.h" @@ -167,9 +171,9 @@ class DCHdigi_v02 final "ReadoutWindowStartTime_ns + ReadoutWindowDuration_ns are discarded."}; /// Convert EDM4hep Vector3d to TVector3 - TVector3 toTVector3(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; + ROOT::Math::XYZVector toTVector3(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; /// Convert TVector3 to EDM4hep Vector3d - edm4hep::Vector3d toEDM4hepVector(const TVector3& v) const { return {v.x(), v.y(), v.z()}; }; + edm4hep::Vector3d toEDM4hepVector(const ROOT::Math::XYZVector& v) const { return {v.x(), v.y(), v.z()}; }; // /// Function to calculate the drift time from the distance to the wire double get_drift_time_ns(double distance_to_wire_mm) const; diff --git a/DCHdigi/src/DCHdigi_v02.cpp b/DCHdigi/src/DCHdigi_v02.cpp index b2b07b63..09a3ba46 100644 --- a/DCHdigi/src/DCHdigi_v02.cpp +++ b/DCHdigi/src/DCHdigi_v02.cpp @@ -118,8 +118,8 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, for (const auto& [cellID, simhits] : cell_map) { // Some geometry values needed for the calculations below - int layer = m_dch_info->CalculateILayerFromCellIDFields(m_decoder->get(cellID, "layer"), - m_decoder->get(cellID, "superlayer")); + int superlayer = m_decoder->get(cellID, "superlayer"); + int layer = m_dch_info->CalculateILayerFromCellIDFields(m_decoder->get(cellID, "layer"), superlayer); int nphi = m_decoder->get(cellID, "nphi"); /* THE FOLLOWING CALCULATION OF WIRE ANGLES HAS BEEN COPIED AS IS FROM DCHdigi_v01! */ @@ -128,16 +128,14 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, // One point of the wire is for example the following: // RotationZ(WireAzimuthalAngle) * Position(cell_rave_z0, 0 , 0) // variables are defined below - auto WireAzimuthalAngle = this->m_dch_info->Get_cell_phi_angle(layer, nphi); + auto WireAzimuthalAngle = this->m_dch_info->Get_cell_phi_angle(superlayer, layer, /*sector=*/0, nphi); float WireStereoAngle = 0; { auto l = this->m_dch_info->database.at(layer); - // radial middle point of the cell at Z=0 - auto cell_rave_z0 = 0.5 * (l.radius_fdw_z0 + l.radius_fuw_z0); // when building the twisted tube, the twist angle is defined as: - // cell_twistangle = l.StereoSign() * DCH_i->twist_angle + // cell_twistangle = DCH_i->StereoSign(l) * DCH_i->twist_angle // which forces the stereoangle of the wire to have the oposite sign - WireStereoAngle = (-1.) * l.StereoSign() * m_dch_info->stereoangle_z0(cell_rave_z0); + WireStereoAngle = (-1.) * l.stereo_sw_z0; } /* END OF COPYING WIRE ANGLE CALCULATION FROM DCHdigi_v01 */ @@ -157,10 +155,10 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, // Use dd4hep:mm as scale to convert into the dd4hep default units (_ddu) auto simhit_position_ddu = this->toTVector3(simhit.getPosition()) * dd4hep::mm; - auto hit_to_wire_vector_ddu = m_dch_info->Calculate_hitpos_to_wire_vector(layer, nphi, simhit_position_ddu); + auto hit_to_wire_vector_ddu = m_dch_info->Calculate_hitpos_to_wire_vector(superlayer, layer, /*isector=*/0, nphi, simhit_position_ddu); auto hit_projection_on_the_wire_ddu = simhit_position_ddu + hit_to_wire_vector_ddu; double distance_to_wire_mm = - hit_to_wire_vector_ddu.Mag() / dd4hep::mm; // Explicitly cast to mm, no matter what the default unit is + hit_to_wire_vector_ddu.R() / dd4hep::mm; // Explicitly cast to mm, no matter what the default unit is //////////////////////////////////////////// // POSITION SMEARING AND TIME COMPUTATION // @@ -172,7 +170,7 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, // z smearing double smearing_z_ddu = random_engine.Gaus(0.0, m_z_resolution_mm.value() * dd4hep::mm); - TVector3 wire_direction_ez_ddu = (m_dch_info->Calculate_wire_vector_ez(layer, nphi)).Unit(); + auto wire_direction_ez_ddu = (m_dch_info->Calculate_wire_vector_ez(superlayer, layer,/*sector=*/0, nphi)).Unit(); hit_projection_on_the_wire_ddu += smearing_z_ddu * wire_direction_ez_ddu; // Need to multiply smearing_z_ddu with dd4hep::mm to cast into default units From 7589e29e368e7f8d8d09d984ff4acae987f0621a Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Tue, 12 May 2026 15:08:22 +0200 Subject: [PATCH 02/12] clean up and adapt tracking code --- DCHdigi/include/DCHdigi_v02.h | 4 ---- Tracking/CMakeLists.txt | 1 + Tracking/include/genfit_interfaces/GenfitTrack.h | 2 ++ Tracking/include/genfit_interfaces/GenfitWireMeasurement.h | 3 ++- Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp | 7 ++++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/DCHdigi/include/DCHdigi_v02.h b/DCHdigi/include/DCHdigi_v02.h index 09470b6c..16d14008 100644 --- a/DCHdigi/include/DCHdigi_v02.h +++ b/DCHdigi/include/DCHdigi_v02.h @@ -68,7 +68,6 @@ #include "detectorCommon/WireTracker_info.h" // k4Interface -#include #include #include @@ -81,9 +80,6 @@ // DD4hep #include "DDSegmentation/BitFieldCoder.h" -// DDRec -//#include "DDRec/DCH_info.h" - // delphes #include "TrackCovariance/TrkUtil.h" diff --git a/Tracking/CMakeLists.txt b/Tracking/CMakeLists.txt index d5ace677..34d48a78 100644 --- a/Tracking/CMakeLists.txt +++ b/Tracking/CMakeLists.txt @@ -37,6 +37,7 @@ gaudi_add_module(${PackageName} EDM4HEP::edm4hep k4FWCore::k4FWCore k4FWCore::k4Interface + k4geo::detectorCommon extensionDict onnxruntime::onnxruntime torch diff --git a/Tracking/include/genfit_interfaces/GenfitTrack.h b/Tracking/include/genfit_interfaces/GenfitTrack.h index 6cf77da1..c28e6c6a 100644 --- a/Tracking/include/genfit_interfaces/GenfitTrack.h +++ b/Tracking/include/genfit_interfaces/GenfitTrack.h @@ -47,6 +47,8 @@ #include "DDRec/Vector3D.h" #include "DDSegmentation/BitFieldCoder.h" +#include "detectorCommon/WireTracker_info.h" + #include "edm4hep/MutableTrack.h" #include "edm4hep/TrackCollection.h" diff --git a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h index 48885066..6d9d8b35 100644 --- a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h +++ b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h @@ -30,9 +30,10 @@ #include #include -#include "DDRec/DCH_info.h" #include "DDSegmentation/BitFieldCoder.h" +#include "detectorCommon/WireTracker_info.h" + #include "edm4hep/SenseWireHitCollection.h" /** @class WireMeasurement diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index 372eca4b..1b2f8891 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -53,14 +53,15 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: direction = direction.Unit(); // Wire extremities - const int layer = decoder->get(cellid, "layer"); const int superlayer = decoder->get(cellid, "superlayer"); + const int layer = decoder->get(cellid, "layer"); + const int sector = decoder->get(cellid, "sector"); const int nphi = decoder->get(cellid, "nphi"); const int ilayer = dch_info->CalculateILayerFromCellIDFields(layer, superlayer); const auto& l = dch_info->database.at(ilayer); - const int stereosign = l.StereoSign(); + const int stereosign = dch_info->StereoSign(l); const double rz0 = l.radius_sw_z0; const double dphi = dch_info->twist_angle; @@ -70,7 +71,7 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: TVector3 p2(rz0, stereosign * rz0 * kappa * dch_info->Lhalf, dch_info->Lhalf); - const double phi_z0 = dch_info->Calculate_wire_phi_z0(ilayer, nphi); + const double phi_z0 = dch_info->Get_cell_phi_angle(superlayer, ilayer, sector, nphi); p1.RotateZ(phi_z0); p2.RotateZ(phi_z0); From 90b6648762e1193efe4bb9d9c05010fa35d06ee6 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Tue, 12 May 2026 15:41:34 +0200 Subject: [PATCH 03/12] move to wire tracker info --- Tracking/components/GenfitTrackFitter.cpp | 18 ++++++++-------- .../include/genfit_interfaces/GenfitTrack.h | 6 +++--- .../genfit_interfaces/GenfitWireMeasurement.h | 2 +- .../src/genfit_interfaces/GenfitTrack.cpp | 6 +++--- .../GenfitWireMeasurement.cpp | 21 +++++++++---------- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Tracking/components/GenfitTrackFitter.cpp b/Tracking/components/GenfitTrackFitter.cpp index 76a5db4f..c7d24c3a 100644 --- a/Tracking/components/GenfitTrackFitter.cpp +++ b/Tracking/components/GenfitTrackFitter.cpp @@ -154,9 +154,9 @@ struct GenfitTrackFitter final // If the detector doesn't have a drift chamber, this part will be skipped try { - std::string DCH_name(m_DCH_name.value()); - dd4hep::DetElement DCH_DE = m_geoSvc->getDetector()->detectors().at(DCH_name); - m_dch_info = DCH_DE.extension(); + std::string DCH_name(m_WireTracker_name.value()); + dd4hep::DetElement WireTracker_DE = m_geoSvc->getDetector()->detectors().at(DCH_name); + m_wire_info = WireTracker_DE.extension(); dd4hep::SensitiveDetector dch_sd = m_geoSvc->getDetector()->sensitiveDetector(DCH_name); dd4hep::Readout dch_readout = dch_sd.readout(); m_dc_decoder = dch_readout.idSpec().decoder(); @@ -454,12 +454,12 @@ struct GenfitTrackFitter final GenfitInterface::GenfitMaterialInterface* m_geoMaterial; dd4hep::rec::SurfaceManager* m_surfMan; - dd4hep::rec::DCH_info* m_dch_info; + dd4hep::rec::WireTracker_info* m_wire_info; dd4hep::DDSegmentation::BitFieldCoder* m_dc_decoder; - Gaudi::Property m_DCH_name{ - this, "DCHName", "DCH_v2", - "DCHName in the detector description (used to retrieve DCH geometry and material information)"}; + Gaudi::Property m_WireTracker_name{ + this, "WireTrackerName", "DCH_v2", + "WireTrackerName in the detector description (used to retrieve Wire Tracker geometry and material information)"}; // ====================== ECAL Geometry Parameters ====================== double m_eCalBarrelInnerR; @@ -616,7 +616,7 @@ struct GenfitTrackFitter final edm4hep::TrackCollection& FittedTracks, edm4hep::TrackCollection& FittedTracksWithFilteredHits, edm4hep::TrackerHitPlaneCollection& FittedHits, bool runCalorimeterExtrapolation) const { - GenfitInterface::GenfitTrack track_interface(track, m_skipTrackOrdering, m_dch_info, m_dc_decoder, + GenfitInterface::GenfitTrack track_interface(track, m_skipTrackOrdering, m_wire_info, m_dc_decoder, m_genfitField.get()); TVector3 Init_position(m_init_position.value()[0] * dd4hep::mm, m_init_position.value()[1] * dd4hep::mm, @@ -773,7 +773,7 @@ struct GenfitTrackFitter final for (int pdgCode : m_particleHypothesis) { - GenfitInterface::GenfitTrack track_interface(track, m_skipTrackOrdering, m_dch_info, m_dc_decoder, + GenfitInterface::GenfitTrack track_interface(track, m_skipTrackOrdering, m_wire_info, m_dc_decoder, m_genfitField.get()); track_interface.InitializeTrack(m_RadialThresholdPromptTrack.value(), m_useFirstHitAsReference, LimitHits, diff --git a/Tracking/include/genfit_interfaces/GenfitTrack.h b/Tracking/include/genfit_interfaces/GenfitTrack.h index c28e6c6a..a4929f86 100644 --- a/Tracking/include/genfit_interfaces/GenfitTrack.h +++ b/Tracking/include/genfit_interfaces/GenfitTrack.h @@ -71,7 +71,7 @@ * - execute the GENFIT fitting procedure * * The class maintains access to both the EDM4hep and GENFIT representations of the track, and stores - * relevant geometry information such as the drift chamber (DCH) description and segmentation decoder. + * relevant geometry information such as the wire tracker info description and segmentation decoder. * * * Author: Andrea De Vita @@ -84,7 +84,7 @@ namespace GenfitInterface { class GenfitTrack { public: GenfitTrack(const edm4hep::Track& track, const bool skipTrackOrdering = false, - const dd4hep::rec::DCH_info* dch_info = nullptr, + const dd4hep::rec::WireTracker_info* wire_info = nullptr, const dd4hep::DDSegmentation::BitFieldCoder* decoder = nullptr, const GenfitInterface::GenfitField* fieldMap = nullptr); @@ -176,7 +176,7 @@ class GenfitTrack { TVector3 m_VP_referencePoint{0., 0., 0.}; - const dd4hep::rec::DCH_info* m_dch_info; + const dd4hep::rec::WireTracker_info* m_wire_info; const dd4hep::DDSegmentation::BitFieldCoder* m_dc_decoder; const GenfitInterface::GenfitField* m_fieldMap; }; diff --git a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h index 6d9d8b35..66a7e990 100644 --- a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h +++ b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h @@ -57,7 +57,7 @@ namespace GenfitInterface { class WireMeasurement { public: - WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::DCH_info* dch_info, + WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, const int hit_idx, const int debug_lvl); diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index ffc83305..536ca79c 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -22,12 +22,12 @@ namespace GenfitInterface { GenfitTrack::GenfitTrack(const edm4hep::Track& track, const bool skipTrackOrdering, - const dd4hep::rec::DCH_info* dch_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, + const dd4hep::rec::WireTracker_info* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const GenfitInterface::GenfitField* fieldMap) : m_originalTrack(track), m_posInit(0., 0., 0.), m_momInit(0., 0., 0.), m_covInit(6), m_genfitTrackRep(nullptr), m_genfitTrack(nullptr), m_edm4hepTrack(), - m_dch_info(dch_info), m_dc_decoder(decoder), m_fieldMap(fieldMap) + m_wire_info(wire_info), m_dc_decoder(decoder), m_fieldMap(fieldMap) { @@ -821,7 +821,7 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { } else if (hit.isA()) { detID = 1; auto wire_hit = hit.as(); - GenfitInterface::WireMeasurement measurement(wire_hit, m_dch_info, m_dc_decoder, detID, ++hit_idx, debug_lvl); + GenfitInterface::WireMeasurement measurement(wire_hit, m_wire_info, m_dc_decoder, detID, ++hit_idx, debug_lvl); m_genfitTrack->insertPoint(new genfit::TrackPoint(measurement.getGenFit(), m_genfitTrack)); } else { throw std::runtime_error("InitializeTrack: Unknown hit type encountered - Hit will be skipped."); diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index 1b2f8891..23661cf1 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -21,7 +21,7 @@ namespace GenfitInterface { -WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::DCH_info* dch_info, +WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, const int hit_idx, const int debug_lvl) { @@ -58,20 +58,19 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: const int sector = decoder->get(cellid, "sector"); const int nphi = decoder->get(cellid, "nphi"); - const int ilayer = dch_info->CalculateILayerFromCellIDFields(layer, superlayer); - const auto& l = dch_info->database.at(ilayer); + const int ilayer = wire_info->CalculateILayerFromCellIDFields(layer, superlayer); + const auto& l = wire_info->database.at(ilayer); - const int stereosign = dch_info->StereoSign(l); + // following the logic form WireTracker_info + const double stereo = l.stereo_sw_z0; const double rz0 = l.radius_sw_z0; + const double kappa = tan(stereo) / rz0; + const double dy = rz0 * kappa * wire_info->Lhalf; // m - const double dphi = dch_info->twist_angle; - const double kappa = (1. / dch_info->Lhalf) * std::tan(dphi / 2.); + TVector3 p1(rz0, -dy, -wire_info->Lhalf); + TVector3 p2(rz0, dy, wire_info->Lhalf); - TVector3 p1(rz0, -stereosign * rz0 * kappa * dch_info->Lhalf, -dch_info->Lhalf); - - TVector3 p2(rz0, stereosign * rz0 * kappa * dch_info->Lhalf, dch_info->Lhalf); - - const double phi_z0 = dch_info->Get_cell_phi_angle(superlayer, ilayer, sector, nphi); + const double phi_z0 = wire_info->Get_cell_phi_angle(superlayer, ilayer, sector, nphi); p1.RotateZ(phi_z0); p2.RotateZ(phi_z0); From 5044f6890bcf3d2c52da62ad5b8abf7833ee23d6 Mon Sep 17 00:00:00 2001 From: Stefano Fanchellucci <94967300+sfranchel@users.noreply.github.com> Date: Mon, 18 May 2026 09:07:01 +0200 Subject: [PATCH 04/12] Apply suggestions from Andreas Ensure that polymorphism work with WireTracker_info subclasses Co-authored-by: Andreas Loeschcke Centeno <53434935+s6anloes@users.noreply.github.com> --- Tracking/components/GenfitTrackFitter.cpp | 4 ++-- Tracking/include/genfit_interfaces/GenfitTrack.h | 4 ++-- Tracking/include/genfit_interfaces/GenfitWireMeasurement.h | 2 +- Tracking/src/genfit_interfaces/GenfitTrack.cpp | 2 +- Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Tracking/components/GenfitTrackFitter.cpp b/Tracking/components/GenfitTrackFitter.cpp index c7d24c3a..7d54d5e3 100644 --- a/Tracking/components/GenfitTrackFitter.cpp +++ b/Tracking/components/GenfitTrackFitter.cpp @@ -156,7 +156,7 @@ struct GenfitTrackFitter final std::string DCH_name(m_WireTracker_name.value()); dd4hep::DetElement WireTracker_DE = m_geoSvc->getDetector()->detectors().at(DCH_name); - m_wire_info = WireTracker_DE.extension(); + m_wire_info = WireTracker_DE.extension(); dd4hep::SensitiveDetector dch_sd = m_geoSvc->getDetector()->sensitiveDetector(DCH_name); dd4hep::Readout dch_readout = dch_sd.readout(); m_dc_decoder = dch_readout.idSpec().decoder(); @@ -454,7 +454,7 @@ struct GenfitTrackFitter final GenfitInterface::GenfitMaterialInterface* m_geoMaterial; dd4hep::rec::SurfaceManager* m_surfMan; - dd4hep::rec::WireTracker_info* m_wire_info; + dd4hep::rec::WireTracker_info_struct* m_wire_info; dd4hep::DDSegmentation::BitFieldCoder* m_dc_decoder; Gaudi::Property m_WireTracker_name{ diff --git a/Tracking/include/genfit_interfaces/GenfitTrack.h b/Tracking/include/genfit_interfaces/GenfitTrack.h index a4929f86..130eca5a 100644 --- a/Tracking/include/genfit_interfaces/GenfitTrack.h +++ b/Tracking/include/genfit_interfaces/GenfitTrack.h @@ -84,7 +84,7 @@ namespace GenfitInterface { class GenfitTrack { public: GenfitTrack(const edm4hep::Track& track, const bool skipTrackOrdering = false, - const dd4hep::rec::WireTracker_info* wire_info = nullptr, + const dd4hep::rec::WireTracker_info_struct* wire_info = nullptr, const dd4hep::DDSegmentation::BitFieldCoder* decoder = nullptr, const GenfitInterface::GenfitField* fieldMap = nullptr); @@ -176,7 +176,7 @@ class GenfitTrack { TVector3 m_VP_referencePoint{0., 0., 0.}; - const dd4hep::rec::WireTracker_info* m_wire_info; + const dd4hep::rec::WireTracker_info_struct* m_wire_info; const dd4hep::DDSegmentation::BitFieldCoder* m_dc_decoder; const GenfitInterface::GenfitField* m_fieldMap; }; diff --git a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h index 66a7e990..c8688c51 100644 --- a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h +++ b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h @@ -57,7 +57,7 @@ namespace GenfitInterface { class WireMeasurement { public: - WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info* wire_info, + WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info_struct* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, const int hit_idx, const int debug_lvl); diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index 536ca79c..79d47533 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -22,7 +22,7 @@ namespace GenfitInterface { GenfitTrack::GenfitTrack(const edm4hep::Track& track, const bool skipTrackOrdering, - const dd4hep::rec::WireTracker_info* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, + const dd4hep::rec::WireTracker_info_struct* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const GenfitInterface::GenfitField* fieldMap) : m_originalTrack(track), m_posInit(0., 0., 0.), m_momInit(0., 0., 0.), m_covInit(6), m_genfitTrackRep(nullptr), m_genfitTrack(nullptr), m_edm4hepTrack(), diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index 23661cf1..a7cebf64 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -21,7 +21,7 @@ namespace GenfitInterface { -WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info* wire_info, +WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info_struct* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, const int hit_idx, const int debug_lvl) { From 4f440bf6e96d76c3eab1fa8ae9ac897e9849f663 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Mon, 18 May 2026 12:04:04 +0200 Subject: [PATCH 05/12] implement suggestions and fix dch digitizers * use a try catch for retrival of sector * get the dch pointer via dinamic cast of the WireTracker_info_struct * fix v1 of the dch digitizer * update some comments and function naming --- DCHdigi/include/DCHdigi_v01.h | 11 ++++---- DCHdigi/include/DCHdigi_v02.h | 6 ++-- DCHdigi/src/DCHdigi_v01.cpp | 28 ++++++++++--------- DCHdigi/src/DCHdigi_v02.cpp | 8 ++++-- .../GenfitWireMeasurement.cpp | 12 +++++++- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/DCHdigi/include/DCHdigi_v01.h b/DCHdigi/include/DCHdigi_v01.h index f7b8497a..108c928e 100644 --- a/DCHdigi/include/DCHdigi_v01.h +++ b/DCHdigi/include/DCHdigi_v01.h @@ -55,13 +55,13 @@ #include "DD4hep/Detector.h" // for dd4hep::VolumeManager #include "DDSegmentation/BitFieldCoder.h" +// k4geo +#include "detectorCommon/WireTracker_info.h" + // STL #include #include -// data extension for detector DCH_v2 -#include "DDRec/DCH_info.h" - // ROOT headers #include "TFile.h" #include "TH1D.h" @@ -142,10 +142,11 @@ struct DCHdigi_v01 final int CalculateNphiFromCellID(dd4hep::DDSegmentation::CellID id) const { return m_decoder->get(id, "nphi"); } - TVector3 Convert_EDM4hepVector_to_TVector3(const edm4hep::Vector3d& v, double scale) const { + /// Convert EDM4hep Vector3d to XYZVector + ROOT::Math::XYZVector Convert_EDM4hepVector_to_XYZVector(const edm4hep::Vector3d& v, double scale) const { return {v[0] * scale, v[1] * scale, v[2] * scale}; }; - edm4hep::Vector3d Convert_TVector3_to_EDM4hepVector(const TVector3& v, double scale) const { + edm4hep::Vector3d Convert_XYZVector_to_EDM4hepVector(const ROOT::Math::XYZVector& v, double scale) const { return {v.x() * scale, v.y() * scale, v.z() * scale}; }; diff --git a/DCHdigi/include/DCHdigi_v02.h b/DCHdigi/include/DCHdigi_v02.h index 16d14008..1360d61c 100644 --- a/DCHdigi/include/DCHdigi_v02.h +++ b/DCHdigi/include/DCHdigi_v02.h @@ -166,9 +166,9 @@ class DCHdigi_v02 final "Together with ReadoutWindowStartTime_ns, defines the readout window. Any DigiHits with arrival time after " "ReadoutWindowStartTime_ns + ReadoutWindowDuration_ns are discarded."}; - /// Convert EDM4hep Vector3d to TVector3 - ROOT::Math::XYZVector toTVector3(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; - /// Convert TVector3 to EDM4hep Vector3d + /// Convert EDM4hep Vector3d to XYZVector + ROOT::Math::XYZVector toXYZVector(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; + /// Convert XYZVector to EDM4hep Vector3d edm4hep::Vector3d toEDM4hepVector(const ROOT::Math::XYZVector& v) const { return {v.x(), v.y(), v.z()}; }; // /// Function to calculate the drift time from the distance to the wire diff --git a/DCHdigi/src/DCHdigi_v01.cpp b/DCHdigi/src/DCHdigi_v01.cpp index afc07ba2..60a0dc4c 100644 --- a/DCHdigi/src/DCHdigi_v01.cpp +++ b/DCHdigi/src/DCHdigi_v01.cpp @@ -48,7 +48,8 @@ StatusCode DCHdigi_v01::initialize() { /////////////////////////////////////////////////////////////////////////////////// /////////////////////////// retrieve data extension ////////////////////////// /////////////////////////////////////////////////////////////////////////////////// - this->dch_data = DCH_DE.extension(); + auto wt_info = DCH_DE.extension(); + this->dch_data = dynamic_cast(wt_info); if (not dch_data->IsValid()) ThrowException("No valid data extension was found for detector <<" + DCH_name + ">>."); @@ -131,19 +132,20 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, // loop over hit collection for (const auto& input_sim_hit : input_sim_hits) { dd4hep::DDSegmentation::CellID cellid = input_sim_hit.getCellID(); + int superlayer = this->CalculateLayerFromCellID(cellid); int ilayer = this->CalculateLayerFromCellID(cellid); int nphi = this->CalculateNphiFromCellID(cellid); - auto hit_position = Convert_EDM4hepVector_to_TVector3(input_sim_hit.getPosition(), MM_TO_CM); + auto hit_position = Convert_EDM4hepVector_to_XYZVector(input_sim_hit.getPosition(), MM_TO_CM); // ------------------------------------------------------------------------- // calculate hit position projection into the wire - TVector3 hit_to_wire_vector = this->dch_data->Calculate_hitpos_to_wire_vector(ilayer, nphi, hit_position); - TVector3 hit_projection_on_the_wire = hit_position + hit_to_wire_vector; + ROOT::Math::XYZVector hit_to_wire_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer,ilayer, /*isector=*/0, nphi, hit_position); + ROOT::Math::XYZVector hit_projection_on_the_wire = hit_position + hit_to_wire_vector; if (m_create_debug_histos.value()) { - double distance_hit_wire = hit_to_wire_vector.Mag(); + double distance_hit_wire = hit_to_wire_vector.R(); hDpw->Fill(distance_hit_wire); } - TVector3 wire_direction_ez = this->dch_data->Calculate_wire_vector_ez(ilayer, nphi); + ROOT::Math::XYZVector wire_direction_ez = this->dch_data->Calculate_wire_vector_ez(superlayer, ilayer, /*isector=*/0, nphi); // ------------------------------------------------------------------------- // smear the position @@ -156,15 +158,15 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, hit_projection_on_the_wire += smearing_z * (wire_direction_ez.Unit()); if (m_create_debug_histos.value()) { // the distance from the hit projection and the wire should be zero - TVector3 dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(ilayer, nphi, hit_projection_on_the_wire); - hDww->Fill(dummy_vector.Mag()); + ROOT::Math::XYZVector dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, hit_projection_on_the_wire); + hDww->Fill(dummy_vector.R()); } // smear position perpendicular to the wire double smearing_xy = gauss_xy_cm(rng_engine); if (m_create_debug_histos.value()) hSxy->Fill(smearing_xy); - float distanceToWire_real = hit_to_wire_vector.Mag(); + float distanceToWire_real = hit_to_wire_vector.R(); // protect against negative values float distanceToWire_smeared = std::max(0.0, distanceToWire_real + smearing_xy); @@ -173,8 +175,8 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, std::int32_t quality = 0; float eDepError = 0; // length units back to mm - auto positionSW = Convert_TVector3_to_EDM4hepVector(hit_projection_on_the_wire, 1. / MM_TO_CM); - // auto directionSW = Convert_TVector3_to_EDM4hepVector(wire_direction_ez, 1. / MM_TO_CM); + auto positionSW = Convert_XYZVector_to_EDM4hepVector(hit_projection_on_the_wire, 1. / MM_TO_CM); + // auto directionSW = Convert_XYZVector_to_EDM4hepVector(wire_direction_ez, 1. / MM_TO_CM); float distanceToWire = distanceToWire_smeared / MM_TO_CM; // The direction of the sense wires can be calculated as: @@ -182,7 +184,7 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, // One point of the wire is for example the following: // RotationZ(WireAzimuthalAngle) * Position(cell_rave_z0, 0 , 0) // variables aredefined below - auto WireAzimuthalAngle = this->dch_data->Get_cell_phi_angle(ilayer, nphi); + auto WireAzimuthalAngle = this->dch_data->Get_cell_phi_angle(superlayer, ilayer, /*isector=*/0, nphi); float WireStereoAngle = 0; { auto l = this->dch_data->database.at(ilayer); @@ -191,7 +193,7 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, // when building the twisted tube, the twist angle is defined as: // cell_twistangle = l.StereoSign() * DCH_i->twist_angle // which forces the stereoangle of the wire to have the oposite sign - WireStereoAngle = (-1.) * l.StereoSign() * dch_data->stereoangle_z0(cell_rave_z0); + WireStereoAngle = (-1.) * dch_data->StereoSign(l) * dch_data->stereoangle_z0(cell_rave_z0); } extension::MutableSenseWireHit oDCHdigihit; diff --git a/DCHdigi/src/DCHdigi_v02.cpp b/DCHdigi/src/DCHdigi_v02.cpp index 09a3ba46..93d50b8f 100644 --- a/DCHdigi/src/DCHdigi_v02.cpp +++ b/DCHdigi/src/DCHdigi_v02.cpp @@ -10,6 +10,7 @@ #include "DD4hep/Detector.h" // STL +#include #include namespace { @@ -58,7 +59,8 @@ StatusCode DCHdigi_v02::initialize() { // Retrieve the detector element dd4hep::DetElement dch_detelem = m_geoSvc->getDetector()->detectors().at(dch_name); // Retrieve the DCH_info data extension for the drift chamber - m_dch_info = dch_detelem.extension(); + auto wt_info = dch_detelem.extension(); + m_dch_info = dynamic_cast(wt_info); if (not m_dch_info->IsValid()) { error() << "No valid data extension was found for detector <<" << dch_name << ">>." << endmsg; return StatusCode::FAILURE; @@ -151,9 +153,9 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, ////////////////////////// // Get hit position to calculate distance to wire - // Need to convert to TVector3 to use the DCH_info methods + // Need to convert to XYZVector to use the DCH_info methods // Use dd4hep:mm as scale to convert into the dd4hep default units (_ddu) - auto simhit_position_ddu = this->toTVector3(simhit.getPosition()) * dd4hep::mm; + auto simhit_position_ddu = this->toXYZVector(simhit.getPosition()) * dd4hep::mm; auto hit_to_wire_vector_ddu = m_dch_info->Calculate_hitpos_to_wire_vector(superlayer, layer, /*isector=*/0, nphi, simhit_position_ddu); auto hit_projection_on_the_wire_ddu = simhit_position_ddu + hit_to_wire_vector_ddu; diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index a7cebf64..e7486839 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -52,10 +52,20 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: direction.RotateZ(wireAzimuthalAngle); direction = direction.Unit(); + // Safe decoder wrapper to handle missing cellID fields, currently used only for sector + auto safe_decoder = [decoder, debug_lvl](int b, std::string f){ + try { + return (int) decoder->get(b, f); + } catch (std::exception& e) { + if (debug_lvl > 0) std::cout << "WARNING: cannot decode "<get(cellid, "superlayer"); const int layer = decoder->get(cellid, "layer"); - const int sector = decoder->get(cellid, "sector"); + const int sector = safe_decoder(cellid, "sector"); const int nphi = decoder->get(cellid, "nphi"); const int ilayer = wire_info->CalculateILayerFromCellIDFields(layer, superlayer); From 7fa072116a313280a7c8120d6f8f401747f48f81 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Mon, 1 Jun 2026 13:36:26 +0200 Subject: [PATCH 06/12] address comments --- DCHdigi/include/DCHdigi_v01.h | 8 +++++--- DCHdigi/include/DCHdigi_v02.h | 10 ++++++---- DCHdigi/src/DCHdigi_v01.cpp | 12 ++++++------ DCHdigi/src/DCHdigi_v02.cpp | 4 ++-- .../genfit_interfaces/GenfitWireMeasurement.h | 4 ++-- Tracking/src/genfit_interfaces/GenfitTrack.cpp | 5 ++++- .../genfit_interfaces/GenfitWireMeasurement.cpp | 14 ++------------ 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/DCHdigi/include/DCHdigi_v01.h b/DCHdigi/include/DCHdigi_v01.h index 108c928e..34fd3672 100644 --- a/DCHdigi/include/DCHdigi_v01.h +++ b/DCHdigi/include/DCHdigi_v01.h @@ -71,6 +71,8 @@ // Class developed by Walaa for the CLS #include "AlgData.h" +using Vector3D = dd4hep::rec::WireTracker_info::Vector3D; + /// constant to convert from mm (EDM4hep) to DD4hep (cm) struct DCHdigi_v01 final @@ -142,11 +144,11 @@ struct DCHdigi_v01 final int CalculateNphiFromCellID(dd4hep::DDSegmentation::CellID id) const { return m_decoder->get(id, "nphi"); } - /// Convert EDM4hep Vector3d to XYZVector - ROOT::Math::XYZVector Convert_EDM4hepVector_to_XYZVector(const edm4hep::Vector3d& v, double scale) const { + /// Convert EDM4hep Vector3d to Vector3D as defined in WireTracker_info + Vector3D Convert_EDM4hepVector_to_Vector3D(const edm4hep::Vector3d& v, double scale) const { return {v[0] * scale, v[1] * scale, v[2] * scale}; }; - edm4hep::Vector3d Convert_XYZVector_to_EDM4hepVector(const ROOT::Math::XYZVector& v, double scale) const { + edm4hep::Vector3d Convert_Vector3D_to_EDM4hepVector(const Vector3D& v, double scale) const { return {v.x() * scale, v.y() * scale, v.z() * scale}; }; diff --git a/DCHdigi/include/DCHdigi_v02.h b/DCHdigi/include/DCHdigi_v02.h index 1360d61c..0450fb9e 100644 --- a/DCHdigi/include/DCHdigi_v02.h +++ b/DCHdigi/include/DCHdigi_v02.h @@ -86,6 +86,8 @@ // ROOT #include "TRandom3.h" +using Vector3D = dd4hep::rec::WireTracker_info::Vector3D; + class DCHdigi_v02 final : public k4FWCore::MultiTransformer< std::tuple( @@ -166,10 +168,10 @@ class DCHdigi_v02 final "Together with ReadoutWindowStartTime_ns, defines the readout window. Any DigiHits with arrival time after " "ReadoutWindowStartTime_ns + ReadoutWindowDuration_ns are discarded."}; - /// Convert EDM4hep Vector3d to XYZVector - ROOT::Math::XYZVector toXYZVector(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; - /// Convert XYZVector to EDM4hep Vector3d - edm4hep::Vector3d toEDM4hepVector(const ROOT::Math::XYZVector& v) const { return {v.x(), v.y(), v.z()}; }; + /// Convert EDM4hep Vector3d to Vector3D as defined in WireTracker_info + Vector3D toVector3D(const edm4hep::Vector3d& v) const { return {v[0], v[1], v[2]}; }; + /// Convert Vector3D as defined in WireTracker_info to EDM4hep Vector3d + edm4hep::Vector3d toEDM4hepVector(const Vector3D& v) const { return {v.x(), v.y(), v.z()}; }; // /// Function to calculate the drift time from the distance to the wire double get_drift_time_ns(double distance_to_wire_mm) const; diff --git a/DCHdigi/src/DCHdigi_v01.cpp b/DCHdigi/src/DCHdigi_v01.cpp index 60a0dc4c..38beb919 100644 --- a/DCHdigi/src/DCHdigi_v01.cpp +++ b/DCHdigi/src/DCHdigi_v01.cpp @@ -135,17 +135,17 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, int superlayer = this->CalculateLayerFromCellID(cellid); int ilayer = this->CalculateLayerFromCellID(cellid); int nphi = this->CalculateNphiFromCellID(cellid); - auto hit_position = Convert_EDM4hepVector_to_XYZVector(input_sim_hit.getPosition(), MM_TO_CM); + auto hit_position = Convert_EDM4hepVector_to_Vector3D(input_sim_hit.getPosition(), MM_TO_CM); // ------------------------------------------------------------------------- // calculate hit position projection into the wire - ROOT::Math::XYZVector hit_to_wire_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer,ilayer, /*isector=*/0, nphi, hit_position); - ROOT::Math::XYZVector hit_projection_on_the_wire = hit_position + hit_to_wire_vector; + auto hit_to_wire_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer,ilayer, /*isector=*/0, nphi, hit_position); + auto hit_projection_on_the_wire = hit_position + hit_to_wire_vector; if (m_create_debug_histos.value()) { double distance_hit_wire = hit_to_wire_vector.R(); hDpw->Fill(distance_hit_wire); } - ROOT::Math::XYZVector wire_direction_ez = this->dch_data->Calculate_wire_vector_ez(superlayer, ilayer, /*isector=*/0, nphi); + auto wire_direction_ez = this->dch_data->Calculate_wire_vector_ez(superlayer, ilayer, /*isector=*/0, nphi); // ------------------------------------------------------------------------- // smear the position @@ -158,7 +158,7 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, hit_projection_on_the_wire += smearing_z * (wire_direction_ez.Unit()); if (m_create_debug_histos.value()) { // the distance from the hit projection and the wire should be zero - ROOT::Math::XYZVector dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, hit_projection_on_the_wire); + auto dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, hit_projection_on_the_wire); hDww->Fill(dummy_vector.R()); } @@ -175,7 +175,7 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, std::int32_t quality = 0; float eDepError = 0; // length units back to mm - auto positionSW = Convert_XYZVector_to_EDM4hepVector(hit_projection_on_the_wire, 1. / MM_TO_CM); + auto positionSW = Convert_Vector3D_to_EDM4hepVector(hit_projection_on_the_wire, 1. / MM_TO_CM); // auto directionSW = Convert_XYZVector_to_EDM4hepVector(wire_direction_ez, 1. / MM_TO_CM); float distanceToWire = distanceToWire_smeared / MM_TO_CM; diff --git a/DCHdigi/src/DCHdigi_v02.cpp b/DCHdigi/src/DCHdigi_v02.cpp index 93d50b8f..22302f23 100644 --- a/DCHdigi/src/DCHdigi_v02.cpp +++ b/DCHdigi/src/DCHdigi_v02.cpp @@ -153,9 +153,9 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, ////////////////////////// // Get hit position to calculate distance to wire - // Need to convert to XYZVector to use the DCH_info methods + // Need to convert to Vector3D to use the WireInfo_info methods // Use dd4hep:mm as scale to convert into the dd4hep default units (_ddu) - auto simhit_position_ddu = this->toXYZVector(simhit.getPosition()) * dd4hep::mm; + auto simhit_position_ddu = this->toVector3D(simhit.getPosition()) * dd4hep::mm; auto hit_to_wire_vector_ddu = m_dch_info->Calculate_hitpos_to_wire_vector(superlayer, layer, /*isector=*/0, nphi, simhit_position_ddu); auto hit_projection_on_the_wire_ddu = simhit_position_ddu + hit_to_wire_vector_ddu; diff --git a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h index c8688c51..7a2d920a 100644 --- a/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h +++ b/Tracking/include/genfit_interfaces/GenfitWireMeasurement.h @@ -58,8 +58,8 @@ namespace GenfitInterface { class WireMeasurement { public: WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info_struct* wire_info, - const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, const int hit_idx, - const int debug_lvl); + const dd4hep::DDSegmentation::BitFieldCoder* decoder, const bool has_sectors, const int det_idx, + const int hit_idx, const int debug_lvl); genfit::WirePointMeasurement* getGenFit() const { return m_genfitHit; }; diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index 79d47533..9141fd9f 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -802,6 +802,9 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { auto hits_for_genfit = m_edm4hepTrack.getTrackerHits(); + // Check wether the wire tracker has sectors + const bool has_sectors = m_dc_decoder->fieldDescription().find("sector") != std::string::npos; + int hit_idx(0); int detID(-1); @@ -821,7 +824,7 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { } else if (hit.isA()) { detID = 1; auto wire_hit = hit.as(); - GenfitInterface::WireMeasurement measurement(wire_hit, m_wire_info, m_dc_decoder, detID, ++hit_idx, debug_lvl); + GenfitInterface::WireMeasurement measurement(wire_hit, m_wire_info, m_dc_decoder, has_sectors, detID, ++hit_idx, debug_lvl); m_genfitTrack->insertPoint(new genfit::TrackPoint(measurement.getGenFit(), m_genfitTrack)); } else { throw std::runtime_error("InitializeTrack: Unknown hit type encountered - Hit will be skipped."); diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index e7486839..ea2edd0b 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -22,7 +22,7 @@ namespace GenfitInterface { WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info_struct* wire_info, - const dd4hep::DDSegmentation::BitFieldCoder* decoder, const int det_idx, + const dd4hep::DDSegmentation::BitFieldCoder* decoder, const bool has_sectors, const int det_idx, const int hit_idx, const int debug_lvl) { // NB: dd4hep::mm = 0.1. @@ -52,20 +52,10 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: direction.RotateZ(wireAzimuthalAngle); direction = direction.Unit(); - // Safe decoder wrapper to handle missing cellID fields, currently used only for sector - auto safe_decoder = [decoder, debug_lvl](int b, std::string f){ - try { - return (int) decoder->get(b, f); - } catch (std::exception& e) { - if (debug_lvl > 0) std::cout << "WARNING: cannot decode "<get(cellid, "superlayer"); const int layer = decoder->get(cellid, "layer"); - const int sector = safe_decoder(cellid, "sector"); + const int sector = has_sectors ? decoder->get(cellid, "sector") : 0; const int nphi = decoder->get(cellid, "nphi"); const int ilayer = wire_info->CalculateILayerFromCellIDFields(layer, superlayer); From 894a381f533424c4da83a819bc2c3177271b706c Mon Sep 17 00:00:00 2001 From: Stefano Fanchellucci <94967300+sfranchel@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:08:24 +0200 Subject: [PATCH 07/12] protect from nullptr Co-authored-by: Sanghyun Ko <37464245+SanghyunKo@users.noreply.github.com> --- Tracking/src/genfit_interfaces/GenfitTrack.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index 9141fd9f..f80ad01e 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -802,8 +802,11 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { auto hits_for_genfit = m_edm4hepTrack.getTrackerHits(); - // Check wether the wire tracker has sectors - const bool has_sectors = m_dc_decoder->fieldDescription().find("sector") != std::string::npos; + // Check whether the wire tracker has sectors. + // m_dc_decoder is nullptr when the geometry has no wire tracker; in that case + // there are no SenseWireHits either, so has_sectors is never actually consumed. + const bool has_sectors = + m_dc_decoder && (m_dc_decoder->fieldDescription().find("sector") != std::string::npos); int hit_idx(0); int detID(-1); From 628d397c9c36f24e463e43ea86af03b899c851e8 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Fri, 19 Jun 2026 10:25:18 +0200 Subject: [PATCH 08/12] update tests --- DCHdigi/test/test_DCHdigi/test_DCHdigi.sh | 3 +++ Tracking/test/testTrackFinder/test_trackFinder.sh | 4 ++++ Tracking/test/testTrackFitter/test_trackFitter.sh | 3 +++ .../testTracksFromGenParticles/test_TracksFromGenParticles.sh | 3 +++ 4 files changed, 13 insertions(+) diff --git a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh index 49806383..34732d40 100644 --- a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh +++ b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh @@ -23,3 +23,6 @@ k4run runDCHdigi.py # check distribution of distance from hit position to the wire python3 check_DCHdigi_output.py + +# clean up temp files +rm -f dch_proton_10GeV.root dch_proton_10GeV_digi.root dch_digi_alg_debug.root diff --git a/Tracking/test/testTrackFinder/test_trackFinder.sh b/Tracking/test/testTrackFinder/test_trackFinder.sh index 3e05d1f4..e80a9e71 100755 --- a/Tracking/test/testTrackFinder/test_trackFinder.sh +++ b/Tracking/test/testTrackFinder/test_trackFinder.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Clean old temp files +rm -f Tracking/test/testTrackFinder/out_sim_edm4hep.root Tracking/test/testTrackFinder/out_tracks.root + MODEL_PATH=$1 XML_FILE=$K4GEO/FCCee/IDEA/compact/IDEA_o1_v03/IDEA_o1_v03.xml @@ -17,3 +20,4 @@ ddsim --steeringFile $STEERING_FILE \ --outputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root k4run Tracking/test/testTrackFinder/runTestTrackFinder.py --inputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root --outputFile Tracking/test/testTrackFinder/out_tracks.root --modelPath $MODEL_PATH --tbeta $TBETA --td $TD + diff --git a/Tracking/test/testTrackFitter/test_trackFitter.sh b/Tracking/test/testTrackFitter/test_trackFitter.sh index cfcb9b82..8274858a 100644 --- a/Tracking/test/testTrackFitter/test_trackFitter.sh +++ b/Tracking/test/testTrackFitter/test_trackFitter.sh @@ -1,3 +1,6 @@ #!/bin/bash +# clean up old temp files +rm -f testFitter.root + k4run runTestTrackFitter.py --inputFile ../testTrackFinder/out_tracks.root \ No newline at end of file diff --git a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh index bf627559..6bd575f1 100644 --- a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh +++ b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh @@ -1,5 +1,8 @@ #!/bin/bash +# clean up old temp files +rm -f ddsim_output_edm4hep.root tracks_from_gen_particles.root TrackHitDistances.root + ddsim --enableGun --gun.distribution uniform --gun.energy '10*GeV' --gun.particle e- --numberOfEvents 100 --outputFile ddsim_output_edm4hep.root --random.enableEventSeed --random.seed 42 --compactFile $K4GEO/FCCee/ALLEGRO/compact/ALLEGRO_o1_v03/ALLEGRO_o1_v03.xml k4run runTracksFromGenParticles.py From 952d286af4a1cc5f2a410ad193ad99918aad9663 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Fri, 19 Jun 2026 17:08:54 +0200 Subject: [PATCH 09/12] white space --- Tracking/src/genfit_interfaces/GenfitTrack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index f80ad01e..2e8ee04f 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -807,7 +807,7 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { // there are no SenseWireHits either, so has_sectors is never actually consumed. const bool has_sectors = m_dc_decoder && (m_dc_decoder->fieldDescription().find("sector") != std::string::npos); - + int hit_idx(0); int detID(-1); From 878754945691710fb42c0ade076ca9350aef7c13 Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Fri, 19 Jun 2026 17:09:10 +0200 Subject: [PATCH 10/12] update tests --- .github/workflows/key4hep-build.yaml | 2 ++ DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py | 4 +++- DCHdigi/test/test_DCHdigi/runDCHdigi.py | 9 +++++++-- DCHdigi/test/test_DCHdigi/runDCHdigiV2.py | 9 +++++++-- DCHdigi/test/test_DCHdigi/test_DCHdigi.sh | 5 +---- Tracking/test/testTrackFinder/runTestTrackFinder.py | 4 ++-- Tracking/test/testTrackFinder/test_trackFinder.sh | 7 ++----- Tracking/test/testTrackFitter/runTestTrackFitter.py | 4 ++-- Tracking/test/testTrackFitter/test_trackFitter.sh | 5 +---- .../runTracksFromGenParticles.py | 8 +++++--- .../test_TracksFromGenParticles.sh | 5 +---- 11 files changed, 33 insertions(+), 29 deletions(-) diff --git a/.github/workflows/key4hep-build.yaml b/.github/workflows/key4hep-build.yaml index 110b3940..19d32ed8 100644 --- a/.github/workflows/key4hep-build.yaml +++ b/.github/workflows/key4hep-build.yaml @@ -29,6 +29,8 @@ jobs: image: ubuntu26 fail-fast: false runs-on: ubuntu-latest + env: + CI_TYPE: ${{ matrix.build_type }}_${{ matrix.image }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6 - uses: key4hep/key4hep-actions/cache-external-data@main diff --git a/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py b/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py index 57d27f4b..07022a19 100644 --- a/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py +++ b/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py @@ -8,13 +8,15 @@ import ROOT import sys +import os +CI_TYPE = os.environ.get('CI_TYPE', '') def main(): exit_code = 0 # Open debug output file generated by DCHdigi alg - f = ROOT.TFile("dch_digi_alg_debug.root") + f = ROOT.TFile(f"dch_digi_alg_debug_{CI_TYPE}.root") # Retrieve the hit-wire distance distribution hDpw = f.Get("hDpw") diff --git a/DCHdigi/test/test_DCHdigi/runDCHdigi.py b/DCHdigi/test/test_DCHdigi/runDCHdigi.py index 626c6efb..84917853 100644 --- a/DCHdigi/test/test_DCHdigi/runDCHdigi.py +++ b/DCHdigi/test/test_DCHdigi/runDCHdigi.py @@ -4,13 +4,17 @@ # to execute: # k4run runDCHdigi.py +import os + from Gaudi.Configuration import INFO, DEBUG from Configurables import EventDataSvc, UniqueIDGenSvc from k4FWCore import ApplicationMgr, IOSvc +CI_TYPE = os.environ.get('CI_TYPE', '') + svc = IOSvc("IOSvc") -svc.Input = ["dch_proton_10GeV.root"] -svc.Output = "dch_proton_10GeV_digi.root" +svc.Input = [f"dch_proton_10GeV_{CI_TYPE}.root"] +svc.Output = f"dch_proton_10GeV_digi_{CI_TYPE}.root" from Configurables import GeoSvc @@ -25,6 +29,7 @@ DCHdigi.fileDataAlg = "DataAlgFORGEANT.root" DCHdigi.calculate_dndx = True DCHdigi.create_debug_histograms = True +DCHdigi.out_debug_filename = f"dch_digi_alg_debug_{CI_TYPE}.root" DCHdigi.zResolution_mm = 1 DCHdigi.xyResolution_mm = 0.1 diff --git a/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py b/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py index 70fae0db..afa11fe1 100644 --- a/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py +++ b/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py @@ -4,13 +4,18 @@ # to execute: # k4run runDCHdigiV2.py + +import os + from Gaudi.Configuration import INFO, DEBUG from Configurables import EventDataSvc, UniqueIDGenSvc from k4FWCore import ApplicationMgr, IOSvc +CI_TYPE = os.environ.get('CI_TYPE', '') + svc = IOSvc("IOSvc") -svc.Input = ["dch_proton_10GeV.root"] -svc.Output = "dch_proton_10GeV_digi.root" +svc.Input = [f"dch_proton_10GeV_{CI_TYPE}.root"] +svc.Output = f"dch_proton_10GeV_digi_{CI_TYPE}.root" from Configurables import GeoSvc diff --git a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh index 34732d40..bffbbf24 100644 --- a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh +++ b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh @@ -5,7 +5,7 @@ # goal: run sim-digitizer of the DCH v2, and return code printed by check_DCHdigi_output.py # run simulation with the drift chamber alone -ddsim --steeringFile sim_steering.py --outputFile 'dch_proton_10GeV.root' -N 10 --runType batch --random.seed 42 +ddsim --steeringFile sim_steering.py --outputFile 'dch_proton_10GeV_${CI_TYPE}.root' -N 10 --runType batch --random.seed 42 # download file for cluster counting technique ifilename="https://fccsw.web.cern.ch/fccsw/filesForSimDigiReco/IDEA/DataAlgFORGEANT.root" @@ -23,6 +23,3 @@ k4run runDCHdigi.py # check distribution of distance from hit position to the wire python3 check_DCHdigi_output.py - -# clean up temp files -rm -f dch_proton_10GeV.root dch_proton_10GeV_digi.root dch_digi_alg_debug.root diff --git a/Tracking/test/testTrackFinder/runTestTrackFinder.py b/Tracking/test/testTrackFinder/runTestTrackFinder.py index e60eed5c..8658bd9b 100644 --- a/Tracking/test/testTrackFinder/runTestTrackFinder.py +++ b/Tracking/test/testTrackFinder/runTestTrackFinder.py @@ -11,8 +11,8 @@ ################## Parser -parser.add_argument("--inputFile", default="ddsim_output_edm4hep.root", help="InputFile") -parser.add_argument("--outputFile", default="output_digi.root", help="OutputFile") +parser.add_argument("--inputFile", help="InputFile") +parser.add_argument("--outputFile", help="OutputFile") parser.add_argument("--modelPath", default="", help="model path for the track finder") parser.add_argument("--tbeta", default=0.6, help="tbeta clustering parameter") parser.add_argument("--td", default=0.3, help="td clustering parameter") diff --git a/Tracking/test/testTrackFinder/test_trackFinder.sh b/Tracking/test/testTrackFinder/test_trackFinder.sh index e80a9e71..507a8366 100755 --- a/Tracking/test/testTrackFinder/test_trackFinder.sh +++ b/Tracking/test/testTrackFinder/test_trackFinder.sh @@ -1,8 +1,5 @@ #!/bin/bash -# Clean old temp files -rm -f Tracking/test/testTrackFinder/out_sim_edm4hep.root Tracking/test/testTrackFinder/out_tracks.root - MODEL_PATH=$1 XML_FILE=$K4GEO/FCCee/IDEA/compact/IDEA_o1_v03/IDEA_o1_v03.xml @@ -17,7 +14,7 @@ ddsim --steeringFile $STEERING_FILE \ -G --gun.distribution uniform --gun.particle mu- \ --random.seed 42 \ --numberOfEvents 1 \ - --outputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root + --outputFile Tracking/test/testTrackFinder/out_sim_edm4hep_${CI_TYPE}.root -k4run Tracking/test/testTrackFinder/runTestTrackFinder.py --inputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root --outputFile Tracking/test/testTrackFinder/out_tracks.root --modelPath $MODEL_PATH --tbeta $TBETA --td $TD +k4run Tracking/test/testTrackFinder/runTestTrackFinder.py --inputFile Tracking/test/testTrackFinder/out_sim_edm4hep_${CI_TYPE}.root --outputFile Tracking/test/testTrackFinder/out_tracks_${CI_TYPE}.root --modelPath $MODEL_PATH --tbeta $TBETA --td $TD diff --git a/Tracking/test/testTrackFitter/runTestTrackFitter.py b/Tracking/test/testTrackFitter/runTestTrackFitter.py index a9efeb40..4f2a0049 100644 --- a/Tracking/test/testTrackFitter/runTestTrackFitter.py +++ b/Tracking/test/testTrackFitter/runTestTrackFitter.py @@ -9,8 +9,8 @@ ################ parser from k4FWCore.parseArgs import parser -parser.add_argument("--inputFile", default="output_tracks.root", help="InputFile") -parser.add_argument("--outputFile", default="testFitter.root", help="OutputFile") +parser.add_argument("--inputFile", help="InputFile") +parser.add_argument("--outputFile", help="OutputFile") parser.add_argument( "--Beta_init", default=100, diff --git a/Tracking/test/testTrackFitter/test_trackFitter.sh b/Tracking/test/testTrackFitter/test_trackFitter.sh index 8274858a..c2c46987 100644 --- a/Tracking/test/testTrackFitter/test_trackFitter.sh +++ b/Tracking/test/testTrackFitter/test_trackFitter.sh @@ -1,6 +1,3 @@ #!/bin/bash -# clean up old temp files -rm -f testFitter.root - -k4run runTestTrackFitter.py --inputFile ../testTrackFinder/out_tracks.root \ No newline at end of file +k4run runTestTrackFitter.py --inputFile ../testTrackFinder/out_tracks_${CI_TYPE}.root --outputFile testFitter_${CI_TYPE}.root \ No newline at end of file diff --git a/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py b/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py index 46c781e1..e63cf754 100644 --- a/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py +++ b/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py @@ -5,9 +5,11 @@ # Loading the output of the SIM step from k4FWCore import IOSvc +CI_TYPE = os.environ.get('CI_TYPE', '') + io_svc = IOSvc("IOSvc") -io_svc.Input = "ddsim_output_edm4hep.root" -io_svc.Output = "tracks_from_genParticle_output.root" +io_svc.Input = f"ddsim_output_edm4hep_{CI_TYPE}.root" +io_svc.Output = f"tracks_from_genParticle_output_{CI_TYPE}.root" # Geometry service from Configurables import GeoSvc @@ -52,7 +54,7 @@ hps = RootHistSvc("HistogramPersistencySvc") root_hist_svc = RootHistoSink("RootHistoSink") -root_hist_svc.FileName = "TrackHitDistances.root" +root_hist_svc.FileName = f"TrackHitDistances_{CI_TYPE}.root" # Set auditor service from Configurables import AuditorSvc, ChronoAuditor diff --git a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh index 6bd575f1..bb8a78bf 100644 --- a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh +++ b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh @@ -1,8 +1,5 @@ #!/bin/bash -# clean up old temp files -rm -f ddsim_output_edm4hep.root tracks_from_gen_particles.root TrackHitDistances.root - -ddsim --enableGun --gun.distribution uniform --gun.energy '10*GeV' --gun.particle e- --numberOfEvents 100 --outputFile ddsim_output_edm4hep.root --random.enableEventSeed --random.seed 42 --compactFile $K4GEO/FCCee/ALLEGRO/compact/ALLEGRO_o1_v03/ALLEGRO_o1_v03.xml +ddsim --enableGun --gun.distribution uniform --gun.energy '10*GeV' --gun.particle e- --numberOfEvents 100 --outputFile ddsim_output_edm4hep_${CI_TYPE}.root --random.enableEventSeed --random.seed 42 --compactFile $K4GEO/FCCee/ALLEGRO/compact/ALLEGRO_o1_v03/ALLEGRO_o1_v03.xml k4run runTracksFromGenParticles.py From 5e1645e6289c85fce1293e3305b34ef683df67cc Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Fri, 19 Jun 2026 17:29:09 +0200 Subject: [PATCH 11/12] format --- DCHdigi/include/DCHdigi_v01.h | 2 +- DCHdigi/src/DCHdigi_v01.cpp | 8 +++++--- DCHdigi/src/DCHdigi_v02.cpp | 9 +++++---- Tracking/src/genfit_interfaces/GenfitTrack.cpp | 9 +++++---- Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp | 9 +++++---- 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/DCHdigi/include/DCHdigi_v01.h b/DCHdigi/include/DCHdigi_v01.h index 34fd3672..37c6b73b 100644 --- a/DCHdigi/include/DCHdigi_v01.h +++ b/DCHdigi/include/DCHdigi_v01.h @@ -148,7 +148,7 @@ struct DCHdigi_v01 final Vector3D Convert_EDM4hepVector_to_Vector3D(const edm4hep::Vector3d& v, double scale) const { return {v[0] * scale, v[1] * scale, v[2] * scale}; }; - edm4hep::Vector3d Convert_Vector3D_to_EDM4hepVector(const Vector3D& v, double scale) const { + edm4hep::Vector3d Convert_Vector3D_to_EDM4hepVector(const Vector3D& v, double scale) const { return {v.x() * scale, v.y() * scale, v.z() * scale}; }; diff --git a/DCHdigi/src/DCHdigi_v01.cpp b/DCHdigi/src/DCHdigi_v01.cpp index 38beb919..760d3d84 100644 --- a/DCHdigi/src/DCHdigi_v01.cpp +++ b/DCHdigi/src/DCHdigi_v01.cpp @@ -48,7 +48,7 @@ StatusCode DCHdigi_v01::initialize() { /////////////////////////////////////////////////////////////////////////////////// /////////////////////////// retrieve data extension ////////////////////////// /////////////////////////////////////////////////////////////////////////////////// - auto wt_info = DCH_DE.extension(); + auto wt_info = DCH_DE.extension(); this->dch_data = dynamic_cast(wt_info); if (not dch_data->IsValid()) ThrowException("No valid data extension was found for detector <<" + DCH_name + ">>."); @@ -139,7 +139,8 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, // ------------------------------------------------------------------------- // calculate hit position projection into the wire - auto hit_to_wire_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer,ilayer, /*isector=*/0, nphi, hit_position); + auto hit_to_wire_vector = + this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, hit_position); auto hit_projection_on_the_wire = hit_position + hit_to_wire_vector; if (m_create_debug_histos.value()) { double distance_hit_wire = hit_to_wire_vector.R(); @@ -158,7 +159,8 @@ DCHdigi_v01::operator()(const edm4hep::SimTrackerHitCollection& input_sim_hits, hit_projection_on_the_wire += smearing_z * (wire_direction_ez.Unit()); if (m_create_debug_histos.value()) { // the distance from the hit projection and the wire should be zero - auto dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, hit_projection_on_the_wire); + auto dummy_vector = this->dch_data->Calculate_hitpos_to_wire_vector(superlayer, ilayer, /*isector=*/0, nphi, + hit_projection_on_the_wire); hDww->Fill(dummy_vector.R()); } diff --git a/DCHdigi/src/DCHdigi_v02.cpp b/DCHdigi/src/DCHdigi_v02.cpp index 22302f23..38e5c394 100644 --- a/DCHdigi/src/DCHdigi_v02.cpp +++ b/DCHdigi/src/DCHdigi_v02.cpp @@ -59,7 +59,7 @@ StatusCode DCHdigi_v02::initialize() { // Retrieve the detector element dd4hep::DetElement dch_detelem = m_geoSvc->getDetector()->detectors().at(dch_name); // Retrieve the DCH_info data extension for the drift chamber - auto wt_info = dch_detelem.extension(); + auto wt_info = dch_detelem.extension(); m_dch_info = dynamic_cast(wt_info); if (not m_dch_info->IsValid()) { error() << "No valid data extension was found for detector <<" << dch_name << ">>." << endmsg; @@ -120,7 +120,7 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, for (const auto& [cellID, simhits] : cell_map) { // Some geometry values needed for the calculations below - int superlayer = m_decoder->get(cellID, "superlayer"); + int superlayer = m_decoder->get(cellID, "superlayer"); int layer = m_dch_info->CalculateILayerFromCellIDFields(m_decoder->get(cellID, "layer"), superlayer); int nphi = m_decoder->get(cellID, "nphi"); @@ -157,7 +157,8 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, // Use dd4hep:mm as scale to convert into the dd4hep default units (_ddu) auto simhit_position_ddu = this->toVector3D(simhit.getPosition()) * dd4hep::mm; - auto hit_to_wire_vector_ddu = m_dch_info->Calculate_hitpos_to_wire_vector(superlayer, layer, /*isector=*/0, nphi, simhit_position_ddu); + auto hit_to_wire_vector_ddu = + m_dch_info->Calculate_hitpos_to_wire_vector(superlayer, layer, /*isector=*/0, nphi, simhit_position_ddu); auto hit_projection_on_the_wire_ddu = simhit_position_ddu + hit_to_wire_vector_ddu; double distance_to_wire_mm = hit_to_wire_vector_ddu.R() / dd4hep::mm; // Explicitly cast to mm, no matter what the default unit is @@ -172,7 +173,7 @@ DCHdigi_v02::operator()(const edm4hep::SimTrackerHitCollection& input, // z smearing double smearing_z_ddu = random_engine.Gaus(0.0, m_z_resolution_mm.value() * dd4hep::mm); - auto wire_direction_ez_ddu = (m_dch_info->Calculate_wire_vector_ez(superlayer, layer,/*sector=*/0, nphi)).Unit(); + auto wire_direction_ez_ddu = (m_dch_info->Calculate_wire_vector_ez(superlayer, layer, /*sector=*/0, nphi)).Unit(); hit_projection_on_the_wire_ddu += smearing_z_ddu * wire_direction_ez_ddu; // Need to multiply smearing_z_ddu with dd4hep::mm to cast into default units diff --git a/Tracking/src/genfit_interfaces/GenfitTrack.cpp b/Tracking/src/genfit_interfaces/GenfitTrack.cpp index 2e8ee04f..56e4e408 100644 --- a/Tracking/src/genfit_interfaces/GenfitTrack.cpp +++ b/Tracking/src/genfit_interfaces/GenfitTrack.cpp @@ -22,7 +22,8 @@ namespace GenfitInterface { GenfitTrack::GenfitTrack(const edm4hep::Track& track, const bool skipTrackOrdering, - const dd4hep::rec::WireTracker_info_struct* wire_info, const dd4hep::DDSegmentation::BitFieldCoder* decoder, + const dd4hep::rec::WireTracker_info_struct* wire_info, + const dd4hep::DDSegmentation::BitFieldCoder* decoder, const GenfitInterface::GenfitField* fieldMap) : m_originalTrack(track), m_posInit(0., 0., 0.), m_momInit(0., 0., 0.), m_covInit(6), m_genfitTrackRep(nullptr), m_genfitTrack(nullptr), m_edm4hepTrack(), @@ -805,8 +806,7 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { // Check whether the wire tracker has sectors. // m_dc_decoder is nullptr when the geometry has no wire tracker; in that case // there are no SenseWireHits either, so has_sectors is never actually consumed. - const bool has_sectors = - m_dc_decoder && (m_dc_decoder->fieldDescription().find("sector") != std::string::npos); + const bool has_sectors = m_dc_decoder && (m_dc_decoder->fieldDescription().find("sector") != std::string::npos); int hit_idx(0); int detID(-1); @@ -827,7 +827,8 @@ void GenfitTrack::CreateGenFitTrack(int particle_hypotesis, int debug_lvl) { } else if (hit.isA()) { detID = 1; auto wire_hit = hit.as(); - GenfitInterface::WireMeasurement measurement(wire_hit, m_wire_info, m_dc_decoder, has_sectors, detID, ++hit_idx, debug_lvl); + GenfitInterface::WireMeasurement measurement(wire_hit, m_wire_info, m_dc_decoder, has_sectors, detID, ++hit_idx, + debug_lvl); m_genfitTrack->insertPoint(new genfit::TrackPoint(measurement.getGenFit(), m_genfitTrack)); } else { throw std::runtime_error("InitializeTrack: Unknown hit type encountered - Hit will be skipped."); diff --git a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp index ea2edd0b..594826c8 100644 --- a/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp +++ b/Tracking/src/genfit_interfaces/GenfitWireMeasurement.cpp @@ -21,9 +21,10 @@ namespace GenfitInterface { -WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep::rec::WireTracker_info_struct* wire_info, - const dd4hep::DDSegmentation::BitFieldCoder* decoder, const bool has_sectors, const int det_idx, - const int hit_idx, const int debug_lvl) { +WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, + const dd4hep::rec::WireTracker_info_struct* wire_info, + const dd4hep::DDSegmentation::BitFieldCoder* decoder, const bool has_sectors, + const int det_idx, const int hit_idx, const int debug_lvl) { // NB: dd4hep::mm = 0.1. // Therefore: @@ -62,7 +63,7 @@ WireMeasurement::WireMeasurement(const edm4hep::SenseWireHit& hit, const dd4hep: const auto& l = wire_info->database.at(ilayer); // following the logic form WireTracker_info - const double stereo = l.stereo_sw_z0; + const double stereo = l.stereo_sw_z0; const double rz0 = l.radius_sw_z0; const double kappa = tan(stereo) / rz0; const double dy = rz0 * kappa * wire_info->Lhalf; // m From bab3948559a2962fbad1d438ef7fc4f3cc5f589d Mon Sep 17 00:00:00 2001 From: Stefano Franchellucci Date: Mon, 22 Jun 2026 09:56:31 +0200 Subject: [PATCH 12/12] clean up tests --- .github/workflows/key4hep-build.yaml | 2 -- DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py | 4 +--- DCHdigi/test/test_DCHdigi/runDCHdigi.py | 9 +++------ DCHdigi/test/test_DCHdigi/runDCHdigiV2.py | 8 ++------ DCHdigi/test/test_DCHdigi/test_DCHdigi.sh | 5 ++++- Tracking/test/testTrackFinder/test_trackFinder.sh | 8 ++++++-- Tracking/test/testTrackFitter/test_trackFitter.sh | 5 ++++- .../runTracksFromGenParticles.py | 9 +++------ .../test_TracksFromGenParticles.sh | 5 ++++- 9 files changed, 27 insertions(+), 28 deletions(-) diff --git a/.github/workflows/key4hep-build.yaml b/.github/workflows/key4hep-build.yaml index 19d32ed8..110b3940 100644 --- a/.github/workflows/key4hep-build.yaml +++ b/.github/workflows/key4hep-build.yaml @@ -29,8 +29,6 @@ jobs: image: ubuntu26 fail-fast: false runs-on: ubuntu-latest - env: - CI_TYPE: ${{ matrix.build_type }}_${{ matrix.image }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6 - uses: key4hep/key4hep-actions/cache-external-data@main diff --git a/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py b/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py index 07022a19..57d27f4b 100644 --- a/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py +++ b/DCHdigi/test/test_DCHdigi/check_DCHdigi_output.py @@ -8,15 +8,13 @@ import ROOT import sys -import os -CI_TYPE = os.environ.get('CI_TYPE', '') def main(): exit_code = 0 # Open debug output file generated by DCHdigi alg - f = ROOT.TFile(f"dch_digi_alg_debug_{CI_TYPE}.root") + f = ROOT.TFile("dch_digi_alg_debug.root") # Retrieve the hit-wire distance distribution hDpw = f.Get("hDpw") diff --git a/DCHdigi/test/test_DCHdigi/runDCHdigi.py b/DCHdigi/test/test_DCHdigi/runDCHdigi.py index 84917853..d0b0aada 100644 --- a/DCHdigi/test/test_DCHdigi/runDCHdigi.py +++ b/DCHdigi/test/test_DCHdigi/runDCHdigi.py @@ -4,17 +4,14 @@ # to execute: # k4run runDCHdigi.py -import os - from Gaudi.Configuration import INFO, DEBUG from Configurables import EventDataSvc, UniqueIDGenSvc from k4FWCore import ApplicationMgr, IOSvc -CI_TYPE = os.environ.get('CI_TYPE', '') svc = IOSvc("IOSvc") -svc.Input = [f"dch_proton_10GeV_{CI_TYPE}.root"] -svc.Output = f"dch_proton_10GeV_digi_{CI_TYPE}.root" +svc.Input = ["dch_proton_10GeV.root"] +svc.Output = "dch_proton_10GeV_digi.root" from Configurables import GeoSvc @@ -29,7 +26,7 @@ DCHdigi.fileDataAlg = "DataAlgFORGEANT.root" DCHdigi.calculate_dndx = True DCHdigi.create_debug_histograms = True -DCHdigi.out_debug_filename = f"dch_digi_alg_debug_{CI_TYPE}.root" +DCHdigi.out_debug_filename = "dch_digi_alg_debug.root" DCHdigi.zResolution_mm = 1 DCHdigi.xyResolution_mm = 0.1 diff --git a/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py b/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py index afa11fe1..f8052ffe 100644 --- a/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py +++ b/DCHdigi/test/test_DCHdigi/runDCHdigiV2.py @@ -4,18 +4,14 @@ # to execute: # k4run runDCHdigiV2.py - -import os - from Gaudi.Configuration import INFO, DEBUG from Configurables import EventDataSvc, UniqueIDGenSvc from k4FWCore import ApplicationMgr, IOSvc -CI_TYPE = os.environ.get('CI_TYPE', '') svc = IOSvc("IOSvc") -svc.Input = [f"dch_proton_10GeV_{CI_TYPE}.root"] -svc.Output = f"dch_proton_10GeV_digi_{CI_TYPE}.root" +svc.Input = ["dch_proton_10GeV.root"] +svc.Output = "dch_proton_10GeV_digi.root" from Configurables import GeoSvc diff --git a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh index bffbbf24..a6cb117b 100644 --- a/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh +++ b/DCHdigi/test/test_DCHdigi/test_DCHdigi.sh @@ -4,8 +4,11 @@ # to run: sh + test_DCHdigi.sh # goal: run sim-digitizer of the DCH v2, and return code printed by check_DCHdigi_output.py +# clean up previous output files +rm -f dch_proton_10GeV.root + # run simulation with the drift chamber alone -ddsim --steeringFile sim_steering.py --outputFile 'dch_proton_10GeV_${CI_TYPE}.root' -N 10 --runType batch --random.seed 42 +ddsim --steeringFile sim_steering.py --outputFile 'dch_proton_10GeV.root' -N 10 --runType batch --random.seed 42 # download file for cluster counting technique ifilename="https://fccsw.web.cern.ch/fccsw/filesForSimDigiReco/IDEA/DataAlgFORGEANT.root" diff --git a/Tracking/test/testTrackFinder/test_trackFinder.sh b/Tracking/test/testTrackFinder/test_trackFinder.sh index 507a8366..318b0657 100755 --- a/Tracking/test/testTrackFinder/test_trackFinder.sh +++ b/Tracking/test/testTrackFinder/test_trackFinder.sh @@ -1,5 +1,9 @@ #!/bin/bash +# clean up previous output files +rm -f Tracking/test/testTrackFinder/out_sim_edm4hep.root +rm -f Tracking/test/testTrackFinder/out_tracks.root + MODEL_PATH=$1 XML_FILE=$K4GEO/FCCee/IDEA/compact/IDEA_o1_v03/IDEA_o1_v03.xml @@ -14,7 +18,7 @@ ddsim --steeringFile $STEERING_FILE \ -G --gun.distribution uniform --gun.particle mu- \ --random.seed 42 \ --numberOfEvents 1 \ - --outputFile Tracking/test/testTrackFinder/out_sim_edm4hep_${CI_TYPE}.root + --outputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root -k4run Tracking/test/testTrackFinder/runTestTrackFinder.py --inputFile Tracking/test/testTrackFinder/out_sim_edm4hep_${CI_TYPE}.root --outputFile Tracking/test/testTrackFinder/out_tracks_${CI_TYPE}.root --modelPath $MODEL_PATH --tbeta $TBETA --td $TD +k4run Tracking/test/testTrackFinder/runTestTrackFinder.py --inputFile Tracking/test/testTrackFinder/out_sim_edm4hep.root --outputFile Tracking/test/testTrackFinder/out_tracks.root --modelPath $MODEL_PATH --tbeta $TBETA --td $TD diff --git a/Tracking/test/testTrackFitter/test_trackFitter.sh b/Tracking/test/testTrackFitter/test_trackFitter.sh index c2c46987..c46442a1 100644 --- a/Tracking/test/testTrackFitter/test_trackFitter.sh +++ b/Tracking/test/testTrackFitter/test_trackFitter.sh @@ -1,3 +1,6 @@ #!/bin/bash -k4run runTestTrackFitter.py --inputFile ../testTrackFinder/out_tracks_${CI_TYPE}.root --outputFile testFitter_${CI_TYPE}.root \ No newline at end of file +# clean up previous output +rm -f testFitter.root + +k4run runTestTrackFitter.py --inputFile ../testTrackFinder/out_tracks.root --outputFile testFitter.root diff --git a/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py b/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py index e63cf754..63ff2c89 100644 --- a/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py +++ b/Tracking/test/testTracksFromGenParticles/runTracksFromGenParticles.py @@ -1,15 +1,12 @@ from k4FWCore import ApplicationMgr from Gaudi.Configuration import INFO, DEBUG -import os # Loading the output of the SIM step from k4FWCore import IOSvc -CI_TYPE = os.environ.get('CI_TYPE', '') - io_svc = IOSvc("IOSvc") -io_svc.Input = f"ddsim_output_edm4hep_{CI_TYPE}.root" -io_svc.Output = f"tracks_from_genParticle_output_{CI_TYPE}.root" +io_svc.Input = "ddsim_output_edm4hep.root" +io_svc.Output = "tracks_from_genParticle_output.root" # Geometry service from Configurables import GeoSvc @@ -54,7 +51,7 @@ hps = RootHistSvc("HistogramPersistencySvc") root_hist_svc = RootHistoSink("RootHistoSink") -root_hist_svc.FileName = f"TrackHitDistances_{CI_TYPE}.root" +root_hist_svc.FileName = "TrackHitDistances.root" # Set auditor service from Configurables import AuditorSvc, ChronoAuditor diff --git a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh index bb8a78bf..dcf65aaa 100644 --- a/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh +++ b/Tracking/test/testTracksFromGenParticles/test_TracksFromGenParticles.sh @@ -1,5 +1,8 @@ #!/bin/bash -ddsim --enableGun --gun.distribution uniform --gun.energy '10*GeV' --gun.particle e- --numberOfEvents 100 --outputFile ddsim_output_edm4hep_${CI_TYPE}.root --random.enableEventSeed --random.seed 42 --compactFile $K4GEO/FCCee/ALLEGRO/compact/ALLEGRO_o1_v03/ALLEGRO_o1_v03.xml +# clean up previous output files +rm -f ddsim_output_edm4hep.root + +ddsim --enableGun --gun.distribution uniform --gun.energy '10*GeV' --gun.particle e- --numberOfEvents 100 --outputFile ddsim_output_edm4hep.root --random.enableEventSeed --random.seed 42 --compactFile $K4GEO/FCCee/ALLEGRO/compact/ALLEGRO_o1_v03/ALLEGRO_o1_v03.xml k4run runTracksFromGenParticles.py