11 from time 
import strftime,localtime
 
   13 from ROOT 
import TFile
 
   14 from ROOT 
import TH1F,TProfile
 
   15 from ROOT 
import TCanvas
 
   16 from ROOT 
import kTeal
 
   17 from ROOT 
import gStyle,gROOT,gPad
 
   18 from ROOT 
import kYellow,kOrange,kRed,kBlue,kPink,kMagenta,kGreen,kSpring,kViolet,kAzure,kCyan,kTeal,kBlack,kWhite,kGray
 
   21 sys.path.append(
"/afs/cern.ch/user/l/larmon/public/prod/Misc")
 
   22 from LArMonCoolLib 
import GetLBTimeStamps,GetOfflineLumiFromCOOL,GetReadyFlag
 
   23 from DeMoLib 
import retrieveYearTagProperties,returnPeriod,plotStack,MakeTH1,MakeLegend,strLumi
 
   25 from DQUtils 
import fetch_iovs
 
   27 from argparse 
import RawTextHelpFormatter,ArgumentParser
 
   36 from DQDefects 
import DefectsDB
 
   38 parser = ArgumentParser(description=
'',formatter_class=RawTextHelpFormatter)
 
   39 parser.add_argument(
'-y',
'--year',dest=
'parser_year',default = 
"2022",help=
'Year [Default: 2022]',action=
'store')
 
   40 parser.add_argument(
'-t',
'--tag',dest=
'parser_tag',default = 
"AtlasReady",help=
'Defect tag [Default: "AtlasReady"]',action=
'store')
 
   41 parser.add_argument(
'-b',
'--batch',dest=
'parser_batchMode',help=
'Batch mode',action=
'store_true')
 
   43 args = parser.parse_args()
 
   44 year = args.parser_year
 
   49 if args.parser_batchMode:
 
   54 systemList = [
"LAr",
"Pixel",
"SCT",
"TRT",
"Tile",
"MDT",
"TGC",
"RPC",
"Trig_L1",
"Trig_HLT",
"Lumi",
"Global",
"ALFA",
"LUCID",
"ZDC",
"IDGlobal",
"BTag",
"CaloCP",
"MuonCP"]
 
   55 systemList2 = systemList + [
"All"]
 
   57 for iSyst 
in systemList2:
 
   58   affectedLBs[iSyst] = {}
 
   61 for iSyst 
in systemList:
 
   62   recapDefectsFile = 
open(
"YearStats-%s/%s/%s/recapDefects.txt"%(iSyst,year,tag))
 
   65   for iline 
in recapDefectsFile:
 
   66     ilineSplit = iline.split(
"|")
 
   68     if (len(ilineSplit) == 8) 
and (
"Run" not in ilineSplit[0]): 
 
   69       runNumber = ilineSplit[0]
 
   70       lbRange = ilineSplit[5]
 
   71     if (len(ilineSplit) == 4): 
 
   72       lbRange = ilineSplit[1]
 
   76       if (runNumber 
not in affectedLBs[iSyst].
keys()):
 
   77         affectedLBs[iSyst][runNumber] = []
 
   79       if (runNumber 
not in affectedLBs[
"All"].
keys()):
 
   80         affectedLBs[
"All"][runNumber] = []
 
   82       lbRangeSplit = lbRange.split(
"->")
 
   83       if len(lbRangeSplit) == 1: 
 
   84         lbAffInt = 
int(lbRange)
 
   85         if (lbAffInt 
not in affectedLBs[iSyst][runNumber]):
 
   86           affectedLBs[iSyst][runNumber].
append(lbAffInt)
 
   87         if (lbAffInt 
not in affectedLBs[
"All"][runNumber]):
 
   88           affectedLBs[
"All"][runNumber].
append(lbAffInt)          
 
   90       if len(lbRangeSplit) == 2: 
 
   91         for iLB 
in range(
int(lbRangeSplit[0]),
int(lbRangeSplit[1])+1):
 
   92           if (iLB 
not in affectedLBs[iSyst][runNumber]):
 
   93             affectedLBs[iSyst][runNumber].
append(iLB)
 
   94           if (iLB 
not in affectedLBs[
"All"][runNumber]):
 
   95             affectedLBs[
"All"][runNumber].
append(iLB)          
 
   97     if (
"Tolerable defect" in iline): 
 
  104 for iRun 
in affectedLBs[
"All"].
keys():
 
  105   instOfflLumi = GetOfflineLumiFromCOOL(
int(iRun),0,DeMoConfig[
"OflLumi tag"])
 
  106   atlasready=GetReadyFlag(
int(iRun))
 
  109   v_lbTimeSt = GetLBTimeStamps(
int(iRun))
 
  111   lumiacct=
fetch_iovs(
'COOLOFL_TRIGGER::/TRIGGER/OFLLUMI/LumiAccounting', tag=DeMoConfig[
"OflLumiAcct tag"], since=v_lbTimeSt[1][0]*1000000000, until=v_lbTimeSt[len(v_lbTimeSt)][1]*1000000000) 
 
  113   for iLumiAcct 
in range(len(lumiacct)):
 
  114     if (lumiacct[iLumiAcct].LumiBlock 
in affectedLBs[
"All"][iRun]):
 
  115       if (atlasready[lumiacct[iLumiAcct].LumiBlock]):
 
  116         lbLumi[iRun][lumiacct[iLumiAcct].LumiBlock] = lumiacct[iLumiAcct].LBTime*lumiacct[iLumiAcct].LiveFraction*lumiacct[iLumiAcct].InstLumiAll
 
  117         lbLumi[iRun][lumiacct[iLumiAcct].LumiBlock] = lumiacct[iLumiAcct].LBTime*lumiacct[iLumiAcct].LiveFraction*instOfflLumi[lumiacct[iLumiAcct].LumiBlock]
 
  119         affectedLBs[
"All"][iRun].
remove(lumiacct[iLumiAcct].LumiBlock)
 
  120         for iSyst 
in systemList:
 
  121           if (iRun 
in affectedLBs[iSyst].
keys() 
and lumiacct[iLumiAcct].LumiBlock 
in affectedLBs[iSyst][iRun]):
 
  122               affectedLBs[iSyst][iRun].
remove(lumiacct[iLumiAcct].LumiBlock)
 
  125 periodFile = TFile(
"YearStats-Global/%s/%s/TProfiles.root"%(year,tag))
 
  127 h1_lumi = periodFile.Get(
"h1Period_IntLuminosity_archive")
 
  128 periodListHash = h1_lumi.GetXaxis().GetLabels()
 
  132 dataLossPerPeriod = {}
 
  133 for iSyst 
in systemList2:
 
  134   dataLossPerPeriod[iSyst]={}
 
  136 for i 
in range(len(periodListHash)):
 
  137   periodName.append(
str(periodListHash[i]))
 
  138   periodLumi[periodName[i]] = h1_lumi.GetBinContent(i+1)
 
  139   for iSyst 
in systemList2:
 
  140     dataLossPerPeriod[iSyst][periodName[i]] = 0.
 
  142 hprof_dataLossPerSystem = {}
 
  143 for iSyst 
in systemList2:
 
  144   hprof_dataLossPerSystem[iSyst] = 
MakeTH1(
"dataLoss_%s"%iSyst,
"Period",
"dataLoss_%s"%iSyst,-0.5,-0.5+len(periodName),len(periodName),kBlack)
 
  145   for i 
in range(len(periodName)):
 
  146     hprof_dataLossPerSystem[iSyst].GetXaxis().SetBinLabel(i+1,periodName[i])
 
  149 colorPalette = {
"Pixel":kViolet-4,
 
  161                 "IDGlobal":kMagenta+2,
 
  167 for iSyst 
in systemList2:
 
  168   for iAffRun 
in affectedLBs[iSyst].
keys():
 
  170     for iAffLB 
in affectedLBs[iSyst][iAffRun]:
 
  171       dataLossPerPeriod[iSyst][period] = dataLossPerPeriod[iSyst][period] + lbLumi[iAffRun][iAffLB]
 
  172       dataLossPerPeriod[iSyst][
"All"] = dataLossPerPeriod[iSyst][
"All"] + lbLumi[iAffRun][iAffLB]
 
  174   print(
"==== %s"%iSyst)
 
  175   if (len(affectedLBs[iSyst])):
 
  176     for i 
in range(len(periodName)):
 
  177       if (periodLumi[periodName[i]] != 0.):
 
  178         percentLoss = dataLossPerPeriod[iSyst][periodName[i]]/periodLumi[periodName[i]]/10000
 
  181       if percentLoss != 0.:
 
  182         print(
"Period %s -> %.4f percent"%(periodName[i],percentLoss))
 
  183         hprof_dataLossPerSystem[iSyst].Fill(i,percentLoss)
 
  184         hprof_dataLossPerSystem[iSyst].SetBinError(i+1,0.)
 
  185     hprof_dataLossPerSystem[iSyst].SetFillColor(colorPalette[iSyst])
 
  191 for iSyst 
in systemList:
 
  192   systemDict[iSyst] = iSyst
 
  194 plotStack(
"Defects--Periods--%s"%DeMoConfig[
"Description"],hprof_dataLossPerSystem,systemList,systemDict,h1_lumi,
False,stacks,canvas,legends,
False)
 
  195 hprof_dataLossPerSystem[
"All"].SetMarkerColor(kOrange+7)
 
  196 hprof_dataLossPerSystem[
"All"].SetMarkerStyle(20)
 
  197 hprof_dataLossPerSystem[
"All"].Draw(
"PSAME")
 
  200 ATLASLegend.AddEntry(hprof_dataLossPerSystem[
"All"], 
"#splitline{ATLAS inefficiency}{All periods: %.2f%% / %s (%s OK)}"%(dataLossPerPeriod[
"All"][
"All"]/periodLumi[
"All"]/10000,
strLumi(dataLossPerPeriod[
"All"][
"All"]),
strLumi(periodLumi[
"All"]-dataLossPerPeriod[
"All"][
"All"]/1000000,
"pb",
True,
True)), 
"P")
 
  201 ATLASLegend.SetFillColor(kWhite)
 
  204 canvas[
"Defects--Periods--%s"%DeMoConfig[
"Description"]].SaveAs(
"YearStats-Global/%s/%s/DataLoss.png"%(year,tag))