ATLAS Offline Software
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 
18 #include "AsgMessaging/MsgStream.h"
19 
20 namespace asg {
21 ANA_MSG_HEADER(CreateDummyEl)
22 ANA_MSG_SOURCE(CreateDummyEl, "")
23 }
24 
25 namespace {
26 
27 const std::set<CaloSampling::CaloSample> samplings{
31 };
32 
33 void
34 fill_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  */
74 getElectrons(const std::vector<std::pair<double, double>>& pt_eta,
75  int runNumber,
77 {
78  using namespace asg::CreateDummyEl;
79  ANA_CHECK_SET_TYPE(int);
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);
138  el->setPt(pt);
139  }
140  if (!store.record(std::move(electrons), "MyElectrons").isSuccess() ||
141  !store.record(std::move(electronsAux), "MyElectronAux.").isSuccess()) {
142  ANA_MSG_ERROR("Could not record Electrons");
143  return StatusCode::FAILURE;
144  }
145 
146  return StatusCode::SUCCESS;
147 }
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
SGTest::store
TestStore store
Definition: TestStore.cxx:23
xAOD::Electron
Electron_v1 Electron
Definition of the current "egamma version".
Definition: Event/xAOD/xAODEgamma/xAODEgamma/Electron.h:17
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
xAOD::EventInfo_v1::setEventNumber
void setEventNumber(uint64_t value)
Set the current event's event number.
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
asg
Definition: DataHandleTestTool.h:28
test_pyathena.pt
pt
Definition: test_pyathena.py:11
xAOD::CaloCluster_v1::insertMoment
void insertMoment(MomentType type, double value)
Definition: CaloCluster_v1.cxx:708
ANA_MSG_ERROR
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:294
xAOD::CaloCluster_v1::setSamplingPattern
void setSamplingPattern(const unsigned sp, const bool clearSamplingVars=false)
Set sampling pattern (one bit per sampling.
Definition: CaloCluster_v1.cxx:81
xAOD::CaloCluster_v1::setEnergy
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.
Definition: CaloCluster_v1.cxx:519
CaloClusterAuxContainer.h
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
Egamma.h
xAOD::CaloCluster_v1::setE
void setE(flt_t)
Definition: CaloCluster_v1.cxx:375
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:62
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
SG::Decorator< float >
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:116
ElectronContainer.h
ParticleConstants.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
CaloCluster.h
ElectronAuxContainer.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
DMTest::links
links
Definition: CLinks_v1.cxx:22
MessageCheck.h
macros for messaging and checking status codes
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
asg::ANA_MSG_HEADER
ANA_MSG_HEADER(msgSTT) ANA_MSG_SOURCE(msgSTT
ANA_MSG_SOURCE
#define ANA_MSG_SOURCE(NAME, TITLE)
the source code part of ANA_MSG_SOURCE
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:133
getElectrons
StatusCode getElectrons(const std::vector< std::pair< double, double >> &pt_eta, int runNumber, xAOD::TStore &store)
Definition: CreateDummyEl.cxx:74
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
SG::AuxElement::makePrivateStore
void makePrivateStore()
Create a new (empty) private store for this object.
Definition: AuxElement.cxx:192
SGTest::TestStore::record
void record(const T *p, const std::string &key)
Definition: TestStore.h:81
xAOD::Electron_v1
Definition: Electron_v1.h:34
xAOD::CaloCluster_v1::PHICALOFRAME
@ PHICALOFRAME
Phi in the calo frame (for egamma)
Definition: CaloCluster_v1.h:191
EventInfo.h
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:47
CreateDummyEl.h
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
ANA_CHECK_SET_TYPE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:314
xAOD::EventInfo_v1::setRunNumber
void setRunNumber(uint32_t value)
Set the current event's run number.
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
CaloClusterContainer.h
xAOD::CaloCluster_v1::setPhi
bool setPhi(const CaloSample sampling, const float phi)
Set in a given sampling. Returns false if the sample isn't part of the cluster.
Definition: CaloCluster_v1.cxx:549
xAOD::CaloCluster_v1::setEta
bool setEta(const CaloSample sampling, const float eta)
Set in a given sampling. Returns false if the sample isn't part of the cluster.
Definition: CaloCluster_v1.cxx:534
xAOD::CaloCluster_v1::ETACALOFRAME
@ ETACALOFRAME
Eta in the calo frame (for egamma)
Definition: CaloCluster_v1.h:190
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
MsgStream.h
ParticleConstants::PDG2011::electronMassInMeV
constexpr double electronMassInMeV
the mass of the electron (in MeV)
Definition: ParticleConstants.h:26