257{
258 bool iphi = false;
259 std::vector<std::list<double>> * rpc_x;
261 int layer_end;
262 if(rpc_x->at(6).size()+rpc_x->at(7).size() >0) layer_end = 7;
263 else layer_end = 5;
264
265
267 for (int l_start=0; l_start<layer_end; l_start++){
269 for(
int i=0;
i<8;
i++) index[i]=-1;
270 TrigL2MuonSA::ClusterPattern crPat;
272
273
274 for (std::list<double>::iterator i_start=rpc_x->at(l_start).begin(); i_start!=rpc_x->at(l_start).end(); ++i_start){
275 int n_hits=1;
276 unsigned int pat=(1<<l_start);
277 double dMO=9999;
278 double dMM=9999;
279 double aw[3] = {0., 0., 0. };
280 double bw[3] = {0., 0., 0. };
281 double current_x =*i_start;
282 int l_current = l_start;
283 index[l_start] = std::distance(rpc_x->at(l_start).begin(), i_start);
284
286 << " pat= " << (std::bitset<8>) pat);
287
288
289
290 bool skipLayer = false;
291 for (int l_test=l_start+1; l_test<=layer_end; l_test++){
292 ATH_MSG_DEBUG(
"start searching the clusters in RPC plane, l_test = " << l_test);
293 if(l_test % 2 == 0){
294 int n_layer=0;
295 int n_layer_upper=0;
296 double x_layer=0;
297 double delta_layer=999;
298 int layerID = 0;
299 for(int ilayer = 0; ilayer < 2; ilayer++){
300 for (std::list<double>::iterator i_test=rpc_x->at(l_test + ilayer).begin(); i_test!=rpc_x->at(l_test + ilayer).end(); ++i_test){
301 double delta=-1;
302
303 if (!
deltaOK( l_current,l_test + ilayer,current_x,*i_test,iphi,delta))
continue;
304 if(ilayer == 0) n_layer++;
305 else if(ilayer == 1) n_layer_upper++;
306
307 if (delta<delta_layer) {
308 delta_layer=delta;
309 x_layer=*i_test;
310 layerID = ilayer;
311 index[l_test+ilayer] = std::distance(rpc_x->at(l_test+ilayer).begin(), i_test);
312
313 if(ilayer == 1){
314 ATH_MSG_DEBUG(
"the minimum delta was found in upper layer, update info");
316 skipLayer = true;
317 }
318 }
319 }
320 }
321 if (n_layer>0 || n_layer_upper>0) {
322 int l_result = l_test + layerID;
323 n_hits+=1;
324 current_x=x_layer;
326 l_current=l_result;
327 if (l_start<4&&l_result>=4&&delta_layer<dMO){
328 dMO=delta_layer;
329 }else if (l_start<2&&l_result>=2&&l_result<4&&delta_layer<dMM) {
330 dMM=delta_layer;
331 } else if (l_start>=4&&l_start<5&&l_result>=6&&delta_layer<dMM) {
332 dMM=delta_layer;
333 }
334 }
335 if(layerID == 0){
336 ATH_MSG_DEBUG(
" l_test = "<< l_test+layerID <<
" n_layer= "<< n_layer
337 << " x= " << current_x << " pat= " << (std::bitset<8>)pat);
338 }
339 else if(layerID == 1){
340 ATH_MSG_DEBUG(
" l_test = "<< l_test+layerID <<
" n_layer_upper= "<< n_layer_upper
341 << " x= " << current_x << " pat= " << (std::bitset<8>)pat);
342 }
343 }
344 else if(l_test % 2 == 1){
345 int n_layer=0;
346 double x_layer=0;
347 double delta_layer=999;
348
349 for (std::list<double>::iterator i_test=rpc_x->at(l_test).begin(); i_test!=rpc_x->at(l_test).end(); ++i_test){
350 double delta=-1;
351
352 if (!
deltaOK( l_current,l_test,current_x,*i_test,iphi,delta))
continue;
353 n_layer++;
354
355 if (delta<delta_layer) {
356 delta_layer=delta;
357 x_layer=*i_test;
358 index[l_test] = std::distance(rpc_x->at(l_test).begin(), i_test);
359
360 }
361 }
362 if (n_layer>0) {
363 n_hits+=1;
364 current_x=x_layer;
366 l_current=l_test;
367 if (l_start<4&&l_test>=4&&delta_layer<dMO){
368 dMO=delta_layer;
369 }else if (l_start<2&&l_test>=2&&l_test<4&&delta_layer<dMM) {
370 dMM=delta_layer;
371 }else if(l_start>=4&&l_start<5&&l_test>=6&&delta_layer<dMM) {
372 dMM=delta_layer;
373 }
374 }
375
376 ATH_MSG_DEBUG(
" l_test = "<< l_test <<
" n_layer= "<< n_layer
377 << " x= " << current_x << " pat= " << (std::bitset<8>)pat);
379 }
380 if(skipLayer){
381 l_test++;
382 skipLayer = false;
383 }
384 }
385
387 if (n_hits>=2) {
390 abcal(pat, index, aw, bw, rpcLayerClusters);
391 for(
int i = 0;
i < 3;
i++){
394 }
395 for(
int i = 0;
i < 8;
i++){
397 }
398 crPatterns.push_back(crPat);
399 }
400 }
401 }
402 return crPatterns.size() > 0;
403}
void abcal(unsigned int result_pat, size_t index[], double aw[], double bw[], TrigL2MuonSA::RpcLayerClusters &rpcLayerClusters) const