87StatusCode L2MuonSAIOMon :: fillVariablesPerOfflineMuonPerChain(
const EventContext& ctx,
const xAOD::Muon* mu,
const std::string &chain)
const {
100 offPt = mu->pt()/1e3 * mu->charge();
103 float offCharge = mu->charge();
106 if( chain.find(
"probe") != std::string::npos ){
107 if(chain.find(
"L1MU14FCH") != std::string::npos){
110 else if(chain.find(
"L1MU18VFCH") != std::string::npos){
115 return StatusCode::SUCCESS;
120 if( tag ==
nullptr )
return StatusCode::SUCCESS;
127 const auto* tag_ms_track = tag->trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle);
128 if( !tag_ms_track)
return StatusCode::SUCCESS;
129 const auto* probe_ms_track = mu->trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle);
130 if( !probe_ms_track )
return StatusCode::SUCCESS;
133 passL2InsideOut =
false;
137 int legIndex_probe = 1;
146 ATH_CHECK( probe_L2SALinkInfo.isValid() );
148 if(
m_matchTool->isMatchedL2SA( (*probe_L2SAobject), mu ) ){
153 if(passL2SA ==
true){
154 if(
m_matchTool->isMatchedL2InsideOut( Trig_L2IOobject, mu ))
158 passL2InsideOut = isPass;
162 return StatusCode::SUCCESS;
166 fill(
m_group+
"_"+chain, passL2InsideOut, passL2SA, offPt);
169 fill(
m_group+
"_"+chain, passL2InsideOut, passL2SA, offEta, offPhi, offdR);
173 if( Trig_L2IOobject ==
nullptr )
return StatusCode::SUCCESS;
174 if( !
m_matchTool->isMatchedL2InsideOut(Trig_L2IOobject, mu) )
return StatusCode::SUCCESS;
186 std::vector< int > L2Muon_chamberID_index;
187 auto mon_L2Muon_chamberID_index =
Monitored::Collection(chain+
"_L2Muon_chamberID_index",L2Muon_chamberID_index);
188 for(
int i = 0; i < 6; i++){
189 L2Muon_chamberID_index.push_back(i);
197 const float ETA_OF_BARREL = 1.05;
212 if( std::abs(offEta) < ETA_OF_BARREL ) {
215 if( offEta > 0. ) isBarrelA =
true;
216 else isBarrelC =
true;
221 if( offEta > 0. ) isEndcapA =
true;
222 else isEndcapC =
true;
225 if( std::abs(offPt) > 4 ){
226 if( std::abs(offPt) < 6 ) pt4to6 =
true;
227 else if( std::abs(offPt) < 8 ) pt6to8 =
true;
235 cbioPt = Trig_L2IOobject->
pt()/1e3 * Trig_L2IOobject->
charge();
236 cbioEta = Trig_L2IOobject->
eta();
237 cbioPhi = Trig_L2IOobject->
phi();
241 L2InsideOut_multiplicity = 0;
242 std::vector< const xAOD::L2CombinedMuon* > Trig_L2IOobjects_tmp;
244 for(
const auto& Trig_L2IOobject_tmp : Trig_L2IOobjects_tmp){
245 if( Trig_L2IOobject_tmp->muSATrack()->roiWord() == Trig_L2IOobject->
muSATrack()->
roiWord() ) L2InsideOut_multiplicity++;
251 ptresol = std::abs(cbioPt)/std::abs(offPt) - 1.;
254 std::vector< float > ptresol_pos, ptresol_neg;
257 if( offCharge > 0. ) ptresol_pos.push_back(ptresol);
258 else ptresol_neg.push_back(ptresol);
261 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Inn_Barrel;
262 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Mid_Barrel;
263 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Out_Barrel;
264 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Inn_Endcap;
265 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Mid_Endcap;
266 std::vector< float > distance_bw_FTFroad_and_offlinesegment_Out_Endcap;
267 auto mon_distance_bw_FTFroad_and_offlinesegment_Inn_Barrel =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Inn_Barrel",distance_bw_FTFroad_and_offlinesegment_Inn_Barrel);
268 auto mon_distance_bw_FTFroad_and_offlinesegment_Mid_Barrel =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Mid_Barrel",distance_bw_FTFroad_and_offlinesegment_Mid_Barrel);
269 auto mon_distance_bw_FTFroad_and_offlinesegment_Out_Barrel =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Out_Barrel",distance_bw_FTFroad_and_offlinesegment_Out_Barrel);
270 auto mon_distance_bw_FTFroad_and_offlinesegment_Inn_Endcap =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Inn_Endcap",distance_bw_FTFroad_and_offlinesegment_Inn_Endcap);
271 auto mon_distance_bw_FTFroad_and_offlinesegment_Mid_Endcap =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Mid_Endcap",distance_bw_FTFroad_and_offlinesegment_Mid_Endcap);
272 auto mon_distance_bw_FTFroad_and_offlinesegment_Out_Endcap =
Monitored::Collection(chain+
"_distance_bw_FTFroad_and_offlinesegment_Out_Endcap",distance_bw_FTFroad_and_offlinesegment_Out_Endcap);
274 std::vector< float > distance_bw_FTFroad_and_offlinesegment_vec;
275 std::vector< float > FTFroad_Aw;
276 std::vector< float > FTFroad_Bw;
277 std::vector< bool > FTFroad_fill;
278 for(
int i=0; i<6; i++){
279 distance_bw_FTFroad_and_offlinesegment_vec.push_back(10000.);
282 FTFroad_fill.push_back(
false);
286 std::vector<float> res_Inn_Barrel, res_Mid_Barrel, res_Out_Barrel, res_Inn_Endcap, res_Mid_Endcap, res_Out_Endcap;
295 std::vector< float > distance_bw_MDT_and_offlinesegment_Inn_Barrel;
296 std::vector< float > distance_bw_MDT_and_offlinesegment_Mid_Barrel;
297 std::vector< float > distance_bw_MDT_and_offlinesegment_Out_Barrel;
298 std::vector< float > distance_bw_MDT_and_offlinesegment_Inn_Endcap;
299 std::vector< float > distance_bw_MDT_and_offlinesegment_Mid_Endcap;
300 std::vector< float > distance_bw_MDT_and_offlinesegment_Out_Endcap;
301 auto mon_distance_bw_MDT_and_offlinesegment_Inn_Barrel =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Inn_Barrel",distance_bw_MDT_and_offlinesegment_Inn_Barrel);
302 auto mon_distance_bw_MDT_and_offlinesegment_Mid_Barrel =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Mid_Barrel",distance_bw_MDT_and_offlinesegment_Mid_Barrel);
303 auto mon_distance_bw_MDT_and_offlinesegment_Out_Barrel =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Out_Barrel",distance_bw_MDT_and_offlinesegment_Out_Barrel);
304 auto mon_distance_bw_MDT_and_offlinesegment_Inn_Endcap =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Inn_Endcap",distance_bw_MDT_and_offlinesegment_Inn_Endcap);
305 auto mon_distance_bw_MDT_and_offlinesegment_Mid_Endcap =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Mid_Endcap",distance_bw_MDT_and_offlinesegment_Mid_Endcap);
306 auto mon_distance_bw_MDT_and_offlinesegment_Out_Endcap =
Monitored::Collection(chain+
"_distance_bw_MDT_and_offlinesegment_Out_Endcap",distance_bw_MDT_and_offlinesegment_Out_Endcap);
307 std::vector< float > distance_bw_MDT_and_offlinesegment_vec;
308 std::vector< int > MDTHitChamber_fill;
309 std::vector< int > MDTHitChamber;
310 std::vector< float > MDTHitR;
311 std::vector< float > MDTHitZ;
314 std::vector<int> MDT_N_Inn_Barrel, MDT_N_Mid_Barrel, MDT_N_Out_Barrel, MDT_N_Inn_Endcap, MDT_N_Mid_Endcap, MDT_N_Out_Endcap;
321 int n_mdthits_BI = 0;
322 int n_mdthits_BM = 0;
323 int n_mdthits_BO = 0;
324 int n_mdthits_EI = 0;
325 int n_mdthits_EM = 0;
326 int n_mdthits_EO = 0;
329 for(
int i_tube=0; i_tube<n_mdt_hits; i_tube++){
333 MDTHitChamber.push_back(imr);
337 if( imr == Inn_Barrel ){
339 res_Inn_Barrel.push_back(
res);
341 else if( imr == Mid_Barrel ){
343 res_Mid_Barrel.push_back(
res);
345 else if( imr == Out_Barrel ){
347 res_Out_Barrel.push_back(
res);
349 else if( imr == Inn_Endcap ){
351 res_Inn_Endcap.push_back(
res);
353 else if( imr == Mid_Endcap ){
355 res_Mid_Endcap.push_back(
res);
357 else if( imr == Out_Endcap ){
359 res_Out_Endcap.push_back(
res);
364 std::vector<bool> superpoint_exist_pt4to6, superpoint_exist_pt6to8, superpoint_exist_ptover8;
365 auto mon_superpoint_exist_pt4to6 =
Monitored::Collection(chain+
"_superpoint_pt4to6",superpoint_exist_pt4to6);
366 auto mon_superpoint_exist_pt6to8 =
Monitored::Collection(chain+
"_superpoint_pt6to8",superpoint_exist_pt6to8);
367 auto mon_superpoint_exist_ptover8 =
Monitored::Collection(chain+
"_superpoint_ptover8",superpoint_exist_ptover8);
368 std::vector<bool> segment_superpoint_exist(6,
false);
369 std::vector<bool> offlinesegment_exist_pt4to6, offlinesegment_exist_pt6to8, offlinesegment_exist_ptover8;
370 auto mon_offlinesegment_exist_pt4to6 =
Monitored::Collection(chain+
"_offlinesegment_pt4to6",offlinesegment_exist_pt4to6);
371 auto mon_offlinesegment_exist_pt6to8 =
Monitored::Collection(chain+
"_offlinesegment_pt6to8",offlinesegment_exist_pt6to8);
372 auto mon_offlinesegment_exist_ptover8 =
Monitored::Collection(chain+
"_offlinesegment_ptover8",offlinesegment_exist_ptover8);
376 std::vector< bool > superpoint_exist;
377 std::vector< float > superpointR;
378 int Num_L2Muon_chamberID = 12;
379 for(
int i_chamber = 0; i_chamber < Num_L2Muon_chamberID; i_chamber++){
381 superpoint_exist.push_back(
false);
384 superpoint_exist.push_back(
true);
385 superpoint_multiplicity++;
391 std::vector< bool > segment_exist(6,
false);
392 for(
unsigned int i_seg = 0; i_seg < mu->nMuonSegments(); i_seg++){
394 if(!segment)
continue;
395 float segmentX = segment->
x();
396 float segmentY = segment->
y();
397 float segmentZ = segment->
z();
398 float segmentR = std::sqrt( std::pow(segmentX, 2.0) + std::pow(segmentY, 2.0) );
399 float segmentPx = segment->
px();
400 float segmentPy = segment->
py();
401 float segmentPz = segment->
pz();
402 float segmentSector = segment->
sector();
405 float distance_bw_FTFroad_and_offlinesegment = 99999.;
406 float distance_bw_MDT_and_offlinesegment = 99999.;
407 int roadChamberIndex = -1;
408 int MDTChamberIndex = -1;
409 if( segmentChamberIndex == 0 || segmentChamberIndex == 1 ){
410 segment_exist.at(Inn_Barrel) =
true;
411 roadChamberIndex = Inn_Barrel;
412 MDTChamberIndex = Inn_Barrel;
414 else if( segmentChamberIndex == 2 || segmentChamberIndex == 3 ){
415 segment_exist.at(Mid_Barrel) =
true;
416 roadChamberIndex = Mid_Barrel;
417 MDTChamberIndex = Mid_Barrel;
419 else if( segmentChamberIndex == 4 || segmentChamberIndex == 5 ){
420 segment_exist.at(Out_Barrel) =
true;
421 roadChamberIndex = Out_Barrel;
422 MDTChamberIndex = Out_Barrel;
424 else if( segmentChamberIndex == 7 || segmentChamberIndex == 8 ){
425 segment_exist.at(Inn_Endcap) =
true;
426 roadChamberIndex = Inn_Endcap;
427 MDTChamberIndex = Inn_Endcap;
429 else if( segmentChamberIndex == 9 || segmentChamberIndex == 10 ){
430 segment_exist.at(Mid_Endcap) =
true;
431 roadChamberIndex = Mid_Endcap;
432 MDTChamberIndex = Mid_Endcap;
434 else if( segmentChamberIndex == 11 || segmentChamberIndex == 12 ){
435 segment_exist.at(Out_Endcap) =
true;
436 roadChamberIndex = Out_Endcap;
437 MDTChamberIndex = Out_Endcap;
441 if( roadChamberIndex != -1 ){
442 if( FTFroad_Aw.at(roadChamberIndex) >
ZERO_LIMIT || FTFroad_Bw.at(roadChamberIndex) >
ZERO_LIMIT ){
443 FTFroad_fill.at(roadChamberIndex) =
true;
444 if( FTFroad_Aw.at(roadChamberIndex) <
ZERO_LIMIT) distance_bw_FTFroad_and_offlinesegment = segmentR - FTFroad_Bw.at(roadChamberIndex);
446 float ia = 1.0/FTFroad_Aw.at(roadChamberIndex);
448 distance_bw_FTFroad_and_offlinesegment = (segmentZ - ia * (segmentR - FTFroad_Bw.at(roadChamberIndex)))/std::sqrt(1.0 + iaq);
450 if( std::abs(distance_bw_FTFroad_and_offlinesegment) < std::abs(distance_bw_FTFroad_and_offlinesegment_vec.at(roadChamberIndex)) )
451 distance_bw_FTFroad_and_offlinesegment_vec.at(roadChamberIndex) = distance_bw_FTFroad_and_offlinesegment;
456 if( MDTChamberIndex != -1 ){
457 float sector_phi =
M_PI*(segmentSector - 1.0)/8.0;
458 float segmentR_projection = segmentX * std::cos(sector_phi) + segmentY * std::sin(sector_phi);
459 float segmentPr_projection = segmentPx * std::cos(sector_phi) + segmentPy * std::sin(sector_phi);
461 for(
unsigned int i_tube=0; i_tube<MDTHitChamber.size(); i_tube++){
462 if( MDTHitChamber.at(i_tube) != MDTChamberIndex )
continue;
463 if( MDTChamberIndex < 3 ){
464 if( std::abs(segmentPz) <
ZERO_LIMIT ) distance_bw_MDT_and_offlinesegment = MDTHitZ.at(i_tube) - segmentZ;
466 float denominator = segmentPr_projection/segmentPz;
467 if( std::abs(denominator) <
ZERO_LIMIT )
continue;
468 distance_bw_MDT_and_offlinesegment = MDTHitZ.at(i_tube) - ((MDTHitR.at(i_tube) - segmentR_projection)/denominator + segmentZ);
473 distance_bw_MDT_and_offlinesegment = MDTHitR.at(i_tube) - segmentR;
476 float coeffi = (MDTHitZ.at(i_tube) - segmentZ)/segmentPz;
477 float segmentR_extrapolated = std::sqrt(std::pow(segmentX + coeffi * segmentPx, 2.0) + std::pow(segmentY + coeffi * segmentPy, 2.0));
478 distance_bw_MDT_and_offlinesegment = MDTHitR.at(i_tube) - segmentR_extrapolated;
481 distance_bw_MDT_and_offlinesegment_vec.push_back(distance_bw_MDT_and_offlinesegment);
482 MDTHitChamber_fill.push_back(MDTHitChamber.at(i_tube));
487 if( FTFroad_fill.at(Inn_Barrel) ){
488 distance_bw_FTFroad_and_offlinesegment_Inn_Barrel.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Inn_Barrel));
490 if( FTFroad_fill.at(Mid_Barrel) ){
491 distance_bw_FTFroad_and_offlinesegment_Mid_Barrel.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Mid_Barrel));
493 if( FTFroad_fill.at(Out_Barrel) ){
494 distance_bw_FTFroad_and_offlinesegment_Out_Barrel.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Out_Barrel));
496 if( FTFroad_fill.at(Inn_Endcap) ){
497 distance_bw_FTFroad_and_offlinesegment_Inn_Endcap.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Inn_Endcap));
499 if( FTFroad_fill.at(Mid_Endcap) ){
500 distance_bw_FTFroad_and_offlinesegment_Mid_Endcap.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Mid_Endcap));
502 if( FTFroad_fill.at(Out_Endcap) ){
503 distance_bw_FTFroad_and_offlinesegment_Out_Endcap.push_back(distance_bw_FTFroad_and_offlinesegment_vec.at(Out_Endcap));
506 for(
unsigned int i = 0; i < distance_bw_MDT_and_offlinesegment_vec.size(); i++ ){
507 if( MDTHitChamber_fill.at(i) == Inn_Barrel ){
508 distance_bw_MDT_and_offlinesegment_Inn_Barrel.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
510 else if( MDTHitChamber_fill.at(i) == Mid_Barrel ){
511 distance_bw_MDT_and_offlinesegment_Mid_Barrel.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
513 else if( MDTHitChamber_fill.at(i) == Out_Barrel ){
514 distance_bw_MDT_and_offlinesegment_Out_Barrel.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
516 else if( MDTHitChamber_fill.at(i) == Inn_Endcap ){
517 distance_bw_MDT_and_offlinesegment_Inn_Endcap.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
519 else if( MDTHitChamber_fill.at(i) == Mid_Endcap ){
520 distance_bw_MDT_and_offlinesegment_Mid_Endcap.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
522 else if( MDTHitChamber_fill.at(i) == Out_Endcap ){
523 distance_bw_MDT_and_offlinesegment_Out_Endcap.push_back(distance_bw_MDT_and_offlinesegment_vec.at(i));
526 ATH_MSG_WARNING(
"undefined chamberID is pushed back into MDTHitChamber_fill" );
530 if( segment_exist.at(Inn_Barrel) ){
531 MDT_N_Inn_Barrel.push_back(n_mdthits_BI);
532 segment_superpoint_exist.at(Inn_Barrel) = superpoint_exist.at(Inn_Barrel);
534 if( segment_exist.at(Mid_Barrel) ){
535 MDT_N_Mid_Barrel.push_back(n_mdthits_BM);
536 segment_superpoint_exist.at(Mid_Barrel) = superpoint_exist.at(Mid_Barrel);
538 if( segment_exist.at(Out_Barrel) ){
539 MDT_N_Out_Barrel.push_back(n_mdthits_BO);
540 segment_superpoint_exist.at(Out_Barrel) = superpoint_exist.at(Out_Barrel);
542 if( segment_exist.at(Inn_Endcap) ){
543 MDT_N_Inn_Endcap.push_back(n_mdthits_EI);
544 segment_superpoint_exist.at(Inn_Endcap) = superpoint_exist.at(Inn_Endcap);
546 if( segment_exist.at(Mid_Endcap) ){
547 MDT_N_Mid_Endcap.push_back(n_mdthits_EM);
548 segment_superpoint_exist.at(Mid_Endcap) = superpoint_exist.at(Mid_Endcap);
550 if( segment_exist.at(Out_Endcap) ){
551 MDT_N_Out_Endcap.push_back(n_mdthits_EO);
552 segment_superpoint_exist.at(Out_Endcap) = superpoint_exist.at(Out_Endcap);
556 offlinesegment_exist_pt4to6 = segment_exist;
557 superpoint_exist_pt4to6 = segment_superpoint_exist;
560 offlinesegment_exist_pt6to8 = segment_exist;
561 superpoint_exist_pt6to8 = segment_superpoint_exist;
564 offlinesegment_exist_ptover8 = segment_exist;
565 superpoint_exist_ptover8 = segment_superpoint_exist;
573 fill(
m_group+
"_"+chain, ptresol, offEta, pt4to6, pt6to8, ptover8);
574 fill(
m_group+
"_"+chain, ptresol, offPt, isBarrelA, isBarrelC, isEndcapA, isEndcapC);
575 fill(
m_group+
"_"+chain, mon_ptresol_pos, mon_ptresol_neg, isBarrelA, isBarrelC, isEndcapA, isEndcapC);
576 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Inn_Barrel, pt4to6, pt6to8, ptover8);
577 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Mid_Barrel, pt4to6, pt6to8, ptover8);
578 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Out_Barrel, pt4to6, pt6to8, ptover8);
579 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Inn_Endcap, pt4to6, pt6to8, ptover8);
580 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Mid_Endcap, pt4to6, pt6to8, ptover8);
581 fill(
m_group+
"_"+chain, mon_distance_bw_FTFroad_and_offlinesegment_Out_Endcap, pt4to6, pt6to8, ptover8);
588 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Inn_Barrel);
589 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Mid_Barrel);
590 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Out_Barrel);
591 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Inn_Endcap);
592 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Mid_Endcap);
593 fill(
m_group+
"_"+chain, mon_distance_bw_MDT_and_offlinesegment_Out_Endcap);
600 fill(
m_group+
"_"+chain, superpoint_multiplicity, regionBE, pt4to6, pt6to8, ptover8);
601 fill(
m_group+
"_"+chain, mon_L2Muon_chamberID_index, mon_superpoint_exist_pt4to6, mon_offlinesegment_exist_pt4to6);
602 fill(
m_group+
"_"+chain, mon_L2Muon_chamberID_index, mon_superpoint_exist_pt6to8, mon_offlinesegment_exist_pt6to8);
603 fill(
m_group+
"_"+chain, mon_L2Muon_chamberID_index, mon_superpoint_exist_ptover8, mon_offlinesegment_exist_ptover8);
606 return StatusCode::SUCCESS;