Commit 4899a765 authored by David Cussans's avatar David Cussans

Added simple control - s = start running , q = quit. Writes to a ROOT file, but…

Added simple control - s = start running , q = quit. Writes to a ROOT file, but output not yet checked
parent 8c233286
......@@ -154,7 +154,11 @@ def initTLU( uhalDevice , pychipsBoard , listenForTelescopeShutter , pulseDelay
print "Setting internal trigger interval to " , triggerInterval , " ( zero = no internal triggers)"
print "Internal trigger frequency = " , 160000.0/triggerInterval , " kHz"
if triggerInterval == 0:
internalTriggerFreq = 0
else:
internalTriggerFreq = 160000.0/triggerInterval
print "Internal trigger frequency = " , internalTriggerFreq , " kHz"
pychipsBoard.write("InternalTriggerIntervalW",triggerInterval) #0->Internal pulse generator disabled. Any other value will generate pulses with a frequency of n*6.25ns
trigInterval = pychipsBoard.read("InternalTriggerIntervalR")
print "Trigger interval read back as ", trigInterval
......
......@@ -11,22 +11,53 @@ from FmcTluI2c import *
import uhal
import sys
import time
# For single character non-blocking input:
import select
import tty
import termios
from initTLU import *
def isData():
return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], [])
from ROOT import TFile, TTree
from ROOT import gROOT # , AddressOf
# "bufferPos, highWord , lowWord , event-number , timestamp , evtType = %x %016x %016x %08x %012x %01x %03x" % ( evt , highWord , lowWord, evtNumber , timeStamp , evtType , trigsFired)
gROOT.ProcessLine(
"struct TLUEvtStruct {\
UInt_t uBufpos;\
ULong64_t ulHighWord;\
ULong64_t ulLowWord;\
UInt_t uEvtNumber;\
ULong64_t ulTimeStamp;\
UInt_t uEvtType;\
UInt_t uTrigsFired;\
};" );
from ROOT import TLUEvtStruct
tluEvtStruct = TLUEvtStruct()
print "Setting up AIDA TLU to supply clock and trigger to TORCH readout\n"
writeTimestamps = True
listenForTelescopeShutter = False
#TriggerInterval = 400000 # Units = 160MHz clock ticks.
#loopWait = 1.0 # polling interval ( seconds )
TriggerInterval = 16000 # Units = 160MHz clock ticks.
#TriggerInterval = 16000 # Units = 160MHz clock ticks.
TriggerInterval = 0 # Units = 160MHz clock ticks.
loopWait = 0.05 # polling interval ( seconds )
pulseDelay = 0 # between 0 and 31 in units of 160MHz clock.
pulseStretch = 4 # between 0 and 31 in units of 160MHz clock.
DUTMask = 1 # bit mask to indicate with DUT are active
rootFname = "OutputData.root"
# Point to board in uHAL
manager = uhal.ConnectionManager("file://./connection.xml")
hw = manager.getDevice("minitlu")
......@@ -37,6 +68,12 @@ bAddrTab = AddressTable("./aida_mini_tlu_addr_map.txt")
# Assume DIP-switch controlled address. Switches at 2
board = ChipsBusUdp(bAddrTab,"192.168.200.32",50001)
# Open Root file
f = TFile( rootFname, 'RECREATE' )
tree = TTree( 'T', 'TLU Data' )
tree.Branch( 'tluInts', tluEvtStruct, 'Bufpos/i:HighWord/l:LowWord/l:EvtNumber/i:TimeStamp/l:EvtType/i:TrigsFired/i' )
# Initialize TLU registers
initTLU( uhalDevice = hw, pychipsBoard = board, listenForTelescopeShutter = listenForTelescopeShutter, pulseDelay = pulseDelay, pulseStretch = pulseStretch, DUTMask = DUTMask, triggerInterval = TriggerInterval, thresholdVoltage = -0.2, writeTimestamps = True )
......@@ -49,54 +86,84 @@ oldPostVetotriggerCount = board.read("PostVetoTriggersR")
print "Starting polling loop"
eventFifoFillLevel = 0
loopRunning = True
runStarted = False
# Save old terminal settings
oldTermSettings = termios.tcgetattr(sys.stdin)
tty.setcbreak(sys.stdin.fileno())
while loopRunning:
while True:
nEvents = int(eventFifoFillLevel)//4 # only read out whole events ( 4 x 32-bit words )
wordsToRead = nEvents*4
# get timestamp data and fifo fill in same outgoing packet.
timestampData = hw.getNode("eventBuffer.EventFifoData").readBlock(wordsToRead)
eventFifoFillLevel = hw.getNode("eventBuffer.EventFifoFillLevel").read()
if isData():
c = sys.stdin.read(1)
print "Got input: ", c
if c == 'q':
loopRunning = False
print "Terminating loop"
elif c == 's':
runStarted = True
print "Starting Run"
preVetotriggerCount = hw.getNode("triggerLogic.PreVetoTriggersR").read()
postVetotriggerCount = hw.getNode("triggerLogic.PostVetoTriggersR").read()
if runStarted:
timestampHigh = hw.getNode("Event_Formatter.CurrentTimestampHR").read()
timestampLow = hw.getNode("Event_Formatter.CurrentTimestampLR").read()
nEvents = int(eventFifoFillLevel)//4 # only read out whole events ( 4 x 32-bit words )
wordsToRead = nEvents*4
# get timestamp data and fifo fill in same outgoing packet.
timestampData = hw.getNode("eventBuffer.EventFifoData").readBlock(wordsToRead)
eventFifoFillLevel = hw.getNode("eventBuffer.EventFifoFillLevel").read()
hw.dispatch()
preVetotriggerCount = hw.getNode("triggerLogic.PreVetoTriggersR").read()
postVetotriggerCount = hw.getNode("triggerLogic.PostVetoTriggersR").read()
preVetoFreq = (preVetotriggerCount-oldPreVetotriggerCount)/loopWait
postVetoFreq = (postVetotriggerCount-oldPostVetotriggerCount)/loopWait
oldPreVetotriggerCount = preVetotriggerCount
oldPostVetotriggerCount = postVetotriggerCount
timestampHigh = hw.getNode("Event_Formatter.CurrentTimestampHR").read()
timestampLow = hw.getNode("Event_Formatter.CurrentTimestampLR").read()
print "pre , post veto triggers , pre , post frequency = " , preVetotriggerCount , postVetotriggerCount , preVetoFreq , postVetoFreq
hw.dispatch()
print "Current timestamp High,Low (hex) = " , hex(timestampHigh) , hex(timestampLow)
preVetoFreq = (preVetotriggerCount-oldPreVetotriggerCount)/loopWait
postVetoFreq = (postVetotriggerCount-oldPostVetotriggerCount)/loopWait
oldPreVetotriggerCount = preVetotriggerCount
oldPostVetotriggerCount = postVetotriggerCount
print "FIFO fill level = " , eventFifoFillLevel
print "number of events in FIFO = ",nEvents
# print timestampData
for evt in range (0, nEvents-1 ):
lowWord = timestampData[evt*4 + 1] + 0x100000000* timestampData[ (evt*4) + 0] # timestamp
print "pre , post veto triggers , pre , post frequency = " , preVetotriggerCount , postVetotriggerCount , preVetoFreq , postVetoFreq
highWord = timestampData[evt*4 + 3] + 0x100000000* timestampData[ (evt*4) + 2] # evt number
evtNumber = timestampData[evt*4 + 3]
print "Current timestamp High,Low (hex) = " , hex(timestampHigh) , hex(timestampLow)
if evtNumber != ( oldEvtNumber + 1 ):
print "***WARNING *** Non sqeuential event numbers *** , evt,oldEvt = ", evtNumber , oldEvtNumber
oldEvtNumber = evtNumber
timeStamp = lowWord & 0xFFFFFFFFFFFF
evtType = timestampData[ (evt*4) + 0] >> 28
print "bufferPos, highWord , lowWord , event-number , timestamp , evtType = %x %016x %016x %08x %012x %01x" % ( evt , highWord , lowWord, evtNumber , timeStamp , evtType)
print "FIFO fill level = " , eventFifoFillLevel
# todo - extract which inputs fired from data.
# todo - make root branch - try example in http://wlav.web.cern.ch/wlav/pyroot/tpytree.html : write raw data and decoded data for now.
print "number of events in FIFO = ",nEvents
# print timestampData
for evt in range (0, nEvents-1 ):
lowWord = timestampData[evt*4 + 1] + 0x100000000* timestampData[ (evt*4) + 0] # timestamp
highWord = timestampData[evt*4 + 3] + 0x100000000* timestampData[ (evt*4) + 2] # evt number
evtNumber = timestampData[evt*4 + 3]
if evtNumber != ( oldEvtNumber + 1 ):
print "***WARNING *** Non sqeuential event numbers *** , evt,oldEvt = ", evtNumber , oldEvtNumber
oldEvtNumber = evtNumber
timeStamp = lowWord & 0xFFFFFFFFFFFF
evtType = timestampData[ (evt*4) + 0] >> 28
trigsFired = (timestampData[ (evt*4) + 0] >> 16) & 0xFFF
print "bufferPos, highWord , lowWord , event-number , timestamp , evtType = %x %016x %016x %08x %012x %01x %03x" % ( evt , highWord , lowWord, evtNumber , timeStamp , evtType , trigsFired)
tluEvtStruct.uBufpos = evt
tluEvtStruct.ulHighWord = highWord;
tluEvtStruct.ulLowWord = lowWord;
tluEvtStruct.uEvtNumber = evtNumber;
tluEvtStruct.ulTimeStamp = timeStamp;
tluEvtStruct.uEvtType = evtType;
tluEvtStruct.uTrigsFired = trigsFired;
tree.Fill()
# todo - extract which inputs fired from data.
# todo - make root branch - try example in http://wlav.web.cern.ch/wlav/pyroot/tpytree.html : write raw data and decoded data for now.
time.sleep( loopWait)
......@@ -104,3 +171,5 @@ while True:
preVetotriggerCount = board.read("PreVetoTriggersR")
postVetotriggerCount = board.read("PostVetoTriggersR")
print "\n\nPre,post trigger count at end of run " , preVetotriggerCount , postVetotriggerCount
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldTermSettings)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment