71{
73
74 std::vector<double> RoiEta_mon;
75 std::vector<double> RoiPhi_mon;
76 std::vector<double> RoiZed_mon;
77
78 auto CluEta = Monitored::Scalar<double>("CluEta", -99.);
79 auto CluPhi = Monitored::Scalar<double>("CluPhi", -99.);
80 auto CluNum = Monitored::Scalar<int>("NumRoi", 0);
81
82 auto nL1RoIs = Monitored::Scalar<int>("nL1RoIs",-99);
83 auto nRoIinClusters = Monitored::Scalar<int>("nRoIinClusters",-99);
84 auto nClusters = Monitored::Scalar<int>("nClusters",-99);
85
86 auto dPhi_cluSeed = Monitored::Scalar<float>("dPhiCluSeed", -99.);
87 auto dEta_cluSeed = Monitored::Scalar<float>("dEtaCluSeed", -99.);
88 auto dR_cluSeed = Monitored::Scalar<float>("dRCluSeed", -99.);
89
90 auto dPhi_RoivecSeed = Monitored::Scalar<double>("dPhiRoiVecSeed", -99.);
91 auto dEta_RoivecSeed = Monitored::Scalar<double>("dEtaRoiVecSeed", -99.);
92 auto dR_RoivecSeed = Monitored::Scalar<double>("dRRoiVecSeed", -99.);
93
96
97 auto t1 = Monitored::Timer(
"TIME_TrigAlg");
98 auto t2 = Monitored::Timer(
"TIME_TrigAlg_Clustering");
99
100 auto mon = Monitored::Group(
m_monTool, mon_roiEta, mon_roiPhi,
101 CluEta, CluPhi, CluNum,
102 nL1RoIs, nRoIinClusters, nClusters,
103 dPhi_cluSeed, dR_cluSeed, dEta_cluSeed,
104 t1, t2);
105
106
109 trigCompColl.record(std::make_unique<xAOD::TrigCompositeContainer>(),std::make_unique<xAOD::TrigCompositeAuxContainer>())
110 );
111
112
113 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, float> muRoiClusEta(
m_muRoiClusEtaKey, ctx);
114 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, float> muRoiClusPhi(
m_muRoiClusPhiKey, ctx);
115 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> muRoiClusNRoi(
m_muRoiClusNRoiKey, ctx);
116
117
119
120
121
122 int n_cl=0;
125
127 auto roiCollection = roiCollectionHdl.get();
128
129 if (roiCollection->size() < 2){
130 ATH_MSG_WARNING(
"Input TrigRoiDescriptorCollection isn't the correct size! Potential L1 menu inconsistency. Got " << roiCollection->size() <<
" RoIs");
131 return StatusCode::SUCCESS;
132 }
133
134 nL1RoIs = roiCollection->size();
135 nRoIinClusters = 0;
137 {
140 break;
141 }
142
143 RoiEta_mon.push_back(roi->eta());
144 RoiPhi_mon.push_back(roi->phi());
146 my_lvl1_clu_roi.
eta = roi->eta();
147 my_lvl1_clu_roi.phi = roi->phi();
148 my_lvl1_clu_roi.nroi = 0;
149 muonClu[n_cl] = my_lvl1_clu_roi;
150 muonClu0[n_cl] = my_lvl1_clu_roi;
151 ++n_cl;
152 }
153
155 ATH_MSG_DEBUG(
"Accumulated " << n_cl <<
" ROI Directions: ");
157 for (
int unsigned i=0;
i<RoiEta_mon.size();
i++) {
158 ATH_MSG_DEBUG(
" [" << RoiEta_mon.at(i) <<
"," << RoiPhi_mon.at(i) <<
"]");
159 }
160 }
161
162
163
165 int n_itr = 0;
166 for(int i_cl=0; i_cl<n_cl; ++i_cl) {
167 ATH_MSG_DEBUG(
"Initial RoI Coordinates: eta = " << muonClu0[i_cl].
eta <<
", phi = " << muonClu0[i_cl].
phi);
168 bool improvement = true;
169 n_itr = 0;
170 while(improvement){
171 ++n_itr;
172 double eta_avg=0.0;
173 double cosPhi_avg=0.0;
174 double sinPhi_avg=0.0;
175 int n_in_clu = 0;
176 for (int j_cl=0; j_cl<n_cl; ++j_cl) {
179 ATH_MSG_DEBUG(
" Adding Following RoI: eta = " << muonClu0[j_cl].
eta <<
", phi = " << muonClu0[j_cl].
phi);
180 ++n_in_clu;
181 if(n_itr==1){
182 muonClu[i_cl].eta = muonClu[i_cl].eta + (muonClu0[j_cl].eta-muonClu[i_cl].eta)/n_in_clu;
184 } else{
185
186 eta_avg += muonClu0[j_cl].eta;
187 cosPhi_avg += std::cos(muonClu0[j_cl].
phi);
188 sinPhi_avg += std::sin(muonClu0[j_cl].
phi);
189 }
190 }
191
192 }
193
194 if(n_itr > 1){
195
196
197
199 ATH_MSG_ERROR(
"MuonCluster::execute: n_in_clu denominator is zero.");
200 return StatusCode::FAILURE;
201 }
202 muonClu[i_cl].eta = eta_avg/n_in_clu;
203 muonClu[i_cl].phi = std::atan2(sinPhi_avg,cosPhi_avg);
204 }
205
206
207
208 Int_t n_in_clu2=0;
209 for (int j_cl=0; j_cl<n_cl; ++j_cl) {
212 ++n_in_clu2;
213 }
214 }
215
216 ATH_MSG_DEBUG(
"Finding the number of Muon RoIs in the new Cluster.... " << n_in_clu2);
217 if(n_in_clu2>muonClu[i_cl].nroi){
218 muonClu[i_cl].nroi=n_in_clu2;
219 improvement = true;
220 } else improvement = false;
221 }
222 }
224
226
227
228
229 int ncl_max = 0;
230 int sel_cl = -1;
231 int nRoisInClu = 0;
232 for(int i_cl=0; i_cl<n_cl; ++i_cl) {
233 nRoisInClu += muonClu[i_cl].nroi;
234 if(muonClu[i_cl].nroi>ncl_max){
235 CluEta = muonClu[i_cl].eta;
236 CluPhi = muonClu[i_cl].phi;
237 CluNum = muonClu[i_cl].nroi;
238 ncl_max = muonClu[i_cl].nroi;
239 sel_cl = i_cl;
240 ATH_MSG_DEBUG(
" -- ncl_max loop: i_cl = " << i_cl <<
" with ncl_max = " << ncl_max);
241 }
242 }
243 nRoIinClusters = nRoisInClu;
244 nClusters = n_cl;
245
246
247
248 if (sel_cl < 0) {
249 return StatusCode::FAILURE;
250 }
251
253 dEta_cluSeed = muonClu0[sel_cl].eta-muonClu[sel_cl].eta;
254 dR_cluSeed =
DeltaR(muonClu0[sel_cl],muonClu[sel_cl]);
255
256 ATH_MSG_DEBUG(
"RoI Cluster Coordinates: eta = " << CluEta <<
", phi = " << CluPhi <<
", nRoI = " << CluNum);
257 ATH_MSG_DEBUG(
"Found the Cluster with the maximum number of RoIs.... " << ncl_max);
258
259 ATH_MSG_DEBUG(
"Create an output Collection seeded by the input");
260
262 try{
263 trigCompColl->push_back(compClu);
264 }catch(const std::exception& e){
265 ATH_MSG_ERROR(
"Write of MuonRoICluster TrigCompositeContainer object into trigCompColl failed!");
267 return StatusCode::FAILURE;
268 }
269
270
272 muRoiClusEta(*compClu) = static_cast<float>(CluEta);
273 muRoiClusPhi(*compClu) = static_cast<float>(CluPhi);
274 muRoiClusNRoi(*compClu) = static_cast<int>(CluNum);
275
276
277
278
279 if( (static_cast<int>(CluNum) >= 3 && std::abs(static_cast<double>(CluEta)) < 1.0) || \
280 (static_cast<int>(CluNum) >= 4 && std::abs(static_cast<double>(CluEta)) >= 1.0 && std::abs(static_cast<double>(CluEta)) <= 2.5) )
281 {
282 double phiHalfWidth = 0.35;
285 TrigRoiDescriptor* roiClus =
new TrigRoiDescriptor(
static_cast<double>(CluEta),
static_cast<double>(CluEta)-0.4,
static_cast<double>(CluEta)+0.4,
static_cast<double>(CluPhi), phiMinus, phiPlus);
286 trigDescColl->push_back(roiClus);
287 }
288
289
290
291
292 ATH_MSG_DEBUG(
" REGTEST \t Cluster with : " <<
static_cast<int>(CluNum) <<
" LVL1-Roi");
293 ATH_MSG_DEBUG(
" REGTEST \t Cluster Eta " <<
static_cast<double>(CluEta) <<
" Cluster Phi " <<
static_cast<double>(CluPhi));
294
295
296 return StatusCode::SUCCESS;
297}
Scalar deltaR(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
Athena::TPCnvVers::Current TrigRoiDescriptor
bool msgLvl(const MSG::Level lvl) const
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_muRoiClusEtaKey
SG::WriteHandleKey< xAOD::TrigCompositeContainer > m_outputCompositesKey
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_muRoiClusNRoiKey
SG::ReadHandleKey< TrigRoiDescriptorCollection > m_roiCollectionKey
float DeltaR(lvl1_muclu_roi, lvl1_muclu_roi) const
calculcate the deltaR between two Rois
SG::WriteDecorHandleKey< xAOD::TrigCompositeContainer > m_muRoiClusPhiKey
SG::WriteHandleKey< TrigRoiDescriptorCollection > m_outputRoiDescriptorKey
Gaudi::Property< float > m_DeltaR
A property which specifies the radius of the cluster.
ToolHandle< GenericMonitoringTool > m_monTool
void setName(const std::string &name)
Set a human-readable name for the object.
std::vector< ALFA_RawDataContainer_p1 > t2
std::vector< ALFA_RawDataCollection_p1 > t1
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
SG::WriteHandle< CONT > createAndStoreNoAux(const SG::WriteHandleKey< CONT > &key, const EventContext &ctx)
Creates and right away records the Container CONT with the key.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.