diff --git a/DataQuality/DataQualityConfigurations/python/base_data.py b/DataQuality/DataQualityConfigurations/python/base_data.py index c081d6b3994fb476b492df1aae2e48ec8a10adc6..e25d1750a9c62000c4e2f185074f2aa7613d07ca 100644 --- a/DataQuality/DataQualityConfigurations/python/base_data.py +++ b/DataQuality/DataQualityConfigurations/python/base_data.py @@ -27,6 +27,7 @@ dqconfig.filemap = { 'RPCDQMFOFFLINE.db': '/afs/cern.ch/user/m/muoncali/w 'MDTDQMFOFFLINE_NOISY.db': '/afs/cern.ch/user/m/muoncali/w0/RPC/DQAresults', 'zrate.csv': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi', 'zlumi.root': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi', + 'zlumi.root_lumicomp.eps': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi', } dqconfig.dbConnection = "oracle://ATLAS_COOLWRITE;schema=ATLAS_COOLOFL_GLOBAL;dbname=CONDBR2;" diff --git a/DataQuality/DataQualityTools/CMakeLists.txt b/DataQuality/DataQualityTools/CMakeLists.txt index a09be2c190264094ebbf19486d349a33a0154231..585a4f51fea8af3ce3916710f8576f53b37b7348 100644 --- a/DataQuality/DataQualityTools/CMakeLists.txt +++ b/DataQuality/DataQualityTools/CMakeLists.txt @@ -66,4 +66,3 @@ atlas_add_component( DataQualityTools # Install files from the package: #atlas_install_headers( DataQualityTools ) atlas_install_joboptions( share/*.py ) -atlas_install_scripts( scripts/*.py ) \ No newline at end of file diff --git a/DataQuality/DataQualityUtils/CMakeLists.txt b/DataQuality/DataQualityUtils/CMakeLists.txt index 55f000783ba80cf1c70e8e74fef726e7b770f451..50b3c6c4b1c53279345edf7215b34bb290d851d3 100644 --- a/DataQuality/DataQualityUtils/CMakeLists.txt +++ b/DataQuality/DataQualityUtils/CMakeLists.txt @@ -7,7 +7,8 @@ atlas_subdir( DataQualityUtils ) # Declare the package's dependencies: atlas_depends_on_subdirs( PRIVATE - DataQuality/DataQualityInterfaces ) + DataQuality/DataQualityInterfaces + DataQuality/ZLumiScripts ) # External dependencies: find_package( Boost COMPONENTS regex filesystem thread system ) diff --git a/DataQuality/DataQualityUtils/python/doZLumi.py b/DataQuality/DataQualityUtils/python/doZLumi.py index e3fc8b3f56f4936cd412260c1ad65b36da2683ae..116febf4ec25d5080084ea8e8f92c02e11ca6b88 100644 --- a/DataQuality/DataQualityUtils/python/doZLumi.py +++ b/DataQuality/DataQualityUtils/python/doZLumi.py @@ -28,6 +28,63 @@ def copyPlot(infname, outfname): d.WriteTObject(obj) fin.Close(); fout.Close() +def makeGRL(run, defect, fname): + from ROOT import Root, TString + import DQUtils, DQDefects + import os + tgrl = Root.TGoodRunsList(defect) + + tag = 'HEAD' + runs = [run] + print 'Query run information...', + from DQUtils.db import fetch_iovs + dbinstance = 'CONDBR2' + eor = fetch_iovs('EOR', (min(runs) << 32) | 1, + (max(runs) << 32) | 0xFFFFFFFF, + with_channel=False, what=[], database='COOLONL_TDAQ/%s' % dbinstance) + eor = eor.trim_iovs + eor = DQUtils.IOVSet(iov for iov in eor if iov.since.run in runs) + print 'done' + print 'Query defects...', + ddb = DQDefects.DefectsDB('COOLOFL_GLOBAL/%s' % dbinstance, tag=tag) + ignores = set([_ for _ in ddb.defect_names if 'UNCHECKED' in _]) + try: + defectiovs = ddb.retrieve(since = min(runs) << 32 | 1, + until = max(runs) << 32 | 0xffffffff, + channels = [defect], + evaluate_full = False, + ignore=ignores) + except Exception, e: + print e + raise + print 'Doing exclusions...', + okiovs = eor.logical_and(eor, defectiovs.logical_not()) + print 'done' + + dibr = okiovs.by_run + + print 'Generating GRL...', + for run, iovs in dibr.items(): + if run not in runs: continue + tgr = Root.TGoodRun(run) + for iov in iovs: + #print iov.since.run, iov.since.lumi, iov.until.run, iov.until.lumi + tgr.push_back(Root.TLumiBlockRange(iov.since.lumi, iov.until.lumi-1)) + tgrl[run] = tgr + + tgrl.AddMetaData(TString('Query'), TString('dummy')) + tgrl.AddMetaData(TString('ARQEquivalentQuery'), TString('dummy')) + tgrl.SetVersion(TString('2.1')) + tgrl.AddMetaData(TString('RunList'), TString(','.join(map(str, tgrl.GetRunlist())))) + tgrl.Summary() + tgrlw = Root.TGoodRunsListWriter(tgrl, TString('')) + rv = tgrlw.GetXMLString() + if not rv: + print 'Looks like we have an empty string' + return "" + print 'done' + with open(fname, 'w') as outf: + outf.write(rv.Data()[:]) def go(fname): import subprocess, os, shutil @@ -38,7 +95,14 @@ def go(fname): if 'DISPLAY' in os.environ: del os.environ['DISPLAY'] runno = getRun(fname) print 'Seen run', runno - subprocess.call(['dqt_zlumi_compute_lumi.py', fname, '--out', 'zlumiraw.root', '--plotdir', '']) + grlcmd = [] + if runno >= 325000: + makeGRL(runno, 'PHYS_StandardGRL_All_Good', 'grl.xml') + grlcmd = ['--grl', 'grl.xml'] + else: + print 'Run number', runno, 'not 2017 data' + + subprocess.call(['dqt_zlumi_compute_lumi.py', fname, '--out', 'zlumiraw.root', '--dblivetime', '--plotdir', ''] + grlcmd) subprocess.call(['dqt_zlumi_alleff_HIST.py', fname, '--out', 'zlumieff.root']) subprocess.call(['dqt_zlumi_combine_lumi.py', 'zlumiraw.root', 'zlumieff.root', 'zlumi.root']) subprocess.call(['dqt_zlumi_display_z_rate.py', 'zlumi.root']) diff --git a/DataQuality/ZLumiScripts/CMakeLists.txt b/DataQuality/ZLumiScripts/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b658acb5bba60af166e5ece565628c9b784817fd --- /dev/null +++ b/DataQuality/ZLumiScripts/CMakeLists.txt @@ -0,0 +1,15 @@ +################################################################################ +# Package: ZLumiScripts +################################################################################ + +# Declare the package name: +atlas_subdir( ZLumiScripts ) + +# Declare the package's dependencies: +#atlas_depends_on_subdirs( ) + +# External dependencies: +find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread ) + +# Install files from the package: +atlas_install_scripts( scripts/*.py ) diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py similarity index 95% rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py index 8682ab42229a547f1f313b944e91a7b6fa61b933..753c52e7dbc8f32373fa23d38db749b01b0b7a3c 100755 --- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py +++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py @@ -11,6 +11,7 @@ import argparse parser = argparse.ArgumentParser() parser.add_argument('infile', type=str, help='input HIST file') parser.add_argument('--out', type=str, help='output ROOT file') +parser.add_argument('--debug', action='store_true', help='Be verbose in output') args = parser.parse_args() @@ -114,11 +115,12 @@ for lb in sorted(lbdirs): matchss, matchsserr = extract(hms) nomatchos, nomatchoserr = extract(hno) nomatchss, nomatchsserr = extract(hns) - print lb - print ' ->', matchos, matchoserr - print ' ->', matchss, matchsserr - print ' ->', nomatchos, nomatchoserr - print ' ->', nomatchss, nomatchsserr + if args.debug: + print lb + print ' ->', matchos, matchoserr + print ' ->', matchss, matchsserr + print ' ->', nomatchos, nomatchoserr + print ' ->', nomatchss, nomatchsserr A = float(matchos-matchss) Aerr = (matchoserr**2+matchsserr**2)**.5 B = float(nomatchos-nomatchss) diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py similarity index 97% rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py index 95a5b307bd1f223cd096654011d44205a433a180..08c4994b875a82ebbfc4bcbd5ca06ddae23b3350 100755 --- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py +++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py @@ -121,6 +121,11 @@ for entry, entryval in sorted(entrydict.items()): if o_zlumi[0] < 4 or o_zlumi[0] > 15: print o_lb[0], o_zlumi[0], entryval['zcount'], eff, entryval['livetime'] t.Fill() -t.Write() +#t.Write() +newrzt = recoztree.CloneTree() +newrzt.SetName("recolumitree") +newezt = effztree.CloneTree() +newezt.SetName("efflumitree") +fout.Write() fout.Close() diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_compute_lumi.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_compute_lumi.py similarity index 100% rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_compute_lumi.py rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_compute_lumi.py diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py similarity index 65% rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py index 145bccccbfda3d22a503976bce0cf2ca4e6a051e..e1222cb326a9728a96770e6c5c793eab8f017bdc 100755 --- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py +++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py @@ -3,11 +3,24 @@ import ROOT import sys +import array runnum = sys.argv[1].split('_')[0] f = ROOT.TFile.Open(sys.argv[1], 'UPDATE') c1 = ROOT.TCanvas() lumitree = f.lumitree +#get range +runs=[0,1]; fills=[0,1] +lumitree.Draw("run:lhcfill", "", "goff") +if lumitree.GetSelectedRows() > 0: + runs = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows())) + fills = list(lumitree.GetV2()[_] for _ in xrange(lumitree.GetSelectedRows())) +titlestr = '' +if min(fills)==max(fills): + titlestr += 'Fill %d' % min(fills) +if min(runs) == max(runs): + titlestr += ' Run %d' % min(runs) + lumitree.Draw("zrate:lb+10:zratestat", "", "goff") print 'Selected rows', lumitree.GetSelectedRows() if lumitree.GetSelectedRows() > 0: @@ -44,24 +57,40 @@ csvout.close() lumitree.Draw("zlumi:lb+10:zlumistat", "", "goff") if lumitree.GetSelectedRows() > 0: gr = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), lumitree.GetV1(), ROOT.nullptr, lumitree.GetV3()) + zlumi = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows())); + zlumierr = list(lumitree.GetV3()[_] for _ in xrange(lumitree.GetSelectedRows())) gr.Draw("ap") gr.GetHistogram().SetXTitle('LB') gr.GetHistogram().SetYTitle('Luminosity (x10^{33})') gr.SetMarkerStyle(20) - gr.SetTitle('') + gr.SetTitle(titlestr) f.WriteTObject(gr, 'z_lumi') lumitree.Draw("offlumi:lb+10", "", "goff") gr2 = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), lumitree.GetV1()) + offlumi = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows())) gr2.SetMarkerStyle(21) gr2.SetMarkerSize(0.5) gr2.SetMarkerColor(ROOT.kRed) - gr2.Draw('same,pl') - f.WriteTObject(gr, 'official_lumi') + gr2.SetLineColor(ROOT.kRed) + gr2.Draw('same,l') + f.WriteTObject(gr2, 'official_lumi') leg = ROOT.TLegend(0.65, 0.7, 0.89, 0.89) leg.SetBorderSize(0) leg.AddEntry(gr, 'Z luminosity', 'pl') - leg.AddEntry(gr2, '-005 calibration', 'pl') + leg.AddEntry(gr2, 'Official', 'l') leg.Draw() c1.Update() c1.Print('%s_lumicomp.eps' % runnum) f.WriteTObject(c1, 'lumicomp_canvas') + zlumirat = array.array('d', [_[0]/_[1] for _ in zip(zlumi, offlumi)]) + zlumiraterr = array.array('d', [_[0]/_[1] for _ in zip(zlumierr, offlumi)]) + gr3 = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), zlumirat, ROOT.nullptr, zlumiraterr) + c1.Clear() + gr3.SetMarkerStyle(20) + gr3.Draw('ap') + gr3.SetTitle(titlestr) + gr3.GetHistogram().SetXTitle('LB') + gr3.GetHistogram().SetYTitle('Z Counting/Official Lumi') + c1.Print('%s_lumicompratio.eps' % runnum) + f.WriteTObject(c1, 'lumicompratio_canvas') +