Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/mucoll-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ jobs:
-DCMAKE_INSTALL_PREFIX=$(pwd)/install \
-DCMAKE_CXX_FLAGS=" -fdiagnostics-color=always -Werror -Wno-error=deprecated-declarations"
cmake --build build
# Tests need OpenDataDetector, which is not present in the mucoll image atm
# ctest --test-dir build -j$(nproc) --output-on-failure
ctest --test-dir build -j$(nproc) --output-on-failure
cmake --build build --target install

ccache -s
Expand Down
5 changes: 4 additions & 1 deletion k4ActsTracking/include/k4ActsTracking/ACTSAlgBase.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
// edm4hep
#include <edm4hep/TrackCollection.h>
#include <edm4hep/TrackerHitPlaneCollection.h>
#include <edm4hep/TrackerHitSimTrackerHitLinkCollection.h>

// Gaudi
#include <Gaudi/Property.h>
Expand Down Expand Up @@ -63,7 +64,8 @@
* @version $Id$
*/
struct ACTSAlgBase : k4FWCore::MultiTransformer<std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection>(
const edm4hep::TrackerHitPlaneCollection&)> {
const edm4hep::TrackerHitPlaneCollection&,
const edm4hep::TrackerHitSimTrackerHitLinkCollection&)> {
using DetectorElementPtr = std::shared_ptr<const ActsPlugins::TGeoDetectorElement>;
using DetectorStore = std::vector<DetectorElementPtr>;

Expand Down Expand Up @@ -165,6 +167,7 @@ private:

Acts::CalibrationContext m_calibrationContext; ///< Calibration Context

protected:
SmartIF<IGeoSvc> m_geoSvc;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ public:
* @return A tuple of Track Collections: The reconstructed tracks and the seeds that led to those tracks
*/
std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection> operator()(
const edm4hep::TrackerHitPlaneCollection& trackerHitCollection) const;
const edm4hep::TrackerHitPlaneCollection& trackerHitCollection,
const edm4hep::TrackerHitSimTrackerHitLinkCollection& trackerHitRelations) const;

std::vector<Acts::BoundTrackParameters> findSeeds(const Acts::SeedFinder<SSPoint, SSPointGrid, void*>& finder,
const Acts::SeedFinderOptions& finderOpts,
Expand Down
4 changes: 3 additions & 1 deletion k4ActsTracking/src/components/ACTSAlgBase.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ using namespace ACTSTracking;

ACTSAlgBase::ACTSAlgBase(const std::string& name, ISvcLocator* svcLoc)
: MultiTransformer(
name, svcLoc, {KeyValues("InputTrackerHitCollectionName", {"TrackerHits"})},
name, svcLoc,
{KeyValues("InputTrackerHitCollectionName", {"TrackerHits"}),
KeyValues("InputTrackerHitRelationCollectionName", {"TrackerHitRelations"})},
{KeyValues("OutputSeedCollectionName", {"SeedTracks"}), KeyValues("OutputTrackCollectionName", {"Tracks"})}),
m_geometryContext(Acts::GeometryContext::dangerouslyDefaultConstruct()) {
m_geoSvc = serviceLocator()->service("GeoSvc"); // important to initialize m_geoSvc
Expand Down
35 changes: 32 additions & 3 deletions k4ActsTracking/src/components/ACTSSeededCKFTrackingAlg.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
#include <edm4hep/SimTrackerHit.h>
#include <edm4hep/TrackState.h>
#include <edm4hep/TrackerHitPlane.h>
#include <edm4hep/TrackerHitSimTrackerHitLinkCollection.h>

// podio
#include <podio/LinkNavigator.h>

// ACTS
#include <Acts/Seeding/SpacePointGrid.hpp>
Expand All @@ -37,6 +41,8 @@
#include <Acts/TrackFitting/GainMatrixUpdater.hpp>
#include <Acts/Utilities/RangeXD.hpp>

#include <DDSegmentation/BitFieldCoder.h>

// TBB
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
Expand Down Expand Up @@ -93,7 +99,8 @@ StatusCode ACTSSeededCKFTrackingAlg::initialize() {
}

std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection> ACTSSeededCKFTrackingAlg::operator()(
const edm4hep::TrackerHitPlaneCollection& trackerHitCollection) const {
const edm4hep::TrackerHitPlaneCollection& trackerHitCollection,
const edm4hep::TrackerHitSimTrackerHitLinkCollection& trackerHitRelations) const {
// Prepare output collections
edm4hep::TrackCollection seedCollection;
edm4hep::TrackCollection trackCollection;
Expand All @@ -111,6 +118,7 @@ std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection> ACTSSeededCKFTrac
sortedHits.reserve(trackerHitCollection.size());

for (const auto& hit : trackerHitCollection) {
debug() << "Adding hit " << hit.id() << endmsg;
sortedHits.push_back(std::make_pair(geoIDMappingTool()->getGeometryID(hit), hit));
}
debug() << "Working with " << sortedHits.size() << " hits." << endmsg;
Expand All @@ -126,6 +134,10 @@ std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection> ACTSSeededCKFTrac
std::sort(sortedHits.begin(), sortedHits.end(), compare);
}

dd4hep::DDSegmentation::BitFieldCoder decoder{m_geoSvc->constantAsString(m_encodingStringVariable.value())};

podio::LinkNavigator hitRelNav{trackerHitRelations};

// Turn the edm4hep TrackerHit's into Acts objects
// Assumes that the hits are sorted by the GeoID
sourceLinks.reserve(sortedHits.size());
Expand All @@ -138,9 +150,26 @@ std::tuple<edm4hep::TrackCollection, edm4hep::TrackCollection> ACTSSeededCKFTrac
const edm4hep::Vector3d& edmglobalpos = hitPair.second.getPosition();
Acts::Vector3 globalPos = {edmglobalpos.x, edmglobalpos.y, edmglobalpos.z};

debug() << "Converting hit " << hitPair.second.id() << " to local position (pos = " << edmglobalpos
<< ") using surface with geoId " << hitPair.first
<< " dd4hep cellid: " << decoder.valueString(hitPair.second.getCellID()) << endmsg;

Acts::Result<Acts::Vector2> lpResult = surface->globalToLocal(geometryContext(), globalPos, {0, 0, 0}, 0.5_um);
if (!lpResult.ok())
throw std::runtime_error("Global to local transformation did not succeed.");
if (!lpResult.ok()) {
warning() << "Global to local transformation did not succeed" << endmsg;
Acts::Vector3 loc3DFrame = surface->localToGlobalTransform(geometryContext()).inverse() * globalPos;
debug() << "Local position: " << loc3DFrame.x() << ", " << loc3DFrame.y() << ", " << loc3DFrame.z()
<< " z tolerance: " << 0.5_um << endmsg;

const auto simHits = hitRelNav.getLinked(hitPair.second);
if (!simHits.empty()) {
const auto& simPos = simHits.front().o.getPosition();
debug() << "SimTrackerHit position: " << simPos.x << ", " << simPos.y << ", " << simPos.z << endmsg;
}
continue;

// throw std::runtime_error("Global to local transformation did not succeed.");
}

Acts::Vector2 loc = lpResult.value();

Expand Down
37 changes: 37 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,40 @@ add_geometry_load_test($ENV{k4geo_DIR}/FCCee/ILD_FCCee/compact/ILD_FCCee_v01/ILD
add_geometry_load_test($ENV{k4geo_DIR}/FCCee/ILD_FCCee/compact/ILD_FCCee_v02/ILD_FCCee_v02.xml)
add_geometry_load_test($ENV{k4geo_DIR}/FCCee/CLD/compact/CLD_o2_v07/CLD_o2_v07.xml)
add_geometry_load_test($ENV{k4geo_DIR}/FCCee/CLD/compact/CLD_o2_v08/CLD_o2_v08.xml)

add_test(NAME sim_MAIA
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND ddsim --compactFile=$ENV{k4geo_DIR}/MuColl/MAIA/compact/MAIA_v0/MAIA_v0.xml
--runType=batch -G -N=10

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using 10 events here to actually trigger failures, see key4hep/k4FWCore#367

--outputFile=particle_gun_MAIA_SIM.edm4hep.root
--gun.multiplicity 10
--gun.particle "mu-"
--gun.distribution uniform
--gun.thetaMax 2.96 # rougly 170 degrees
--gun.thetaMin -2.96 # rougly -170 degrees
--gun.momentumMin 5
--gun.momentumMax 500
)

add_test(NAME reco_MAIA
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMAND k4run ${CMAKE_CURRENT_LIST_DIR}/options/MAIA_CKF_Tracking.py
--compactFile=$ENV{k4geo_DIR}/MuColl/MAIA/compact/MAIA_v0/MAIA_v0.xml
--trackingGeoFile=${CMAKE_CURRENT_LIST_DIR}/../data/MAIA_v0.root
--geoDescFile=${CMAKE_CURRENT_LIST_DIR}/../data/MAIA_v0.json
--materialFile=${CMAKE_CURRENT_LIST_DIR}/../data/MAIA_v0_material.json
)
set_test_env(reco_MAIA)

# Setup test dependencies such that they are run in the right order always
set_tests_properties(
sim_MAIA
PROPERTIES
FIXTURES_SETUP sim_maia_fixture
)

# set_tests_properties(
# reco_MAIA
# PROPERTIES
# FIXTURES_REQUIRED sim_maia_fixture
# )
185 changes: 185 additions & 0 deletions test/options/MAIA_CKF_Tracking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#!/usr/bin/env python3

import os

from Gaudi.Configuration import INFO, VERBOSE
from Gaudi.Configurables import (
ACTSSeededCKFTrackingAlg,
CollectionMerger,
DDPlanarDigi,
EventDataSvc,
GeoSvc,
)

from k4FWCore import ApplicationMgr, IOSvc
from k4FWCore.parseArgs import parser

parser.add_argument(
"--compactFile",
help="The geometry compact file to use for reconstruction",
type=str,
)
parser.add_argument(
"--trackingGeoFile",
help="The TGeo file containing the tracking geometry",
type=str,
)
parser.add_argument(
"--materialFile",
help="The file containing the material mapping for the tracking geometry",
type=str,
)
parser.add_argument(
"--geoDescFile", help="The JSON file describing the subdetectors", type=str
)

args = parser.parse_known_args()[0]


svcList = [
GeoSvc("GeoSvc", detectors=[args.compactFile], EnableGeant4Geo=False),
EventDataSvc("EventDataSvc"),
]

iosvc = IOSvc(
"IOSvc",
Input=["particle_gun_MAIA_SIM.edm4hep.root"],
Output="maia_ckf_tracking_reco.edm4hep.root",
)


algList = []


for name in ("VertexBarrel", "VertexEndcap"):
algList.append(
DDPlanarDigi(
f"{name}Digitizer",
CorrectTimesForPropagation=True,
IsStrip=False,
ResolutionT=[0.03],
ResolutionU=[0.005],
ResolutionV=[0.005],
SubDetectorName="Vertex",
TimeWindowMax=[0.15],
TimeWindowMin=[-0.09],
UseTimeWindow=True,
SimTrackHitCollectionName=[f"{name}Collection"],
SimTrkHitRelCollection=[f"{name}HitsRelations"],
TrackerHitCollectionName=[f"{name}Hits"],
)
)

for name in (
"InnerTrackerBarrel",
"InnerTrackerEndcap",
"OuterTrackerBarrel",
"OuterTrackerEndcap",
):
algList.append(
DDPlanarDigi(
f"{name}Digitizer",
CorrectTimesForPropagation=True,
IsStrip="InnerBarrel" in name or "OuterEndcap" in name, # Is this true?
ResolutionT=[0.06],
ResolutionU=[0.007],
ResolutionV=[0.09],
SubDetectorName=name.replace("Barrel", "s").replace("Endcap", "s"),
TimeWindowMax=[0.3],
TimeWindowMin=[-0.18],
UseTimeWindow=True,
SimTrackHitCollectionName=[f"{name}Collection"],
SimTrkHitRelCollection=[f"{name}HitsRelations"],
TrackerHitCollectionName=[f"{name}Hits"],
)
)


algList.append(
CollectionMerger(
"MergeHits",
InputCollections=[
"VertexBarrelHits",
"VertexEndcapHits",
"InnerTrackerBarrelHits",
"InnerTrackerEndcapHits",
"OuterTrackerBarrelHits",
"OuterTrackerEndcapHits",
],
OutputCollection="MergedTrackerHits",
)
)

algList.append(
CollectionMerger(
"MergeHitsRelations",
InputCollections=[
"VertexBarrelHitsRelations",
"VertexEndcapHitsRelations",
"InnerTrackerBarrelHitsRelations",
"InnerTrackerEndcapHitsRelations",
"OuterTrackerBarrelHitsRelations",
"OuterTrackerEndcapHitsRelations",
],
OutputCollection="MergedTrackerHitsRelations",
)
)

ckf_tracking = ACTSSeededCKFTrackingAlg(
"CKFTracking",
MatFile=args.materialFile,
TGeoFile=args.trackingGeoFile,
TGeoDescFile=args.geoDescFile,
DetectorSchema=args.compactFile,
RunCKF="True",
CKF_Chi2CutOff=10,
SeedFinding_RMax=150,
SeedFinding_MinPt=500,
SeedFinding_ImpactMax=3,
CKF_NumMeasurementsCutOff=1,
SeedFinding_SigmaScattering=50,
SeedFinding_CollisionRegion=6,
SeedFinding_RadLengthPerSeed=0.1,
SeedingLayers=[
"13",
"2",
"13",
"6",
"13",
"10",
"13",
"14",
"14",
"2",
"14",
"6",
"14",
"10",
"14",
"14",
"15",
"2",
"15",
"6",
"15",
"10",
"15",
"14",
"8",
"2",
"17",
"2",
"18",
"2",
],
OutputTrackCollectionName=["AllTracks"],
OutputSeedCollectionName=["SeedTracks"],
InputTrackerHitCollectionName=["MergedTrackerHits"],
OutputLevel=VERBOSE,
)
algList.append(ckf_tracking)


ApplicationMgr(
TopAlg=algList, ExtSvc=svcList, OutputLevel=INFO, EvtSel="NONE", EvtMax=-1
)
Loading