7def CaloFwdTopoTowerCfg(flags,**kwargs):
8
9 mlog = logging.getLogger('MakeFwdTopoTowerCfg')
10
11 result=ComponentAccumulator()
12
13 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
14 from TileGeoModel.TileGMConfig import TileGMCfg
15
16 result.merge(LArGMCfg(flags))
17 result.merge(TileGMCfg(flags))
18
19
20 result.addCondAlgo(CompFactory.CaloTowerGeometryCondAlg(TowerEtaBins = 100,
21 TowerEtaMin = -5,
22 TowerEtaMax = 5.,))
23
24
25 kwargs.setdefault("PrepareLCW",flags.Calo.FwdTower.prepareLCW)
26 kwargs.setdefault("TopoClusterRange",flags.Calo.FwdTower.clusterRange)
27 kwargs.setdefault("BuildCombinedTopoSignal",True)
28
29
30 towerContainerKey=kwargs.pop('towerContainerKey','CaloCalFwdTopoTowers')
31 signalContainerKey=kwargs.pop('signalContainerKey','CaloCalTopoSignals')
32 towerBuilderName=kwargs.pop('TowerBuilderName','CaloTopoTowerFromClusterMaker')
33 towerMergerName=kwargs.pop('TowerMergerName','CaloTopoSignalMaker')
34
35
36 towerBuilder=CompFactory.CaloTopoTowerFromClusterMaker(towerBuilderName,**kwargs)
37
38
39 orderbyPt=towerBuilder.OrderClusterByPt
40
41 if flags.Calo.FwdTower.prepareLCW:
42
43 towerBuilder.OrderClusterByPt=False
44
45 mlog.info('Consistency check')
46 if towerBuilder.PrepareLCW and not towerBuilder.BuildTopoTowers:
47 raise RuntimeError('{0}[inconsistent configuration] applying LCW requires to build topo-towers'.format(towerBuilder.name()))
48 if towerBuilder.BuildCombinedTopoSignal and not towerBuilder.BuildTopoTowers:
49 raise RuntimeError('{0}[inconsistent configuration] building combined topo-cluster/topo-tower signals requires to build topo-towers'.format(towerBuilder.name()))
50 if towerBuilder.ApplyCellEnergyThreshold and towerBuilder.BuildTopoTowers:
51 raise RuntimeError('{0}[inconsistent configuration] applying cell energy thresholds for topo-towers not yet implemented'.format(towerBuilder.name()))
52
53 ''' Tower converter configuration summary
54 '''
55 if towerBuilder.BuildTopoTowers:
56 if towerBuilder.PrepareLCW:
57 ''' LCW topo-towers
58 '''
59 mlog.info('################################################')
60 mlog.info('## Produce LCW calibrated topo-tower clusters ##')
61 mlog.info('################################################')
62 mlog.info('CaloTopoClusterContainerKey .. {0}'.format(towerBuilder.CaloTopoClusterContainerKey))
63
64 else:
65 ''' EM topo-towers
66 '''
67 mlog.info('###############################################')
68 mlog.info('## Produce EM calibrated topo-tower clusters ##')
69 mlog.info('###############################################')
70 mlog.info('CaloTopoClusterContainerKey .. {0}'.format(towerBuilder.CaloTopoClusterContainerKey))
71
72 if towerBuilder.BuildCombinedTopoSignal:
73 mlog.info(' ')
74 mlog.info('Combined topo-cluster/topo-towermode with y_max = {0}'.format(towerBuilder.TopoClusterRange))
75 else:
76 ''' EM towers
77 '''
78 mlog.info('########################################')
79 mlog.info('## Produce EM standard tower clusters ##')
80 mlog.info('########################################')
81
82
83 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
84 result.merge(CaloNoiseCondAlgCfg(flags, noisetype="totalNoise"))
85
86 baseName=towerBuilder.name.replace(
"Builder",
"").
replace(
"Maker",
"")
88
89 clusterMoments = CompFactory.CaloClusterMomentsMaker (baseName+'MomentMaker')
90 clusterMoments.MaxAxisAngle = 20*deg
91 clusterMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
92 clusterMoments.MinBadLArQuality = 4000
93 clusterMoments.MomentsNames = [
94
95
96 "LONGITUDINAL",
97
98
99 "ENG_FRAC_EM",
100
101 "SIGNIFICANCE",
102
103 ]
104
105 if not flags.Common.isOnline:
106 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBCfg
107 result.merge(LArElecCalibDBCfg(flags,["HVScaleCorr"]))
108 if flags.Input.isMC:
109 clusterMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
110 else:
111 clusterMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed")
112
113 clusterMoments.MomentsNames += ["ENG_BAD_HV_CELLS","N_BAD_HV_CELLS"]
114
115
116 towerMaker = CompFactory.CaloTopoTowerMaker(baseName+"Alg")
117 towerMaker.TowersOutputName = towerContainerKey
118 towerMaker.TowerMakerTool = towerBuilder
119 towerMaker.UseLCWCalibration = towerBuilder.PrepareLCW
120
121 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
122 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
123 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
125
126
127 towerMaker.TowerCorrectionTools += [BadChannelListCorr,clusterMoments]
128
129 if towerBuilder.PrepareLCW:
130 ''' Configure name for calibration tool
131 '''
132 towerCalName = baseName+'Calibrator'
133 towerCalibrator = CompFactory.CaloTopoTowerFromClusterCalibrator(towerCalName)
134 towerCalibrator.OrderClusterByPt = orderbyPt
135
136 towerMaker.TowerCalibratorTool = towerCalibrator
137
138 result.addEventAlgo(towerMaker)
139
140
141 if towerBuilder.TopoClusterRange > 0.:
142 caloTowerMerger = CompFactory.CaloTopoClusterTowerMerger(towerMergerName)
143 caloTowerMerger.TopoClusterRange = towerBuilder.TopoClusterRange
144 caloTowerMerger.TopoClusterContainerKey = towerBuilder.CaloTopoClusterContainerKey
145 caloTowerMerger.TopoTowerContainerKey = towerMaker.TowersOutputName
146 caloTowerMerger.TopoSignalContainerKey = signalContainerKey
147
148 result.addEventAlgo(caloTowerMerger)
149
150
151 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
152 toESD=[f"xAOD::CaloClusterContainer#{towerContainerKey}",
153 f"xAOD::CaloClusterAuxContainer#{towerContainerKey}Aux.",
154 f"CaloClusterCellLinkContainer#{towerContainerKey}_links"]
155
156
157 AODAuxItems=f"xAOD::CaloClusterAuxContainer#{towerContainerKey}Aux"
158 for mom in ("CENTER_LAMBDA",
159
160 "LONGITUDINAL",
161
162
163 "ENG_FRAC_EM",
164
165 "SIGNIFICANCE",
166 "ENG_POS"):
167 AODAuxItems+="."+mom
168
169 toAOD=[f"xAOD::CaloClusterContainer#{towerContainerKey}",AODAuxItems]
170
171 result.merge(addToESD(flags, toESD))
172
173 if flags.Calo.FwdTower.WriteToAOD:
174 result.merge(addToAOD(flags, toAOD))
175
176 return result
177
178
std::string replace(std::string s, const std::string &s2, const std::string &s3)