diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/python/MMMonitorAlgorithm.py b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/python/MMMonitorAlgorithm.py index 3d2c55248381762098ccdf57e0893a36f1cb02b4..8341cf6ecb318e47ecdc16b767a3dd9b92f0a725 100644 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/python/MMMonitorAlgorithm.py +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/python/MMMonitorAlgorithm.py @@ -1,6 +1,5 @@ # -#Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration - +#Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration # from AthenaConfiguration.ComponentFactory import CompFactory @@ -37,6 +36,15 @@ def MMMonitoringConfig(inputFlags): # Configure histograms # Overview histograms + mmGroup.defineHistogram('residual;Residuals', type='TH1F', title='Residuals;res[mm];Number of Entries', + path='Overview', xbins=200, xmin=-10, xmax=10. + ) + + + mmGroup.defineHistogram('residual,eta_trk;Res_vs_eta', type='TH2F', title="Res vs Eta;Res;Eta;", path='Overview',xbins=100, xmin=-10, xmax=10., ybins=100, ymin=-3.,ymax=3.) + mmGroup.defineHistogram('residual,phi_trk;Res_vs_phi', type='TH2F', title="Res vs Eta;Res;Phi;", path='Overview',xbins=100, xmin=-10, xmax=10., ybins=16, ymin=-3.14,ymax=3.14) + mmGroup.defineHistogram('residual,stPhi_mon;Res_vs_stPhi', type='TH2F', title="Res vs Eta;Res;stPhi;", path='Overview',xbins=100, xmin=-10, xmax=10., ybins=16, ymin=0,ymax=16) + mmGroup.defineHistogram('charge_all;Charge', type='TH1F', title='Charge;Charge[fC];Number of Entries', path='Overview', xbins=120, xmin=0., xmax=1200. @@ -148,6 +156,11 @@ def MMMonitoringConfig(inputFlags): title_MMSummary_angle="uTPC angle "+iside+" "+isector+" stPhi"+str(phi)+" stEta"+str(eta)+" multiplet"+str(multi)+" gap"+str(gas_gap) var3="mu_TPC_angle_"+iside+"_sector_"+isector+"_phi"+str(phi)+"_stationEta"+str(eta)+"_multiplet"+str(multi)+"_gas_gap"+str(gas_gap)+";uTPCangle_"+iside+"_"+isector+"_stPhi"+str(phi)+"_stEta"+str(eta)+"_multiplet"+str(multi)+"_gap"+str(gas_gap) mmSideGroup.defineHistogram(var3, type='TH1F', title=title_MMSummary_angle+"; #muTPC angle [degrees];Number of Entries",path='uTPC_angle_perLayer', xbins=2000, xmin=-100, xmax=100) + + var_residual="residuals_"+iside+"_phi"+str(phi)+"_stationEta"+str(eta)+"_multiplet"+str(multi)+"_gas_gap"+str(gas_gap) + print(var_residual) + title_residual = "residuals "+iside+" "+isector+" stPhi"+str(phi)+" stEta"+str(eta)+" multiplet"+str(multi)+" gap"+str(gas_gap) + mmSideGroup.defineHistogram(var_residual, type='TH1F', title=title_residual+"; res [mm];Number of Entries",path='Residuals', xbins=200, xmin=-10, xmax=10) for gas1 in range(1, 5): for multi1 in range(1, 3): @@ -172,11 +185,25 @@ if __name__=='__main__': # Set the Athena configuration flags from AthenaConfiguration.AllConfigFlags import ConfigFlags - #ConfigFlags.Input.Files = ['/afs/cern.ch/work/e/elrossi/DQ_Run3/WorkDir/group.det-muon/group.det-muon.21673292.EXT1._000048.ESD.pool.root'] - #ConfigFlags.Input.Files = ['/afs/cern.ch/work/e/elrossi/DQ_Run3/WorkDir/group.det-muon_Sym/group.det-muon.21823259.EXT1._000045_uTPC.ESD.pool.root'] #ConfigFlags.Input.Files = ["/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_uTPC_v01_EXT1/group.det-muon.21673283.EXT1._000037.ESD.pool.root"] - #ConfigFlags.Input.Files = ['/afs/cern.ch/work/e/elrossi/DQ_updated_308/WorkDir/group.det-muon/group.det-muon.22415666.EXT1._000048.ESD.pool.root'] - ConfigFlags.Input.Files = ['/afs/cern.ch/work/e/elrossi/DQ_Run3/WorkDir/group.det-muon_Sym/group.det-muon.21670802.EXT1._000006.ESD.pool.root','/afs/cern.ch/work/e/elrossi/DQ_updated/WorkDir/group.det-muon_Sym/group.det-muon.21670802.EXT1._000045.ESD.pool.root','/afs/cern.ch/work/e/elrossi/DQ_updated/WorkDir/group.det-muon_Sym/group.det-muon.21670802.EXT1._000030.ESD.pool.root','/afs/cern.ch/work/e/elrossi/DQ_updated/WorkDir/group.det-muon_Sym/group.det-muon.21670802.EXT1._000046.ESD.pool.root','/afs/cern.ch/work/e/elrossi/DQ_updated/WorkDir/group.det-muon_Sym/group.det-muon.21670802.EXT1._000014.ESD.pool.root'] + ConfigFlags.Input.Files = ["/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000002.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000006.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000008.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000009.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000012.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000015.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000017.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000018.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000019.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000020.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000021.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000023.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000028.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000032.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000033.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000041.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000043.ESD.pool.root", + "/afs/cern.ch/user/b/bigliett/work/DQ/group.det-muon.DiMuon10_100GeV.ESD.rel213_2020-06-18T2149_R3S_v01_EXT1/group.det-muon.21670802.EXT1._000050.ESD.pool.root"] #from AthenaCommon.AthenaCommonFlags import athenaCommonFlags # ConfigFlags.Input.isMC = True ConfigFlags.Output.HISTFileName = 'monitor.root' @@ -198,4 +225,4 @@ if __name__=='__main__': cfg.merge(mmMonitorAcc) #cfg.printConfig(withDetails=True, summariseProps = True) # number of events selected in the ESD - cfg.run(1000) + cfg.run(2000) diff --git a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/src/MMRawDataMonAlg.cxx b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/src/MMRawDataMonAlg.cxx index f7c30ff74ee0096fee0c91a8db3ca1bcb70da339..8ca9d8ae97a5a168c69905c811ec636934397780 100755 --- a/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/src/MMRawDataMonAlg.cxx +++ b/MuonSpectrometer/MuonValidation/MuonDQA/MuonRawDataMonitoring/MMRawDataMonitoring/src/MMRawDataMonAlg.cxx @@ -87,6 +87,7 @@ namespace { std::vector<float> mu_TPC_angle; std::vector<float> x_ontrack; std::vector<float> y_ontrack; + std::vector<float> residuals; }; } @@ -216,6 +217,7 @@ StatusCode MMRawDataMonAlg::fillMMOverviewVects( const Muon::MMPrepData* prd, MM vects.R_mon.push_back(R); + //MMS and MML phi sectors int phisec=0; if (stationNumber%2 == 0) phisec=1; @@ -355,7 +357,8 @@ StatusCode MMRawDataMonAlg::fillMMSummaryVects( const Muon::MMPrepData* prd, MMS // Filling Vectors for both sides, considering each strip Vectors.strip_number.push_back(stripNumbers[sIdx]); - Vectors.sector_strip.push_back(get_bin_for_occ_ASide_hist(stationEta,multiplet,gas_gap)); + if(iside==1) Vectors.sector_strip.push_back(get_bin_for_occ_ASide_hist(stationEta,multiplet,gas_gap)); + if(iside==0) Vectors.sector_strip.push_back(get_bin_for_occ_CSide_hist(stationEta,multiplet,gas_gap)); } @@ -408,27 +411,31 @@ StatusCode MMRawDataMonAlg::fillMMHistograms( const Muon::MMPrepData* ) const{ void MMRawDataMonAlg::clusterFromTrack(const xAOD::TrackParticleContainer* muonContainer, int lb) const{ MMSummaryHistogramStruct summaryPlots[2][2][4]; + MMSummaryHistogramStruct summaryPlots_full[2][16][2][2][4]; MMOverviewHistogramStruct overviewPlots; + int nmu=0; for (const xAOD::TrackParticle* meTP : *muonContainer){ if (meTP) { nmu++; + auto eta_trk = Monitored::Scalar<float>("eta_trk", meTP->eta()); + auto phi_trk = Monitored::Scalar<float>("phi_trk", meTP->phi()); // retrieve the original track const Trk::Track* meTrack = meTP->track(); if (meTrack) { // get the vector of measurements on track - + const DataVector<const Trk::MeasurementBase>* meas = meTrack->measurementsOnTrack(); + for(const Trk::MeasurementBase* it: *meas){ const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(it); if (rot) { - Identifier rot_id = rot->identify(); if (m_idHelperSvc->isMM(rot_id)) { const Muon::MMClusterOnTrack* cluster = dynamic_cast<const Muon::MMClusterOnTrack*>(rot); @@ -479,12 +486,71 @@ void MMRawDataMonAlg::clusterFromTrack(const xAOD::TrackParticleContainer* muon vects.sector_lb_ASide_eta2_ontrack.push_back(get_bin_for_occ_lb_ASide_pcb_eta2_hist(stEta,multi,gap,PCB,phisec)); } - + + float x = cluster->localParameters()[Trk::loc1] ; + + for (const Trk::TrackStateOnSurface* trkState: *meTrack->trackStateOnSurfaces()) { + + if(!(trkState)) continue; + Identifier surfaceId = (trkState)->surface().associatedDetectorElementIdentifier(); + if(!m_idHelperSvc->isMM(surfaceId)) continue; + + int trk_stEta= m_idHelperSvc->mmIdHelper().stationEta(surfaceId); + int trk_stPhi= m_idHelperSvc->mmIdHelper().stationPhi(surfaceId); + int trk_multi = m_idHelperSvc->mmIdHelper().multilayer(surfaceId); + int trk_gap= m_idHelperSvc->mmIdHelper().gasGap(surfaceId); + if( trk_stPhi==stPhi and trk_stEta==stEta and trk_multi==multi and trk_gap==gap ){ + double x_trk = trkState->trackParameters()->parameters()[Trk::loc1]; + double y_trk = trkState->trackParameters()->parameters()[Trk::locY]; + + int stPhi16=0; + if (stName=="MML") stPhi16=2*stPhi-1; + + if (stName=="MMS") stPhi16=2*stPhi; + + int iside=0; + if(stEta>0) iside=1; + + float stereo_angle= 0.02618; + // float stereo_correction=stereo_angle*y_trk; + float stereo_correction=sin(stereo_angle)*y_trk; + if(multi==1 && gap<3) stereo_correction=0; + if(multi==2 && gap>2) stereo_correction=0; + if(multi==1 && gap==3 ) stereo_correction*=-1; + if(multi==2 && gap==1 ) stereo_correction*=-1; + if(multi==1 && gap<3) stereo_angle=0; + if(multi==2 && gap>2) stereo_angle=0; + float res_stereo = (x - x_trk)*cos(stereo_angle) - stereo_correction; + auto residual_mon = Monitored::Scalar<float>("residual", res_stereo); + auto stPhi_mon = Monitored::Scalar<float>("stPhi_mon",stPhi16); + fill("mmMonitor",residual_mon, eta_trk, phi_trk, stPhi_mon); + int abs_stEta= get_sectorEta_from_stationEta(stEta); + auto& vectors = summaryPlots_full[iside][stPhi16-1][abs_stEta-1][multi-1][gap-1]; + vectors.residuals.push_back(res_stereo); + } + } } //if cluster } //isMM } // if rot } // loop on meas + for (int iside=0;iside<2;iside++){ + std::string MM_sideGroup = "MM_sideGroup"+MM_Side[iside]; + for( int statPhi=0; statPhi<16; statPhi++) { + for( int statEta=0; statEta<2; statEta++) { + for( int multiplet=0; multiplet<2; multiplet++) { + for( int gas_gap=0; gas_gap<4; gas_gap++) { + auto& vects=summaryPlots_full[iside][statPhi][statEta][multiplet][gas_gap];; + auto residuals_gap = Monitored::Collection("residuals_"+MM_Side[iside]+"_phi"+std::to_string(statPhi+1)+"_stationEta"+EtaSector[statEta]+"_multiplet"+std::to_string(multiplet+1)+"_gas_gap"+std::to_string(gas_gap+1),vects.residuals); + std::string MM_GapGroup = "MM_GapGroup"+std::to_string(gas_gap+1); + + fill(MM_sideGroup,residuals_gap); + } + }}}} + + + + for (const Trk::TrackStateOnSurface* trkState: *meTrack->trackStateOnSurfaces()) { if(!(trkState)) continue; @@ -500,13 +566,12 @@ void MMRawDataMonAlg::clusterFromTrack(const xAOD::TrackParticleContainer* muon int iside=0; if(stEta>0) iside=1; - auto& Vectors = summaryPlots[iside][multi-1][gap-1]; - + auto& Vectors = summaryPlots[iside][multi-1][gap-1]; + //Filling x-y position vectors using the trackStateonSurface - Vectors.x_ontrack.push_back(pos.x()); - Vectors.y_ontrack.push_back(pos.y()); - - + Vectors.x_ontrack.push_back(pos.x()); + Vectors.y_ontrack.push_back(pos.y()); + } } // if meTrack } // if muon