ATLAS Offline Software
Loading...
Searching...
No Matches
CreateDummyEl.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4
5#include "CreateDummyEl.h"
6// EDM include(s):
7#include "xAODEgamma/Egamma.h"
16
19
20namespace asg {
21ANA_MSG_HEADER(CreateDummyEl)
22ANA_MSG_SOURCE(CreateDummyEl, "")
23}
24
25namespace {
26
27const std::set<CaloSampling::CaloSample> samplings{
28 CaloSampling::PreSamplerB, CaloSampling::EMB1, CaloSampling::EMB2,
29 CaloSampling::EMB3, CaloSampling::PreSamplerE, CaloSampling::EME1,
30 CaloSampling::EME2, CaloSampling::EME3
31};
32
33void
34fill_cluster(xAOD::CaloCluster* cluster, float eta, float phi, float e)
35{
36 unsigned sampling_pattern = 0;
37 for (auto sample : samplings) {
38 sampling_pattern |= 0x1U << sample;
39 }
40 cluster->setSamplingPattern(sampling_pattern);
41
42 for (auto sample : samplings) {
43 cluster->setEta(sample, eta);
44 cluster->setPhi(sample, phi);
45 }
46
47 if (std::abs(eta) < 1.45) {
48 cluster->setEnergy(CaloSampling::PreSamplerB, e / 4);
49 cluster->setEnergy(CaloSampling::EMB1, e / 4);
50 cluster->setEnergy(CaloSampling::EMB2, e / 4);
51 cluster->setEnergy(CaloSampling::EMB3, e / 4);
52 } else {
53 cluster->setEnergy(CaloSampling::PreSamplerE, e / 4);
54 cluster->setEnergy(CaloSampling::EME1, e / 4);
55 cluster->setEnergy(CaloSampling::EME2, e / 4);
56 cluster->setEnergy(CaloSampling::EME3, e / 4);
57 }
58 cluster->setE(e);
59 cluster->setEta(eta);
60 cluster->setPhi(phi);
61 static const SG::Decorator<float> etaCaloDecor("etaCalo");
62 static const SG::Decorator<float> phiCaloDecor("phiCalo");
63 etaCaloDecor(*cluster) = eta;
64 phiCaloDecor(*cluster) = phi;
67}
68}
69/* This is a bit weird function at it "creates a dummy pseudo reconstruction
70 * sequence" The idea here is basically to record everything to the Store in the
71 * order reco would do. Then an analysis code should see the collections needed
72 */
73StatusCode
74getElectrons(const std::vector<std::pair<double, double>>& pt_eta,
75 int runNumber,
76 xAOD::TStore& store)
77{
78 using namespace asg::CreateDummyEl;
80 setMsgLevel(MSG::INFO);
81 // This is what we will return back
82
83 // create the EventInfo
84 std::unique_ptr<xAOD::EventInfo> eventInfo =
85 std::make_unique<xAOD::EventInfo>();
86 eventInfo->makePrivateStore();
87 eventInfo->setEventNumber(363636);
88 eventInfo->setRunNumber(runNumber);
89 static SG::AuxElement::Decorator<unsigned int> randomrunnumber(
90 "RandomRunNumber");
91 randomrunnumber(*eventInfo) = runNumber;
92 if (!store.record(std::move(eventInfo), "EventInfo").isSuccess()) {
93 ANA_MSG_ERROR("Could not record EventInfo");
94 return StatusCode::FAILURE;
95 }
96
97 size_t numel = pt_eta.size();
98 // Create all clusters
99 std::unique_ptr<xAOD::CaloClusterContainer> clusters =
100 std::make_unique<xAOD::CaloClusterContainer>();
101 std::unique_ptr<xAOD::CaloClusterAuxContainer> clAux =
102 std::make_unique<xAOD::CaloClusterAuxContainer>();
103 clusters->setStore(clAux.get());
104 clusters->reserve(numel);
105 for (const auto& i : pt_eta) {
106 const double pt{ i.first };
107 const double eta{ i.second };
108 const double e{ pt * cosh(eta) };
109 xAOD::CaloCluster* cluster = new xAOD::CaloCluster();
110 clusters->push_back(cluster);
111 fill_cluster(cluster, eta, 0.0, e);
112 }
113
114 if (!store.record(std::move(clusters), "MyClusters").isSuccess() ||
115 !store.record(std::move(clAux), "MyClustersAux.").isSuccess()) {
116 ANA_MSG_ERROR("Could not record clusters");
117 return StatusCode::FAILURE;
118 }
119 // Create all electrons one per cluster
120 std::vector<ElementLink<xAOD::CaloClusterContainer>> links{};
121 std::unique_ptr<xAOD::ElectronContainer> electrons =
122 std::make_unique<xAOD::ElectronContainer>();
123 std::unique_ptr<xAOD::ElectronAuxContainer> electronsAux =
124 std::make_unique<xAOD::ElectronAuxContainer>();
125 electrons->setStore(electronsAux.get());
126 electrons->reserve(numel);
127 for (const auto& i : pt_eta) {
128 const double pt{ i.first };
129 const double eta{ i.second };
131 electrons->push_back(el);
132 links.clear();
133 links.emplace_back("MyClusters", el->index());
134 el->setCaloClusterLinks(links);
135 el->setEta(eta);
136 el->setPhi(0.0);
137 el->setPt(pt);
138 }
139 if (!store.record(std::move(electrons), "MyElectrons").isSuccess() ||
140 !store.record(std::move(electronsAux), "MyElectronAux.").isSuccess()) {
141 ANA_MSG_ERROR("Could not record Electrons");
142 return StatusCode::FAILURE;
143 }
144
145 return StatusCode::SUCCESS;
146}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
macros for messaging and checking status codes
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_MSG_HEADER(NAME)
for standalone code this creates a new message category
#define ANA_MSG_SOURCE(NAME, TITLE)
the source code part of ANA_MSG_SOURCE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
StatusCode getElectrons(const std::vector< std::pair< double, double > > &pt_eta, int runNumber, xAOD::TStore &store)
A number of constexpr particle constants to avoid hardcoding them directly in various places.
void record(const T *p, const std::string &key)
Definition TestStore.h:81
SG::Decorator< T, ALLOC > Decorator
Definition AuxElement.h:575
Helper class to provide type-safe access to aux data.
Definition Decorator.h:59
bool setPhi(const CaloSample sampling, const float phi)
Set in a given sampling. Returns false if the sample isn't part of the cluster.
void insertMoment(MomentType type, double value)
bool setEta(const CaloSample sampling, const float eta)
Set in a given sampling. Returns false if the sample isn't part of the cluster.
bool setEnergy(const CaloSample sampling, const float e)
Set energy for a given sampling. Returns false if the sample isn't part of the cluster.
void setSamplingPattern(const unsigned sp, const bool clearSamplingVars=false)
Set sampling pattern (one bit per sampling.
@ ETACALOFRAME
Eta in the calo frame (for egamma)
@ PHICALOFRAME
Phi in the calo frame (for egamma)
A relatively simple transient store for objects created in analysis.
Definition TStore.h:45
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Electron_v1 Electron
Definition of the current "egamma version".