]> jspc29.x-matter.uni-frankfurt.de Git - trb3.git/commitdiff
CBMNet: Script to convert TrbNet into CBMNet time using TDC data. Tool will now be...
authorManuel Penschuck <manuel.penschuck@stud.uni-frankfurt.de>
Sat, 18 Oct 2014 19:12:52 +0000 (21:12 +0200)
committerManuel Penschuck <manuel.penschuck@stud.uni-frankfurt.de>
Sat, 18 Oct 2014 19:12:52 +0000 (21:12 +0200)
cbmnet/test/analyse/convertToCbmClock.py [new file with mode: 0644]
cbmnet/test/analyse/hldLib.py
cbmnet/test/analyse/time_between_events.gp [new file with mode: 0644]

diff --git a/cbmnet/test/analyse/convertToCbmClock.py b/cbmnet/test/analyse/convertToCbmClock.py
new file mode 100644 (file)
index 0000000..cd95e51
--- /dev/null
@@ -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()
+
+
index 07cfe798a3aa6091c67892296aae601025106c87..c8730370dba71e22f071b8830f72d1c706871635 100644 (file)
@@ -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 (file)
index 0000000..5a92a9c
--- /dev/null
@@ -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