From: Manuel Penschuck Date: Sat, 18 Oct 2014 19:12:52 +0000 (+0200) Subject: CBMNet: Script to convert TrbNet into CBMNet time using TDC data. Tool will now be... X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=22df5f871dbcd306724489a67cf8a2ba36a1ba6a;p=trb3.git CBMNet: Script to convert TrbNet into CBMNet time using TDC data. Tool will now be moved to daqtools --- diff --git a/cbmnet/test/analyse/convertToCbmClock.py b/cbmnet/test/analyse/convertToCbmClock.py new file mode 100644 index 0000000..cd95e51 --- /dev/null +++ b/cbmnet/test/analyse/convertToCbmClock.py @@ -0,0 +1,103 @@ +import datetime +import glob +from hldLib import * +import numpy as np + +noEvents = 1000000 +counter = 0 +TDCCHANS = 5 + +files = glob.glob("/local/mpenschuck/hldfiles/*.hld") +files.sort() +files.pop() +files.pop() +#files.pop() + +epoch = 0 +epochTimeInNs = 0.0 + +calibDataTDC = np.load("calib.dat.npy") + +firstEpoch = -1 + + +trbRefTimeTDCChan = 0 +cbmRefTimeTDCChan = 3 + +eventTimeInCBM = np.zeros( noEvents ) +print "Read file ", files[-1] +with open(files[-1], "rb") as hld: + lastEvent = None + for evt in eventIterator(hld): + if not len(evt[1]): continue + + trbTDC = None + cbmTDC = None + sync = None + + for sEvt in evt[1]: + for ssEvt in sEvt[1]: + if ssEvt[0]['subsubEvtId'] == 0xf3c0: + cts, remain = extractCTS(ssEvt[1]) + sync, tdc = extractSync(remain) + assert(len(sync) in {1, 5, 11}) + + for w in tdc: + if w & 0x80000000: + tdcData = tdcTimeData(w) + if tdcData["edge"] == 1 and tdcData["channelNo"] in {trbRefTimeTDCChan, cbmRefTimeTDCChan} and tdcData["fineTime"] != 0x3ff: + fineTimeInNs = calibDataTDC[tdcData["channelNo"], tdcData["fineTime"]] + assert( 0 <= fineTimeInNs <= 5.0 ) + coarseTimeInNs = tdcData["coarseTime"] * 5.0 + tdcTime = coarseTimeInNs - fineTimeInNs + epochTimeInNs + + if tdcData["channelNo"] == trbRefTimeTDCChan: + trbTDC = tdcTime + else: + cbmTDC = tdcTime + + if trbTDC != None and cbmTDC != None: break + + elif (w >> 29) == 3: # epoch counter + epoch = w & 0x0fffffff + tmp = epoch * 10240.0 + if epochTimeInNs > tmp: + print epoch + #tmp += 10240.0 * 0x0fffffff + epochTimeInNs = tmp + + elif (w >> 29) == 1: # tdc header + pass + elif (w >> 29) == 2: # debug + pass + else: + print "Unknown TDC word type: 0x%08x" % w + + if trbTDC != None and cbmTDC != None: + eventTimeInCBM[counter] = 8.0 * sync[2] + trbTDC - cbmTDC + else: + print "Bad Event: %d" % counter + + counter += 1 + if noEvents <= counter: + break + +if counter < noEvents: + print "Only found %d events" % counter + eventTimeInCBM = eventTimeInCBM[:counter] + +#eventTimeInCBM -= eventTimeInCBM[0] +timeBetweenEvents = slope(eventTimeInCBM) + +avgInterval = np.average(timeBetweenEvents) +stdInterval = np.std(timeBetweenEvents) + +print "Avg: %f ns, Std: %f ns" % (avgInterval, stdInterval) + +np.savetxt("time_between_events.txt", np.vstack([timeBetweenEvents, timeBetweenEvents - avgInterval]).T ) + +text_file = open("time_between_events.label", "w") +text_file.write('labelText = "Events: %d\\nAvg: %.2f ns\\nFreq: %.2f KHz\\nStd: %.2f ps"' % (counter, avgInterval, 1e6 / avgInterval, stdInterval * 1000) ) +text_file.close() + + diff --git a/cbmnet/test/analyse/hldLib.py b/cbmnet/test/analyse/hldLib.py index 07cfe79..c873037 100644 --- a/cbmnet/test/analyse/hldLib.py +++ b/cbmnet/test/analyse/hldLib.py @@ -1,5 +1,6 @@ import struct import datetime +import numpy as np def eventIterator(f): f.seek(0) @@ -133,3 +134,22 @@ def extractTDC(ssEvtData): assert(length >= len(ssEvtData)) return (ssEvtData[:length+1], ssEvtData[length:]) +def slopeWithoutAvg(X): + slope = X[1:]-X[:-1] + return slope - np.average(slope) + +def slope(X): + return X[1:] - X[:-1] + +def tdcTimeData(w): + if not (w & 0x80000000): + return None + + return { + "coarseTime": (w >> 0) & 0x7ff, + "edge": (w >> 11) & 1, + "fineTime": (w >> 12) & 0x3ff, + "channelNo": (w >> 22) & 0x7f + } + + diff --git a/cbmnet/test/analyse/time_between_events.gp b/cbmnet/test/analyse/time_between_events.gp new file mode 100644 index 0000000..5a92a9c --- /dev/null +++ b/cbmnet/test/analyse/time_between_events.gp @@ -0,0 +1,10 @@ +set terminal pdf +set output "time_between_events_hist.pdf" + +load "time_between_events.label" +set label labelText at graph 0.05,0.95 + + +binwidth=10 +bin(x,width)=width*floor(x/width) +plot 'time_between_events.txt' using (bin($2*1000,binwidth)):(1.0) smooth freq with boxes notitle \ No newline at end of file