diff --git a/DQMServices/FileIO/scripts/blacklist.py b/DQMServices/FileIO/scripts/blacklist.py new file mode 100644 index 0000000000000..273f91af9201d --- /dev/null +++ b/DQMServices/FileIO/scripts/blacklist.py @@ -0,0 +1,380 @@ + +def get_blacklist(RUN_NR): + return { + ('DQMData', 'Run %s' % RUN_NR, 'AlCaReco', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'AlCaReco', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'AlCaReco', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'AlCaReco', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_real_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_thread_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'event time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_real_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_thread_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'explicit time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_real_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_thread_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process DQM time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process PAT time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process RECO time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_real_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_thread_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'process reRECO time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source allocated_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source allocated_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source allocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source deallocated_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source deallocated_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source deallocated_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_real'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_real_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_real_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_real_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_thread'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_thread_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_thread_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'source time_thread_byls'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead allocated_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead allocated_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead deallocated_VsPU'), + ('DQMData', 'Run %s' % RUN_NR, 'DQM', 'Run summary', 'TimerService', 'overhead deallocated_VsScalLumi'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'DT', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Ecal', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'HLT', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TStage2uGMT', 'ugmtMuonPhi.muon_phiSpectrum'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TStage2uGMT', 'ugmtMuonPhiAtVtx.muon_phiSpectrum'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TStage2uGMT', 'ugmtMuonPhiEmtf.uGMT_EMTFMuonPhiSpectrum'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1T', 'Run summary', 'L1TriggerVsReco', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'L1TEMU', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'MessageLogger', 'Run summary', 'Errors', 'total_errors'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phiVSeta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phiVSeta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phiVseta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phiVseta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phiVSeta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phiVSeta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_qComparison.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'GlbRh_Div_RhAssoStaTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_GlbSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkGlb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_GlbSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkGlb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_GlbSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_TkGlb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'Res_TuneP_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaEta_ifCombinedAlso.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaPhi_ifCombinedAlso.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaRh_Frac_inGlb.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'StaRh_inGlb_Div_RhAssoSta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkRh_Frac_inGlb.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'TkRh_inGlb_Div_RhAssoTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'invalidRh_Frac_inTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'muVStkSytemRotation_negMu.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons', 'Run summary', 'MuonRecoAnalyzer', 'muVStkSytemRotation_posMu.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phiVSeta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_phiVSeta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Glb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phiVseta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_phiVseta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Sta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phiVSeta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_phiVSeta_badlumi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_Tk_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbMuon_qComparison.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'GlbRh_Div_RhAssoStaTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Pull_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_GlbSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkGlb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsEta_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_GlbSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkGlb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPhi_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsPt_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_GlbSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_TkGlb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'ResVsTheta_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_GlbSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkGlb_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_oneOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_oneOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_qOverp.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_qOverpt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TkSta_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'Res_TuneP_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaEta_ifCombinedAlso.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaMuon_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaPhi_ifCombinedAlso.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaRh_Frac_inGlb.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'StaRh_inGlb_Div_RhAssoSta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_chi2OverDf.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_eta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_p.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_phi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_probchi.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_pt.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_q.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkMuon_theta.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkRh_Frac_inGlb.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'TkRh_inGlb_Div_RhAssoTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'invalidRh_Frac_inTk.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'muVStkSytemRotation_negMu.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Muons_miniAOD', 'Run summary', 'MuonRecoAnalyzer', 'muVStkSytemRotation_posMu.Mu_Comp2RefChi2'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Pixel', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'RPC', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'RecoTauV', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'SiStrip', 'Run summary', 'EventInfo', 'workingDir'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'hostName'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'processEventRate'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'processID'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'processLatency'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'processStartTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'processTimeStamp'), + ('DQMData', 'Run %s' % RUN_NR, 'Tracking', 'Run summary', 'EventInfo', 'workingDir'), + } diff --git a/DQMServices/FileIO/scripts/compareDQMOutput.py b/DQMServices/FileIO/scripts/compareDQMOutput.py new file mode 100755 index 0000000000000..8f9cf648003df --- /dev/null +++ b/DQMServices/FileIO/scripts/compareDQMOutput.py @@ -0,0 +1,145 @@ +#!/bin/env python + +import os +import sys +import glob +import argparse +import subprocess +from threading import Thread + +COMPARISON_RESULTS = [] + +def collect_and_compare_files(base_dir, pr_dir, output_dir, num_procs, pr_number, test_number, release_format): + files = get_file_pairs(base_dir, pr_dir) + + threads = [] + for _ in range(num_procs): + thread = Thread(target=compare, args=(base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format)) + thread.start() + threads.append(thread) + + [thread.join() for thread in threads] + + COMPARISON_RESULTS.sort(key=lambda k: float(k['workflow'])) + +def compare(base_dir, pr_dir, output_dir, files, pr_number, test_number, release_format): + while files: + try: + file_name = files.pop() + command = ['python', os.path.join(os.path.dirname(__file__), 'compareHistograms.py'), '-b', os.path.join(base_dir, file_name), \ + '-p', os.path.join(pr_dir, file_name), '-o', output_dir, '-n', pr_number, '-t', test_number, '-r', release_format] + print('Running comparison:') + print(' '.join(command)) + + output = subprocess.check_output(command) + + output_elements = output.split('\n')[1:] + base_output_filename = output_elements[0] + pr_output_filename = output_elements[1] + run_nr = base_output_filename.split('_')[2].lstrip('R').lstrip('0') + output_numbers = output_elements[2].split(' ') + + workflow = os.path.basename(os.path.dirname(os.path.join(base_dir, file_name))).split('_')[0] + base_dataset = '/' + '/'.join(base_output_filename.rstrip('.root').split('__')[1:]) + pr_dataset = '/' + '/'.join(pr_output_filename.rstrip('.root').split('__')[1:]) + + COMPARISON_RESULTS.append({'workflow': workflow, 'base_dataset': base_dataset, 'pr_dataset': pr_dataset, 'run_nr': run_nr,\ + 'changed_elements': int(output_numbers[0]), 'removed_elements': int(output_numbers[1]), 'added_elements': int(output_numbers[2])}) + except: + pass + +def get_file_pairs(base_dir, pr_dir): + base_files = glob.glob(os.path.join(base_dir, '*.*_*/DQM_*.root')) + pr_files = glob.glob(os.path.join(pr_dir, '*.*_*/DQM_*.root')) + + # Remove base directories and leave + # only parts of paths that are same + base_files = map(lambda x: os.path.relpath(x, base_dir), base_files) + pr_files = map(lambda x: os.path.relpath(x, pr_dir), pr_files) + + # Find intersection + return [value for value in base_files if value in pr_files] + +def upload_to_gui(output_dir, num_procs): + base_files = glob.glob(os.path.join(output_dir, 'base/*.root')) + pr_files = glob.glob(os.path.join(output_dir, 'pr/*.root')) + + files = base_files + pr_files + + for _ in range(num_procs): + thread = Thread(target=upload, args=(files,)) + thread.start() + +def upload(files): + while files: + try: + file = files.pop() + command = ['python', os.path.join(os.path.dirname(__file__), 'visDQMUpload.py'), 'https://cmsweb.cern.ch/dqm/dev', file] + print('Uploading output:') + print(' '.join(command)) + + subprocess.call(command) + print('') + except: + pass + +def generate_summary_html(output_dir, pr_number, summary_dir): + template_file = open(os.path.join(os.path.dirname(__file__), 'dqm-histo-comparison-summary-template.html'), 'r') + result = template_file.read() + + result = result.replace('$PR_NUMBER$', pr_number) + + table_items = '' + total_changes = 0 + + for comp in COMPARISON_RESULTS: + total_changes += comp['removed_elements'] + comp['added_elements'] + comp['changed_elements'] + baseline_count = comp['changed_elements'] + comp['removed_elements'] + pr_count = comp['changed_elements'] + comp['added_elements'] + overlay_count = baseline_count + + # Make urls + base_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;sampletype%%3Doffline_relval;workspace%%3DEverything;' % (comp['run_nr'], comp['base_dataset']) + pr_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;sampletype%%3Doffline_relval;workspace%%3DEverything;' % (comp['run_nr'], comp['pr_dataset']) + overlay_url = 'https://cmsweb.cern.ch/dqm/dev/start?runnr=%s;dataset%%3D%s;referenceshow%%3Dall;referenceobj1%%3Dother::%s::;sampletype%%3Doffline_relval;workspace%%3DEverything;' \ + % (comp['run_nr'], comp['pr_dataset'], comp['base_dataset']) + + table_items += ' \n' + table_items += ' %s baseline GUI (%s)\n' % (base_url, comp['workflow'], baseline_count) + table_items += ' %s pr GUI (%s)\n' % (pr_url, comp['workflow'], pr_count) + table_items += ' %s overlay GUI (%s)\n' % (overlay_url, comp['workflow'], overlay_count) + table_items += ' -%s+%s%s\n' \ + % (comp['removed_elements'], comp['added_elements'], comp['changed_elements']) + table_items += ' \n' + + result = result.replace('$TOTAL_CHANGES$', str(total_changes)) + result = result.replace('$NUMBER_OF_WORKFLOWS$', str(len(COMPARISON_RESULTS))) + result = result.replace('$PER_WORKFLOW_LIST$', table_items) + template_file.close() + + # Write output + result_file_path = os.path.join(summary_dir, 'dqm-histo-comparison-summary.html') + if os.path.dirname(result_file_path): + if not os.path.exists(os.path.dirname(result_file_path)): + os.makedirs(os.path.dirname(result_file_path)) + summary_file = open(result_file_path, 'w') + summary_file.write(result) + summary_file.close() + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="This tool compares DQM monitor elements within DQM files found in base-dir with the ones found in in pr-dir. " + "All workflow directories are searched for correctly named DQM root files. " + "Comparison is done bin by bin and output is written to a root files containing only the changes.") + parser.add_argument('-b', '--base-dir', help='Baseline IB directory', default='basedata/') + parser.add_argument('-p', '--pr-dir', help='PR directory', default='prdata/') + parser.add_argument('-o', '--output-dir', help='Comparison root files output directory', default='dqmHistoComparisonOutput') + parser.add_argument('-j', '--nprocs', help='Number of processes', default=1, type=int) + parser.add_argument('-n', '--pr-number', help='PR number under test', required=True) + parser.add_argument('-t', '--test-number', help='Unique test number to distinguish different comparisons of the same PR.', default='1') + parser.add_argument('-r', '--release-format', help='Release format in this format: CMSSW_10_5_X_2019-02-17-0000', required=True) + parser.add_argument('-s', '--summary-dir', help='Directory where summary with all links will be saved', default='') + args = parser.parse_args() + + collect_and_compare_files(args.base_dir, args.pr_dir, args.output_dir, args.nprocs, args.pr_number, args.test_number, args.release_format) + upload_to_gui(args.output_dir, args.nprocs) + generate_summary_html(args.output_dir, args.pr_number, args.summary_dir) diff --git a/DQMServices/FileIO/scripts/compareHistograms.py b/DQMServices/FileIO/scripts/compareHistograms.py new file mode 100755 index 0000000000000..9ed2fea7ac3f2 --- /dev/null +++ b/DQMServices/FileIO/scripts/compareHistograms.py @@ -0,0 +1,266 @@ +#!/bin/env python + +from __future__ import print_function +import ROOT +ROOT.PyConfig.IgnoreCommandLineOptions = True +import os +import sys +import argparse +import root_numpy +import numpy as np +from blacklist import get_blacklist + +def create_dif(base_file_path, pr_file_path, pr_number, test_number, cmssw_version, output_dir_path): + base_file = ROOT.TFile(base_file_path, 'read') + ROOT.gROOT.GetListOfFiles().Remove(base_file) + + pr_file = ROOT.TFile(pr_file_path, 'read') + ROOT.gROOT.GetListOfFiles().Remove(pr_file) + + if base_file.IsOpen(): + print('Baseline file successfully opened', file=sys.stderr) + else: + print('Unable to open base file', file=sys.stderr) + return + + if pr_file.IsOpen(): + print('PR file successfully opened', file=sys.stderr) + else: + print('Unable to open PR file', file=sys.stderr) + return + + run_nr = get_run_nr(pr_file_path) + + # Get list of paths (lists of directories) + base_flat_dict = flatten_file(base_file, run_nr) + pr_flat_dict = flatten_file(pr_file, run_nr) + + # Paths that appear in both baseline and PR data. (Intersection) + shared_paths = list(set(pr_flat_dict).intersection(set(base_flat_dict))) + + # Paths that appear only in PR data. (Except) + only_pr_paths = list(set(pr_flat_dict).difference(set(base_flat_dict))) + + # Paths that appear only in baseline data. (Except) + only_base_paths = list(set(base_flat_dict).difference(set(pr_flat_dict))) + + # Histograms pointed to by these paths will be written to baseline output + paths_to_save_in_base = [] + + # Histograms pointed to by these paths will be written to pr output + paths_to_save_in_pr = [] + + # Make comparison + compare(shared_paths, pr_flat_dict, base_flat_dict, paths_to_save_in_pr, paths_to_save_in_base) + + # Collect paths that have to be written to baseline output file + for path in only_base_paths: + item = base_flat_dict[path] + + if item == None: + continue + + paths_to_save_in_base.append(path) + + # Collect paths that have to be written to PR output file + for path in only_pr_paths: + item = pr_flat_dict[path] + + if item == None: + continue + + paths_to_save_in_pr.append(path) + + base_output_filename = get_output_filename(pr_file_path, pr_number, test_number, cmssw_version, False) + pr_output_filename = get_output_filename(pr_file_path, pr_number, test_number, cmssw_version, True) + + # Write baseline output + save_paths(base_flat_dict, paths_to_save_in_base, os.path.join(output_dir_path, 'base', base_output_filename)) + + # Write PR output + save_paths(pr_flat_dict, paths_to_save_in_pr, os.path.join(output_dir_path, 'pr', pr_output_filename)) + + pr_file.Close() + base_file.Close() + + # Info about changed, added and removed elements + nr_of_changed_elements = len(set(paths_to_save_in_base).intersection(set(paths_to_save_in_pr))) + nr_of_removed_elements = len(paths_to_save_in_base) - nr_of_changed_elements + nr_of_added_elements = len(paths_to_save_in_pr) - nr_of_changed_elements + + print('Base output file. PR output file. Changed elements, removed elements, added elements:') + print(base_output_filename) + print(pr_output_filename) + print('%s %s %s' % (nr_of_changed_elements, nr_of_removed_elements, nr_of_added_elements)) + +def compare(shared_paths, pr_flat_dict, base_flat_dict, paths_to_save_in_pr, paths_to_save_in_base): + # Collect paths that have to be written to both output files + for path in shared_paths: + pr_item = pr_flat_dict[path] + base_item = base_flat_dict[path] + + if pr_item == None or base_item == None: + continue + + are_different=False + + if pr_item.InheritsFrom('TProfile2D') and base_item.InheritsFrom('TProfile2D'): + # Compare TProfile (content, entries and errors) + are_different = not compare_TProfile(pr_item, base_item) + + elif pr_item.InheritsFrom('TProfile') and base_item.InheritsFrom('TProfile'): + # Compare TProfile (content, entries and errors) + are_different = not compare_TProfile(pr_item, base_item) + + elif pr_item.InheritsFrom('TH1') and base_item.InheritsFrom('TH1'): + # Compare bin by bin + pr_array = root_numpy.hist2array(hist=pr_item, include_overflow=True, copy=False) + base_array = root_numpy.hist2array(hist=base_item, include_overflow=True, copy=False) + + if pr_array.shape != base_array.shape or not np.allclose(pr_array, base_array, equal_nan=True): + are_different = True + else: + # Compare non histograms + if pr_item != base_item: + are_different = True + + if are_different: + paths_to_save_in_pr.append(path) + paths_to_save_in_base.append(path) + +# Returns False if different, True otherwise +def compare_TProfile(pr_item, base_item): + if pr_item.GetSize() != base_item.GetSize(): + return False + + for i in range(pr_item.GetSize()): + pr_bin_content = pr_item.GetBinContent(i) + base_bin_content = base_item.GetBinContent(i) + + pr_bin_entries = pr_item.GetBinEntries(i) + base_bin_entries = base_item.GetBinEntries(i) + + pr_bin_error = pr_item.GetBinError(i) + base_bin_error = base_item.GetBinError(i) + + if not np.isclose(pr_bin_content, base_bin_content, equal_nan=True): + return False + + if not np.isclose(pr_bin_entries, base_bin_entries, equal_nan=True): + return False + + if not np.isclose(pr_bin_error, base_bin_error, equal_nan=True): + return False + + return True + +def flatten_file(file, run_nr): + result = {} + for key in file.GetListOfKeys(): + try: + traverse_till_end(key.ReadObj(), [], result, run_nr) + except: + pass + + return result + +def traverse_till_end(node, dirs_list, result, run_nr): + new_dir_list = dirs_list + [get_node_name(node)] + if hasattr(node, 'GetListOfKeys'): + for key in node.GetListOfKeys(): + traverse_till_end(key.ReadObj(), new_dir_list, result, run_nr) + else: + path = tuple(new_dir_list) + if path not in get_blacklist(run_nr): + result[path] = node + +def get_node_name(node): + if node.InheritsFrom('TObjString'): + # Strip out just the name from a tag (value) + return node.GetName().split('>')[0][1:] + else: + return node.GetName() + +def save_paths(flat_dict, paths, result_file_path): + if len(paths) == 0: + print('No differences were observed - output will not be written', file=sys.stderr) + return + + # Make sure output dir exists + result_dir = os.path.dirname(result_file_path) + if not os.path.exists(result_dir): + os.makedirs(result_dir) + + result_file = ROOT.TFile(result_file_path, 'recreate') + ROOT.gROOT.GetListOfFiles().Remove(result_file) + + if not result_file.IsOpen(): + print('Unable to open %s output file' % result_file_path, file=sys.stderr) + return + + for path in paths: + save_to_file(flat_dict, path, result_file) + + result_file.Close() + print('Output written to %s file' % result_file_path, file=sys.stderr) + +# Saves file from flat_dict in the same dir of currently open file for writing +def save_to_file(flat_dict, path, output_file): + histogram = flat_dict[path] + + current = output_file + + # Last item is filename. No need to create dir for it + for directory in path[:-1]: + current = create_dir(current, directory) + current.cd() + + histogram.Write() + +# Create dir in root file if it doesn't exist +def create_dir(parent_dir, name): + dir = parent_dir.Get(name) + if not dir: + dir = parent_dir.mkdir(name) + return dir + +def get_output_filename(input_file_path, pr_number, test_number, cmssw_version, isPr): + # Samples of correct output file format: + # DQM_V0001_R000320822__wf136_892_pr__CMSSW_10_4_0_pre3-PR25518-1234__DQMIO.root + # When run number is 1 we have to use RelVal naming pattern: + # DQM_V0002_R000000001__RelVal_wf136_892_pr__CMSSW_10_4_0_pre3-PR25518-1234__DQMIO.root + + input_file_name = os.path.basename(input_file_path) + + run = input_file_name.split('_')[2] + workflow = os.path.basename(os.path.dirname(input_file_path)).split('_')[0].replace('.', '_') + if not workflow: + workflow = 'Unknown' + + relval_prefix = '' + if run == 'R000000001': + relval_prefix = 'RelVal_' + + baseOrPr = 'base' + if isPr: + baseOrPr = 'pr' + + return 'DQM_V0001_%s__%swf%s_%s__%s-PR%s-%s__DQMIO.root' % (run, relval_prefix, workflow, baseOrPr, cmssw_version, pr_number, test_number) + +def get_run_nr(file_path): + return os.path.basename(file_path).split('_')[2].lstrip('R').lstrip('0') + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="This tool compares DQM monitor elements found in base-file with the ones found in pr-file." + "Comparison is done bin by bin and output is written to a root file containing only the changes.") + parser.add_argument('-b', '--base-file', help='Baseline IB DQM root file', required=True) + parser.add_argument('-p', '--pr-file', help='PR DQM root file', required=True) + parser.add_argument('-n', '--pr-number', help='PR number under test', default='00001') + parser.add_argument('-t', '--test-number', help='Unique test number to distinguish different comparisons of the same PR.', default='1') + parser.add_argument('-r', '--release-format', help='Release format in this format: CMSSW_10_5_X_2019-02-17-0000', default=os.environ['CMSSW_VERSION']) + parser.add_argument('-o', '--output-dir', help='Comparison root files output directory', default='dqmHistoComparisonOutput') + args = parser.parse_args() + + cmssw_version = '_'.join(args.release_format.split('_')[:4]) + + create_dif(args.base_file, args.pr_file, args.pr_number, args.test_number, cmssw_version, args.output_dir) diff --git a/DQMServices/FileIO/scripts/dqm-histo-comparison-summary-template.html b/DQMServices/FileIO/scripts/dqm-histo-comparison-summary-template.html new file mode 100644 index 0000000000000..2144a29ef6dd6 --- /dev/null +++ b/DQMServices/FileIO/scripts/dqm-histo-comparison-summary-template.html @@ -0,0 +1,68 @@ + + + + + + DQM histogram comparison summary + + + + +

Total number of changes to DQM monitor elements made by PR $PR_NUMBER$:

+ +

$TOTAL_CHANGES$

+ +

URLs for each individual workflow ($NUMBER_OF_WORKFLOWS$):

+ + + + + + + + +$PER_WORKFLOW_LIST$ +
BaselinePull RequestOverlay (PR + base)Removed, added and changed plots
+ + + + \ No newline at end of file diff --git a/DQMServices/FileIO/scripts/visDQMUpload.py b/DQMServices/FileIO/scripts/visDQMUpload.py new file mode 100755 index 0000000000000..1dff3a4c5f43c --- /dev/null +++ b/DQMServices/FileIO/scripts/visDQMUpload.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +import sys +import os +import re +import string +import httplib +import mimetypes +import urllib +import urllib2 +import httplib +import gzip +import hashlib +from commands import getstatusoutput +from cStringIO import StringIO +from stat import * +try: + from Monitoring.DQM import visDQMUtils +except: + import visDQMUtils + +HTTPS = httplib.HTTPS +if sys.version_info[:3] >= (2, 4, 0): + HTTPS = httplib.HTTPSConnection + +ssl_key_file = None +ssl_cert_file = None + +class HTTPSCertAuth(HTTPS): + def __init__(self, host, *args, **kwargs): + HTTPS.__init__(self, host, key_file = ssl_key_file, cert_file = ssl_cert_file, **kwargs) + +class HTTPSCertAuthenticate(urllib2.AbstractHTTPHandler): + def default_open(self, req): + return self.do_open(HTTPSCertAuth, req) + +def filetype(filename): + return mimetypes.guess_type(filename)[0] or 'application/octet-stream' + +def encode(args, files): + """ + Encode form (name, value) and (name, filename, type) elements into + multi-part/form-data. We don't actually need to know what we are + uploading here, so just claim it's all text/plain. + """ + boundary = '----------=_DQM_FILE_BOUNDARY_=-----------' + (body, crlf) = ('', '\r\n') + for (key, value) in args.items(): + payload = str(value) + body += '--' + boundary + crlf + body += ('Content-Disposition: form-data; name="%s"' % key) + crlf + body += crlf + payload + crlf + for (key, filename) in files.items(): + body += '--' + boundary + crlf + body += ('Content-Disposition: form-data; name="%s"; filename="%s"' + % (key, os.path.basename(filename))) + crlf + body += ('Content-Type: %s' % filetype(filename)) + crlf + body += ('Content-Length: %d' % os.stat(filename)[ST_SIZE]) + crlf + body += crlf + open(filename, "r").read() + crlf + body += '--' + boundary + '--' + crlf + crlf + return ('multipart/form-data; boundary=' + boundary, body) + +def marshall(args, files, request): + """ + Marshalls the arguments to the CGI script as multi-part/form-data, + not the default application/x-www-form-url-encoded. This improves + the transfer of the large inputs and eases command line invocation + of the CGI script. + """ + (type, body) = encode(args, files) + request.add_header('Content-Type', type) + request.add_header('Content-Length', str(len(body))) + request.add_data(body) + +def upload(url, args, files): + ident = "visDQMUpload DQMGUI/%s python/%s" % \ + (os.getenv('DQMGUI_VERSION', '?'), "%d.%d.%d" % sys.version_info[:3]) + datareq = urllib2.Request(url + '/data/put') + datareq.add_header('Accept-encoding', 'gzip') + datareq.add_header('User-agent', ident) + marshall(args, files, datareq) + if 'https://' in url: + result = urllib2.build_opener(HTTPSCertAuthenticate()).open(datareq) + else: + result = urllib2.build_opener(urllib2.ProxyHandler({})).open(datareq) + + data = result.read() + if result.headers.get ('Content-encoding', '') == 'gzip': + data = gzip.GzipFile (fileobj=StringIO(data)).read () + return (result.headers, data) + +x509_path = os.getenv("X509_USER_PROXY", None) +if x509_path and os.path.exists(x509_path): + ssl_key_file = ssl_cert_file = x509_path + +if not ssl_key_file: + x509_path = os.getenv("X509_USER_KEY", None) + if x509_path and os.path.exists(x509_path): + ssl_key_file = x509_path + +if not ssl_cert_file: + x509_path = os.getenv("X509_USER_CERT", None) + if x509_path and os.path.exists(x509_path): + ssl_cert_file = x509_path + +if not ssl_key_file and not ssl_cert_file: + (status, uid) = getstatusoutput("id -u") + if os.path.exists("/tmp/x509up_u%s" % uid): + ssl_key_file = ssl_cert_file = "/tmp/x509up_u%s" % uid + +if not ssl_key_file: + x509_path = os.getenv("HOME") + "/.globus/userkey.pem" + if os.path.exists(x509_path): + ssl_key_file = x509_path + +if not ssl_cert_file: + x509_path = os.getenv("HOME") + "/.globus/usercert.pem" + if os.path.exists(x509_path): + ssl_cert_file = x509_path + +if 'https://' in sys.argv[1] and (not ssl_key_file or not os.path.exists(ssl_key_file)): + print >>sys.stderr, "no certificate private key file found" + sys.exit(1) + +if 'https://' in sys.argv[1] and (not ssl_cert_file or not os.path.exists(ssl_cert_file)): + print >>sys.stderr, "no certificate public key file found" + sys.exit(1) + +try: + for file_path in sys.argv[2:]: + # Before even trying to make a call to the other side, we first do a check on + # the filename: + classification_ok, classification_result = visDQMUtils.classifyDQMFile(file_path) + if not classification_ok: + print "Check of filename before upload failed with following message:" + print classification_result + sys.exit(1) + # If file check was fine, we continue with the upload method: + else: + print "Using SSL private key", ssl_key_file + print "Using SSL public key", ssl_cert_file + (headers, data) = \ + upload(sys.argv[1], + { 'size': os.stat(sys.argv[2])[ST_SIZE], + 'checksum': "md5:%s" % hashlib.md5(file(sys.argv[2]).read()).hexdigest() }, + { 'file': file_path }) + print 'Status code: ', headers.get("Dqm-Status-Code", "None") + print 'Message: ', headers.get("Dqm-Status-Message", "None") + print 'Detail: ', headers.get("Dqm-Status-Detail", "None") + print data + sys.exit(0) +except urllib2.HTTPError, e: + print "ERROR", e + print 'Status code: ', e.hdrs.get("Dqm-Status-Code", "None") + print 'Message: ', e.hdrs.get("Dqm-Status-Message", "None") + print 'Detail: ', e.hdrs.get("Dqm-Status-Detail", "None") + sys.exit(1) + diff --git a/DQMServices/FileIO/scripts/visDQMUtils.py b/DQMServices/FileIO/scripts/visDQMUtils.py new file mode 100644 index 0000000000000..4d4722b04f505 --- /dev/null +++ b/DQMServices/FileIO/scripts/visDQMUtils.py @@ -0,0 +1,107 @@ +import re + +# Various regular expressions used to check filename validity: + +# Regexp for valid dataset names. +RXDATASET = re.compile(r"^(/[-A-Za-z0-9_]+){3}$") +# Regexp for valid RelVal dataset names. +RXRELVALMC = re.compile(r"^/RelVal[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$") +RXRELVALRUNDEPMC = re.compile(r"^/RelVal[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*rundepMC.*$") +RXRELVALDATA = re.compile(r"^/[^/]+/(CMSSW(?:_[0-9]+)+(?:_pre[0-9]+)?)[-_].*$") +RXRUNDEPMC = re.compile(r"^/(?!RelVal)[^/]+/.*rundepMC.*$") + +# Regexp for online DQM files. +RXONLINE = re.compile(r"^(?:.*/)?DQM_V(\d+)(_[A-Za-z0-9]+)?_R(\d+)\.root$") + +# Regexp for offline DQM files. +RXOFFLINE = re.compile(r"^(?:.*/)?DQM_V(\d+)_R(\d+)((?:__[-A-Za-z0-9_]+){3})\.root$") + +# -------------------------------------------------------------------- +# Pre-classify a file into main category based on file name structure. +# path: path (relative to the uploads dir, coming from the walk) of the root +# file +# Returns a tuple of: +# a boolean: True or False depending on whether the classification went OK +# a string or dictionary: +# - In case the classification went wrong: A string with the reason +# - In case the classification was OK: A dictionary with classification +# information +def classifyDQMFile(path): + print(path) + try: + m = re.match(RXONLINE, path) + if m: + version = int(m.group(1)) + runnr = int(m.group(3)) + subsys = m.group(2) and m.group(2)[1:] + if version != 1: + return False, "file version is not 1" + elif runnr <= 10000: + return False, "online file has run number <= 10000" + else: + # online_data + return True, { 'class': 'online_data', 'version': version, + 'subsystem': subsys, 'runnr': runnr, + 'dataset': "/Global/Online/ALL" } + + m = re.match(RXOFFLINE, path) + if m: + version = int(m.group(1)) + dataset = m.group(3).replace("__", "/") + if not re.match(RXDATASET, dataset): + return False, "Invalid dataset name" + relvalmc = re.match(RXRELVALMC, dataset) + relvaldata = re.match(RXRELVALDATA, dataset) + relvalrundepmc = re.match(RXRELVALRUNDEPMC, dataset) + rundepmc = re.match(RXRUNDEPMC, dataset) + runnr = int(m.group(2)) + if version != 1: + return False, "file version is not 1" + if runnr < 1: + return False, "file matches offline naming, but run number is < 1" + elif rundepmc: + if runnr == 1: + return False, "file matches Run Dependent MonteCarlo naming, but run number is 1" + else: + # simulated_rundep + return True, { 'class': 'simulated_rundep', 'version': version, + 'runnr': runnr, 'dataset': dataset } + elif relvalrundepmc: + if runnr == 1: + return False, "file matches Run Dependent MonteCarlo naming, but run number is 1" + else: + # relval_rundepmc + return True, { 'class': 'relval_rundepmc', 'version': version, + 'runnr': runnr, 'dataset': dataset, + 'release': relvalrundepmc.group(1)} + elif relvalmc: + if runnr != 1: + return False, "file matches relval mc naming, but run number != 1" + else: + # relval_mc + return True, { 'class': 'relval_mc', 'version': version, + 'runnr': runnr, 'dataset': dataset, + 'release': relvalmc.group(1) } + elif relvaldata: + if runnr == 1: + return False, "file matches relval data naming, but run number = 1" + else: + # relval_data + return True, { 'class': 'relval_data', 'version': version, + 'runnr': runnr, 'dataset': dataset, + 'release': relvaldata.group(1) } + elif dataset.find("CMSSW") >= 0: + return False, "non-relval dataset name contains 'CMSSW'" + elif runnr > 1: + # offline_data + return True, { 'class': 'offline_data', 'version': version, + 'runnr': runnr, 'dataset': dataset } + else: + # simulated + return True, { 'class': 'simulated', 'version': int(m.group(1)), + 'runnr': runnr, 'dataset': dataset } + + return False, "file matches no known naming convention" + except: + return False, "error while classifying file name" +