diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx index edcfbb032088a07937e17c20a59532b3e58c5701..6880f5dce596a18be3f51aaf014f548ce409bb54 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.cxx @@ -15,6 +15,14 @@ #include "TrackerPrepRawData/FaserSCT_Cluster.h" #include "xAODTruth/TruthParticle.h" #include "AtlasHepMC/GenEvent.h" + +#include "Acts/Definitions/TrackParametrization.hpp" +#include "Acts/EventData/Measurement.hpp" +#include "Acts/Geometry/GeometryContext.hpp" +#include "Acts/Geometry/GeometryIdentifier.hpp" +#include "Acts/Geometry/TrackingGeometry.hpp" +#include "Acts/Surfaces/Surface.hpp" + #include <cmath> #include <TH1F.h> #include <numeric> @@ -979,24 +987,24 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const m_truthd1_px.push_back(particle->p4().X()); m_truthd1_py.push_back(particle->p4().Y()); m_truthd1_pz.push_back(particle->p4().Z()); - m_truthd1_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); + m_truthd1_isFiducial.push_back(m_fiducialParticleTool->isFiducial(particle->barcode())); - // if ( particle->hasProdVtx()) { - // m_truthd1_x.push_back(particle->prodVtx()->x()); - // m_truthd1_y.push_back(particle->prodVtx()->y()); - // m_truthd1_z.push_back(particle->prodVtx()->z()); - // } else { - // m_truthd1_x.push_back(999999); - // m_truthd1_y.push_back(999999); - // m_truthd1_z.push_back(999999); - // } - // for (int station = 1; station < 4; ++station) { - // m_truthd1_x.push_back(positions[station].x()); - // m_truthd1_y.push_back(positions[station].y()); - // m_truthd1_z.push_back(positions[station].z()); - // } - // } - // } + if ( particle->hasProdVtx()) { + m_truthd1_x.push_back(particle->prodVtx()->x()); + m_truthd1_y.push_back(particle->prodVtx()->y()); + m_truthd1_z.push_back(particle->prodVtx()->z()); + } else { + m_truthd1_x.push_back(999999); + m_truthd1_y.push_back(999999); + m_truthd1_z.push_back(999999); + } + for (int station = 1; station < 4; ++station) { + m_truthd1_x.push_back(positions[station].x()); + m_truthd1_y.push_back(positions[station].y()); + m_truthd1_z.push_back(positions[station].z()); + } + } + } } } } @@ -1110,320 +1118,332 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const SG::ReadHandle<TrackCollection> tc {m_trackCollectionWithoutIFT, ctx}; // use track collection that excludes IFT trackCollection = tc; } - // ATH_CHECK(trackCollection.isValid()); + ATH_CHECK(trackCollection.isValid()); // create list of good tracks in fiducial region (r < 95mm) and chi2/nDoF < 25, #Layers >= 7, #Hits >= 12 std::vector<const Trk::Track*> goodTracks {}; - if (trackCollection.isValid()) + for (const Trk::Track* track : *trackCollection) { - for (const Trk::Track* track : *trackCollection) - { - if (track == nullptr) continue; - - std::set<std::pair<int, int>> layerMap; - std::set<int> stationMap; - // Check for hit in the three downstream stations - HitSet hitSet {24}; - for (auto measurement : *(track->measurementsOnTrack())) { - const Tracker::FaserSCT_ClusterOnTrack* cluster = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement); - if (cluster != nullptr) { - Identifier id = cluster->identify(); - int station = m_sctHelper->station(id); - int layer = m_sctHelper->layer(id); - int side = m_sctHelper->side(id); - stationMap.emplace(station); - layerMap.emplace(station, layer); - hitSet.set(23 - (station * 6 + layer * 2 + side)); - } - } - m_hitSet.push_back(hitSet.to_ulong()); - if (stationMap.count(1) == 0 || stationMap.count(2) == 0 || stationMap.count(3) == 0) continue; - - const Trk::TrackParameters* upstreamParameters = track->trackParameters()->front(); - const Trk::TrackParameters* downstreamParameters = track->trackParameters()->back(); - - if ((upstreamParameters == nullptr) || (downstreamParameters == nullptr)) continue; - - m_nLayers.push_back(layerMap.size()); - - m_Chi2.push_back(track->fitQuality()->chiSquared()); - m_DoF.push_back(track->fitQuality()->numberDoF()); - const Trk::MeasurementBase *measurement = track->measurementsOnTrack()->front(); - const Tracker::FaserSCT_ClusterOnTrack* cluster = - dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement); - Identifier id = cluster->identify(); - m_module_eta0.push_back(m_sctHelper->eta_module(id)); - m_module_phi0.push_back(m_sctHelper->phi_module(id)); - - m_nHit0.push_back(stationMap.count(0)); - m_nHit1.push_back(stationMap.count(1)); - m_nHit2.push_back(stationMap.count(2)); - m_nHit3.push_back(stationMap.count(3)); - - m_charge.push_back( (int) upstreamParameters->charge() ); - - m_xup.push_back(upstreamParameters->position().x()); - m_yup.push_back(upstreamParameters->position().y()); - m_zup.push_back(upstreamParameters->position().z()); - m_pxup.push_back(upstreamParameters->momentum().x()); - m_pyup.push_back(upstreamParameters->momentum().y()); - m_pzup.push_back(upstreamParameters->momentum().z()); - m_pup.push_back(sqrt( pow(upstreamParameters->momentum().x(),2) + pow(upstreamParameters->momentum().y(),2) + pow(upstreamParameters->momentum().z(),2) )); - - m_xdown.push_back(downstreamParameters->position().x()); - m_ydown.push_back(downstreamParameters->position().y()); - m_zdown.push_back(downstreamParameters->position().z()); - m_pxdown.push_back(downstreamParameters->momentum().x()); - m_pydown.push_back(downstreamParameters->momentum().y()); - m_pzdown.push_back(downstreamParameters->momentum().z()); - m_pdown.push_back(sqrt( pow(downstreamParameters->momentum().x(),2) + pow(downstreamParameters->momentum().y(),2) + pow(downstreamParameters->momentum().z(),2) )); - - // find and store the position of the measurement on track with the largest radius - double maxRadius = 0; - Amg::Vector3D positionAtMaxRadius {}; - for (const Trk::TrackParameters* trackParameters : *track->trackParameters()) { - if (radius(trackParameters->position()) > maxRadius) { - maxRadius = radius(trackParameters->position()); - positionAtMaxRadius = trackParameters->position(); + if (track == nullptr) continue; + + std::set<std::pair<int, int>> layerMap; + std::set<int> stationMap; + // Check for hit in the three downstream stations + HitSet hitSet {24}; + for (auto measurement : *(track->measurementsOnTrack())) { + const Tracker::FaserSCT_ClusterOnTrack* cluster = dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement); + if (cluster != nullptr) { + Identifier id = cluster->identify(); + int station = m_sctHelper->station(id); + int layer = m_sctHelper->layer(id); + int side = m_sctHelper->side(id); + stationMap.emplace(station); + layerMap.emplace(station, layer); + hitSet.set(23 - (station * 6 + layer * 2 + side)); } + } + m_hitSet.push_back(hitSet.to_ulong()); + if (stationMap.count(1) == 0 || stationMap.count(2) == 0 || stationMap.count(3) == 0) continue; + + const Trk::TrackParameters* upstreamParameters = track->trackParameters()->front(); + const Trk::TrackParameters* downstreamParameters = track->trackParameters()->back(); + + if ((upstreamParameters == nullptr) || (downstreamParameters == nullptr)) continue; + + m_nLayers.push_back(layerMap.size()); + + m_Chi2.push_back(track->fitQuality()->chiSquared()); + m_DoF.push_back(track->fitQuality()->numberDoF()); + const Trk::MeasurementBase *measurement = track->measurementsOnTrack()->front(); + const Tracker::FaserSCT_ClusterOnTrack* cluster = + dynamic_cast<const Tracker::FaserSCT_ClusterOnTrack*>(measurement); + Identifier id = cluster->identify(); + m_module_eta0.push_back(m_sctHelper->eta_module(id)); + m_module_phi0.push_back(m_sctHelper->phi_module(id)); + + m_nHit0.push_back(stationMap.count(0)); + m_nHit1.push_back(stationMap.count(1)); + m_nHit2.push_back(stationMap.count(2)); + m_nHit3.push_back(stationMap.count(3)); + + m_charge.push_back( (int) upstreamParameters->charge() ); + + m_xup.push_back(upstreamParameters->position().x()); + m_yup.push_back(upstreamParameters->position().y()); + m_zup.push_back(upstreamParameters->position().z()); + m_pxup.push_back(upstreamParameters->momentum().x()); + m_pyup.push_back(upstreamParameters->momentum().y()); + m_pzup.push_back(upstreamParameters->momentum().z()); + m_pup.push_back(sqrt( pow(upstreamParameters->momentum().x(),2) + pow(upstreamParameters->momentum().y(),2) + pow(upstreamParameters->momentum().z(),2) )); + + m_xdown.push_back(downstreamParameters->position().x()); + m_ydown.push_back(downstreamParameters->position().y()); + m_zdown.push_back(downstreamParameters->position().z()); + m_pxdown.push_back(downstreamParameters->momentum().x()); + m_pydown.push_back(downstreamParameters->momentum().y()); + m_pzdown.push_back(downstreamParameters->momentum().z()); + m_pdown.push_back(sqrt( pow(downstreamParameters->momentum().x(),2) + pow(downstreamParameters->momentum().y(),2) + pow(downstreamParameters->momentum().z(),2) )); + + // find and store the position of the measurement on track with the largest radius + double maxRadius = 0; + Amg::Vector3D positionAtMaxRadius {}; + for (const Trk::TrackParameters* trackParameters : *track->trackParameters()) { + if (radius(trackParameters->position()) > maxRadius) { + maxRadius = radius(trackParameters->position()); + positionAtMaxRadius = trackParameters->position(); } - m_r_atMaxRadius.push_back(maxRadius); - m_x_atMaxRadius.push_back(positionAtMaxRadius.x()); - m_y_atMaxRadius.push_back(positionAtMaxRadius.y()); - m_z_atMaxRadius.push_back(positionAtMaxRadius.z()); - - if ((m_Chi2.back() / m_DoF.back() < m_maxChi2NDOF) && - (m_nLayers.back() >= m_minLayers) && - (m_DoF.back() + 5 >= m_minHits) && - (m_r_atMaxRadius.back() < 95)) { - goodTracks.push_back(track); - } + } + m_r_atMaxRadius.push_back(maxRadius); + m_x_atMaxRadius.push_back(positionAtMaxRadius.x()); + m_y_atMaxRadius.push_back(positionAtMaxRadius.y()); + m_z_atMaxRadius.push_back(positionAtMaxRadius.z()); + + if ((m_Chi2.back() / m_DoF.back() < m_maxChi2NDOF) && + (m_nLayers.back() >= m_minLayers) && + (m_DoF.back() + 5 >= m_minHits) && + (m_r_atMaxRadius.back() < 95)) { + goodTracks.push_back(track); + } - if (isMC) { // if simulation, store track truth info as well - // auto [truthParticle, hitCount] = m_trackTruthMatchingTool->getTruthParticle(track); - // if (truthParticle != nullptr) { - // if (truthParticleCount.count(truthParticle->barcode()) > 0) - // truthParticleCount[truthParticle->barcode()] += 1; - // m_t_pdg.push_back(truthParticle->pdgId()); - // m_t_barcode.push_back(truthParticle->barcode()); - // if (truthParticle->nParents() > 0){ - // m_t_pdg_parent.push_back(truthParticle->parent(0)->pdgId()); - // m_t_barcode_parent.push_back(truthParticle->parent(0)->barcode()); - // } else { - // m_t_pdg_parent.push_back(0); - // m_t_barcode_parent.push_back(-1); - // } - // // the track fit eats up 5 degrees of freedom, thus the number of hits on track is m_DoF + 5 - // m_t_truthHitRatio.push_back(hitCount / (m_DoF.back() + 5)); - // m_isFiducial.push_back(m_fiducialParticleTool->isFiducial(truthParticle->barcode())); - // auto positions = m_fiducialParticleTool->getTruthPositions(truthParticle->barcode()); - // for (int station = 0; station < 4; ++station) { - // m_t_st_x[station].push_back(positions[station].x()); - // m_t_st_y[station].push_back(positions[station].y()); - // m_t_st_z[station].push_back(positions[station].z()); - // } + if (isMC) { // if simulation, store track truth info as well + auto [truthParticle, hitCount] = m_trackTruthMatchingTool->getTruthParticle(track); + if (truthParticle != nullptr) { + if (truthParticleCount.count(truthParticle->barcode()) > 0) + truthParticleCount[truthParticle->barcode()] += 1; + m_t_pdg.push_back(truthParticle->pdgId()); + m_t_barcode.push_back(truthParticle->barcode()); + if (truthParticle->nParents() > 0){ + m_t_pdg_parent.push_back(truthParticle->parent(0)->pdgId()); + m_t_barcode_parent.push_back(truthParticle->parent(0)->barcode()); + } else { + m_t_pdg_parent.push_back(0); + m_t_barcode_parent.push_back(-1); + } + // the track fit eats up 5 degrees of freedom, thus the number of hits on track is m_DoF + 5 + m_t_truthHitRatio.push_back(hitCount / (m_DoF.back() + 5)); + m_isFiducial.push_back(m_fiducialParticleTool->isFiducial(truthParticle->barcode())); + auto positions = m_fiducialParticleTool->getTruthPositions(truthParticle->barcode()); + for (int station = 0; station < 4; ++station) { + m_t_st_x[station].push_back(positions[station].x()); + m_t_st_y[station].push_back(positions[station].y()); + m_t_st_z[station].push_back(positions[station].z()); + } - // auto momenta = m_fiducialParticleTool->getTruthMomenta(truthParticle->barcode()); - // for (int station = 0; station < 4; ++station) { - // m_t_st_px[station].push_back(momenta[station].x()); - // m_t_st_py[station].push_back(momenta[station].y()); - // m_t_st_pz[station].push_back(momenta[station].z()); - // } + auto momenta = m_fiducialParticleTool->getTruthMomenta(truthParticle->barcode()); + for (int station = 0; station < 4; ++station) { + m_t_st_px[station].push_back(momenta[station].x()); + m_t_st_py[station].push_back(momenta[station].y()); + m_t_st_pz[station].push_back(momenta[station].z()); + } - // if (truthParticle->hasProdVtx()) { - // m_t_prodVtx_x.push_back(truthParticle->prodVtx()->x()); - // m_t_prodVtx_y.push_back(truthParticle->prodVtx()->y()); - // m_t_prodVtx_z.push_back(truthParticle->prodVtx()->z()); - // } else { - // m_t_prodVtx_x.push_back(999999); - // m_t_prodVtx_y.push_back(999999); - // m_t_prodVtx_z.push_back(999999); - // } - // if (truthParticle->hasDecayVtx()) { - // m_t_decayVtx_x.push_back(truthParticle->decayVtx()->x()); - // m_t_decayVtx_y.push_back(truthParticle->decayVtx()->y()); - // m_t_decayVtx_z.push_back(truthParticle->decayVtx()->z()); - // } else { - // m_t_decayVtx_x.push_back(999999); - // m_t_decayVtx_y.push_back(999999); - // m_t_decayVtx_z.push_back(999999); - // } - // m_t_px.push_back(truthParticle->px()); - // m_t_py.push_back(truthParticle->py()); - // m_t_pz.push_back(truthParticle->pz()); - // m_t_theta.push_back(truthParticle->p4().Theta()); - // m_t_phi.push_back(truthParticle->p4().Phi()); - // m_t_p.push_back(truthParticle->p4().P()); - // m_t_pT.push_back(truthParticle->p4().Pt()); - // m_t_eta.push_back(truthParticle->p4().Eta()); - // } else { - // ATH_MSG_WARNING("Can not find truthParticle."); - // clearTrackTruth(); - // } + if (truthParticle->hasProdVtx()) { + m_t_prodVtx_x.push_back(truthParticle->prodVtx()->x()); + m_t_prodVtx_y.push_back(truthParticle->prodVtx()->y()); + m_t_prodVtx_z.push_back(truthParticle->prodVtx()->z()); + } else { + m_t_prodVtx_x.push_back(999999); + m_t_prodVtx_y.push_back(999999); + m_t_prodVtx_z.push_back(999999); + } + if (truthParticle->hasDecayVtx()) { + m_t_decayVtx_x.push_back(truthParticle->decayVtx()->x()); + m_t_decayVtx_y.push_back(truthParticle->decayVtx()->y()); + m_t_decayVtx_z.push_back(truthParticle->decayVtx()->z()); + } else { + m_t_decayVtx_x.push_back(999999); + m_t_decayVtx_y.push_back(999999); + m_t_decayVtx_z.push_back(999999); + } + m_t_px.push_back(truthParticle->px()); + m_t_py.push_back(truthParticle->py()); + m_t_pz.push_back(truthParticle->pz()); + m_t_theta.push_back(truthParticle->p4().Theta()); + m_t_phi.push_back(truthParticle->p4().Phi()); + m_t_p.push_back(truthParticle->p4().P()); + m_t_pT.push_back(truthParticle->p4().Pt()); + m_t_eta.push_back(truthParticle->p4().Eta()); } else { + ATH_MSG_WARNING("Can not find truthParticle."); clearTrackTruth(); } + } else { + clearTrackTruth(); + } - // fill extrapolation vectors with dummy values, will get set to real number if the track extrapolation succeeds - m_xVetoNu.push_back(999999); - m_yVetoNu.push_back(999999); - m_thetaxVetoNu.push_back(999999); - m_thetayVetoNu.push_back(999999); - m_xVetoStation1.push_back(999999); - m_yVetoStation1.push_back(999999); - m_thetaxVetoStation1.push_back(999999); - m_thetayVetoStation1.push_back(999999); - m_xVetoStation2.push_back(999999); - m_yVetoStation2.push_back(999999); - m_thetaxVetoStation2.push_back(999999); - m_thetayVetoStation2.push_back(999999); - m_xTrig.push_back(999999); - m_yTrig.push_back(999999); - m_thetaxTrig.push_back(999999); - m_thetayTrig.push_back(999999); - m_xPreshower1.push_back(999999); - m_yPreshower1.push_back(999999); - m_thetaxPreshower1.push_back(999999); - m_thetayPreshower1.push_back(999999); - m_xPreshower2.push_back(999999); - m_yPreshower2.push_back(999999); - m_thetaxPreshower2.push_back(999999); - m_thetayPreshower2.push_back(999999); - m_xCalo.push_back(999999); - m_yCalo.push_back(999999); - m_thetaxCalo.push_back(999999); - m_thetayCalo.push_back(999999); - - // Define paramters for track extrapolation from most upstream measurement - Amg::Vector3D position_up = upstreamParameters->position(); - Amg::Vector3D momentum_up = upstreamParameters->momentum(); - Acts::BoundVector params_up = Acts::BoundVector::Zero(); - params_up[Acts::eBoundLoc0] = -position_up.y(); - params_up[Acts::eBoundLoc1] = position_up.x(); - params_up[Acts::eBoundPhi] = momentum_up.phi(); - params_up[Acts::eBoundTheta] = momentum_up.theta(); - params_up[Acts::eBoundQOverP] = upstreamParameters->charge() / (momentum_up.mag() * 1_MeV); - params_up[Acts::eBoundTime] = 0; - std::optional<Acts::BoundSquareMatrix> cov_up; - auto startSurface_up = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, position_up.z()), Acts::Vector3(0, 0, 1)); - Acts::BoundTrackParameters startParameters_up(startSurface_up, params_up, cov_up, Acts::ParticleHypothesis::muon()); - - // Define paramters for track extrapolation from most downstream measurement - Amg::Vector3D position_down = downstreamParameters->position(); - Amg::Vector3D momentum_down = downstreamParameters->momentum(); - Acts::BoundVector params_down = Acts::BoundVector::Zero(); - params_down[Acts::eBoundLoc0] = -position_down.y(); - params_down[Acts::eBoundLoc1] = position_down.x(); - params_down[Acts::eBoundPhi] = momentum_down.phi(); - params_down[Acts::eBoundTheta] = momentum_down.theta(); - params_down[Acts::eBoundQOverP] = downstreamParameters->charge() / (momentum_down.mag() * 1_MeV); - params_down[Acts::eBoundTime] = 0; - std::optional<Acts::BoundSquareMatrix> cov_down; - auto startSurface_down = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, position_down.z()), Acts::Vector3(0, 0, 1)); - Acts::BoundTrackParameters startParameters_down(startSurface_down, params_down, cov_down, Acts::ParticleHypothesis::muon()); - - // Extrapolate track to scintillators - auto targetSurface_VetoNu = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -3112.0), Acts::Vector3(0, 0, 1)); // -3112 mm is z position of VetoNu planes touching - std::optional<const Acts::BoundTrackParameters> targetParameters_VetoNu =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_VetoNu, Acts::Direction::Backward); - if (targetParameters_VetoNu.has_value()) { - auto targetPosition_VetoNu = targetParameters_VetoNu->position(gctx); - auto targetMomentum_VetoNu = targetParameters_VetoNu->momentum(); - m_xVetoNu[m_longTracks] = targetPosition_VetoNu.x(); - m_yVetoNu[m_longTracks] = targetPosition_VetoNu.y(); - m_thetaxVetoNu[m_longTracks] = atan(targetMomentum_VetoNu[0]/targetMomentum_VetoNu[2]); - m_thetayVetoNu[m_longTracks] = atan(targetMomentum_VetoNu[1]/targetMomentum_VetoNu[2]); - } else { - ATH_MSG_INFO("vetoNu null targetParameters"); - } - - auto targetSurface_Veto1 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -1769.65), Acts::Vector3(0, 0, 1)); // -1769.65 mm is z position of center of operational layer in Veto station 1 - std::optional<const Acts::BoundTrackParameters> targetParameters_Veto1 =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Veto1, Acts::Direction::Backward); - if (targetParameters_Veto1.has_value()) { - auto targetPosition_Veto1 = targetParameters_Veto1->position(gctx); - auto targetMomentum_Veto1 = targetParameters_Veto1->momentum(); - m_xVetoStation1[m_longTracks] = targetPosition_Veto1.x(); - m_yVetoStation1[m_longTracks] = targetPosition_Veto1.y(); - m_thetaxVetoStation1[m_longTracks] = atan(targetMomentum_Veto1[0]/targetMomentum_Veto1[2]); - m_thetayVetoStation1[m_longTracks] = atan(targetMomentum_Veto1[1]/targetMomentum_Veto1[2]); - } else { - ATH_MSG_INFO("veto1 null targetParameters"); - } + // fill extrapolation vectors with dummy values, will get set to real number if the track extrapolation succeeds + m_xVetoNu.push_back(999999); + m_yVetoNu.push_back(999999); + m_thetaxVetoNu.push_back(999999); + m_thetayVetoNu.push_back(999999); + m_xVetoStation1.push_back(999999); + m_yVetoStation1.push_back(999999); + m_thetaxVetoStation1.push_back(999999); + m_thetayVetoStation1.push_back(999999); + m_xVetoStation2.push_back(999999); + m_yVetoStation2.push_back(999999); + m_thetaxVetoStation2.push_back(999999); + m_thetayVetoStation2.push_back(999999); + m_xTrig.push_back(999999); + m_yTrig.push_back(999999); + m_thetaxTrig.push_back(999999); + m_thetayTrig.push_back(999999); + m_xPreshower1.push_back(999999); + m_yPreshower1.push_back(999999); + m_thetaxPreshower1.push_back(999999); + m_thetayPreshower1.push_back(999999); + m_xPreshower2.push_back(999999); + m_yPreshower2.push_back(999999); + m_thetaxPreshower2.push_back(999999); + m_thetayPreshower2.push_back(999999); + m_xCalo.push_back(999999); + m_yCalo.push_back(999999); + m_thetaxCalo.push_back(999999); + m_thetayCalo.push_back(999999); + + // Define paramters for track extrapolation from most upstream measurement + Amg::Vector3D position_up = upstreamParameters->position(); + Amg::Vector3D momentum_up = upstreamParameters->momentum(); + Acts::BoundVector params_up = Acts::BoundVector::Zero(); + params_up[Acts::eBoundLoc0] = -position_up.y(); + params_up[Acts::eBoundLoc1] = position_up.x(); + params_up[Acts::eBoundPhi] = momentum_up.phi(); + params_up[Acts::eBoundTheta] = momentum_up.theta(); + params_up[Acts::eBoundQOverP] = upstreamParameters->charge() / (momentum_up.mag() * 1_MeV); + params_up[Acts::eBoundTime] = 0; + + Acts::BoundSquareMatrix cov = Acts::BoundSquareMatrix::Zero(); + cov(Acts::eBoundLoc0, Acts::eBoundLoc0) = 1; + cov(Acts::eBoundLoc1, Acts::eBoundLoc1) = 1; + cov(Acts::eBoundPhi, Acts::eBoundPhi) = 1; + cov(Acts::eBoundTheta, Acts::eBoundTheta) = 1; + cov(Acts::eBoundQOverP, Acts::eBoundQOverP) = 1; + cov(Acts::eBoundTime, Acts::eBoundTime) = 1; + + + auto startSurface_up = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, position_up.z()), Acts::Vector3(0, 0, 1)); + Acts::BoundTrackParameters startParameters_up(std::move(startSurface_up), params_up, cov, Acts::ParticleHypothesis::muon()); + + // Define paramters for track extrapolation from most downstream measurement + Amg::Vector3D position_down = downstreamParameters->position(); + Amg::Vector3D momentum_down = downstreamParameters->momentum(); + Acts::BoundVector params_down = Acts::BoundVector::Zero(); + params_down[Acts::eBoundLoc0] = -position_down.y(); + params_down[Acts::eBoundLoc1] = position_down.x(); + params_down[Acts::eBoundPhi] = momentum_down.phi(); + params_down[Acts::eBoundTheta] = momentum_down.theta(); + params_down[Acts::eBoundQOverP] = downstreamParameters->charge() / (momentum_down.mag() * 1_MeV); + params_down[Acts::eBoundTime] = 0; + auto startSurface_down = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, position_down.z()), Acts::Vector3(0, 0, 1)); + Acts::BoundTrackParameters startParameters_down(std::move(startSurface_down), params_down, cov, Acts::ParticleHypothesis::muon()); + + // Extrapolate track to scintillators + auto targetSurface_VetoNu = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -3112.0), Acts::Vector3(0, 0, 1)); // -3112 mm is z position of VetoNu planes touching + std::optional<const Acts::BoundTrackParameters> targetParameters_VetoNu =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_VetoNu, Acts::Direction::Backward); + + if (targetParameters_VetoNu) { + auto targetPosition_VetoNu = targetParameters_VetoNu->position(gctx); + auto targetMomentum_VetoNu = targetParameters_VetoNu->momentum(); + m_xVetoNu[m_longTracks] = targetPosition_VetoNu.x(); + m_yVetoNu[m_longTracks] = targetPosition_VetoNu.y(); + m_thetaxVetoNu[m_longTracks] = atan(targetMomentum_VetoNu[0]/targetMomentum_VetoNu[2]); + m_thetayVetoNu[m_longTracks] = atan(targetMomentum_VetoNu[1]/targetMomentum_VetoNu[2]); + } else { + ATH_MSG_INFO("vetoNu null targetParameters"); + } - auto targetSurface_Veto2 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -1609.65), Acts::Vector3(0, 0, 1)); // -1609.65 mm is z position of where planes touch in Veto station 2 - std::optional<const Acts::BoundTrackParameters> targetParameters_Veto2 =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Veto2, Acts::Direction::Backward); - if (targetParameters_Veto2.has_value()) { - auto targetPosition_Veto2 = targetParameters_Veto2->position(gctx); - auto targetMomentum_Veto2 = targetParameters_Veto2->momentum(); - m_xVetoStation2[m_longTracks] = targetPosition_Veto2.x(); - m_yVetoStation2[m_longTracks] = targetPosition_Veto2.y(); - m_thetaxVetoStation2[m_longTracks] = atan(targetMomentum_Veto2[0]/targetMomentum_Veto2[2]); - m_thetayVetoStation2[m_longTracks] = atan(targetMomentum_Veto2[1]/targetMomentum_Veto2[2]); - } else { - ATH_MSG_INFO("veto2 null targetParameters"); - } + auto targetSurface_Veto1 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -1769.65), Acts::Vector3(0, 0, 1)); // -1769.65 mm is z position of center of operational layer in Veto station 1 + std::optional<const Acts::BoundTrackParameters> targetParameters_Veto1 =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Veto1, Acts::Direction::Backward); + + if (targetParameters_Veto1) { + auto targetPosition_Veto1 = targetParameters_Veto1->position(gctx); + auto targetMomentum_Veto1 = targetParameters_Veto1->momentum(); + m_xVetoStation1[m_longTracks] = targetPosition_Veto1.x(); + m_yVetoStation1[m_longTracks] = targetPosition_Veto1.y(); + m_thetaxVetoStation1[m_longTracks] = atan(targetMomentum_Veto1[0]/targetMomentum_Veto1[2]); + m_thetayVetoStation1[m_longTracks] = atan(targetMomentum_Veto1[1]/targetMomentum_Veto1[2]); + } else { + ATH_MSG_INFO("veto1 null targetParameters"); + } - auto targetSurface_Trig = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 0.0), Acts::Vector3(0, 0, 1)); // 0 mm is z position of Trig planes overlapping - std::optional<const Acts::BoundTrackParameters> targetParameters_Trig =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Trig, Acts::Direction::Backward); // must extrapolate backsards to trig plane if track starts in station 1 - if (targetParameters_Trig.has_value()) { - auto targetPosition_Trig = targetParameters_Trig->position(gctx); - auto targetMomentum_Trig = targetParameters_Trig->momentum(); - m_xTrig[m_longTracks] = targetPosition_Trig.x(); - m_yTrig[m_longTracks] = targetPosition_Trig.y(); - m_thetaxTrig[m_longTracks] = atan(targetMomentum_Trig[0]/targetMomentum_Trig[2]); - m_thetayTrig[m_longTracks] = atan(targetMomentum_Trig[1]/targetMomentum_Trig[2]); - } else { - ATH_MSG_INFO("Trig null targetParameters"); - } + auto targetSurface_Veto2 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, -1609.65), Acts::Vector3(0, 0, 1)); // -1609.65 mm is z position of where planes touch in Veto station 2 + std::optional<const Acts::BoundTrackParameters> targetParameters_Veto2 =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Veto2, Acts::Direction::Backward); + + if (targetParameters_Veto2) { + auto targetPosition_Veto2 = targetParameters_Veto2->position(gctx); + auto targetMomentum_Veto2 = targetParameters_Veto2->momentum(); + m_xVetoStation2[m_longTracks] = targetPosition_Veto2.x(); + m_yVetoStation2[m_longTracks] = targetPosition_Veto2.y(); + m_thetaxVetoStation2[m_longTracks] = atan(targetMomentum_Veto2[0]/targetMomentum_Veto2[2]); + m_thetayVetoStation2[m_longTracks] = atan(targetMomentum_Veto2[1]/targetMomentum_Veto2[2]); + } else { + ATH_MSG_INFO("veto2 null targetParameters"); + } - auto targetSurface_Preshower1 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2582.68), Acts::Vector3(0, 0, 1)); // 2582.68 mm is z position of center of upstream preshower layer - std::optional<const Acts::BoundTrackParameters> targetParameters_Preshower1 =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Preshower1, Acts::Direction::Forward); - if (targetParameters_Preshower1.has_value()) { - auto targetPosition_Preshower1 = targetParameters_Preshower1->position(gctx); - auto targetMomentum_Preshower1 = targetParameters_Preshower1->momentum(); - m_xPreshower1[m_longTracks] = targetPosition_Preshower1.x(); - m_yPreshower1[m_longTracks] = targetPosition_Preshower1.y(); - m_thetaxPreshower1[m_longTracks] = atan(targetMomentum_Preshower1[0]/targetMomentum_Preshower1[2]); - m_thetayPreshower1[m_longTracks] = atan(targetMomentum_Preshower1[1]/targetMomentum_Preshower1[2]); - } else { - ATH_MSG_INFO("Preshower1 null targetParameters"); - } + auto targetSurface_Trig = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 0.0), Acts::Vector3(0, 0, 1)); // 0 mm is z position of Trig planes overlapping + std::optional<const Acts::BoundTrackParameters> targetParameters_Trig =m_extrapolationTool->propagate(ctx, startParameters_up, *targetSurface_Trig, Acts::Direction::Backward); // must extrapolate backsards to trig plane if track starts in station 1 + + if (targetParameters_Trig) { + auto targetPosition_Trig = targetParameters_Trig->position(gctx); + auto targetMomentum_Trig = targetParameters_Trig->momentum(); + m_xTrig[m_longTracks] = targetPosition_Trig.x(); + m_yTrig[m_longTracks] = targetPosition_Trig.y(); + m_thetaxTrig[m_longTracks] = atan(targetMomentum_Trig[0]/targetMomentum_Trig[2]); + m_thetayTrig[m_longTracks] = atan(targetMomentum_Trig[1]/targetMomentum_Trig[2]); + } else { + ATH_MSG_INFO("Trig null targetParameters"); + } - auto targetSurface_Preshower2 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2657.68), Acts::Vector3(0, 0, 1)); // 2657.68 mm is z position of center of downstream preshower layer - std::optional<const Acts::BoundTrackParameters> targetParameters_Preshower2 =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Preshower2, Acts::Direction::Forward); - if (targetParameters_Preshower2.has_value()) { - auto targetPosition_Preshower2 = targetParameters_Preshower2->position(gctx); - auto targetMomentum_Preshower2 = targetParameters_Preshower2->momentum(); - m_xPreshower2[m_longTracks] = targetPosition_Preshower2.x(); - m_yPreshower2[m_longTracks] = targetPosition_Preshower2.y(); - m_thetaxPreshower2[m_longTracks] = atan(targetMomentum_Preshower2[0]/targetMomentum_Preshower2[2]); - m_thetayPreshower2[m_longTracks] = atan(targetMomentum_Preshower2[1]/targetMomentum_Preshower2[2]); - } else { - ATH_MSG_INFO("Preshower2 null targetParameters"); - } + auto targetSurface_Preshower1 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2582.68), Acts::Vector3(0, 0, 1)); // 2582.68 mm is z position of center of upstream preshower layer + std::optional<const Acts::BoundTrackParameters> targetParameters_Preshower1 =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Preshower1, Acts::Direction::Forward); + + if (targetParameters_Preshower1) { + auto targetPosition_Preshower1 = targetParameters_Preshower1->position(gctx); + auto targetMomentum_Preshower1 = targetParameters_Preshower1->momentum(); + m_xPreshower1[m_longTracks] = targetPosition_Preshower1.x(); + m_yPreshower1[m_longTracks] = targetPosition_Preshower1.y(); + m_thetaxPreshower1[m_longTracks] = atan(targetMomentum_Preshower1[0]/targetMomentum_Preshower1[2]); + m_thetayPreshower1[m_longTracks] = atan(targetMomentum_Preshower1[1]/targetMomentum_Preshower1[2]); + } else { + ATH_MSG_INFO("Preshower1 null targetParameters"); + } - auto targetSurface_Calo = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2760.0), Acts::Vector3(0, 0, 1)); // 2760 mm is estimated z position of calorimeter face - std::optional<const Acts::BoundTrackParameters> targetParameters_Calo =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Calo, Acts::Direction::Forward); - if (targetParameters_Calo.has_value()) { - auto targetPosition_Calo = targetParameters_Calo->position(gctx); - auto targetMomentum_Calo = targetParameters_Calo->momentum(); - m_xCalo[m_longTracks] = targetPosition_Calo.x(); - m_yCalo[m_longTracks] = targetPosition_Calo.y(); - m_thetaxCalo[m_longTracks] = atan(targetMomentum_Calo[0]/targetMomentum_Calo[2]) ; - m_thetayCalo[m_longTracks] = atan(targetMomentum_Calo[1]/targetMomentum_Calo[2]) ; - } else { - ATH_MSG_INFO("Calo null targetParameters"); - } + auto targetSurface_Preshower2 = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2657.68), Acts::Vector3(0, 0, 1)); // 2657.68 mm is z position of center of downstream preshower layer + std::optional<const Acts::BoundTrackParameters> targetParameters_Preshower2 =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Preshower2, Acts::Direction::Forward); + + if (targetParameters_Preshower2) { + auto targetPosition_Preshower2 = targetParameters_Preshower2->position(gctx); + auto targetMomentum_Preshower2 = targetParameters_Preshower2->momentum(); + m_xPreshower2[m_longTracks] = targetPosition_Preshower2.x(); + m_yPreshower2[m_longTracks] = targetPosition_Preshower2.y(); + m_thetaxPreshower2[m_longTracks] = atan(targetMomentum_Preshower2[0]/targetMomentum_Preshower2[2]); + m_thetayPreshower2[m_longTracks] = atan(targetMomentum_Preshower2[1]/targetMomentum_Preshower2[2]); + } else { + ATH_MSG_INFO("Preshower2 null targetParameters"); + } - m_longTracks++; + auto targetSurface_Calo = Acts::Surface::makeShared<Acts::PlaneSurface>(Acts::Vector3(0, 0, 2760.0), Acts::Vector3(0, 0, 1)); // 2760 mm is estimated z position of calorimeter face + std::optional<const Acts::BoundTrackParameters> targetParameters_Calo =m_extrapolationTool->propagate(ctx, startParameters_down, *targetSurface_Calo, Acts::Direction::Forward); + + if (targetParameters_Calo) { + auto targetPosition_Calo = targetParameters_Calo->position(gctx); + auto targetMomentum_Calo = targetParameters_Calo->momentum(); + m_xCalo[m_longTracks] = targetPosition_Calo.x(); + m_yCalo[m_longTracks] = targetPosition_Calo.y(); + m_thetaxCalo[m_longTracks] = atan(targetMomentum_Calo[0]/targetMomentum_Calo[2]) ; + m_thetayCalo[m_longTracks] = atan(targetMomentum_Calo[1]/targetMomentum_Calo[2]) ; + } else { + ATH_MSG_INFO("Calo null targetParameters"); } + + m_longTracks++; } - if (m_runVertexing && goodTracks.size() >= 2) { - // sort tracks my momentum and reconstruct vertex - // std::sort(goodTracks.begin(), goodTracks.end(), [](const Trk::Track *lhs, const Trk::Track *rhs){ - // return lhs->trackParameters()->front()->momentum().z() < rhs->trackParameters()->front()->momentum().z(); - // }); - // std::vector<const Trk::Track*> lowMomentumTracks {goodTracks[0], goodTracks[1]}; + // if (m_runVertexing && goodTracks.size() >= 2) { + // // sort tracks my momentum and reconstruct vertex + // std::sort(goodTracks.begin(), goodTracks.end(), [](const Trk::Track *lhs, const Trk::Track *rhs){ + // return lhs->trackParameters()->front()->momentum().z() < rhs->trackParameters()->front()->momentum().z(); + // }); + // std::vector<const Trk::Track*> lowMomentumTracks {goodTracks[0], goodTracks[1]}; // std::optional<FaserTracking::POCA> vertex = m_vertexingTool->getVertex(lowMomentumTracks); // if (vertex) { @@ -1451,7 +1471,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const // m_vertex_p1 = std::sqrt(m_vertex_px1*m_vertex_px1 + m_vertex_py1*m_vertex_py1 + m_vertex_pz1*m_vertex_pz1); // } // } - } + //} if (!isMC) { if (m_doTrackFilter) { // filter events: colliding bunches have at least one long track, non-colliding bunches have at least one long track or one calo module with raw_peak > 3 mV @@ -1469,7 +1489,7 @@ StatusCode NtupleDumperAlg::execute(const EventContext &ctx) const for (auto &tp : truthParticleCount) { m_truthParticleBarcode.push_back(tp.first); m_truthParticleMatchedTracks.push_back(tp.second); - // m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(tp.first)); + m_truthParticleIsFiducial.push_back(m_fiducialParticleTool->isFiducial(tp.first)); } } @@ -1873,6 +1893,6 @@ void NtupleDumperAlg::clearTrackTruth() const { m_isFiducial.push_back(false); } -double NtupleDumperAlg::radius(const Amg::Vector3D &position) const { +double NtupleDumperAlg::radius(const Acts::Vector3 &position) const { return std::sqrt(position.x() * position.x() + position.y() * position.y()); } diff --git a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h index a539248e89bdc5374956af0e151c278d94c7d480..c5051ae797e6eee967abf9de69394b88f86d6650 100644 --- a/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h +++ b/PhysicsAnalysis/NtupleDumper/src/NtupleDumperAlg.h @@ -18,8 +18,8 @@ #include "TrackerSimData/TrackerSimDataCollection.h" #include "FaserActsGeometryInterfaces/IFaserActsExtrapolationTool.h" #include "FaserActsGeometryInterfaces/IFaserActsTrackingGeometryTool.h" -// #include "FaserActsKalmanFilter/IFiducialParticleTool.h" -// #include "FaserActsKalmanFilter/ITrackTruthMatchingTool.h" +#include "FaserActsKalmanFilter/IFiducialParticleTool.h" +#include "FaserActsKalmanFilter/ITrackTruthMatchingTool.h" #include "TrackerSimEvent/FaserSiHitCollection.h" #include "xAODEventInfo/EventInfo.h" #include "FaserActsVertexing/IVertexingTool.h" @@ -69,7 +69,7 @@ private: void addWaveBranches(const std::string &name, std::list<int> channel_list) const; void FillWaveBranches(const xAOD::WaveformHitContainer &wave, bool isMC) const; void addCalibratedBranches(const std::string &name, int nchannels, int first); - double radius(const Amg::Vector3D &position) const; + double radius(const Acts::Vector3 &position) const; ServiceHandle <ITHistSvc> m_histSvc; diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx index bf405a6692704773345842131dfb4dec45e902c9..687908a4956dcc545bc92d2806712d080e8f0fac 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx @@ -87,7 +87,7 @@ StatusCode CKF2::execute() { const EventContext& ctx = Gaudi::Hive::currentContext(); m_numberOfEvents++; - SG::WriteDecorHandle<xAOD::EventInfo,uint32_t> eventInfo (m_eventInfoKey, ctx); + SG::ReadHandle<xAOD::EventInfo> eventInfo { m_eventInfoKey, ctx }; SG::WriteHandle trackContainer{m_trackCollection, ctx}; std::unique_ptr<TrackCollection> outputTracks = std::make_unique<TrackCollection>(); diff --git a/package_filters.txt b/package_filters.txt index 82549fe7d8a7e3869d9271fb2801cf75104f8e4f..c3167d0ab1df2c713b94f6d221dd8d7f1b027414 100644 --- a/package_filters.txt +++ b/package_filters.txt @@ -142,6 +142,7 @@ +Tracking/Acts/FaserActsGeometryInterfaces +Tracking/Acts/ActsInterop +Tracking/Acts/FaserActsKalmanFilter +#+Tracking/Acts/FaserActsKalmanFilter/FaserActsVertexing +Tracking/TrkEventCnv/TrkEventAthenaPool +Tracking/TrkEventCnv/TrkEventCnvTools +Tracking/TrkEventCnv/TrkEventTopLevelCnv