ATLAS Offline Software
CaloThinCellsByClusterAlg_test.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration.
3 #
4 # File: CaloRec/python/CaloThinCellsByClusterAlg_test.py
5 # Author: scott snyder
6 # Date: Nov, 2019
7 # Brief: Test for CaloThinCellsByClusterAlg.
8 #
9 
10 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
11 from AthenaConfiguration.ComponentFactory import CompFactory
12 from AthenaPython.PyAthenaComps import Alg, StatusCode
13 from math import pi
14 import ROOT
15 
16 
17 cell_hashes = set()
18 
19 
20 def make_calo_cells (mgr):
21  ccc = ROOT.CaloCellContainer()
22  for i in range (mgr.element_size()):
23  elt = mgr.get_element (ROOT.IdentifierHash (i))
24  if not elt: break
25  cc = ROOT.CaloCell (elt, 0, 0, 0, 0)
26  ccc.push_back (cc)
27  ROOT.SetOwnership (cc, False)
28  ccc.order()
29  ccc.updateCaloIterators()
30  return ccc
31 
32 
33 def make_clusters (mgr, ccc, hashes, ctx):
34  clc = ROOT.xAOD.CaloClusterContainer()
35  clc_store = ROOT.xAOD.CaloClusterAuxContainer()
36  clc.setStore (clc_store)
37  cellLinks = ROOT.CaloClusterCellLinkContainer()
38  ids = ROOT.vector(ROOT.IdentifierHash)()
39 
40  for i in range(2):
41  cl = ROOT.xAOD.CaloCluster()
42  clc.push_back (cl)
43  ROOT.SetOwnership (cl, False)
44  eta = 0.5 - i # 0.5 or -0.5
45  phi = 1
46  cl.setEta (eta)
47  cl.setPhi (phi)
48  cl.setClusterSize (ROOT.xAOD.CaloCluster.SW_37ele)
49  links = ROOT.CaloClusterCellLink (ccc)
50  cl.addCellLink (links)
51  ROOT.SetOwnership (links, False)
52 
53  mgr.cellsInZone (eta - 0.05, eta + 0.05, phi - 0.05, phi + 0.05, ids)
54  for hash in ids:
55  elt = mgr.get_element (hash)
56  s = elt.getSampling()
57  if s == 0 or s == 2:
58  idx = ccc.findIndex (hash)
59  if idx < 0:
60  print ("??? Can't find cell with hash ", hash)
61  else:
62  hashes.add (hash.value())
63  cl.addCell (idx, 1)
64  cl.setLink(cellLinks, ctx)
65 
66  return (clc, clc_store, cellLinks)
67 
68 
69 class CreateDataAlg (Alg):
70  def execute (self):
71  ctx = self.getContext()
72  mgr = self.condStore['CaloDetDescrManager'].find (ctx.eventID())
73  ccc = make_calo_cells (mgr)
74  self.evtStore.record (ccc, 'AllCalo', False)
75 
76  global cell_hashes
77  cell_hashes = set()
78  (clc, clc_store, cellLinks) = make_clusters (mgr, ccc, cell_hashes, ctx)
79  self.evtStore.record (clc, 'Clusters', False)
80  self.evtStore.record (clc_store, 'ClustersAux.', False)
81  self.evtStore.record (cellLinks, 'Clusters_links', False)
82  return StatusCode.Success
83 
84 
85 class CheckThinningAlg (Alg):
86  def isCloseTo (self, elt, eta, phi):
87  # Assuming no phi wrapping.
88  return (abs (elt.eta() - eta) < 3*0.025 and
89  abs (elt.phi() - phi) < 7*2*pi/256)
90 
91  def execute (self):
92  ctx = self.getContext()
93  mgr = self.condStore['CaloDetDescrManager'].find (ctx.eventID())
94  dec = self.evtStore['AllCalo_THINNED_StreamAOD.thinAlg']
95 
96  global cell_hashes
97  for i in range (dec.size()):
98  elt = mgr.get_element (ROOT.IdentifierHash (i))
99  if elt.getSampling() == 3:
100  close = (self.isCloseTo (elt, 0.5, 1) or
101  self.isCloseTo (elt, -0.5, 1))
102  if not dec.thinned(i):
103  assert close
104  else:
105  assert not close
106  else:
107  if not dec.thinned(i):
108  assert i in cell_hashes
109  else:
110  assert i not in cell_hashes
111  return StatusCode.Success
112 
113 
114 def testCfg (flags):
115  result = ComponentAccumulator()
116 
117  from LArGeoAlgsNV.LArGMConfig import LArGMCfg
118  from TileGeoModel.TileGMConfig import TileGMCfg
119  result.merge(LArGMCfg(flags))
120  result.merge(TileGMCfg(flags))
121 
122  from LArCabling.LArCablingConfig import LArOnOffIdMappingCfg
123  result.merge(LArOnOffIdMappingCfg(flags))
124 
125  result.addEventAlgo (CreateDataAlg ('CreateDataAlg'))
126 
127  CaloThinCellsByClusterAlg=CompFactory.CaloThinCellsByClusterAlg
128  result.addEventAlgo (CaloThinCellsByClusterAlg ('thinAlg',
129  StreamName = 'StreamAOD',
130  Clusters = 'Clusters',
131  SamplingCellsName = ['EMB3']))
132 
133  result.addEventAlgo (CheckThinningAlg ('CheckThinningAlg'))
134  return result
135 
136 
137 # Work around issue with cling in root 6.20.06 getting confused
138 # by forward declarations.
139 ROOT.xAOD.CaloClusterContainer_v1
140 
141 
142 from AthenaConfiguration.AllConfigFlags import initConfigFlags
143 from AthenaConfiguration.TestDefaults import defaultTestFiles
145 flags.Input.Files = defaultTestFiles.RDO_RUN2
146 flags.Input.TimeStamps = [1000]
147 flags.Detector.GeometryLAr = True
148 flags.Detector.GeometryTile = True
149 flags.needFlagsCategory('Tile')
150 flags.needFlagsCategory('LAr')
151 
152 flags.lock()
153 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
154 acc = MainServicesCfg(flags)
155 
156 from McEventSelector.McEventSelectorConfig import McEventSelectorCfg
157 acc.merge (McEventSelectorCfg (flags))
158 
159 acc.merge (testCfg (flags))
160 acc.run(1)
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.CaloThinCellsByClusterAlg_test.CheckThinningAlg.isCloseTo
def isCloseTo(self, elt, eta, phi)
Definition: CaloThinCellsByClusterAlg_test.py:86
python.CaloThinCellsByClusterAlg_test.CreateDataAlg
Definition: CaloThinCellsByClusterAlg_test.py:69
python.CaloThinCellsByClusterAlg_test.CheckThinningAlg
Definition: CaloThinCellsByClusterAlg_test.py:85
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:310
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
python.CaloThinCellsByClusterAlg_test.make_calo_cells
def make_calo_cells(mgr)
Definition: CaloThinCellsByClusterAlg_test.py:20
python.CaloThinCellsByClusterAlg_test.make_clusters
def make_clusters(mgr, ccc, hashes, ctx)
Definition: CaloThinCellsByClusterAlg_test.py:33
LArCablingConfig.LArOnOffIdMappingCfg
def LArOnOffIdMappingCfg(configFlags)
Definition: LArCablingConfig.py:62
LArGMConfig.LArGMCfg
def LArGMCfg(flags)
Definition: LArGMConfig.py:8
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
python.CaloThinCellsByClusterAlg_test.testCfg
def testCfg(flags)
Definition: CaloThinCellsByClusterAlg_test.py:114
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.CaloThinCellsByClusterAlg_test.CheckThinningAlg.execute
def execute(self)
Definition: CaloThinCellsByClusterAlg_test.py:91
python.CaloThinCellsByClusterAlg_test.CreateDataAlg.execute
def execute(self)
Definition: CaloThinCellsByClusterAlg_test.py:70
TileGMConfig.TileGMCfg
def TileGMCfg(flags)
Definition: TileGMConfig.py:7