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