22 unsigned int doubletR,
30 if (stationName.substr(0,2)==
"BO") ilay=4;
34 if (stationName.substr(0,3)==
"BML" && stationEta==7) ilay+=2;
38 double R=std::sqrt(gPosX*gPosX+gPosY*gPosY);
39 const double Phi=std::atan2(gPosY,gPosX);
43 R =
calibR(stationName,R, Phi);
58 std::array<std::reference_wrapper<double>, 3>& result_aw,
59 std::array<std::reference_wrapper<double>, 3>& result_bw,
65 if(rpc_x.at(6).size()+rpc_x.at(7).size() >0) layer_end = 7;
68 std::bitset<8> result_pat{};
69 double result_dMM{9999}, result_dMO{9999};
71 std::array<size_t, 8> result_index{};
74 for (
int l_start=0; l_start<layer_end; l_start++){
76 for (
size_t i_start = 0; i_start < rpc_x.at(l_start).
size(); ++i_start){
80 std::bitset<8> pat (1<<l_start);
81 std::array<size_t, 8>
index {};
82 index[l_start] = i_start;
86 int current_l = l_start;
87 double current_x = rpc_x.at(l_start).at(i_start);
91 for (
int l_test=l_start+1; l_test<=layer_end; l_test++){
92 double min_delta {999};
93 const std::vector<double>& test_layer_hits {rpc_x.at(l_test)};
95 for (
size_t i_test = 0; i_test < test_layer_hits.size(); ++i_test){
98 if (
deltaOK(current_l,l_test,current_x, test_layer_hits.at(i_test),
false,delta)){
100 if (delta < min_delta) {
102 index[l_test] = i_test;
106 if (min_delta < 998){
108 current_x = test_layer_hits.at(
index[l_test]);
111 dMO = (l_start<4 and l_test>=4) ? std::min(dMO, min_delta) : dMO;
112 dMM = (l_start<2 and l_test>=2 and l_test<4) or (l_start>=4 and l_start<5 and l_test>=6) ? std::min(dMM, min_delta) : dMM;
117 if (
nHits>nHits_pat) {
123 }
else if (
nHits==nHits_pat) {
125 if (dMM<result_dMM or (dMM==result_dMM and dMO<result_dMO)){
136 abcal(result_pat, result_index, result_aw, result_bw, rpcLayerHits);
137 if(msgLevel(MSG::DEBUG)){
138 std::ostringstream ossR, ossZ;
140 for (
int i=0; i<8; ++i){
141 if(result_pat.test(i)){
152 std::ostringstream oss;
153 std::copy(result_index.begin(), result_index.end(), std::ostream_iterator<int>(oss,
" "));
154 ATH_MSG_DEBUG(
"patfinder: BEST pat= " << result_pat <<
" nHit: " << nHits_pat <<
" Idx: " << oss.str()
155 <<
" dMM= "<<result_dMM <<
" dMO= "<<result_dMO <<
" R_hits: " << ossR.str() <<
" Z_hits: " << ossZ.str()
156 <<
" Slopes: " << result_aw[0] <<
"," << result_aw[1] <<
"," << result_aw[2] <<
" Offsets: " << result_bw[0] <<
"," << result_bw[1] <<
"," << result_bw[2]);
168 const int N_layers=8;
170 const std::vector<std::vector<double>>& rpc_phi {rpcLayerHits.
hits_in_layer_phi};
173 if (rpc_phi.at(6).size()+rpc_phi.at(7).size()>0) l_start_max=5;
178 double result_dMM{9999}, result_dMO{9999};
182 for (
int l_start=0; l_start<=l_start_max; l_start++){
184 for (
const double& phi_start : rpc_phi.at(l_start)){
190 int current_l = l_start;
191 double current_phi = phi_start;
195 for (
int l_test=l_start+1; l_test<N_layers; l_test++){
196 double min_delta {999};
197 double layer_phi {0.};
199 for (
const double& phi_test : rpc_phi.at(l_test)){
202 if (
deltaOK(current_l,l_test,current_phi, phi_test,
true,delta)){
204 if (delta < min_delta) {
206 layer_phi = phi_test;
210 if (min_delta < 998){
212 current_phi = layer_phi;
214 dMO = (l_start<4 and l_test>=4) ? std::min(dMO, min_delta) : dMO;
215 dMM = (l_start<2 and l_test>=2 and l_test<4) or (l_start>=4 and l_start<5 and l_test>=6) ? std::min(dMM, min_delta) : dMM;
220 if (
nHits>nHits_pat and current_l > 1) {
224 phi_middle=phi_start;
225 phi_outer=current_phi;
226 }
else if (
nHits==nHits_pat and current_l > 1) {
228 if (dMM<result_dMM or (dMM==result_dMM and dMO<result_dMO)){
231 phi_middle=phi_start;
232 phi_outer=current_phi;
239 ATH_MSG_DEBUG(
"patfinder: BEST phi path dMM= "<<result_dMM <<
" dMO= "<<result_dMO
240 <<
" phi_middle= "<<phi_middle <<
" phi_outer= "<<phi_outer);
267 const double delta_gasgap_eta = 0.01;
268 const double delta_lowpt_eta = 0.05;
269 const double delta_highpt_eta = 0.1;
270 const double delta_feet_eta = 0.05;
272 const double delta_gasgap_phi = 0.01;
273 const double delta_lowpt_phi = 0.03;
274 const double delta_highpt_phi = 0.04;
275 const double delta_feet_phi = 0.03;
278 if(isphi) delta=std::abs(std::acos(std::cos(x2-x1)));
279 else delta=std::abs(x2-x1);
289 if (l2-l1==1&&(l1==0||l1==2||l1==4||l1==6)){
290 delta_max=delta_gasgap_phi;
291 }
else if (l1<2&&l2<4) {
292 delta_max=delta_lowpt_phi;
293 }
else if (l1<4&&l2>=4) {
294 delta_max=delta_highpt_phi;
295 }
else if (l1<6&&l1>=4&&l2>=6) {
296 delta_max=delta_feet_phi;
299 if (l2-l1==1&&(l1==0||l1==2||l1==4||l1==6)){
300 delta_max=delta_gasgap_eta;
301 }
else if (l1<2&&l2>=2&&l2<4) {
302 delta_max=delta_lowpt_eta;
303 }
else if (l1<4&&l2>=4) {
304 delta_max=delta_highpt_eta;
305 }
else if (l1<6&&l1>=4&&l2>=6) {
306 delta_max=delta_feet_eta;
313 if (delta<delta_max) OK=
true;
323 double DeltaPhi, temp_phi;
324 double calibPhi = std::acos(std::cos(Phi));
326 if(std::string::npos != stationName.rfind(
'L')){
327 DeltaPhi= 999; temp_phi=9999;
328 for(
int inum=0;inum < 8;inum++){
329 temp_phi = std::abs((inum *
M_PI/4.0 )- calibPhi);
330 if(temp_phi < DeltaPhi) DeltaPhi = temp_phi;
332 }
else if(std::string::npos != stationName.rfind(
'S') ||
333 std::string::npos != stationName.rfind(
'F') ||
334 std::string::npos != stationName.rfind(
'G') ){
335 DeltaPhi= 999; temp_phi=9999;
337 for(
int inum=0;inum < 8;inum++){
338 temp_phi = std::abs(inum *(
M_PI/4.0 )+(
M_PI/8.0) - calibPhi);
339 if(temp_phi < DeltaPhi) DeltaPhi = temp_phi;
343 double calibR = R *std::cos(DeltaPhi);
352 const std::array<size_t, 8>&
index,
353 std::array<std::reference_wrapper<double>, 3>& aw,
354 std::array<std::reference_wrapper<double>, 3>& bw,
357 const std::vector<std::vector<double>>& rpc_R {rpcLayerHits.
hits_in_layer_R};
358 const std::vector<std::vector<double>>& rpc_Z {rpcLayerHits.
hits_in_layer_Z};
361 auto getCompanion = [](
const int& l) ->
int {
362 return (l%2==0) ? l+1 : l-1;
365 auto getAvgRZ= [&rpc_R, &rpc_Z, &result_pat, &
index](
double& R,
double& Z,
int l,
int companion) ->
void {
366 const auto idxAtl =
index.at(l);
367 const auto idxAtComp =
index.at(companion);
368 if (result_pat.test(companion)){
369 R = (rpc_R.at(l).at(idxAtl) + rpc_R.at(companion).at(idxAtComp)) / 2.0;
370 Z = (rpc_Z.at(l).at(idxAtl) + rpc_Z.at(companion).at(idxAtComp)) / 2.0;
373 R = rpc_R.at(l).at(idxAtl);
374 Z = rpc_Z.at(l).at(idxAtl);
379 double R1{0}, R2{0}, Z1{0}, Z2{0};
380 for(
int i=0; i<4; i++){
381 if(!result_pat.test(i))
continue;
382 l1 = std::min(l1, i);
383 l2 = std::max(l2, i);
385 const int comp1{getCompanion(l1)}, comp2{getCompanion(l2)};
386 if (l1 != 4 and l1 != l2 and l2 != comp1){
388 getAvgRZ(R1, Z1, l1, comp1);
389 getAvgRZ(R2, Z2, l2, comp2);
392 if(((result_pat & std::bitset<8>(
"00001111")).
count() > 3) and std::abs(Z2-Z1) >
ZERO_LIMIT){
394 double theta_m {std::atan2(R1, Z1)};
395 double theta_t {std::atan2(R2-R1, Z2-Z1)};
396 double theta_f {(theta_m+theta_t)/2.};
398 aw[0].get() = std::tan(theta_f);
399 bw[0].get() = R1 - Z1*aw[0].get();
408 aw[1].get() = (R2-R1)/(Z2-Z1);
409 bw[1].get() = R2 - Z2*aw[1].get();
417 getAvgRZ(R1, Z1, l1, comp1);
420 aw[1].get() = aw[0].get();
427 double R3{0}, R4{0}, Z3{0}, Z4{0};
428 for(
int i=2; i<8; i++){
429 if(!result_pat.test(i))
continue;
430 l3 = std::min(l3, i);
431 l4 = std::max(l4, i);
433 const int comp3{getCompanion(l3)}, comp4{getCompanion(l4)};
434 if ( l3 != 8 and l3 != l4 and l4 != comp3){
436 getAvgRZ(R3, Z3, l3, comp3);
437 getAvgRZ(R4, Z4, l4, comp4);
440 aw[2].get() = (R4-R3)/(Z4-Z3);
441 bw[2].get() = R4 - Z4*aw[2].get();
449 getAvgRZ(R3, Z3, l3, comp3);
455 getAvgRZ(R3, Z3, l3, comp3);
457 aw[1].get() = aw[0].get();
460 getAvgRZ(R2, Z2, l2, comp2);
void abcal(const std::bitset< 8 > &result_pat, const std::array< size_t, 8 > &index, std::array< std::reference_wrapper< double >, 3 > &aw, std::array< std::reference_wrapper< double >, 3 > &bw, const TrigL2MuonSA::RpcLayerHits &rpcLayerHits) const
void addHit(const std::string &stationName, int stationEta, bool measuresPhi, unsigned int gasGap, unsigned int doubletR, double gPosX, double gPosY, double gPosZ, TrigL2MuonSA::RpcLayerHits &rpcLayerHits) const