示例#1
0
def getTrap():

    ds, run, chan = 1, 11085, 580  # C1P1D3
    # trigger eff vals from old study: mu = 1.448, sig = 0.305

    # 2016-9-15-P3LQG_Run60001538 C2P1D3 P42748B
    # ds, run, chan = 4, 60001538, 1110

    from ROOT import GATDataSet
    gds = GATDataSet(run)
    tt = gds.GetGatifiedChain()
    bt = gds.GetBuiltChain()
    tt.AddFriend(bt)

    tCut = "channel==%d" % chan
    n = tt.Draw("Entry$:Iteration$", tCut, "goff")
    evt, itr = tt.GetV1(), tt.GetV2()
    evtList = [[int(evt[i]), int(itr[i])] for i in range(n)]

    trapOutput = []

    pEvt = -1
    for i, (iE, iH) in enumerate(evtList):
        if iE != pEvt:
            tt.GetEntry(iE)
        pEvt = iE

        hitE = tt.trapENFCal.at(iH)
        wf = bt.event.GetWaveform(iH)
        sig = wl.processWaveform(wf)
        waveRaw = sig.GetWaveBLSub()
        waveTS = sig.GetTS()

        # mimic onboard energy trapezoid
        eTrap = wl.trapFilter(waveRaw, 400, 180, 0)
        nPad = len(waveRaw) - len(eTrap)
        eTrap = np.pad(eTrap, (nPad, 0), 'constant')
        eTrapTS = np.arange(0, len(eTrap) * 10., 10)

        # trap timestamps shouldn't change, don't recalculate them
        if i == 0:
            pTS = eTrapTS
        if not np.array_equal(eTrapTS, pTS):
            print("Warning, the timestamps changed.  Uggggg")
            return

        # print(i, iE, iH, hitE)
        trapOutput.append(eTrap)

    # np.savez("../data/trapOutput.npz",trapOutput,eTrapTS) # original ds4 run
    np.savez("../data/trapOutput-2.npz", trapOutput, eTrapTS)  # new ds1 run
示例#2
0
def getOffset():
    """ we're looking for the difference in the offsets between HG and LG waveforms. """

    from ROOT import GATDataSet, TChain

    ds, cIdx, run = 1, 41, 13387

    det = dsi.DetInfo()
    pMons = det.getPMon(ds)

    # skim = TChain("skimTree")
    # skim.Add("/global/homes/w/wisecg/project/cal/skim/skimDS1_run13387_low.root")
    gds = GATDataSet(run)
    gat = gds.GetGatifiedChain(False)

    n = gat.Draw("Entry$:tOffset:channel", "trapENFCal < 250", "goff")
    iEnt, tOff, chan = gat.GetV1(), gat.GetV2(), gat.GetV3()
    iEnt = np.asarray([int(iEnt[i]) for i in range(n)])
    tOff = np.asarray([tOff[i] for i in range(n)])
    chan = np.asarray([chan[i] for i in range(n)])

    chList = sorted(list(set(chan)))
    chList = [ch for ch in chList if ch % 2 == 0]
    chDiff = {ch: [] for ch in chList}
    chNoPair = {ch: [] for ch in chList}

    eList = sorted(list(
        set(iEnt)))  # we do this b/c the list isn't insanely huge
    for iE in eList:
        idx = np.where(iEnt == iE)
        tOffTmp = tOff[idx]
        chTmp = chan[idx]

        for i, ch in enumerate(chTmp):
            if ch % 2 == 1: continue

            iM = np.where(chTmp == ch + 1)
            if len(iM[0]) == 0:
                chNoPair[ch].append(tOffTmp[i])
                continue

            diff = tOffTmp[i] - tOffTmp[iM]  # HG - LG
            chDiff[ch].append(tOffTmp[i] - tOffTmp[iM])

    for ch in chList:
        chDiff[ch] = np.asarray(chDiff[ch])

    np.savez("../data/tOff-%d.npz" % run, chDiff, chNoPair)
示例#3
0
def pulserBL():
    """ For each bkgIdx, get the HG pulser events and all their baseline values.
    Fill a dict of channels w/ the values, then make plots'n stuff.
    """
    dsNum, modNum = 1, 1
    goodList = ds.GetGoodChanList(dsNum)

    # thing we want to make histos with
    baseDict = {ch: [] for ch in goodList}

    # for bkgIdx in range(ds.dsMap[dsNum]+1):
    for bkgIdx in range(1):

        print "DS-%d, bkgIdx %d" % (dsNum, bkgIdx)

        runList = []
        bkgList = ds.bkgRunsDS[dsNum][bkgIdx]
        for idx in range(0, len(bkgList), 2):
            [
                runList.append(run)
                for run in range(bkgList[idx], bkgList[idx + 1] + 1)
            ]

        gds = GATDataSet()
        [gds.AddRunNumber(run) for run in runList]
        gatTree = gds.GetGatifiedChain()
        bltTree = gds.GetBuiltChain()
        gatTree.AddFriend(bltTree)

        theCut = "EventDC1Bits && channel%2==0 && trapENFCal>50"  # select pulser subset
        gatTree.Draw(">>elist", theCut, "entrylist")
        elist = gDirectory.Get("elist")
        gatTree.SetEntryList(elist)

        for iList in range(elist.GetN()):

            entry = gatTree.GetEntryNumber(iList)
            gatTree.LoadTree(entry)
            gatTree.GetEntry(entry)
            nChans = gatTree.channel.size()
            numPass = gatTree.Draw("channel", theCut, "GOFF", 1, iList)
            chans = gatTree.GetV1()
            chanList = list(set(int(chans[n]) for n in xrange(numPass)))

            hitList = (iH for iH in xrange(nChans)
                       if gatTree.channel.at(iH) in goodList)
            for iH in hitList:
                if dsNum == 2:
                    wf_downsampled = bltTree.event.GetWaveform(iH)
                    wf_regular = bltTree.event.GetAuxWaveform(iH)
                    wf = MJTMSWaveform(wf_downsampled, wf_regular)
                else:
                    wf = bltTree.event.GetWaveform(iH)
                chan = int(gatTree.channel.at(iH))
                signal = wl.processWaveform(wf)
                baseline, _ = signal.GetBaseNoise()
                baseline = float("%.2f" %
                                 baseline)  # kill precision to save on memory
                baseDict[chan].append(baseline)

    # could pickle the baseDict here, but idk, let's move on

    fig = plt.figure(figsize=(8, 7), facecolor='w')
    p1 = plt.subplot(111)
    # for ch in baseDict:
    ch = 608

    arr = np.asarray(baseDict[chan])

    p1.hist(arr)  #, bins='auto') # arguments are passed to np.histogram
    p1.set_title("Channel 608")

    plt.savefig("../plots/ch608-bl.pdf")
示例#4
0
def main(argv):
    """
    Matplotlib animation tutorial:
    http://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/
    Requires ffmpeg.  (brew install ffmpeg)
    """

    # Set input file and cuts
    # gatFile = TFile("~/project/mjddatadir/gatified/mjd_run27012.root") # generate w/ process_mjd_data_p1
    # bltFile = TFile("~/project/mjddatadir/built/OR_run27012.root")
    # gatTree = gatFile.Get("mjdTree")
    # bltTree = bltFile.Get("MGTree")
    run = 23725
    ds = GATDataSet(run)
    gatTree = ds.GetGatifiedChain()
    bltTree = ds.GetBuiltChain()
    gatTree.AddFriend(bltTree)
    print "Found",gatTree.GetEntries(),"input entries."

    # Get first timestamp
    gatTree.GetEntry(0)
    # print type(gatTree.localTime.localTime)


    theCut = "Entry$<50"
    # theCut = "channel == 674" # C1P7D3
    # theCut = "trapE < 6000 && channel==674 && timestamp/1e8 > 148359"
    # theCut = "channel==632 && timestamp/1e8 > 148359"

    outFile = "../plots/movie_run%d.mp4" % run

    # Print cut and events passing cut
    print "Using cut:\n",theCut,"\n"
    gatTree.Draw(">>elist", theCut, "entrylist")
    elist = gDirectory.Get("elist")
    gatTree.SetEntryList(elist)
    nList = elist.GetN()
    print "Found",nList,"entries passing cuts."



    # First set up the figure, the axis, and the plot element we want to animate
    fig = plt.figure(figsize=(11,5), facecolor='w')
    a1 = plt.subplot(111)
    # a2 = plt.subplot(111)
    # a1.set_xlim(0,50000)
    # a1.set_ylim(0,1000)
    a1.set_xlabel("time (ns)")
    a1.set_ylabel("ADC")
    p1, = a1.plot(np.ones(1), np.ones(1), color='blue')
    p2, = a1.plot(np.ones(1), np.ones(1), color='red')

    # initialization function: plot the background of each frame
    def init():
        p1.set_data([],[])
        p2.set_data([],[])
        return p1,p2,

    # animation function.  This is called sequentially (it's the loop over events.)
    def animate(iList):

        entry = gatTree.GetEntryNumber(iList);
        gatTree.LoadTree(entry)
        gatTree.GetEntry(entry)
        nChans = gatTree.channel.size()
        numPass = gatTree.Draw("channel",theCut,"GOFF",1,iList)
        chans = gatTree.GetV1()
        chanList = list(set(int(chans[n]) for n in xrange(numPass)))
        event = bltTree.event

        locTime = gatTree.localTime.localTime # wow, srsly?

        # Loop over hits passing cuts
        hitList = (iH for iH in xrange(nChans) if gatTree.channel.at(iH) in chanList)  # a 'generator expression'
        for iH in hitList:

            # wf = MGTWaveform()
            iEvent = 0
            wf_downsampled = event.GetWaveform(iH)
            wf_regular = event.GetAuxWaveform(iH)

            wf = MJTMSWaveform(wf_downsampled,wf_regular)


            iEvent = entry
            run = gatTree.run
            chan = gatTree.channel.at(iH)
            energy = gatTree.trapE.at(iH)
            # timestamp = gatTree.timestamp.at(iH) / 1e8
            # locTime = timestamp - firstTime


            signal = wl.processWaveform(wf)
            waveRaw = signal.GetWaveRaw()
            waveBLSub = signal.GetWaveBLSub()
            waveTS = signal.GetTS()

            baseline = np.sum(waveRaw[:50])/50

            # B, A = butter(2,1e6/(1e8/2), btype='lowpass')
            # data_lPass = lfilter(B, A, waveRaw)

            # simple trap filter (broken)
            trapTS = waveTS
            ADCThresh = 1.
            trap, trigger, triggerTS = trapFilt(waveBLSub,trapThresh=ADCThresh)
            trap = trap + baseline

            # fill the figure
            p1.set_ydata(waveRaw)
            p1.set_xdata(waveTS)
            p2.set_ydata(trap)
            p2.set_xdata(trapTS)
            plt.title("Run %d  Channel %d  Entry %d  trapE %.1f  locTime %.1f s" % (run,chan,iList,energy,locTime))

            # dynamically scale the axes
            xmin, xmax = np.amin(waveTS), np.amax(waveTS)
            a1.set_xlim([xmin,xmax])
            if energy < 1000:
                a1.set_ylim(0,1000)
            else:
                ymin, ymax = np.amin(waveRaw), np.amax(waveRaw)
                a1.set_ylim([ymin-abs(0.1*ymin),ymax+abs(0.1*ymax)])

            # print progress
            # print "%d / %d  Run %d  nCh %d  chan %d  trapE %.1f  samp %d" % (iList,nList,run,nChans,chan,energy,wf.GetLength())
            if iList%500 == 0 and iList!=0:
                print "%d / %d entries saved (%.2f %% done)." % (iList,nList,100*(float(iList)/nList))

            return p1,p2,

    # call the animator.  blit=True means only re-draw the parts that have changed.
    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=elist.GetN(), interval=0, blit=True)

    # save the animation as an mp4.  This requires ffmpeg or mencoder to be
    # installed.  The extra_args ensure that the x264 codec is used, so that
    # the video can be embedded in html5.  You may need to adjust this for
    # your system: for more information, see
    # http://matplotlib.sourceforge.net/api/animation_api.html
    anim.save(outFile, fps=20)#, extra_args=['-vcodec', 'libx264'])
示例#5
0
def printOffsets():

    from ROOT import GATDataSet, TChain

    ds, cIdx, run = 1, 41, 13387

    det = dsi.DetInfo()
    # pMons = det.getPMon(ds) # this cal run isn't getting these
    # print(pMons)
    # return
    cpdList = det.dets["M1"]
    cpdPairs = {cpd: 0 for cpd in cpdList}
    cpdOrphanHG = {cpd: 0 for cpd in cpdList}
    cpdOrphanLG = {cpd: 0 for cpd in cpdList}

    skim = TChain("skimTree")
    skim.Add(
        "/global/homes/w/wisecg/project/cal/skim/skimDS1_run13387_low.root")
    # n = skim.Draw("iEvent:tOffset:channel","mH==1 && tOffset > 100","goff")
    n = skim.Draw("iEvent:tOffset:channel", "mH==1", "goff")
    iEnt, tOff, chan = skim.GetV1(), skim.GetV2(), skim.GetV3()
    iEnt = [int(iEnt[i]) for i in range(n)]
    tOff = [tOff[i] for i in range(n)]
    chan = [chan[i] for i in range(n)]

    gds = GATDataSet(run)
    gat = gds.GetGatifiedChain(False)

    iNWF, hitChans, tOffs, hitEs = [], [], [], []
    for iE in iEnt:
        gat.GetEntry(iE)
        iN = gat.channel.size()
        iNWF.append(iN)

        hChs = [int(gat.channel.at(j)) for j in range(iN)]
        hitChans.append(hChs)
        tOffs.append([int(gat.tOffset.at(j)) for j in range(iN)])

        hits = [gat.trapENFCal.at(j) for j in range(iN)]
        hitEs.append(wl.niceList(hits))

        pairs = []
        for ch in hChs:
            if ch + 1 in hChs: pairs.extend([ch, ch + 1])
        hgOrphans = [
            ch for ch in hChs
            if ch + 1 not in hChs and ch not in pairs and ch % 2 == 0
        ]
        lgOrphans = [
            ch for ch in hChs
            if ch - 1 not in hChs and ch not in pairs and ch % 2 == 1
        ]
        # print(hChs, "pairs:", pairs, "hg orph", hgOrphans, "lg orph", lgOrphans)

        for ch in pairs:
            if ch % 2 == 1: continue
            cpd = det.getChanCPD(ds, ch)
            cpdPairs[cpd] += 1

        for ch in hgOrphans:
            cpd = det.getChanCPD(ds, ch)
            cpdOrphanHG[cpd] += 1

        for ch in lgOrphans:
            cpd = det.getChanCPD(ds, ch - 1)
            cpdOrphanLG[cpd] += 1

    # nLim = 200 if n > 200 else n
    # for i in range(nLim):
    # print("%d  %-5d  %-4d  gNWF %d" % (chan[i], iEnt[i], tOff[i], iNWF[i]), hitChans[i], tOffs[i], hitEs[i])

    np.savez("../data/toffset-orphans.npz", cpdPairs, cpdOrphanHG, cpdOrphanLG)