File indexing completed on 2026-04-09 07:46:31
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/Io/Root/RootTrackSummaryWriter.hpp"
0010
0011 #include "Acts/Definitions/TrackParametrization.hpp"
0012 #include "Acts/EventData/AnyTrackProxy.hpp"
0013 #include "Acts/EventData/VectorMultiTrajectory.hpp"
0014 #include "Acts/Surfaces/Surface.hpp"
0015 #include "Acts/TrackFitting/GsfOptions.hpp"
0016 #include "Acts/Utilities/Intersection.hpp"
0017 #include "Acts/Utilities/Result.hpp"
0018 #include "Acts/Utilities/detail/periodic.hpp"
0019 #include "ActsExamples/EventData/TruthMatching.hpp"
0020 #include "ActsExamples/Framework/AlgorithmContext.hpp"
0021 #include "ActsExamples/Framework/WriterT.hpp"
0022 #include "ActsExamples/Validation/TrackClassification.hpp"
0023 #include "ActsFatras/EventData/Barcode.hpp"
0024
0025 #include <array>
0026 #include <cmath>
0027 #include <cstddef>
0028 #include <cstdint>
0029 #include <ios>
0030 #include <limits>
0031 #include <numbers>
0032 #include <optional>
0033 #include <ostream>
0034 #include <stdexcept>
0035
0036 #include <TFile.h>
0037 #include <TTree.h>
0038
0039 using Acts::VectorHelpers::eta;
0040 using Acts::VectorHelpers::perp;
0041 using Acts::VectorHelpers::phi;
0042 using Acts::VectorHelpers::theta;
0043
0044 namespace ActsExamples {
0045
0046 RootTrackSummaryWriter::RootTrackSummaryWriter(
0047 const RootTrackSummaryWriter::Config& config, Acts::Logging::Level level)
0048 : WriterT(config.inputTracks, "RootTrackSummaryWriter", level),
0049 m_cfg(config) {
0050
0051 if (m_cfg.filePath.empty()) {
0052 throw std::invalid_argument("Missing output filename");
0053 }
0054 if (m_cfg.treeName.empty()) {
0055 throw std::invalid_argument("Missing tree name");
0056 }
0057
0058 m_inputParticles.maybeInitialize(m_cfg.inputParticles);
0059 m_inputTrackParticleMatching.maybeInitialize(
0060 m_cfg.inputTrackParticleMatching);
0061 if (m_cfg.writeJets) {
0062 m_inputJets.maybeInitialize(m_cfg.inputJets);
0063 }
0064
0065
0066 auto path = m_cfg.filePath;
0067 m_outputFile = TFile::Open(path.c_str(), m_cfg.fileMode.c_str());
0068 if (m_outputFile == nullptr) {
0069 throw std::ios_base::failure("Could not open '" + path + "'");
0070 }
0071 m_outputFile->cd();
0072 m_outputTree = new TTree(m_cfg.treeName.c_str(), m_cfg.treeName.c_str());
0073 if (m_outputTree == nullptr) {
0074 throw std::bad_alloc();
0075 }
0076
0077
0078 m_outputTree->Branch("event_nr", &m_eventNr);
0079 m_outputTree->Branch("track_nr", &m_trackNr);
0080
0081 m_outputTree->Branch("nStates", &m_nStates);
0082 m_outputTree->Branch("nMeasurements", &m_nMeasurements);
0083 m_outputTree->Branch("nOutliers", &m_nOutliers);
0084 m_outputTree->Branch("nHoles", &m_nHoles);
0085 m_outputTree->Branch("nSharedHits", &m_nSharedHits);
0086 m_outputTree->Branch("chi2Sum", &m_chi2Sum);
0087 m_outputTree->Branch("NDF", &m_NDF);
0088 m_outputTree->Branch("measurementChi2", &m_measurementChi2);
0089 m_outputTree->Branch("outlierChi2", &m_outlierChi2);
0090 m_outputTree->Branch("measurementVolume", &m_measurementVolume);
0091 m_outputTree->Branch("measurementLayer", &m_measurementLayer);
0092 m_outputTree->Branch("outlierVolume", &m_outlierVolume);
0093 m_outputTree->Branch("outlierLayer", &m_outlierLayer);
0094
0095 m_outputTree->Branch("nMajorityHits", &m_nMajorityHits);
0096 m_outputTree->Branch("majorityParticleId_vertex_primary",
0097 &m_majorityParticleVertexPrimary);
0098 m_outputTree->Branch("majorityParticleId_vertex_secondary",
0099 &m_majorityParticleVertexSecondary);
0100 m_outputTree->Branch("majorityParticleId_particle",
0101 &m_majorityParticleParticle);
0102 m_outputTree->Branch("majorityParticleId_generation",
0103 &m_majorityParticleGeneration);
0104 m_outputTree->Branch("majorityParticleId_sub_particle",
0105 &m_majorityParticleSubParticle);
0106 m_outputTree->Branch("trackClassification", &m_trackClassification);
0107 m_outputTree->Branch("t_charge", &m_t_charge);
0108 m_outputTree->Branch("t_time", &m_t_time);
0109 m_outputTree->Branch("t_vx", &m_t_vx);
0110 m_outputTree->Branch("t_vy", &m_t_vy);
0111 m_outputTree->Branch("t_vz", &m_t_vz);
0112 m_outputTree->Branch("t_px", &m_t_px);
0113 m_outputTree->Branch("t_py", &m_t_py);
0114 m_outputTree->Branch("t_pz", &m_t_pz);
0115 m_outputTree->Branch("t_theta", &m_t_theta);
0116 m_outputTree->Branch("t_phi", &m_t_phi);
0117 m_outputTree->Branch("t_eta", &m_t_eta);
0118 m_outputTree->Branch("t_p", &m_t_p);
0119 m_outputTree->Branch("t_pT", &m_t_pT);
0120 m_outputTree->Branch("t_d0", &m_t_d0);
0121 m_outputTree->Branch("t_z0", &m_t_z0);
0122 m_outputTree->Branch("t_prodR", &m_t_prodR);
0123
0124 m_outputTree->Branch("hasFittedParams", &m_hasFittedParams);
0125 m_outputTree->Branch("eLOC0_fit", &m_eLOC0_fit);
0126 m_outputTree->Branch("eLOC1_fit", &m_eLOC1_fit);
0127 m_outputTree->Branch("ePHI_fit", &m_ePHI_fit);
0128 m_outputTree->Branch("eTHETA_fit", &m_eTHETA_fit);
0129 m_outputTree->Branch("eQOP_fit", &m_eQOP_fit);
0130 m_outputTree->Branch("eT_fit", &m_eT_fit);
0131 m_outputTree->Branch("err_eLOC0_fit", &m_err_eLOC0_fit);
0132 m_outputTree->Branch("err_eLOC1_fit", &m_err_eLOC1_fit);
0133 m_outputTree->Branch("err_ePHI_fit", &m_err_ePHI_fit);
0134 m_outputTree->Branch("err_eTHETA_fit", &m_err_eTHETA_fit);
0135 m_outputTree->Branch("err_eQOP_fit", &m_err_eQOP_fit);
0136 m_outputTree->Branch("err_eT_fit", &m_err_eT_fit);
0137 m_outputTree->Branch("res_eLOC0_fit", &m_res_eLOC0_fit);
0138 m_outputTree->Branch("res_eLOC1_fit", &m_res_eLOC1_fit);
0139 m_outputTree->Branch("res_ePHI_fit", &m_res_ePHI_fit);
0140 m_outputTree->Branch("res_eTHETA_fit", &m_res_eTHETA_fit);
0141 m_outputTree->Branch("res_eQOP_fit", &m_res_eQOP_fit);
0142 m_outputTree->Branch("res_eT_fit", &m_res_eT_fit);
0143 m_outputTree->Branch("pull_eLOC0_fit", &m_pull_eLOC0_fit);
0144 m_outputTree->Branch("pull_eLOC1_fit", &m_pull_eLOC1_fit);
0145 m_outputTree->Branch("pull_ePHI_fit", &m_pull_ePHI_fit);
0146 m_outputTree->Branch("pull_eTHETA_fit", &m_pull_eTHETA_fit);
0147 m_outputTree->Branch("pull_eQOP_fit", &m_pull_eQOP_fit);
0148 m_outputTree->Branch("pull_eT_fit", &m_pull_eT_fit);
0149
0150 if (m_cfg.writeGsfSpecific) {
0151 m_outputTree->Branch("max_material_fwd", &m_gsf_max_material_fwd);
0152 m_outputTree->Branch("sum_material_fwd", &m_gsf_sum_material_fwd);
0153 }
0154
0155 if (m_cfg.writeCovMat) {
0156
0157
0158 m_outputTree->Branch("cov_eLOC0_eLOC0", &m_cov_eLOC0_eLOC0);
0159 m_outputTree->Branch("cov_eLOC0_eLOC1", &m_cov_eLOC0_eLOC1);
0160 m_outputTree->Branch("cov_eLOC0_ePHI", &m_cov_eLOC0_ePHI);
0161 m_outputTree->Branch("cov_eLOC0_eTHETA", &m_cov_eLOC0_eTHETA);
0162 m_outputTree->Branch("cov_eLOC0_eQOP", &m_cov_eLOC0_eQOP);
0163 m_outputTree->Branch("cov_eLOC0_eT", &m_cov_eLOC0_eT);
0164
0165 m_outputTree->Branch("cov_eLOC1_eLOC0", &m_cov_eLOC1_eLOC0);
0166 m_outputTree->Branch("cov_eLOC1_eLOC1", &m_cov_eLOC1_eLOC1);
0167 m_outputTree->Branch("cov_eLOC1_ePHI", &m_cov_eLOC1_ePHI);
0168 m_outputTree->Branch("cov_eLOC1_eTHETA", &m_cov_eLOC1_eTHETA);
0169 m_outputTree->Branch("cov_eLOC1_eQOP", &m_cov_eLOC1_eQOP);
0170 m_outputTree->Branch("cov_eLOC1_eT", &m_cov_eLOC1_eT);
0171
0172 m_outputTree->Branch("cov_ePHI_eLOC0", &m_cov_ePHI_eLOC0);
0173 m_outputTree->Branch("cov_ePHI_eLOC1", &m_cov_ePHI_eLOC1);
0174 m_outputTree->Branch("cov_ePHI_ePHI", &m_cov_ePHI_ePHI);
0175 m_outputTree->Branch("cov_ePHI_eTHETA", &m_cov_ePHI_eTHETA);
0176 m_outputTree->Branch("cov_ePHI_eQOP", &m_cov_ePHI_eQOP);
0177 m_outputTree->Branch("cov_ePHI_eT", &m_cov_ePHI_eT);
0178
0179 m_outputTree->Branch("cov_eTHETA_eLOC0", &m_cov_eTHETA_eLOC0);
0180 m_outputTree->Branch("cov_eTHETA_eLOC1", &m_cov_eTHETA_eLOC1);
0181 m_outputTree->Branch("cov_eTHETA_ePHI", &m_cov_eTHETA_ePHI);
0182 m_outputTree->Branch("cov_eTHETA_eTHETA", &m_cov_eTHETA_eTHETA);
0183 m_outputTree->Branch("cov_eTHETA_eQOP", &m_cov_eTHETA_eQOP);
0184 m_outputTree->Branch("cov_eTHETA_eT", &m_cov_eTHETA_eT);
0185
0186 m_outputTree->Branch("cov_eQOP_eLOC0", &m_cov_eQOP_eLOC0);
0187 m_outputTree->Branch("cov_eQOP_eLOC1", &m_cov_eQOP_eLOC1);
0188 m_outputTree->Branch("cov_eQOP_ePHI", &m_cov_eQOP_ePHI);
0189 m_outputTree->Branch("cov_eQOP_eTHETA", &m_cov_eQOP_eTHETA);
0190 m_outputTree->Branch("cov_eQOP_eQOP", &m_cov_eQOP_eQOP);
0191 m_outputTree->Branch("cov_eQOP_eT", &m_cov_eQOP_eT);
0192
0193 m_outputTree->Branch("cov_eT_eLOC0", &m_cov_eT_eLOC0);
0194 m_outputTree->Branch("cov_eT_eLOC1", &m_cov_eT_eLOC1);
0195 m_outputTree->Branch("cov_eT_ePHI", &m_cov_eT_ePHI);
0196 m_outputTree->Branch("cov_eT_eTHETA", &m_cov_eT_eTHETA);
0197 m_outputTree->Branch("cov_eT_eQOP", &m_cov_eT_eQOP);
0198 m_outputTree->Branch("cov_eT_eT", &m_cov_eT_eT);
0199 }
0200
0201 if (m_cfg.writeGx2fSpecific) {
0202 m_outputTree->Branch("nUpdatesGx2f", &m_nUpdatesGx2f);
0203 }
0204
0205 if (m_cfg.writeJets) {
0206 m_outputTree->Branch("nJets", &m_nJets);
0207 m_outputTree->Branch("jet_pt", &m_jet_pt);
0208 m_outputTree->Branch("jet_eta", &m_jet_eta);
0209 m_outputTree->Branch("jet_phi", &m_jet_phi);
0210 m_outputTree->Branch("jet_label", &m_jet_label);
0211 m_outputTree->Branch("ntracks_per_jets", &m_ntracks_per_jets);
0212 }
0213 }
0214
0215 RootTrackSummaryWriter::~RootTrackSummaryWriter() {
0216 m_outputFile->Close();
0217 }
0218
0219 ProcessCode RootTrackSummaryWriter::finalize() {
0220 m_outputFile->cd();
0221 m_outputTree->Write();
0222 m_outputFile->Close();
0223
0224 if (m_cfg.writeCovMat) {
0225 ACTS_INFO("Wrote full covariance matrix to tree");
0226 }
0227 ACTS_INFO("Wrote parameters of tracks to tree '" << m_cfg.treeName << "' in '"
0228 << m_cfg.filePath << "'");
0229
0230 return ProcessCode::SUCCESS;
0231 }
0232
0233 ProcessCode RootTrackSummaryWriter::writeT(const AlgorithmContext& ctx,
0234 const ConstTrackContainer& tracks) {
0235
0236 const static SimParticleContainer emptyParticles;
0237 const static TrackParticleMatching emptyTrackParticleMatching;
0238
0239 const auto& particles =
0240 m_inputParticles.isInitialized() ? m_inputParticles(ctx) : emptyParticles;
0241 const auto& trackParticleMatching =
0242 m_inputTrackParticleMatching.isInitialized()
0243 ? m_inputTrackParticleMatching(ctx)
0244 : emptyTrackParticleMatching;
0245
0246
0247 std::vector<ParticleHitCount> particleHitCounts;
0248
0249
0250 std::lock_guard<std::mutex> lock(m_writeMutex);
0251
0252
0253 m_eventNr = ctx.eventNumber;
0254
0255 std::vector<ActsExamples::TruthJet> jets;
0256 std::unordered_map<std::size_t, std::vector<std::int32_t>>
0257 jetToTrackIndicesMap;
0258
0259
0260 if (m_cfg.writeJets) {
0261 auto& inputJets = m_inputJets(ctx);
0262 jets = inputJets;
0263
0264
0265 for (std::size_t ijet = 0; ijet < jets.size(); ++ijet) {
0266 m_nJets.push_back(jets.size());
0267 Acts::Vector4 jet_4mom = jets[ijet].fourMomentum();
0268 Acts::Vector3 jet_3mom{jet_4mom[0], jet_4mom[1], jet_4mom[2]};
0269
0270 float jet_theta = theta(jet_3mom);
0271
0272 m_jet_pt.push_back(perp(jet_4mom));
0273 m_jet_eta.push_back(std::atanh(std::cos(jet_theta)));
0274 m_jet_phi.push_back(phi(jet_4mom));
0275 m_jet_label.push_back(static_cast<int>(jets[ijet].jetLabel()));
0276 m_ntracks_per_jets.push_back(jets[ijet].associatedTracks().size());
0277 }
0278 }
0279
0280 for (const auto& track : tracks) {
0281 m_trackNr.push_back(track.index());
0282
0283
0284 m_nStates.push_back(track.nTrackStates());
0285 m_nMeasurements.push_back(track.nMeasurements());
0286 m_nOutliers.push_back(track.nOutliers());
0287 m_nHoles.push_back(track.nHoles());
0288 m_nSharedHits.push_back(track.nSharedHits());
0289 m_chi2Sum.push_back(track.chi2());
0290 m_NDF.push_back(track.nDoF());
0291
0292 {
0293 std::vector<double> measurementChi2;
0294 std::vector<std::uint32_t> measurementVolume;
0295 std::vector<std::uint32_t> measurementLayer;
0296 std::vector<double> outlierChi2;
0297 std::vector<std::uint32_t> outlierVolume;
0298 std::vector<std::uint32_t> outlierLayer;
0299 for (const auto& state : track.trackStatesReversed()) {
0300 const auto& geoID = state.referenceSurface().geometryId();
0301 const auto& volume = geoID.volume();
0302 const auto& layer = geoID.layer();
0303 if (state.typeFlags().isOutlier()) {
0304 outlierChi2.push_back(state.chi2());
0305 outlierVolume.push_back(volume);
0306 outlierLayer.push_back(layer);
0307 } else if (state.typeFlags().isMeasurement()) {
0308 measurementChi2.push_back(state.chi2());
0309 measurementVolume.push_back(volume);
0310 measurementLayer.push_back(layer);
0311 }
0312 }
0313 m_measurementChi2.push_back(std::move(measurementChi2));
0314 m_measurementVolume.push_back(std::move(measurementVolume));
0315 m_measurementLayer.push_back(std::move(measurementLayer));
0316 m_outlierChi2.push_back(std::move(outlierChi2));
0317 m_outlierVolume.push_back(std::move(outlierVolume));
0318 m_outlierLayer.push_back(std::move(outlierLayer));
0319 }
0320
0321
0322 SimBarcode majorityParticleId{};
0323 TrackMatchClassification trackClassification =
0324 TrackMatchClassification::Unknown;
0325 unsigned int nMajorityHits = std::numeric_limits<unsigned int>::max();
0326 int t_charge = std::numeric_limits<int>::max();
0327 float t_time = NaNfloat;
0328 float t_vx = NaNfloat;
0329 float t_vy = NaNfloat;
0330 float t_vz = NaNfloat;
0331 float t_px = NaNfloat;
0332 float t_py = NaNfloat;
0333 float t_pz = NaNfloat;
0334 float t_theta = NaNfloat;
0335 float t_phi = NaNfloat;
0336 float t_eta = NaNfloat;
0337 float t_p = NaNfloat;
0338 float t_pT = NaNfloat;
0339 float t_d0 = NaNfloat;
0340 float t_z0 = NaNfloat;
0341 float t_qop = NaNfloat;
0342 float t_prodR = NaNfloat;
0343
0344
0345 const Acts::Surface* pSurface =
0346 track.hasReferenceSurface() ? &track.referenceSurface() : nullptr;
0347
0348
0349 auto match = trackParticleMatching.find(track.index());
0350 bool foundMajorityParticle = false;
0351
0352 if (match != trackParticleMatching.end() &&
0353 match->second.particle.has_value()) {
0354
0355 majorityParticleId = match->second.particle.value();
0356 trackClassification = match->second.classification;
0357 nMajorityHits = match->second.contributingParticles.front().hitCount;
0358
0359
0360 auto ip = particles.find(majorityParticleId);
0361 if (ip != particles.end()) {
0362 foundMajorityParticle = true;
0363
0364 const auto& particle = *ip;
0365 ACTS_VERBOSE("Find the truth particle with barcode "
0366 << majorityParticleId << "=" << majorityParticleId.hash());
0367
0368 t_p = particle.absoluteMomentum();
0369 t_charge = static_cast<int>(particle.charge());
0370 t_time = particle.time();
0371 t_vx = particle.position().x();
0372 t_vy = particle.position().y();
0373 t_vz = particle.position().z();
0374 t_px = t_p * particle.direction().x();
0375 t_py = t_p * particle.direction().y();
0376 t_pz = t_p * particle.direction().z();
0377 t_theta = theta(particle.direction());
0378 t_phi = phi(particle.direction());
0379 t_eta = eta(particle.direction());
0380 t_pT = t_p * perp(particle.direction());
0381 t_qop = particle.qOverP();
0382 t_prodR = std::sqrt(t_vx * t_vx + t_vy * t_vy);
0383
0384 if (pSurface != nullptr) {
0385 Acts::Intersection3D intersection =
0386 pSurface
0387 ->intersect(ctx.geoContext, particle.position(),
0388 particle.direction(),
0389 Acts::BoundaryTolerance::Infinite())
0390 .closest();
0391 auto position = intersection.position();
0392
0393
0394 auto lpResult = pSurface->globalToLocal(ctx.geoContext, position,
0395 particle.direction());
0396 if (lpResult.ok()) {
0397 t_d0 = lpResult.value()[Acts::BoundIndices::eBoundLoc0];
0398 t_z0 = lpResult.value()[Acts::BoundIndices::eBoundLoc1];
0399 } else {
0400 ACTS_ERROR("Global to local transformation did not succeed.");
0401 }
0402 }
0403 } else {
0404 ACTS_DEBUG("Truth particle with barcode "
0405 << majorityParticleId << "=" << majorityParticleId.hash()
0406 << " not found in the input collection!");
0407 }
0408 }
0409 if (!foundMajorityParticle) {
0410 ACTS_DEBUG("Truth particle for track " << track.tipIndex()
0411 << " not found!");
0412 }
0413
0414
0415
0416 m_majorityParticleVertexPrimary.push_back(
0417 majorityParticleId.vertexPrimary());
0418 m_majorityParticleVertexSecondary.push_back(
0419 majorityParticleId.vertexSecondary());
0420 m_majorityParticleParticle.push_back(majorityParticleId.particle());
0421 m_majorityParticleGeneration.push_back(majorityParticleId.generation());
0422 m_majorityParticleSubParticle.push_back(majorityParticleId.subParticle());
0423 m_trackClassification.push_back(static_cast<int>(trackClassification));
0424 m_nMajorityHits.push_back(nMajorityHits);
0425 m_t_charge.push_back(t_charge);
0426 m_t_time.push_back(t_time);
0427 m_t_vx.push_back(t_vx);
0428 m_t_vy.push_back(t_vy);
0429 m_t_vz.push_back(t_vz);
0430 m_t_px.push_back(t_px);
0431 m_t_py.push_back(t_py);
0432 m_t_pz.push_back(t_pz);
0433 m_t_theta.push_back(t_theta);
0434 m_t_phi.push_back(t_phi);
0435 m_t_eta.push_back(t_eta);
0436 m_t_p.push_back(t_p);
0437 m_t_pT.push_back(t_pT);
0438 m_t_d0.push_back(t_d0);
0439 m_t_z0.push_back(t_z0);
0440 m_t_prodR.push_back(t_prodR);
0441
0442
0443 std::array<float, Acts::eBoundSize> param = {NaNfloat, NaNfloat, NaNfloat,
0444 NaNfloat, NaNfloat, NaNfloat};
0445 std::array<float, Acts::eBoundSize> error = {NaNfloat, NaNfloat, NaNfloat,
0446 NaNfloat, NaNfloat, NaNfloat};
0447
0448
0449 auto getCov = [&](auto i, auto j) { return track.covariance()(i, j); };
0450
0451 bool hasFittedParams = track.hasReferenceSurface();
0452 if (hasFittedParams) {
0453 const auto& parameter = track.parameters();
0454 for (unsigned int i = 0; i < Acts::eBoundSize; ++i) {
0455 param[i] = parameter[i];
0456 }
0457
0458 for (unsigned int i = 0; i < Acts::eBoundSize; ++i) {
0459 double variance = getCov(i, i);
0460 error[i] = variance >= 0 ? std::sqrt(variance) : NaNfloat;
0461 }
0462 }
0463
0464 std::array<float, Acts::eBoundSize> res = {NaNfloat, NaNfloat, NaNfloat,
0465 NaNfloat, NaNfloat, NaNfloat};
0466 std::array<float, Acts::eBoundSize> pull = {NaNfloat, NaNfloat, NaNfloat,
0467 NaNfloat, NaNfloat, NaNfloat};
0468 if (foundMajorityParticle && hasFittedParams) {
0469 res = {param[Acts::eBoundLoc0] - t_d0,
0470 param[Acts::eBoundLoc1] - t_z0,
0471 Acts::detail::difference_periodic(
0472 param[Acts::eBoundPhi], t_phi,
0473 static_cast<float>(2 * std::numbers::pi)),
0474 param[Acts::eBoundTheta] - t_theta,
0475 param[Acts::eBoundQOverP] - t_qop,
0476 param[Acts::eBoundTime] - t_time};
0477
0478 for (unsigned int i = 0; i < Acts::eBoundSize; ++i) {
0479 pull[i] = res[i] / error[i];
0480 }
0481 }
0482
0483
0484
0485 m_eLOC0_fit.push_back(param[Acts::eBoundLoc0]);
0486 m_eLOC1_fit.push_back(param[Acts::eBoundLoc1]);
0487 m_ePHI_fit.push_back(param[Acts::eBoundPhi]);
0488 m_eTHETA_fit.push_back(param[Acts::eBoundTheta]);
0489 m_eQOP_fit.push_back(param[Acts::eBoundQOverP]);
0490 m_eT_fit.push_back(param[Acts::eBoundTime]);
0491
0492 m_res_eLOC0_fit.push_back(res[Acts::eBoundLoc0]);
0493 m_res_eLOC1_fit.push_back(res[Acts::eBoundLoc1]);
0494 m_res_ePHI_fit.push_back(res[Acts::eBoundPhi]);
0495 m_res_eTHETA_fit.push_back(res[Acts::eBoundTheta]);
0496 m_res_eQOP_fit.push_back(res[Acts::eBoundQOverP]);
0497 m_res_eT_fit.push_back(res[Acts::eBoundTime]);
0498
0499 m_err_eLOC0_fit.push_back(error[Acts::eBoundLoc0]);
0500 m_err_eLOC1_fit.push_back(error[Acts::eBoundLoc1]);
0501 m_err_ePHI_fit.push_back(error[Acts::eBoundPhi]);
0502 m_err_eTHETA_fit.push_back(error[Acts::eBoundTheta]);
0503 m_err_eQOP_fit.push_back(error[Acts::eBoundQOverP]);
0504 m_err_eT_fit.push_back(error[Acts::eBoundTime]);
0505
0506 m_pull_eLOC0_fit.push_back(pull[Acts::eBoundLoc0]);
0507 m_pull_eLOC1_fit.push_back(pull[Acts::eBoundLoc1]);
0508 m_pull_ePHI_fit.push_back(pull[Acts::eBoundPhi]);
0509 m_pull_eTHETA_fit.push_back(pull[Acts::eBoundTheta]);
0510 m_pull_eQOP_fit.push_back(pull[Acts::eBoundQOverP]);
0511 m_pull_eT_fit.push_back(pull[Acts::eBoundTime]);
0512
0513 m_hasFittedParams.push_back(hasFittedParams);
0514
0515 if (m_cfg.writeGsfSpecific) {
0516 using namespace Acts::GsfConstants;
0517 if (tracks.hasColumn(Acts::hashString(kFwdMaxMaterialXOverX0))) {
0518 m_gsf_max_material_fwd.push_back(
0519 track.template component<double>(kFwdMaxMaterialXOverX0));
0520 } else {
0521 m_gsf_max_material_fwd.push_back(NaNfloat);
0522 }
0523
0524 if (tracks.hasColumn(Acts::hashString(kFwdSumMaterialXOverX0))) {
0525 m_gsf_sum_material_fwd.push_back(
0526 track.template component<double>(kFwdSumMaterialXOverX0));
0527 } else {
0528 m_gsf_sum_material_fwd.push_back(NaNfloat);
0529 }
0530 }
0531
0532 if (m_cfg.writeCovMat) {
0533
0534
0535 m_cov_eLOC0_eLOC0.push_back(getCov(0, 0));
0536 m_cov_eLOC0_eLOC1.push_back(getCov(0, 1));
0537 m_cov_eLOC0_ePHI.push_back(getCov(0, 2));
0538 m_cov_eLOC0_eTHETA.push_back(getCov(0, 3));
0539 m_cov_eLOC0_eQOP.push_back(getCov(0, 4));
0540 m_cov_eLOC0_eT.push_back(getCov(0, 5));
0541
0542 m_cov_eLOC1_eLOC0.push_back(getCov(1, 0));
0543 m_cov_eLOC1_eLOC1.push_back(getCov(1, 1));
0544 m_cov_eLOC1_ePHI.push_back(getCov(1, 2));
0545 m_cov_eLOC1_eTHETA.push_back(getCov(1, 3));
0546 m_cov_eLOC1_eQOP.push_back(getCov(1, 4));
0547 m_cov_eLOC1_eT.push_back(getCov(1, 5));
0548
0549 m_cov_ePHI_eLOC0.push_back(getCov(2, 0));
0550 m_cov_ePHI_eLOC1.push_back(getCov(2, 1));
0551 m_cov_ePHI_ePHI.push_back(getCov(2, 2));
0552 m_cov_ePHI_eTHETA.push_back(getCov(2, 3));
0553 m_cov_ePHI_eQOP.push_back(getCov(2, 4));
0554 m_cov_ePHI_eT.push_back(getCov(2, 5));
0555
0556 m_cov_eTHETA_eLOC0.push_back(getCov(3, 0));
0557 m_cov_eTHETA_eLOC1.push_back(getCov(3, 1));
0558 m_cov_eTHETA_ePHI.push_back(getCov(3, 2));
0559 m_cov_eTHETA_eTHETA.push_back(getCov(3, 3));
0560 m_cov_eTHETA_eQOP.push_back(getCov(3, 4));
0561 m_cov_eTHETA_eT.push_back(getCov(3, 5));
0562
0563 m_cov_eQOP_eLOC0.push_back(getCov(4, 0));
0564 m_cov_eQOP_eLOC1.push_back(getCov(4, 1));
0565 m_cov_eQOP_ePHI.push_back(getCov(4, 2));
0566 m_cov_eQOP_eTHETA.push_back(getCov(4, 3));
0567 m_cov_eQOP_eQOP.push_back(getCov(4, 4));
0568 m_cov_eQOP_eT.push_back(getCov(4, 5));
0569
0570 m_cov_eT_eLOC0.push_back(getCov(5, 0));
0571 m_cov_eT_eLOC1.push_back(getCov(5, 1));
0572 m_cov_eT_ePHI.push_back(getCov(5, 2));
0573 m_cov_eT_eTHETA.push_back(getCov(5, 3));
0574 m_cov_eT_eQOP.push_back(getCov(5, 4));
0575 m_cov_eT_eT.push_back(getCov(5, 5));
0576 }
0577
0578 if (m_cfg.writeGx2fSpecific) {
0579 if (tracks.hasColumn(Acts::hashString("Gx2fnUpdateColumn"))) {
0580 int nUpdate = static_cast<int>(
0581 track.template component<std::uint32_t,
0582 Acts::hashString("Gx2fnUpdateColumn")>());
0583 m_nUpdatesGx2f.push_back(nUpdate);
0584 } else {
0585 m_nUpdatesGx2f.push_back(-1);
0586 }
0587 }
0588 }
0589
0590
0591 m_outputTree->Fill();
0592
0593 m_trackNr.clear();
0594 m_nStates.clear();
0595 m_nMeasurements.clear();
0596 m_nOutliers.clear();
0597 m_nHoles.clear();
0598 m_nSharedHits.clear();
0599 m_chi2Sum.clear();
0600 m_NDF.clear();
0601 m_measurementChi2.clear();
0602 m_outlierChi2.clear();
0603 m_measurementVolume.clear();
0604 m_measurementLayer.clear();
0605 m_outlierVolume.clear();
0606 m_outlierLayer.clear();
0607
0608 m_nMajorityHits.clear();
0609 m_majorityParticleVertexPrimary.clear();
0610 m_majorityParticleVertexSecondary.clear();
0611 m_majorityParticleParticle.clear();
0612 m_majorityParticleGeneration.clear();
0613 m_majorityParticleSubParticle.clear();
0614 m_trackClassification.clear();
0615 m_t_charge.clear();
0616 m_t_time.clear();
0617 m_t_vx.clear();
0618 m_t_vy.clear();
0619 m_t_vz.clear();
0620 m_t_px.clear();
0621 m_t_py.clear();
0622 m_t_pz.clear();
0623 m_t_theta.clear();
0624 m_t_phi.clear();
0625 m_t_p.clear();
0626 m_t_pT.clear();
0627 m_t_eta.clear();
0628 m_t_d0.clear();
0629 m_t_z0.clear();
0630 m_t_prodR.clear();
0631
0632 m_hasFittedParams.clear();
0633 m_eLOC0_fit.clear();
0634 m_eLOC1_fit.clear();
0635 m_ePHI_fit.clear();
0636 m_eTHETA_fit.clear();
0637 m_eQOP_fit.clear();
0638 m_eT_fit.clear();
0639 m_err_eLOC0_fit.clear();
0640 m_err_eLOC1_fit.clear();
0641 m_err_ePHI_fit.clear();
0642 m_err_eTHETA_fit.clear();
0643 m_err_eQOP_fit.clear();
0644 m_err_eT_fit.clear();
0645 m_res_eLOC0_fit.clear();
0646 m_res_eLOC1_fit.clear();
0647 m_res_ePHI_fit.clear();
0648 m_res_eTHETA_fit.clear();
0649 m_res_eQOP_fit.clear();
0650 m_res_eT_fit.clear();
0651 m_pull_eLOC0_fit.clear();
0652 m_pull_eLOC1_fit.clear();
0653 m_pull_ePHI_fit.clear();
0654 m_pull_eTHETA_fit.clear();
0655 m_pull_eQOP_fit.clear();
0656 m_pull_eT_fit.clear();
0657
0658 m_gsf_max_material_fwd.clear();
0659 m_gsf_sum_material_fwd.clear();
0660
0661 if (m_cfg.writeCovMat) {
0662 m_cov_eLOC0_eLOC0.clear();
0663 m_cov_eLOC0_eLOC1.clear();
0664 m_cov_eLOC0_ePHI.clear();
0665 m_cov_eLOC0_eTHETA.clear();
0666 m_cov_eLOC0_eQOP.clear();
0667 m_cov_eLOC0_eT.clear();
0668
0669 m_cov_eLOC1_eLOC0.clear();
0670 m_cov_eLOC1_eLOC1.clear();
0671 m_cov_eLOC1_ePHI.clear();
0672 m_cov_eLOC1_eTHETA.clear();
0673 m_cov_eLOC1_eQOP.clear();
0674 m_cov_eLOC1_eT.clear();
0675
0676 m_cov_ePHI_eLOC0.clear();
0677 m_cov_ePHI_eLOC1.clear();
0678 m_cov_ePHI_ePHI.clear();
0679 m_cov_ePHI_eTHETA.clear();
0680 m_cov_ePHI_eQOP.clear();
0681 m_cov_ePHI_eT.clear();
0682
0683 m_cov_eTHETA_eLOC0.clear();
0684 m_cov_eTHETA_eLOC1.clear();
0685 m_cov_eTHETA_ePHI.clear();
0686 m_cov_eTHETA_eTHETA.clear();
0687 m_cov_eTHETA_eQOP.clear();
0688 m_cov_eTHETA_eT.clear();
0689
0690 m_cov_eQOP_eLOC0.clear();
0691 m_cov_eQOP_eLOC1.clear();
0692 m_cov_eQOP_ePHI.clear();
0693 m_cov_eQOP_eTHETA.clear();
0694 m_cov_eQOP_eQOP.clear();
0695 m_cov_eQOP_eT.clear();
0696
0697 m_cov_eT_eLOC0.clear();
0698 m_cov_eT_eLOC1.clear();
0699 m_cov_eT_ePHI.clear();
0700 m_cov_eT_eTHETA.clear();
0701 m_cov_eT_eQOP.clear();
0702 m_cov_eT_eT.clear();
0703 }
0704
0705 m_nUpdatesGx2f.clear();
0706
0707 if (m_cfg.writeJets) {
0708 m_nJets.clear();
0709 m_jet_pt.clear();
0710 m_jet_eta.clear();
0711 m_jet_phi.clear();
0712 m_jet_label.clear();
0713 m_ntracks_per_jets.clear();
0714 }
0715
0716 return ProcessCode::SUCCESS;
0717 }
0718
0719 }