14 from array
import array
16 from ROOT
import gROOT
18 from ROOT
import TFile, TTree, TMath
21 def gainana_pixelToPmt(inputRoot, outputRoot, maxHitTiming=-8., nMinEntries=100):
26 f_out = TFile(outputRoot,
"RECREATE")
27 tr_out = TTree(
"tree_pmt",
"gain/eff. analysis output in PMT-by-PMT")
32 slotId = array(
'i', [0])
33 pmtId = array(
'i', [0])
34 nValidCh = array(
'i', [0])
35 meanGain = array(
'f', [0.])
36 stdDevGain = array(
'f', [0.])
37 maxMinRatio = array(
'f', [0.])
38 gain = array(
'f', nPmtCh * [0.])
39 efficiency = array(
'f', nPmtCh * [0.])
41 tr_out.Branch(
'slotId', slotId,
'slotId/I')
42 tr_out.Branch(
'pmtId', pmtId,
'pmtId/I')
43 tr_out.Branch(
'nValidCh', nValidCh,
'nValidCh/I')
44 tr_out.Branch(
'meanGain', meanGain,
'meanGain/F')
45 tr_out.Branch(
'stdDevGain', stdDevGain,
'stdDevGain/F')
46 tr_out.Branch(
'maxMinRatio', maxMinRatio,
'maxMinRatio/F')
47 tr_out.Branch(
'gain', gain,
'gain[' + str(nPmtCh) +
']/F')
48 tr_out.Branch(
'efficiency', efficiency,
'efficiency[' + str(nPmtCh) +
']/F')
50 for iSlot
in range(nTopModules):
51 for iPMT
in range(nPmtPerModule):
56 cut =
"slotId==" + str(slotId[0]) +
" && pmtId==" + str(pmtId[0]) + \
57 " && hitTiming<(" + str(maxHitTiming) +
") && nEntries>" + str(nMinEntries)
58 tr.Draw(
"gain:efficiency:pmtChId", cut)
59 nValidCh[0] = tr.GetEntries(cut)
62 elif nValidCh[0] >= nPmtCh:
63 print(
"ERROR : too many channels for slot" + str(slotId[0]).zfill(2) +
64 " PMT" + str(pmtId[0]).zfill(2) +
"(" + str(nValidCh[0]) +
")")
69 for iCh
in range(nValidCh[0]):
70 gainArray.append(tr.GetV1()[iCh])
71 effArray.append(tr.GetV2()[iCh])
72 chArray.append(int(tr.GetV3()[iCh]))
74 meanGain[0] = numpy.average(gainArray)
75 stdDevGain[0] = numpy.std(gainArray)
76 maxMinRatio[0] = max(gainArray) / min(gainArray)
77 print(cut +
" : nValidCh = " + str(nValidCh[0]))
78 print(
" --> mean = " + str(
'%05.2f' % meanGain[0]) +
", StdDev = " + str(
'%05.2f' % stdDevGain[0]) +
79 ", max/min = " + str(
'%03.2f' % maxMinRatio[0]))
81 for iCh
in range(nPmtCh):
82 for jCh
in range(nValidCh[0]):
83 if chArray[jCh] - 1
is iCh:
84 gain[iCh] = gainArray[jCh]
85 efficiency[iCh] = effArray[jCh]
97 if __name__ ==
'__main__':
101 gainana_pixelToPmt(args[1], args[2], float(args[3]), int(args[4]))
103 gainana_pixelToPmt(args[1], args[2], float(args[3]))
105 gainana_pixelToPmt(args[1], args[2])
108 print(args[0] +
" (root file for pixel-by-pixel gain result) (output file)" +
109 " [max. hit timing = -8 ns] [min. number of entries = 100]")