diff --git a/Tracker/TrackerRecAlgs/PairVertex/CMakeLists.txt b/Tracker/TrackerRecAlgs/PairVertex/CMakeLists.txt index 07e4fc4065838c8e54104fdbb25625c4b0bb2d21..9d4fc793d2c8c51d3a6a23b1fc299ea35d340057 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/CMakeLists.txt +++ b/Tracker/TrackerRecAlgs/PairVertex/CMakeLists.txt @@ -6,10 +6,11 @@ atlas_add_component( src/PairVertexAlg.cxx src/component/PairVertex_entries.cxx LINK_LIBRARIES AthenaBaseComps StoreGateLib GeneratorObjects - FaserActsGeometryLib TrackerSimEvent TrackerIdentifier + FaserActsGeometryLib TrackerSimEvent TrackerIdentifier TrackerPrepRawData TrackerSimData TrackerReadoutGeometry TrkTrack GeoPrimitives TrackerRIO_OnTrack xAODFaserWaveform ScintIdentifier FaserCaloIdentifier - FaserActsKalmanFilterLib + FaserActsKalmanFilterLib + ) atlas_install_python_modules(python/*.py) diff --git a/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.cxx b/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.cxx index a44ba24c44f2b516d4f9a7769d8bad8b7405810e..be6c6fcb17102fb3631c5283a36e155a89603e2b 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.cxx +++ b/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.cxx @@ -21,6 +21,7 @@ #include <typeinfo> + constexpr float NaN = std::numeric_limits<double>::quiet_NaN(); namespace Tracker { @@ -83,12 +84,17 @@ bool PairVertexAlg::waveformHitOK(const xAOD::WaveformHit* hit) const StatusCode PairVertexAlg::initialize() { ATH_CHECK(m_mcEventCollectionKey.initialize()); + ATH_CHECK(m_siHitCollectionKey.initialize()); + ATH_CHECK( m_sctMap.initialize()); ATH_CHECK(m_trackCollectionKey.initialize()); ATH_CHECK(m_vetoNuContainer.initialize()); ATH_CHECK(m_vetoContainer.initialize()); ATH_CHECK(m_triggerContainer.initialize()); ATH_CHECK(m_preshowerContainer.initialize()); ATH_CHECK(m_ecalContainer.initialize()); + ATH_CHECK(m_clusterContainer.initialize()); + + ATH_CHECK(m_fiducialParticleTool.retrieve()); ATH_CHECK(m_trackTruthMatchingTool.retrieve()); @@ -147,7 +153,7 @@ StatusCode PairVertexAlg::initialize() //TRUTH m_tree->Branch("tTrkBarcode", &m_truthBarcode); - m_tree->Branch("tTrkPdg", &m_truthPdg); + m_tree->Branch("tTrkPdg", &m_truthPdg); m_tree->Branch("vertexPos", &m_vertexPos); // [x,y,z] m_tree->Branch("isFiducial", &m_isFiducial); @@ -182,6 +188,16 @@ StatusCode PairVertexAlg::initialize() m_tree->Branch("truthd1_IsFiducial", &m_truthd1_IsFiducial); m_tree->Branch("truthd1_charge", &m_truthd1_charge); + //Cluster + m_tree->Branch("clusterCount", &m_clusterCount); + m_tree->Branch("clusterEFracPos", &m_clusterEFracPos); + m_tree->Branch("clusterEFracNeg", &m_clusterEFracNeg); + m_tree->Branch("clusterETot", &m_clusterETot); + m_tree->Branch("clusterETotPos", &m_clusterETotPos); + m_tree->Branch("clusterETotNeg", &m_clusterETotNeg); + m_tree->Branch("clusterLocation", &m_clusterLocation); + m_tree->Branch("clusterIsDaughter", &m_clusterIsDaughter); + @@ -420,6 +436,74 @@ StatusCode PairVertexAlg::execute(const EventContext &ctx) const break; } + + //CLUSTER-->RDO-->SiHit + SG::ReadHandle<Tracker::FaserSCT_ClusterContainer> clusterContainer { m_clusterContainer, ctx }; + SG::ReadHandle<TrackerSimDataCollection> h_collectionMap(m_sctMap); + ATH_CHECK(clusterContainer.isValid()); + ATH_CHECK(h_collectionMap.isValid()); + int clustercount=0; + + //loop over all clusters + for (auto collection : *clusterContainer) + { + Identifier id = collection->identify(); + int station = m_idHelper->station(id); + + for (auto cluster : *collection) + { + Identifier clusterID = cluster->identify(); + auto clusterRDOList = cluster->rdoList(); + float TotalEnergyDeposited=0; + float TotalEnergyDeposited_daughterPos=0; + float TotalEnergyDeposited_daughterNeg=0; + bool isDaughter=false; + std::string clusterLocation = std::to_string(m_idHelper->station(clusterID))+' '+std::to_string(m_idHelper->layer(clusterID))+' '+std::to_string(m_idHelper->phi_module(clusterID))+' '+std::to_string(m_idHelper->eta_module(clusterID))+' '+std::to_string(m_idHelper->side(clusterID)); + + //loop over all RDOs in the cluster + for (auto rdoID : clusterRDOList) + { + if (simDataCollection->count(idRDO) > 0) + { + + + const auto& simdata = h_collectionMap->find(rdoID)->second; + const auto& deposits = simdata.getdeposits(); + int barcode = 0; + HepMcParticleLink primary{}; + for( const auto& depositPair : deposits) + { + barcode = depositPair.first->barcode(); + + // int pdgID = 0//depositPair.first->pdg_id(); + // float edeposit = 0.0//depositPair.second; + + // TotalEnergyDeposited+=edeposit; //sum all deposited energies in RDO for each cluster + + // if (barcode==2 || barcode==3) //its a daughter, do something. + // { + // isDaughter=true; + // if (pdgID>0){TotalEnergyDeposited_daughterNeg+=edeposit;} + // if (pdgID<0){TotalEnergyDeposited_daughterPos+=edeposit;} + // } + + } + // m_clusterETotPos.push_back(TotalEnergyDeposited_daughterPos); + // m_clusterETotNeg.push_back(TotalEnergyDeposited_daughterNeg); + // m_clusterETot.push_back(TotalEnergyDeposited); + // m_clusterEFracPos.push_back(TotalEnergyDeposited_daughterPos/TotalEnergyDeposited); + // m_clusterEFracNeg.push_back(TotalEnergyDeposited_daughterNeg/TotalEnergyDeposited); + // m_clusterLocation.push_back(clusterLocation); + // m_clusterIsDaughter.push_back(isDaughter); + } + } + clustercount++; + } + m_clusterCount=clustercount; + + } + + m_tree->Fill(); return StatusCode::SUCCESS; @@ -503,6 +587,15 @@ void PairVertexAlg::clearTree() const m_truthd1_IsFiducial.clear(); m_truthd1_charge.clear(); + m_clusterCount=0; + m_clusterEFracPos.clear(); + m_clusterEFracNeg.clear(); + m_clusterETot.clear(); + m_clusterETotPos.clear(); + m_clusterETotNeg.clear(); + m_clusterLocation.clear(); + m_clusterIsDaughter.clear(); + } } // end Tracker diff --git a/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.h b/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.h index 3495c0ed4f9b1b96aee1e364c214336ef3eb328e..44442898e81699bfdbcc1718befb4da6aaa56545 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.h +++ b/Tracker/TrackerRecAlgs/PairVertex/src/PairVertexAlg.h @@ -8,6 +8,10 @@ Copyright (C) 2022 CERN for the benefit of the FASER collaboration #include "GeoPrimitives/GeoPrimitives.h" #include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "GeneratorObjects/McEventCollection.h" +#include "TrackerSimEvent/FaserSiHitCollection.h" +#include "TrackerSimData/TrackerSimDataCollection.h" +#include "TrackerPrepRawData/FaserSCT_ClusterCollection.h" +#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" #include "TrkTrack/TrackCollection.h" #include "xAODFaserWaveform/WaveformHit.h" #include "xAODFaserWaveform/WaveformHitContainer.h" @@ -18,6 +22,7 @@ Copyright (C) 2022 CERN for the benefit of the FASER collaboration #include "xAODTruth/TruthEventContainer.h" #include <vector> +#include <string> #include "TTree.h" #include <TH1.h> #include <TProfile.h> @@ -73,7 +78,10 @@ namespace Tracker const TrackerDD::SCT_DetectorManager* m_detMgr {nullptr}; SG::ReadHandleKey<McEventCollection> m_mcEventCollectionKey { this, "McEventCollection", "TruthEvent" }; + SG::ReadHandleKey<FaserSiHitCollection> m_siHitCollectionKey{this, "FaserSiHitCollection", "SCT_Hits"}; + SG::ReadHandleKey<TrackerSimDataCollection> m_sctMap {this, "TrackerSimDataCollection", "SCT_SDO_Map"}; SG::ReadHandleKey<TrackCollection> m_trackCollectionKey { this, "TrackCollection", "CKFTrackCollection" }; + SG::ReadHandleKey<Tracker::FaserSCT_ClusterContainer> m_clusterContainer { this, "ClusterContainer", "SCT_ClusterContainer", "Tracker cluster container name" }; SG::ReadHandleKey<xAOD::WaveformHitContainer> m_vetoNuContainer { this, "VetoNuContainer", "VetoNuWaveformHits", "VetoNu hit container name" }; SG::ReadHandleKey<xAOD::WaveformHitContainer> m_vetoContainer { this, "VetoContainer", "VetoWaveformHits", "Veto hit container name" }; SG::ReadHandleKey<xAOD::WaveformHitContainer> m_triggerContainer { this, "TriggerContainer", "TriggerWaveformHits", "Trigger hit container name" }; @@ -149,6 +157,7 @@ namespace Tracker mutable std::vector<int> m_truthParticleBarcode; // vector of barcodes of all truth particles with a momentum larger 50 GeV mutable std::vector<int> m_truthParticleMatchedTracks; // vector of number of tracks to which a truth particle is matched to mutable std::vector<bool> m_truthParticleIsFiducial; // vector of boolean showing whether a truth particle is fiducial + //mutable std::array<std::vector<HepGeom::Point3D<double>>, 12> m_truthHitMap{}; mutable std::vector<int> m_truthBarcode; mutable std::vector<int> m_truthPdg; @@ -192,6 +201,20 @@ namespace Tracker mutable std::vector<double> m_truthd1_IsFiducial; mutable std::vector<double> m_truthd1_charge; + mutable std::vector<int> m_truthClusterSensor_d2; + mutable std::vector<int> m_truthClusterSensor_d3; + + //CLUSTER + mutable int m_clusterCount; + mutable std::vector<float> m_clusterEFracPos; + mutable std::vector<float> m_clusterEFracNeg; + mutable std::vector<float> m_clusterETot; + mutable std::vector<float> m_clusterETotPos; + mutable std::vector<float> m_clusterETotNeg; + mutable std::vector<std::string> m_clusterLocation; + mutable std::vector<bool> m_clusterIsDaughter; + + };