12#include "Acts/EventData/TrackContainer.hpp"
13#include "Acts/EventData/TrackParameters.hpp"
15#include "Gaudi/Property.h"
16#include "GaudiKernel/Algorithm.h"
17#include "GaudiKernel/MsgStream.h"
31 ISvcLocator *pSvcLocator)
60 ATH_MSG_WARNING(
"No extrapolator found. Will not be able to extrapolate tracks.");
62 ATH_MSG_INFO(
"Extrapolator found. Will be able to extrapolate tracks.");
68 return StatusCode::SUCCESS;
72 const Acts::GeometryContext& gctx) {
76 data[
"dparams"] = {track.loc0(), track.loc1(), track.phi(), track.theta(), track.qOverP() * 0.001};
81 const Acts::BoundTrackParameters trackparams(track.referenceSurface().getSharedPtr(),
82 track.parameters(), std::nullopt, Acts::ParticleHypothesis::pion());
83 auto trackPosition = trackparams.position(gctx);;
84 data[
"pos"].push_back(trackPosition.x());
85 data[
"pos"].push_back(trackPosition.y());
86 data[
"pos"].push_back(trackPosition.z());
88 unsigned int nTrackStates = track.nTrackStates();
92 std::vector<typename ActsTrk::TrackContainer::ConstTrackStateProxy> trackStates;
93 trackStates.reserve(nTrackStates);
94 for (
auto trackstate : track.trackStatesReversed()) {
95 trackStates.push_back(trackstate);
100 unsigned int count = 0;
101 for (
auto trackstate : trackStates) {
103 if (trackstate.hasSmoothed() && trackstate.hasReferenceSurface()) {
104 const Acts::BoundTrackParameters params(trackstate.referenceSurface().getSharedPtr(),
105 trackstate.smoothed(),
106 trackstate.smoothedCovariance(),
107 Acts::ParticleHypothesis::pion());
110 auto pos = params.position(gctx);
111 data[
"pos"].push_back(pos.x());
112 data[
"pos"].push_back(pos.y());
113 data[
"pos"].push_back(pos.z());
114 ATH_MSG_VERBOSE(
"TrackState "<<
count<<
" has smoothed state and reference surface. Position is "<<pos.x()<<
", "<<pos.y()<<
", "<<pos.z());
116 ATH_MSG_VERBOSE(
"GeometryId "<<params.referenceSurface().geometryId().value());
118 ATH_MSG_WARNING(
"TrackState "<<
count<<
" does not have smoothed state ["<<trackstate.hasSmoothed()<<
"] or reference surface ["<<trackstate.hasReferenceSurface()<<
"]. Skipping.");
131 return StatusCode::SUCCESS;
140 <<
" Event num: " << eventInfo->eventNumber());
143 j[
"event number"] = eventInfo->eventNumber();
144 j[
"run number"] = eventInfo->runNumber();
163 ATH_MSG_VERBOSE(
"TrackStateContainer has "<< tcHandle->size() <<
" elements");
165 ATH_MSG_VERBOSE(
"Trying to load " << tcHandle.key() <<
" with " << tcHandle->size() <<
" tracks");
167 for (
auto track : *
tc) {
168 nlohmann::json tmp =
getActsData(track, gcx->context());
169 j[
"TrackContainers"][tcHandle.key()].push_back(tmp);
188 std::string
label = std::to_string(eventInfo->eventNumber()) +
"/" +
189 std::to_string(eventInfo->runNumber());
192 return StatusCode::SUCCESS;
200 auto writeEtaPhiLabel = [](
float eta,
float phi) {
201 return std::to_string(
eta) +
"/" + std::to_string(
phi);
204 j[
"event number"] = 999;
205 j[
"run number"] = 999;
208 unsigned int maxSteps = 3;
211 for (
unsigned int nPhi = 0; nPhi < maxSteps; ++nPhi) {
212 phi =
static_cast<float>(nPhi) /
static_cast<float>(maxSteps) *
214 for (
unsigned int nEta = 0; nEta < maxSteps; ++nEta) {
215 eta =
static_cast<float>(nEta) /
static_cast<float>(maxSteps) *
219 nlohmann::json cluster;
220 cluster[
"phi"] =
phi;
221 cluster[
"eta"] =
eta;
222 cluster[
"energy"] = 999.9;
223 cluster[
"label"] = writeEtaPhiLabel(
eta,
phi);
225 j[
"CaloClusters"][
"TestClusters"].push_back(cluster);
231 jet[
"energy"] = 99999.9;
232 jet[
"label"] = writeEtaPhiLabel(
eta,
phi);
233 j[
"Jets"][
"TestJets"].push_back(
jet);
235 nlohmann::json track;
239 double theta = 2 * std::atan(std::exp(-
eta));
241 track[
"dparams"] = {0.0, 0.0,
phi,
theta, 0.0};
243 for (
unsigned int i = 0; i < 4; ++i) {
245 track[
"pos"].push_back({trackPos.x(), trackPos.y(), trackPos.z()});
247 track[
"label"] = writeEtaPhiLabel(
eta,
phi);
248 j[
"Tracks"][
"TestTracks"].push_back(track);
257 const std::string &jsonType) {
263 for (
auto object : *handle) {
264 nlohmann::json tmp =
getData(*
object);
265 event[jsonType][handle.key()].push_back(tmp);
268 return StatusCode::SUCCESS;
287 data[
"energy"] = clust.
e();
297 data[
"phi"] = cell.phi();
298 data[
"eta"] = cell.eta();
299 data[
"energy"] = cell.e();
309 data[
"chi2"] = tp.chiSquared();
310 data[
"dof"] = tp.numberDoF();
311 data[
"dparams"] = {tp.d0(), tp.z0(), tp.phi0(), tp.theta(), tp.qOverP()};
314 ATH_MSG_VERBOSE(
"Physlite mode enabled. Not adding track parameters.");
319 data[
"pos"] = {tp.perigeeParameters().position().x(),
320 tp.perigeeParameters().position().y(),
321 tp.perigeeParameters().position().z()};
322 for (
unsigned int i = 0; i < tp.numberOfParameters(); ++i) {
323 data[
"pos"].push_back(tp.parameterX(i));
324 data[
"pos"].push_back(tp.parameterY(i));
325 data[
"pos"].push_back(tp.parameterZ(i));
328 std::vector<Amg::Vector3D> positions;
348 positions.push_back(pos);
355 for (
auto pos : positions) {
356 data[
"pos"].push_back(pos.x());
357 data[
"pos"].push_back(pos.y());
358 data[
"pos"].push_back(pos.z());
363 "Failure in extrapolation for Track with start parameters "
392 track.trackParameters();
395 data[
"pos"].push_back(param->position().x());
396 data[
"pos"].push_back(param->position().y());
397 data[
"pos"].push_back(param->position().z());
401 track.measurementsOnTrack();
404 data[
"pos"].push_back(meas->globalPosition().x());
405 data[
"pos"].push_back(meas->globalPosition().y());
406 data[
"pos"].push_back(meas->globalPosition().z());
418 data[
"Phi"] = muon.phi();
419 data[
"Eta"] = muon.eta();
421 std::vector<std::string> quality = {
"Tight",
"Medium",
"Loose",
"VeryLoose"};
422 data[
"Quality"] = quality[
static_cast<unsigned int>(muon.quality())];
423 std::vector<std::string>
type = {
"Combined",
"Standalone",
"SegmentTagged",
424 "CaloTagged",
"SiAssociatedForward"};
425 data[
"Type"] =
type[
static_cast<unsigned int>(muon.muonType())];
427 addLink(muon.clusterLink(),
data[
"LinkedClusters"]);
428 addLink(muon.inDetTrackParticleLink(),
data[
"LinkedTracks"]);
429 addLink(muon.muonSpectrometerTrackParticleLink(),
data[
"LinkedTracks"]);
430 addLink(muon.extrapolatedMuonSpectrometerTrackParticleLink(),
431 data[
"LinkedTracks"]);
442 data[
"energy"] = tauJet.
e();
450 data[
"phi"] = electron.phi();
451 data[
"eta"] = electron.eta();
452 data[
"energy"] = electron.e();
453 addLink(electron.caloClusterLink(),
data[
"LinkedClusters"]);
454 addLink(electron.trackParticleLink(),
data[
"LinkedTracks"]);
463 data[
"phi"] = photon.phi();
464 data[
"eta"] = photon.eta();
465 data[
"energy"] = photon.e();
466 addLink(photon.caloClusterLink(),
data[
"LinkedClusters"]);
473 if (link.isValid()) {
474 data.push_back(link.dataID() +
":" + std::to_string(link.index()));
480 if (!outputFile.is_open()) {
482 return StatusCode::FAILURE;
485 return StatusCode::SUCCESS;
491 const std::string &jsonType) {
493 return StatusCode::SUCCESS;
500 <<
" collections: ");
502 nlohmann::json tmp =
getData(*handle);
503 if (!tmp.is_null()) {
505 << tmp.size() <<
" elements:");
506 event[jsonType][handle.
key()] = tmp;
508 return StatusCode::SUCCESS;
515 nlohmann::json colldata = {};
517 for (
const auto &prd : *coll) {
519 data[
"pos"] = {prd->globalPosition().x(), prd->globalPosition().y(),
520 prd->globalPosition().z()};
522 data[
"id"] =
id.get_compact();
523 colldata.push_back(
data);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
char data[hepevt_bytes_allocation_ATLAS]
#define TYPE(CODE, TYP, IOTYP)
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Data object for each calorimeter readout cell.
SG::ReadHandleKeyArray< xAOD::TauJetContainer > m_tauJetKeys
SG::ReadHandleKey< Muon::MdtPrepDataContainer > m_mdtPrepRawDataKey
SG::ReadHandleKey< ActsTrk::GeometryContext > m_geometryContextKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
Gaudi::Property< bool > m_physlite
SG::ReadHandleKeyArray< xAOD::CaloClusterContainer > m_caloClustersKeys
SG::ReadHandleKeyArray< xAOD::TrackParticleContainer > m_trackParticleKeys
virtual StatusCode execute() override
SG::ReadHandleKey< Muon::MMPrepDataContainer > m_mmPrepRawDataKey
SG::ReadHandleKey< Muon::TgcPrepDataContainer > m_tgcPrepRawDataKey
ToolHandle< Trk::IExtrapolationEngine > m_extrapolator
Gaudi::Property< bool > m_dumpTestEvent
SG::ReadHandleKey< InDet::PixelClusterContainer > m_pixelPrepRawDataKey
SG::ReadHandleKeyArray< xAOD::PhotonContainer > m_photonKeys
Gaudi::Property< std::string > m_outputJSON_Name
StatusCode getAndFillContainer(nlohmann::json &event, const SG::ReadHandleKey< TYPE > &key, const std::string &jsonType)
SG::ReadHandleKeyArray< xAOD::MuonContainer > m_muonKeys
SG::ReadHandleKeyArray< ActsTrk::TrackContainer > m_trackContainerKeys
SG::ReadHandleKeyArray< TrackCollection > m_trackCollectionKeys
SG::ReadHandleKeyArray< xAOD::ElectronContainer > m_electronKeys
void prependTestEvent()
Dumps a dummy event with some objects at specific eta/phi coordinates for calibration.
SG::ReadHandleKey< InDet::TRT_DriftCircleContainer > m_trtPrepRawDataKey
void addLink(const TYPE &link, nlohmann::json &data)
SG::ReadHandleKey< Muon::CscPrepDataContainer > m_cscPrepRawDataKey
StatusCode getAndFillArrayOfContainers(nlohmann::json &event, const SG::ReadHandleKeyArray< TYPE > &keys, const std::string &jsonType)
SG::ReadHandleKeyArray< CaloCellContainer > m_caloCellKey
SG::ReadHandleKeyArray< xAOD::JetContainer > m_jetKeys
nlohmann::json getActsData(const typename ActsTrk::TrackContainer::ConstTrackProxy &track, const Acts::GeometryContext &gctx)
nlohmann::json getData(const TYPE &object)
virtual StatusCode initialize() override
inherited from Algorithm
virtual StatusCode finalize() override
DumpEventDataToJsonAlg(const std::string &name, ISvcLocator *pService)
Algorithm constructor.
nlohmann::json m_eventData
SG::ReadHandleKey< Muon::sTgcPrepDataContainer > m_stgcPrepRawDataKey
SG::ReadHandleKey< Muon::RpcPrepDataContainer > m_rpcPrepRawDataKey
SG::ReadHandleKey< InDet::SCT_ClusterContainer > m_sctPrepRawDataKey
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
double chiSquared() const
returns the of the overall track fit
double doubleNumberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as double
This class is the pure abstract base class for all fittable tracking measurements.
const Amg::Vector3D & momentum() const
Access method for the momentum.
const Amg::Vector3D & position() const
Access method for the position.
double charge() const
Returns the charge.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double e() const
The total energy of the particle.
virtual double eta() const
The pseudorapidity ( ) of the particle.
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
std::string label(const std::string &format, int i)
void setRThetaPhi(Amg::Vector3D &v, double r, double theta, double phi)
sets radius, the theta and phi angle of a vector.
Eigen::Matrix< double, 3, 1 > Vector3D
HandleKeyArray< ReadHandle< T >, ReadHandleKey< T >, Gaudi::DataHandle::Reader > ReadHandleKeyArray
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
ParametersBase< TrackParametersDim, Charged > TrackParameters
void reverse(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of reverse for DataVector/List.
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TauJet_v3 TauJet
Definition of the current "tau version".
Muon_v1 Muon
Reference the current persistent version:
Photon_v1 Photon
Definition of the current "egamma version".
Electron_v1 Electron
Definition of the current "egamma version".