67{
69
70 std::vector<double> RoiEta_mon;
71 std::vector<double> RoiPhi_mon;
72 std::vector<double> RoiZed_mon;
73
74 auto CluEta = Monitored::Scalar<double>("CluEta", -99.);
75 auto CluPhi = Monitored::Scalar<double>("CluPhi", -99.);
76 auto CluNum = Monitored::Scalar<int>("NumRoi", 0);
77
78 auto nL1RoIs = Monitored::Scalar<int>("nL1RoIs",-99);
79 auto nRoIinClusters = Monitored::Scalar<int>("nRoIinClusters",-99);
80 auto nClusters = Monitored::Scalar<int>("nClusters",-99);
81
82 auto dPhi_cluSeed = Monitored::Scalar<float>("dPhiCluSeed", -99.);
83 auto dEta_cluSeed = Monitored::Scalar<float>("dEtaCluSeed", -99.);
84 auto dR_cluSeed = Monitored::Scalar<float>("dRCluSeed", -99.);
85
86 auto dPhi_RoivecSeed = Monitored::Scalar<double>("dPhiRoiVecSeed", -99.);
87 auto dEta_RoivecSeed = Monitored::Scalar<double>("dEtaRoiVecSeed", -99.);
88 auto dR_RoivecSeed = Monitored::Scalar<double>("dRRoiVecSeed", -99.);
89
92
93 auto t1 = Monitored::Timer(
"TIME_TrigAlg");
94 auto t2 = Monitored::Timer(
"TIME_TrigAlg_Clustering");
95
96 auto mon = Monitored::Group(
m_monTool, mon_roiEta, mon_roiPhi,
97 CluEta, CluPhi, CluNum,
98 nL1RoIs, nRoIinClusters, nClusters,
99 dPhi_cluSeed, dR_cluSeed, dEta_cluSeed,
100 t1, t2);
101
102
105 trigCompColl.record(std::make_unique<xAOD::TrigCompositeContainer>(),std::make_unique<xAOD::TrigCompositeAuxContainer>())
106 );
107
108
109 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, float> muRoiClusEta(
m_muRoiClusEtaKey, ctx);
110 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, float> muRoiClusPhi(
m_muRoiClusPhiKey, ctx);
111 SG::WriteDecorHandle<xAOD::TrigCompositeContainer, int> muRoiClusNRoi(
m_muRoiClusNRoiKey, ctx);
112
113
115
116
117
118 int n_cl=0;
121
123 auto roiCollection = roiCollectionHdl.get();
124
125 if (roiCollection->size() < 2){
126 ATH_MSG_WARNING(
"Input TrigRoiDescriptorCollection isn't the correct size! Potential L1 menu inconsistency. Got " << roiCollection->size() <<
" RoIs");
127 return StatusCode::SUCCESS;
128 }
129
130 nL1RoIs = roiCollection->size();
131 nRoIinClusters = 0;
133 {
136 break;
137 }
138
139 RoiEta_mon.push_back(roi->eta());
140 RoiPhi_mon.push_back(roi->phi());
142 my_lvl1_clu_roi.
eta = roi->eta();
143 my_lvl1_clu_roi.phi = roi->phi();
144 my_lvl1_clu_roi.nroi = 0;
145 muonClu[n_cl] = my_lvl1_clu_roi;
146 muonClu0[n_cl] = my_lvl1_clu_roi;
147 ++n_cl;
148 }
149
151 ATH_MSG_DEBUG(
"Accumulated " << n_cl <<
" ROI Directions: ");
153 for (
int unsigned i=0;
i<RoiEta_mon.size();
i++) {
154 ATH_MSG_DEBUG(
" [" << RoiEta_mon.at(i) <<
"," << RoiPhi_mon.at(i) <<
"]");
155 }
156 }
157
158
159
161 int n_itr = 0;
162 for(int i_cl=0; i_cl<n_cl; ++i_cl) {
163 ATH_MSG_DEBUG(
"Initial RoI Coordinates: eta = " << muonClu0[i_cl].
eta <<
", phi = " << muonClu0[i_cl].
phi);
164 bool improvement = true;
165 n_itr = 0;
166 while(improvement){
167 ++n_itr;
168 double eta_avg=0.0;
169 double cosPhi_avg=0.0;
170 double sinPhi_avg=0.0;
171 int n_in_clu = 0;
172 for (int j_cl=0; j_cl<n_cl; ++j_cl) {
175 ATH_MSG_DEBUG(
" Adding Following RoI: eta = " << muonClu0[j_cl].
eta <<
", phi = " << muonClu0[j_cl].
phi);
176 ++n_in_clu;
177 if(n_itr==1){
178 muonClu[i_cl].eta = muonClu[i_cl].eta + (muonClu0[j_cl].eta-muonClu[i_cl].eta)/n_in_clu;
180 } else{
181
182 eta_avg += muonClu0[j_cl].eta;
183 cosPhi_avg +=
cos(muonClu0[j_cl].
phi);
184 sinPhi_avg +=
sin(muonClu0[j_cl].
phi);
185 }
186 }
187
188 }
189
190 if(n_itr > 1){
191
192
193
194 muonClu[i_cl].eta = eta_avg/n_in_clu;
195 muonClu[i_cl].phi = atan2(sinPhi_avg,cosPhi_avg);
196 }
197
198
199
200 Int_t n_in_clu2=0;
201 for (int j_cl=0; j_cl<n_cl; ++j_cl) {
204 ++n_in_clu2;
205 }
206 }
207
208 ATH_MSG_DEBUG(
"Finding the number of Muon RoIs in the new Cluster.... " << n_in_clu2);
209 if(n_in_clu2>muonClu[i_cl].nroi){
210 muonClu[i_cl].nroi=n_in_clu2;
211 improvement = true;
212 } else improvement = false;
213 }
214 }
216
218
219
220
221 int ncl_max = 0;
222 int sel_cl = -1;
223 int nRoisInClu = 0;
224 for(int i_cl=0; i_cl<n_cl; ++i_cl) {
225 nRoisInClu += muonClu[i_cl].nroi;
226 if(muonClu[i_cl].nroi>ncl_max){
227 CluEta = muonClu[i_cl].eta;
228 CluPhi = muonClu[i_cl].phi;
229 CluNum = muonClu[i_cl].nroi;
230 ncl_max = muonClu[i_cl].nroi;
231 sel_cl = i_cl;
232 ATH_MSG_DEBUG(
" -- ncl_max loop: i_cl = " << i_cl <<
" with ncl_max = " << ncl_max);
233 }
234 }
235 nRoIinClusters = nRoisInClu;
236 nClusters = n_cl;
237
238
239
240 if (sel_cl < 0) {
241 return StatusCode::FAILURE;
242 }
243
245 dEta_cluSeed = muonClu0[sel_cl].eta-muonClu[sel_cl].eta;
246 dR_cluSeed =
DeltaR(muonClu0[sel_cl],muonClu[sel_cl]);
247
248 ATH_MSG_DEBUG(
"RoI Cluster Coordinates: eta = " << CluEta <<
", phi = " << CluPhi <<
", nRoI = " << CluNum);
249 ATH_MSG_DEBUG(
"Found the Cluster with the maximum number of RoIs.... " << ncl_max);
250
251 ATH_MSG_DEBUG(
"Create an output Collection seeded by the input");
252
254 try{
255 trigCompColl->push_back(compClu);
256 }catch(const std::exception& e){
257 ATH_MSG_ERROR(
"Write of MuonRoICluster TrigCompositeContainer object into trigCompColl failed!");
259 return StatusCode::FAILURE;
260 }
261
262
264 muRoiClusEta(*compClu) = static_cast<float>(CluEta);
265 muRoiClusPhi(*compClu) = static_cast<float>(CluPhi);
266 muRoiClusNRoi(*compClu) = static_cast<int>(CluNum);
267
268
269
270
271 if( (static_cast<int>(CluNum) >= 3 && std::abs(static_cast<double>(CluEta)) < 1.0) || \
272 (static_cast<int>(CluNum) >= 4 && std::abs(static_cast<double>(CluEta)) >= 1.0 && std::abs(static_cast<double>(CluEta)) <= 2.5) )
273 {
274 double phiHalfWidth = 0.35;
277 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);
278 trigDescColl->push_back(roiClus);
279 }
280
281
282
283
284 ATH_MSG_DEBUG(
" REGTEST \t Cluster with : " <<
static_cast<int>(CluNum) <<
" LVL1-Roi");
285 ATH_MSG_DEBUG(
" REGTEST \t Cluster Eta " <<
static_cast<double>(CluEta) <<
" Cluster Phi " <<
static_cast<double>(CluPhi));
286
287
288 return StatusCode::SUCCESS;
289}
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.