def radmon2fill(): #Get fills already processed filesDone = glob.glob(radmonFillPattern) (toReplace, dummy) = radmonFillPattern.split('.') print filesDone fillsDone = [] for file in filesDone: name, ext = file.split('.') fillsDone.append(int(name.replace(toReplace[0:-1], ""))) if len(fillsDone) > 0: print "Fills already done", fillsDone fillReport = FillReport(fillReportName) #Start/End of each fill in fillReport fillStarted = fillReport.getFillCreationTime() fillDumped = fillReport.getFillEndTime() for fill in sorted(fillStarted.keys()): if int(fill) in fillsDone: print "Fill", fill, "is already processed. Skipping..." continue print "Processing fill", fill, "........." fillData = FillData() radmonData = RadmonData() #runningSums = RunningSums() #rsumsList = [] for i in range(0, 16): #rsumsList.insert(i, [0.]*1800) radmonData.rates[i] = 0. radmonData.status[i] = 0. #Output rootFile = radmonFillPattern.replace("*", str(fill)) try: fout = TFile(rootFile,'RECREATE') except IOError: print "Cannot open file for output", rootFile exit t = TTree('t', 'Radmon rates') t.Branch('fillBranchI', fillData, 'fill/I:fillStart/I:fillStable/I:fillEnd/I:durationStable/I') t.Branch('fillBranchD', AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D') t.Branch('radmonBranchI', radmonData, 'tstamp/I:status[16]/I') t.Branch('radmonBranchD', AddressOf(radmonData, 'rates'), 'rates[16]/D') #t.Branch('radmonSums', runningSums, 'rsums[28800]/D') tsStart = fillStarted[fill] tsEnd = fillDumped[fill] tsStable = fillReport.getFillStableTime(int(fill)) duration = fillReport.getFillDuration(int(fill)) bField = fillReport.getFillField(int(fill)) beamEnergy = fillReport.getFillBeamEnergy(int(fill)) fromto = [tsStart-hrs*3600, tsEnd+hrs*3600] filelist = get_filelist(RadmonDataDir, radmonFilePattern, fromto) print "Files used:" chain = TChain("Rate") for file in filelist: print file chain.Add(file) fillData.fillStart = tsStart fillData.fillStable = tsStable fillData.fillEnd = tsEnd fillData.durationStable = duration fillData.bField = bField fillData.beamEnergy = beamEnergy for i in range(chain.GetEntries()): chain.GetEntry(i) #if tsStart - chain.tstamp < 1800: if chain.tstamp > tsStart and chain.tstamp < tsEnd: radmonData.tstamp = chain.tstamp for j in range(0, 16): #rsumsList[j].append(chain.rates[j]) #rsumsList[j].pop(0) radmonData.rates[j] = chain.rates[j] radmonData.status[j] = chain.status[j] #runningSums.rsums = np.asarray(rsumsList).ravel() #nparray = np.asarray(rsumsList).ravel() #for j in range(0, 16*1800): #runningSums.rsums[j] = nparray[j] #nump2d = np.reshape(nump, (-1,1800)) (To get back to 2D) #if chain.tstamp > tsStable - deltaMinutes*60 and chain.tstamp < tsEnd + deltaMinutes*60: t.Fill() fout.Write() fout.Close() del chain del fillData del radmonData #del runningSums del t del fout
def radmonAnaw(): ROOT.gROOT.ProcessLine(\ "struct FillData{\ Int_t fill;\ Int_t fillStart;\ Int_t fillColl;\ Int_t fillStable;\ Int_t fillEnd;\ Int_t durationStable;\ Double_t bField;\ Double_t beamEnergy;\ Double_t peakLumi;\ };") from ROOT import FillData ROOT.gROOT.ProcessLine(\ "struct FitData{\ Double_t p0[16];\ Double_t p0Err[16];\ Double_t p1[16];\ Double_t p1Err[16];\ Double_t p2[16];\ Double_t p2Err[16];\ };") from ROOT import FitData ROOT.gROOT.ProcessLine(\ "struct UcountData{\ Double_t tcount1[16];\ Double_t ucount1[16];\ Double_t tcount2[16];\ Double_t ucount2[16];\ Double_t tcount4[16];\ Double_t ucount4[16];\ };") from ROOT import UcountData fillData = FillData() fitData = FitData() ucountData = UcountData() fout = ROOT.TFile(output, 'RECREATE') t = ROOT.TTree('t', 'Warming by fills') t.Branch('fillBranchI', fillData, 'fill/I:fillStart/I:fillColl/I:fillStable/I:fillEnd/I:durationStable/I') t.Branch('fillBranchD', ROOT.AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D:peakLumi/D') t.Branch('fitBranch', fitData, 'p0[16]/D:p0err[16]/D:p1[16]/D:p1err[16]/D:p2[16]/D:p2err[16]/D') t.Branch('ucountBranch', ucountData, 'tcount1[16]/D:ucount1[16]/D:tcount2[16]/D:ucount2[16]/D:tcount4[16]/D:ucount4[16]/D') for fill in fills: f = RadmonAnaW() status = f.processFill(fill) if status < 0: continue (fillData.fillStart, fillData.fillColl, fillData.fillStable, fillData.fillEnd, fillData.durationStable, fillData.bField, fillData.beamEnergy, fillData.peakLumi) = f.getFillData() f.makeProfiles() f.makeRatios() f.setFitLimits() fillData.fill = fill ##f.draw('r', 'pfib') #(fitData.p0, fitData.p0Err, fitData.p1, fitData.p1Err, fitData.p2, fitData.p2Err) = f.fitAllRatios() #ucountData.ucount = f.getUndercount() (p0, p0Err, p1, p1Err, p2, p2Err) = f.fitAllRatios() for i in range(0, 16): fitData.p0[i] = p0[i] fitData.p0Err[i] = p0Err[i] fitData.p1[i] = p1[i] fitData.p1Err[i] = p1Err[i] fitData.p2[i] = p2[i] fitData.p2Err[i] = p2Err[i] tcount, ucount = f.getUndercount(1) for i in range(0, 16): ucountData.ucount1[i] = ucount[i] ucountData.tcount1[i] = tcount[i] tcount, ucount = f.getUndercount(2) for i in range(0, 16): ucountData.ucount2[i] = ucount[i] ucountData.tcount2[i] = tcount[i] tcount, ucount = f.getUndercount(4) for i in range(0, 16): ucountData.ucount4[i] = ucount[i] ucountData.tcount4[i] = tcount[i] t.Fill() del f fout.Write() fout.Close()
def radmon2fill(): #Get fills already processed filesDone = glob.glob(radmonFillPattern) (toReplace, dummy) = radmonFillPattern.split('.') print filesDone fillsDone = [] for file in filesDone: name, ext = file.split('.') fillsDone.append(int(name.replace(toReplace[0:-1], ""))) if len(fillsDone) > 0: print "Fills already done", fillsDone fillReport = FillReport(fillReportName) #Start/End of each fill in fillReport fillStarted = fillReport.getFillCreationTime() fillDumped = fillReport.getFillEndTime() for fill in sorted(fillStarted.keys()): if int(fill) in fillsDone: print "Fill", fill, "is already processed. Skipping..." continue print "Processing fill", fill, "........." fillData = FillData() radmonData = RadmonData() #runningSums = RunningSums() #rsumsList = [] for i in range(0, 16): #rsumsList.insert(i, [0.]*1800) radmonData.rates[i] = 0. radmonData.status[i] = 0. #Output rootFile = radmonFillPattern.replace("*", str(fill)) try: fout = TFile(rootFile, 'RECREATE') except IOError: print "Cannot open file for output", rootFile exit t = TTree('t', 'Radmon rates') t.Branch('fillBranchI', fillData, 'fill/I:fillStart/I:fillStable/I:fillEnd/I:durationStable/I') t.Branch('fillBranchD', AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D') t.Branch('radmonBranchI', radmonData, 'tstamp/I:status[16]/I') t.Branch('radmonBranchD', AddressOf(radmonData, 'rates'), 'rates[16]/D') #t.Branch('radmonSums', runningSums, 'rsums[28800]/D') tsStart = fillStarted[fill] tsEnd = fillDumped[fill] tsStable = fillReport.getFillStableTime(int(fill)) duration = fillReport.getFillDuration(int(fill)) bField = fillReport.getFillField(int(fill)) beamEnergy = fillReport.getFillBeamEnergy(int(fill)) fromto = [tsStart - hrs * 3600, tsEnd + hrs * 3600] filelist = get_filelist(RadmonDataDir, radmonFilePattern, fromto) print "Files used:" chain = TChain("Rate") for file in filelist: print file chain.Add(file) fillData.fillStart = tsStart fillData.fillStable = tsStable fillData.fillEnd = tsEnd fillData.durationStable = duration fillData.bField = bField fillData.beamEnergy = beamEnergy for i in range(chain.GetEntries()): chain.GetEntry(i) #if tsStart - chain.tstamp < 1800: if chain.tstamp > tsStart and chain.tstamp < tsEnd: radmonData.tstamp = chain.tstamp for j in range(0, 16): #rsumsList[j].append(chain.rates[j]) #rsumsList[j].pop(0) radmonData.rates[j] = chain.rates[j] radmonData.status[j] = chain.status[j] #runningSums.rsums = np.asarray(rsumsList).ravel() #nparray = np.asarray(rsumsList).ravel() #for j in range(0, 16*1800): #runningSums.rsums[j] = nparray[j] #nump2d = np.reshape(nump, (-1,1800)) (To get back to 2D) #if chain.tstamp > tsStable - deltaMinutes*60 and chain.tstamp < tsEnd + deltaMinutes*60: t.Fill() fout.Write() fout.Close() del chain del fillData del radmonData #del runningSums del t del fout
def radmonAnaw(): ROOT.gROOT.ProcessLine(\ "struct FillData{\ Int_t fill;\ Int_t fillStart;\ Int_t fillColl;\ Int_t fillStable;\ Int_t fillEnd;\ Int_t durationStable;\ Double_t bField;\ Double_t beamEnergy;\ Double_t peakLumi;\ };" ) from ROOT import FillData ROOT.gROOT.ProcessLine(\ "struct FitData{\ Double_t p0[16];\ Double_t p0Err[16];\ Double_t p1[16];\ Double_t p1Err[16];\ Double_t p2[16];\ Double_t p2Err[16];\ };" ) from ROOT import FitData ROOT.gROOT.ProcessLine(\ "struct UcountData{\ Double_t tcount1[16];\ Double_t ucount1[16];\ Double_t tcount2[16];\ Double_t ucount2[16];\ Double_t tcount4[16];\ Double_t ucount4[16];\ };" ) from ROOT import UcountData fillData = FillData() fitData = FitData() ucountData = UcountData() fout = ROOT.TFile(output, 'RECREATE') t = ROOT.TTree('t', 'Warming by fills') t.Branch( 'fillBranchI', fillData, 'fill/I:fillStart/I:fillColl/I:fillStable/I:fillEnd/I:durationStable/I' ) t.Branch('fillBranchD', ROOT.AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D:peakLumi/D') t.Branch('fitBranch', fitData, 'p0[16]/D:p0err[16]/D:p1[16]/D:p1err[16]/D:p2[16]/D:p2err[16]/D') t.Branch( 'ucountBranch', ucountData, 'tcount1[16]/D:ucount1[16]/D:tcount2[16]/D:ucount2[16]/D:tcount4[16]/D:ucount4[16]/D' ) for fill in fills: f = RadmonAnaW() status = f.processFill(fill) if status < 0: continue (fillData.fillStart, fillData.fillColl, fillData.fillStable, fillData.fillEnd, fillData.durationStable, fillData.bField, fillData.beamEnergy, fillData.peakLumi) = f.getFillData() f.makeProfiles() f.makeRatios() f.setFitLimits() fillData.fill = fill ##f.draw('r', 'pfib') #(fitData.p0, fitData.p0Err, fitData.p1, fitData.p1Err, fitData.p2, fitData.p2Err) = f.fitAllRatios() #ucountData.ucount = f.getUndercount() (p0, p0Err, p1, p1Err, p2, p2Err) = f.fitAllRatios() for i in range(0, 16): fitData.p0[i] = p0[i] fitData.p0Err[i] = p0Err[i] fitData.p1[i] = p1[i] fitData.p1Err[i] = p1Err[i] fitData.p2[i] = p2[i] fitData.p2Err[i] = p2Err[i] tcount, ucount = f.getUndercount(1) for i in range(0, 16): ucountData.ucount1[i] = ucount[i] ucountData.tcount1[i] = tcount[i] tcount, ucount = f.getUndercount(2) for i in range(0, 16): ucountData.ucount2[i] = ucount[i] ucountData.tcount2[i] = tcount[i] tcount, ucount = f.getUndercount(4) for i in range(0, 16): ucountData.ucount4[i] = ucount[i] ucountData.tcount4[i] = tcount[i] t.Fill() del f fout.Write() fout.Close()
def addRunningSum(): for fill in fills: inputFile = inputPattern.replace('__XXX__', str(fill)) try: fin = ROOT.TFile(inputFile,'READ') print "Processing fill", fill except IOError: print "Cannot open file", inputFile continue inputTree = fin.Get('t') outfile = outputPattern.replace('__XXX__', str(fill)) try: fout = ROOT.TFile(outfile,'RECREATE') except IOError: print "Cannot open file for output", outfile continue #Output tree fillData = FillData() radmonData = RadmonData() t = ROOT.TTree('t', "Radmon rates + runnning sums ") t.Branch('fillBranchI', fillData, 'fill/I:fillStart/I:fillColl/I:fillStable/I:fillEnd/I:durationStable/I') t.Branch('fillBranchD', ROOT.AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D') t.Branch('radmonBranchI', radmonData, 'tstamp/I:status[16]/I') t.Branch('radmonRates', ROOT.AddressOf(radmonData, 'rates'), 'rates[16]/D:rsums15[16]/D:rsums30[16]/D:rsums60[16]/D') rsums15 = [0.]*16 rsumsPrev15 = [0.]*16 rsums30 = [0.]*16 rsumsPrev30 = [0.]*16 rsums60 = [0.]*16 rsumsPrev60 = [0.]*16 # First pass is to find beginning of the collisions tsColl = -100000 for i in range(0, inputTree.GetEntries()): nb = inputTree.GetEntry(i) if nb < 0: continue if inputTree.rates[refIndx] > rateCut: tsColl = inputTree.tstamp break for i in range(0, inputTree.GetEntries()): nb = inputTree.GetEntry(i) if nb < 0: continue #Copy data to a new tree fillData.fill = inputTree.fill fillData.fillStart = inputTree.fillStart fillData.fillColl = tsColl fillData.fillStable = inputTree.fillStable fillData.fillEnd = inputTree.fillEnd fillData.durationStable = inputTree.durationStable fillData.bField = inputTree.bField fillData.beamEnergy = inputTree.beamEnergy radmonData.tstamp = inputTree.tstamp for j in range(0, 16): radmonData.status[j] = inputTree.status[j] radmonData.rates[j] = inputTree.rates[j] #Running sums (c) AK # 15 minutes if i+1 < 15*60: rsums15[j] += inputTree.rates[j] radmonData.rsums15[j] = rsums15[j] rsumsPrev15[j] = rsums15[j] else: rsums15[j] = ((15*60 - 1)*rsumsPrev15[j] + inputTree.rates[j])/15/60 radmonData.rsums15[j] = rsums15[j] rsumsPrev15[j] = rsums15[j] # 30 minutes if i+1 < 30*60: rsums30[j] += inputTree.rates[j] radmonData.rsums30[j] = rsums30[j] rsumsPrev30[j] = rsums30[j] else: rsums30[j] = ((30*60 - 1)*rsumsPrev30[j] + inputTree.rates[j])/30/60 radmonData.rsums30[j] = rsums30[j] rsumsPrev30[j] = rsums30[j] # 60 minutes if i+1 < 60*60: rsums60[j] += inputTree.rates[j] radmonData.rsums60[j] = rsums60[j] rsumsPrev60[j] = rsums60[j] else: rsums60[j] = ((60*60 - 1)*rsumsPrev60[j] + inputTree.rates[j])/60/60 radmonData.rsums60[j] = rsums60[j] rsumsPrev60[j] = rsums60[j] t.Fill() fout.Write() fout.Close() del fillData del radmonData del t del fout del inputTree del inputFile
def writeOutput(self): rootFile = radmonLumiFilePattern.replace('__XXX__', str(self.fill)) try: fout = TFile(rootFile,'RECREATE') except IOError: print "Cannot open file for output", rootFile exit t = TTree('t', 'Combined Lumi and Radmon data') fillData = FillData() lumiData = LumiData() radmonData = RadmonData() t.Branch('fillBranch', fillData, 'fill/I:fillStart/I:fillStable/I:fillEnd/I:durationStable/I:run/I:lsNo/I:tstamp/I:msecs/I:bunchSpacing/I') t.Branch('fillBranchD', AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D') t.Branch('lumiBranch', lumiData, 'bestLumi/D:bestLumiErr/D:hfLumi/D:hfLumiErr/D:pltLumi/D:pltLumiErr/D:pltZeroLumi/D:pltZeroLumiErr/D:bcmfLumi/D:bcmfLumiErr/D') t.Branch('radmonBranch', radmonData, 'rates[16]/D:ratesErr[16]/D') href = self.pbest # Reference histogram #self.pbcmf.Draw() #raw_input("Press enter to continue") print "Starting filling tree, file ", radmonLumiFilePattern.replace('__XXX__', str(self.fill)) for i in range(len(self.xx) - 1): fillData.fill = self.fillDataList[i].fill fillData.fillStart = self.fillDataList[i].fillStart fillData.fillStable = self.fillDataList[i].fillStable fillData.fillEnd = self.fillDataList[i].fillEnd fillData.durationStable = self.fillDataList[i].durationStable fillData.run = self.fillDataList[i].run fillData.lsNo = self.fillDataList[i].lsNo fillData.bunchSpacing = self.fillDataList[i].bunchSpacing fillData.bField = self.fillDataList[i].bField fillData.beamEnergy = self.fillDataList[i].beamEnergy fillData.tstamp = int(href.GetXaxis().GetBinCenter(i)) fillData.msecs = int(href.GetXaxis().GetBinCenter(i) - fillData.tstamp) lumiData.bestLumi = self.pbest.GetBinContent(i) lumiData.bestLumiErr = self.pbest.GetBinError(i) lumiData.hfLumi = self.phf.GetBinContent(i) lumiData.hfLumiErr = self.phf.GetBinError(i) lumiData.pltLumi = self.pplt.GetBinContent(i) lumiData.pltLumiErr = self.pplt.GetBinError(i) lumiData.pltZeroLumi = self.ppltZero.GetBinContent(i) lumiData.pltZeroLumiErr = self.ppltZero.GetBinError(i) lumiData.bcmfLumi = self.pbcmf.GetBinContent(i) lumiData.bcmfLumiErr = self.pbcmf.GetBinError(i) for j in range(len(self.pradmon)): radmonData.rates[j] = self.pradmon[j].GetBinContent(i) radmonData.ratesErr[j] = self.pradmon[j].GetBinError(i) t.Fill() print "Writing", rootFile fout.Write() fout.Close() del fout
def setupRanges(self): """ read file with lumi data setup low edges of histograms corresponding to the beginning of lumisections fill array of fill data (fill, ls, run) corresponding to the given bin """ lsection = -1 fillData = FillData() fillReport = FillReport(fillReportName) #Start/End/Stable tsStart = fillReport.getFillCreationTime(self.fill) tsEnd = fillReport.getFillEndTime(self.fill) tsStable = fillReport.getFillStableTime(self.fill) duration = fillReport.getFillDuration(self.fill) bField = fillReport.getFillField(self.fill) beamEnergy = fillReport.getFillBeamEnergy(self.fill) #Time range to look for radmon files self.fromto[0] = tsStart self.fromto[1] = tsEnd f = TFile(lumiFilePattern.replace('__XXX__', str(self.fill))) tree = f.Get("t") for i in range(0, tree.GetEntries()) : nb = tree.GetEntry(i) if nb < 0: continue #Y range for histograms if tree.bestLumi > self.yMax: self.yMax = tree.bestLumi if tree.bestLumi < self.yMin: self.yMin = tree.bestLumi #Low edges for histos (start of LS) if tree.lsNo != lsection: self.xx.append(tree.lsStart + tree.lsStartMs/1000000.) lsection = tree.lsNo # New lumisection - Add fill data fillData.fill = tree.fill fillData.fillStart = tsStart fillData.fillStable = tsStable fillData.fillEnd = tsEnd fillData.durationStable = duration fillData.bField = bField fillData.beamEnergy = beamEnergy fillData.bunchSpacing = tree.bunchSpacing fillData.run = tree.run fillData.lsNo = tree.lsNo self.fillDataList.append(fillData) print "Done setting up ranges for fill", self.fill, "\tNo of bins", len(self.xx) -1 del tree del f del fillReport return len(self.xx) -1
def writeOutput(self): rootFile = radmonLumiFilePattern.replace('__XXX__', str(self.fill)) try: fout = TFile(rootFile, 'RECREATE') except IOError: print "Cannot open file for output", rootFile exit t = TTree('t', 'Combined Lumi and Radmon data') fillData = FillData() lumiData = LumiData() radmonData = RadmonData() t.Branch( 'fillBranch', fillData, 'fill/I:fillStart/I:fillStable/I:fillEnd/I:durationStable/I:run/I:lsNo/I:tstamp/I:msecs/I:bunchSpacing/I' ) t.Branch('fillBranchD', AddressOf(fillData, 'bField'), 'bField/D:beamEnergy/D') t.Branch( 'lumiBranch', lumiData, 'bestLumi/D:bestLumiErr/D:hfLumi/D:hfLumiErr/D:pltLumi/D:pltLumiErr/D:pltZeroLumi/D:pltZeroLumiErr/D:bcmfLumi/D:bcmfLumiErr/D' ) t.Branch('radmonBranch', radmonData, 'rates[16]/D:ratesErr[16]/D') href = self.pbest # Reference histogram #self.pbcmf.Draw() #raw_input("Press enter to continue") print "Starting filling tree, file ", radmonLumiFilePattern.replace( '__XXX__', str(self.fill)) for i in range(len(self.xx) - 1): fillData.fill = self.fillDataList[i].fill fillData.fillStart = self.fillDataList[i].fillStart fillData.fillStable = self.fillDataList[i].fillStable fillData.fillEnd = self.fillDataList[i].fillEnd fillData.durationStable = self.fillDataList[i].durationStable fillData.run = self.fillDataList[i].run fillData.lsNo = self.fillDataList[i].lsNo fillData.bunchSpacing = self.fillDataList[i].bunchSpacing fillData.bField = self.fillDataList[i].bField fillData.beamEnergy = self.fillDataList[i].beamEnergy fillData.tstamp = int(href.GetXaxis().GetBinCenter(i)) fillData.msecs = int(href.GetXaxis().GetBinCenter(i) - fillData.tstamp) lumiData.bestLumi = self.pbest.GetBinContent(i) lumiData.bestLumiErr = self.pbest.GetBinError(i) lumiData.hfLumi = self.phf.GetBinContent(i) lumiData.hfLumiErr = self.phf.GetBinError(i) lumiData.pltLumi = self.pplt.GetBinContent(i) lumiData.pltLumiErr = self.pplt.GetBinError(i) lumiData.pltZeroLumi = self.ppltZero.GetBinContent(i) lumiData.pltZeroLumiErr = self.ppltZero.GetBinError(i) lumiData.bcmfLumi = self.pbcmf.GetBinContent(i) lumiData.bcmfLumiErr = self.pbcmf.GetBinError(i) for j in range(len(self.pradmon)): radmonData.rates[j] = self.pradmon[j].GetBinContent(i) radmonData.ratesErr[j] = self.pradmon[j].GetBinError(i) t.Fill() print "Writing", rootFile fout.Write() fout.Close() del fout
def setupRanges(self): """ read file with lumi data setup low edges of histograms corresponding to the beginning of lumisections fill array of fill data (fill, ls, run) corresponding to the given bin """ lsection = -1 fillData = FillData() fillReport = FillReport(fillReportName) #Start/End/Stable tsStart = fillReport.getFillCreationTime(self.fill) tsEnd = fillReport.getFillEndTime(self.fill) tsStable = fillReport.getFillStableTime(self.fill) duration = fillReport.getFillDuration(self.fill) bField = fillReport.getFillField(self.fill) beamEnergy = fillReport.getFillBeamEnergy(self.fill) #Time range to look for radmon files self.fromto[0] = tsStart self.fromto[1] = tsEnd f = TFile(lumiFilePattern.replace('__XXX__', str(self.fill))) tree = f.Get("t") for i in range(0, tree.GetEntries()): nb = tree.GetEntry(i) if nb < 0: continue #Y range for histograms if tree.bestLumi > self.yMax: self.yMax = tree.bestLumi if tree.bestLumi < self.yMin: self.yMin = tree.bestLumi #Low edges for histos (start of LS) if tree.lsNo != lsection: self.xx.append(tree.lsStart + tree.lsStartMs / 1000000.) lsection = tree.lsNo # New lumisection - Add fill data fillData.fill = tree.fill fillData.fillStart = tsStart fillData.fillStable = tsStable fillData.fillEnd = tsEnd fillData.durationStable = duration fillData.bField = bField fillData.beamEnergy = beamEnergy fillData.bunchSpacing = tree.bunchSpacing fillData.run = tree.run fillData.lsNo = tree.lsNo self.fillDataList.append(fillData) print "Done setting up ranges for fill", self.fill, "\tNo of bins", len( self.xx) - 1 del tree del f del fillReport return len(self.xx) - 1