20 from array
import array
21 from ROOT
import gROOT
23 from ROOT
import TFile, TTree
26 def gainana_pixelToPmt(inputRoot, outputRoot, maxHitTiming=-8., nMinEntries=100):
31 f_out = TFile(outputRoot,
"RECREATE")
32 tr_out = TTree(
"tree_pmt",
"gain/eff. analysis output in PMT-by-PMT")
37 slotId = array(
'i', [0])
38 pmtId = array(
'i', [0])
39 nValidCh = array(
'i', [0])
40 meanGain = array(
'f', [0.])
41 stdDevGain = array(
'f', [0.])
42 maxMinRatio = array(
'f', [0.])
43 gain = array(
'f', nPmtCh * [0.])
44 efficiency = array(
'f', nPmtCh * [0.])
46 tr_out.Branch(
'slotId', slotId,
'slotId/I')
47 tr_out.Branch(
'pmtId', pmtId,
'pmtId/I')
48 tr_out.Branch(
'nValidCh', nValidCh,
'nValidCh/I')
49 tr_out.Branch(
'meanGain', meanGain,
'meanGain/F')
50 tr_out.Branch(
'stdDevGain', stdDevGain,
'stdDevGain/F')
51 tr_out.Branch(
'maxMinRatio', maxMinRatio,
'maxMinRatio/F')
52 tr_out.Branch(
'gain', gain,
'gain[' + str(nPmtCh) +
']/F')
53 tr_out.Branch(
'efficiency', efficiency,
'efficiency[' + str(nPmtCh) +
']/F')
55 for iSlot
in range(nTopModules):
56 for iPMT
in range(nPmtPerModule):
61 cut =
"slotId==" + str(slotId[0]) +
" && pmtId==" + str(pmtId[0]) + \
62 " && hitTiming<(" + str(maxHitTiming) +
") && nEntries>" + str(nMinEntries)
63 tr.Draw(
"gain:efficiency:pmtChId", cut)
64 nValidCh[0] = tr.GetEntries(cut)
67 elif nValidCh[0] >= nPmtCh:
68 print(
"ERROR : too many channels for slot" + str(slotId[0]).zfill(2) +
69 " PMT" + str(pmtId[0]).zfill(2) +
"(" + str(nValidCh[0]) +
")")
74 for iCh
in range(nValidCh[0]):
75 gainArray.append(tr.GetV1()[iCh])
76 effArray.append(tr.GetV2()[iCh])
77 chArray.append(int(tr.GetV3()[iCh]))
79 meanGain[0] = numpy.average(gainArray)
80 stdDevGain[0] = numpy.std(gainArray)
81 maxMinRatio[0] = max(gainArray) / min(gainArray)
82 print(cut +
" : nValidCh = " + str(nValidCh[0]))
83 print(
" --> mean = " + str(
'%05.2f' % meanGain[0]) +
", StdDev = " + str(
'%05.2f' % stdDevGain[0]) +
84 ", max/min = " + str(
'%03.2f' % maxMinRatio[0]))
86 for iCh
in range(nPmtCh):
87 for jCh
in range(nValidCh[0]):
88 if chArray[jCh] - 1
is iCh:
89 gain[iCh] = gainArray[jCh]
90 efficiency[iCh] = effArray[jCh]
103 if __name__ ==
'__main__':
107 gainana_pixelToPmt(args[1], args[2], float(args[3]), int(args[4]))
109 gainana_pixelToPmt(args[1], args[2], float(args[3]))
111 gainana_pixelToPmt(args[1], args[2])
114 print(args[0] +
" (root file for pixel-by-pixel gain result) (output file)" +
115 " [max. hit timing = -8 ns] [min. number of entries = 100]")