diff --git a/gempython/tools/amc_user_functions_xhal.py b/gempython/tools/amc_user_functions_xhal.py index fc608177..a8105518 100644 --- a/gempython/tools/amc_user_functions_xhal.py +++ b/gempython/tools/amc_user_functions_xhal.py @@ -1,5 +1,5 @@ from ctypes import * -from gempython.tools.hw_constants import maxVfat3DACSize,gbtsPerGemVariant +from gempython.tools.hw_constants import maxVfat3DACSize, gbtsPerGemVariant, vfatsPerGemVariant from gempython.utils.gemlogger import colors, printRed, printYellow from gempython.utils.wrappers import runCommand, runCommandWithOutput @@ -104,7 +104,7 @@ def __init__(self, cardName, debug=False, gemType="ge11"): # Define Link Monitoring self.getmonGBTLink = self.lib.getmonGBTLink - self.getmonGBTLink.argTypes = [ OHLinkMonitorArrayType, c_uint, c_uint, c_bool ] + self.getmonGBTLink.argTypes = [ OHLinkMonitorArrayType, c_uint, c_uint, c_bool, c_uint] self.getmonGBTLink.restype = c_uint self.getmonOHLink = self.lib.getmonOHLink @@ -125,11 +125,11 @@ def __init__(self, cardName, debug=False, gemType="ge11"): self.confDacMonitorMulti.restype = c_uint self.readADCsMulti = self.lib.readVFAT3ADCMultiLink - self.readADCsMulti.argTypes = [ c_uint, POINTER(c_uint32), POINTER(c_uint), c_bool ] + self.readADCsMulti.argTypes = [ c_uint, POINTER(c_uint32), POINTER(c_uint), c_bool, c_uint ] self.readADCsMulti.restype = c_uint self.dacScanMulti = self.lib.dacScanMultiLink - self.dacScanMulti.argTypes = [ c_uint, c_uint, c_uint, c_uint, c_bool, POINTER(c_uint) ] + self.dacScanMulti.argTypes = [ c_uint, c_uint, c_uint, c_uint, c_bool, POINTER(c_uint), c_uint ] self.dacScanMulti.restype = c_uint # Define SCA & Sysmon Monitoring @@ -165,7 +165,7 @@ def __init__(self, cardName, debug=False, gemType="ge11"): self.readSBits.restype = c_uint self.sbitRateScanMulti = self.lib.sbitRateScan - self.sbitRateScanMulti.argTypes = [c_uint, c_uint, c_uint, c_uint, c_uint, c_char_p, POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32)] + self.sbitRateScanMulti.argTypes = [c_uint, c_uint, c_uint, c_uint, c_uint, c_char_p, POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), c_uint] self.sbitRateScanMulti.restype = c_uint # Parse XML @@ -185,6 +185,12 @@ def __init__(self, cardName, debug=False, gemType="ge11"): else: raise KeyError("Unrecognized gemType {0}".format(gemType)) + #Determine the number of VFATs per geb based on the gemType + if gemType in vfatsPerGemVariant.keys(): + self.nVFATs = vfatsPerGemVariant[gemType] + else: + raise KeyError("Unrecognized gemType {0}".format(gemType)) + return def acquireSBits(self, ohN, outFilePath, acquireTime=300): @@ -278,13 +284,14 @@ def getGBTLinkStatus(self,doReset=False,printSummary=False, ohMask=None): ohMask = self.getOHMask(callingMthd="getGBTLinkStatus") gbtMonData = OHLinkMonitorArrayType() - self.getmonGBTLink(gbtMonData, self.nOHs, ohMask, doReset) + self.getmonGBTLink(gbtMonData, self.nOHs, ohMask, doReset, self.NGBT) if printSummary: print("--=======================================--") print("-> GEM SYSTEM GBT INFORMATION") print("--=======================================--") print("") + print("Number of GBTs per optical link: %s" %(self.NGBT)) hfmt = "{:4s}" dfmt = "{}{:4d}{}" gbtfmt = [] @@ -346,7 +353,7 @@ def getL1ACount(self): def getLinkVFATMask(self,ohN): """ V3 electronics only - Returns a 24 bit number that can be used as the VFAT Mask + Returns a self.nVFATs bit number that can be used as the VFAT Mask for the Optohybrid ohN """ if self.fwVersion < 3: @@ -585,7 +592,7 @@ def getVFATLinkStatus(self,doReset=False,printSummary=False, ohMask=None): colw = len(max([colors.GREEN,colors.RED],key=len))+len(colors.ENDC)+4 xfmt = "{}0x{:1x}{}" - vfatsyncfmt = ["VFAT{}.SYNC_ERR_CNT".format(vfat) for vfat in range(24) ] + vfatsyncfmt = ["VFAT{}.SYNC_ERR_CNT".format(vfat) for vfat in range(self.nVFATs) ] lines = [[] for x in range(len(vfatsyncfmt)+1)] lines[0].append("{}".format(" "*(len(max(vfatsyncfmt,key=len))))) @@ -603,7 +610,7 @@ def getVFATLinkStatus(self,doReset=False,printSummary=False, ohMask=None): # print("----------OH{0}----------".format(ohN)) pass - for vfatN in range(24): + for vfatN in range(self.nVFATs): nSyncErrors = vfatMonData[ohN].syncErrCnt[vfatN] totalSyncErrors += nSyncErrors @@ -656,12 +663,12 @@ def performDacScanMultiLink(self, dacDataAll, dacSelect, dacStep=1, ohMask=None, exit(os.EX_USAGE) # Check length of results container - lenExpected = self.nOHs * (maxVfat3DACSize[dacSelect][0] - 0+1)*24 / dacStep + lenExpected = self.nOHs * (maxVfat3DACSize[dacSelect][0] - 0+1)*self.nVFATs / dacStep if (len(dacDataAll) != lenExpected): printRed("HwAMC::performDacScanMultiLink(): I expected container of length {0} but provided 'dacDataAll' has length {1}",format(lenExpected, len(dacDataAll))) exit(os.EX_USAGE) - return self.dacScanMulti(ohMask, self.nOHs, dacSelect, dacStep, useExtRefADC, dacDataAll) + return self.dacScanMulti(ohMask, self.nOHs, dacSelect, dacStep, useExtRefADC, dacDataAll, self.nVFATs) def performSBITRateScanMultiLink(self, outDataDacVal, outDataTrigRate, outDataTrigRatePerVFAT, chan=128, dacMin=0, dacMax=254, dacStep=1, ohMask=None, scanReg="THR_ARM_DAC"): """ @@ -674,7 +681,7 @@ def performSBITRateScanMultiLink(self, outDataDacVal, outDataTrigRate, outDataTr outDataTrigRate - As outDataDacVal but for trigger rate outDataTrigRatePerVFAT - As outDataTrigRate but for each VFAT, array size must be: - (24 * (12 * (dacMax - dacMin + 1) / stepSize)) + (self.nVFATs * (12 * (dacMax - dacMin + 1) / stepSize)) chan - VFAT channel to be considered, for all channels set to 128 dacMin - Starting dac value of the scan @@ -713,11 +720,11 @@ def performSBITRateScanMultiLink(self, outDataDacVal, outDataTrigRate, outDataTr exit(os.EX_USAGE) # Check length of results container - outDataTrigRatePerVFAT - if (len(outDataTrigRatePerVFAT) != (24*lenExpected)): - printRed("HwAMC::performSBITRateScanMultiLink(): I expected container of length {0} but provided 'outDataTrigRatePerVFAT' has length {1}".format(24*lenExpected, len(outDataTrigRatePerVFAT))) + if (len(outDataTrigRatePerVFAT) != (self.nVFATs*lenExpected)): + printRed("HwAMC::performSBITRateScanMultiLink(): I expected container of length {0} but provided 'outDataTrigRatePerVFAT' has length {1}".format(self.nVFATs*lenExpected, len(outDataTrigRatePerVFAT))) exit(os.EX_USAGE) - return self.sbitRateScanMulti(ohMask, dacMin, dacMax, dacStep, chan, scanReg, outDataDacVal, outDataTrigRate, outDataTrigRatePerVFAT) + return self.sbitRateScanMulti(ohMask, dacMin, dacMax, dacStep, chan, scanReg, outDataDacVal, outDataTrigRate, outDataTrigRatePerVFAT, self.nVFATs) def programAllOptohybridFPGAs(self, maxIter=5, ohMask=None): """ @@ -800,7 +807,7 @@ def programAllOptohybridFPGAs(self, maxIter=5, ohMask=None): def readADCsMultiLink(self, adcDataAll, useExtRefADC=False, ohMask=None, debug=False): """ Reads the ADC value from all unmasked VFATs - adcDataAll - Array of type c_uint32 of size 24*12=288 + adcDataAll - Array of type c_uint32 of size self.nVFATs*12 (288 for GE1/1 or 144 for GE2/1) useExtRefADC - True (False) use the externally (internally) referenced ADC ohMask - Mask which defines which OH's to query; 12 bit number where having a 1 in the N^th bit means to query the N^th optohybrid. @@ -821,7 +828,7 @@ def readADCsMultiLink(self, adcDataAll, useExtRefADC=False, ohMask=None, debug=F for ohN in range(0,12): print("| {0} | 0x{1:x} |".format(ohN, ohVFATMaskArray[ohN])) - return self.readADCsMulti(ohMask,ohVFATMaskArray, adcDataAll, useExtRefADC) + return self.readADCsMulti(ohMask,ohVFATMaskArray, adcDataAll, useExtRefADC, self.nVFATs) def readBlock(register, nwords, debug=False): """ diff --git a/gempython/tools/hw_constants.py b/gempython/tools/hw_constants.py index 5b82e24e..1867fe16 100644 --- a/gempython/tools/hw_constants.py +++ b/gempython/tools/hw_constants.py @@ -11,7 +11,7 @@ gbtsPerGemVariant = { "ge11":3, - "ge21":1, + "ge21":2, "me0":0} # Size of VFAT3 DAC's @@ -57,6 +57,62 @@ vfat3GBTPhaseLookupTable["ge21"][ge21Type] = [ 0 for x in range(0,vfatsPerGemVariant["ge21"]) ] vfat3GBTPhaseLookupTable["me0"]["null"] = [ 0 for x in range(0,vfatsPerGemVariant["me0"]) ] +# Fill Info for GE21 - m1 +vfat3GBTPhaseLookupTable["ge21"]["m1"][0] = 6 #VFAT0 +vfat3GBTPhaseLookupTable["ge21"]["m1"][1] = 10 #VFAT1 +vfat3GBTPhaseLookupTable["ge21"]["m1"][2] = 6 #VFAT2 +vfat3GBTPhaseLookupTable["ge21"]["m1"][3] = 9 #VFAT3 +vfat3GBTPhaseLookupTable["ge21"]["m1"][4] = 8 #VFAT4 +vfat3GBTPhaseLookupTable["ge21"]["m1"][5] = 7 #VFAT5 +vfat3GBTPhaseLookupTable["ge21"]["m1"][6] = 4 #VFAT6 +vfat3GBTPhaseLookupTable["ge21"]["m1"][7] = 8 #VFAT7 +vfat3GBTPhaseLookupTable["ge21"]["m1"][8] = 12 #VFAT8 +vfat3GBTPhaseLookupTable["ge21"]["m1"][9] = 9 #VFAT9 +vfat3GBTPhaseLookupTable["ge21"]["m1"][10] = 9 #VFAT10 +vfat3GBTPhaseLookupTable["ge21"]["m1"][11] = 8 #VFAT11 + +# Fill Info for GE21 - m2 +vfat3GBTPhaseLookupTable["ge21"]["m2"][0] = 6 #VFAT0 +vfat3GBTPhaseLookupTable["ge21"]["m2"][1] = 6 #VFAT1 +vfat3GBTPhaseLookupTable["ge21"]["m2"][2] = 10 #VFAT2 +vfat3GBTPhaseLookupTable["ge21"]["m2"][3] = 7 #VFAT3 +vfat3GBTPhaseLookupTable["ge21"]["m2"][4] = 8 #VFAT4 +vfat3GBTPhaseLookupTable["ge21"]["m2"][5] = 7 #VFAT5 +vfat3GBTPhaseLookupTable["ge21"]["m2"][6] = 4 #VFAT6 +vfat3GBTPhaseLookupTable["ge21"]["m2"][7] = 8 #VFAT7 +vfat3GBTPhaseLookupTable["ge21"]["m2"][8] = 7 #VFAT8 +vfat3GBTPhaseLookupTable["ge21"]["m2"][9] = 5 #VFAT9 +vfat3GBTPhaseLookupTable["ge21"]["m2"][10] = 8 #VFAT10 +vfat3GBTPhaseLookupTable["ge21"]["m2"][11] = 7 #VFAT11 + +# Fill Info for GE21 - m3 +vfat3GBTPhaseLookupTable["ge21"]["m3"][0] = 7 #VFAT0 +vfat3GBTPhaseLookupTable["ge21"]["m3"][1] = 5 #VFAT1 +vfat3GBTPhaseLookupTable["ge21"]["m3"][2] = 7 #VFAT2 +vfat3GBTPhaseLookupTable["ge21"]["m3"][3] = 10 #VFAT3 +vfat3GBTPhaseLookupTable["ge21"]["m3"][4] = 9 #VFAT4 +vfat3GBTPhaseLookupTable["ge21"]["m3"][5] = 7 #VFAT5 +vfat3GBTPhaseLookupTable["ge21"]["m3"][6] = 8 #VFAT6 +vfat3GBTPhaseLookupTable["ge21"]["m3"][7] = 10 #VFAT7 +vfat3GBTPhaseLookupTable["ge21"]["m3"][8] = 7 #VFAT8 +vfat3GBTPhaseLookupTable["ge21"]["m3"][9] = 10 #VFAT9 +vfat3GBTPhaseLookupTable["ge21"]["m3"][10] = 6 #VFAT10 +vfat3GBTPhaseLookupTable["ge21"]["m3"][11] = 4 #VFAT11 + +# Fill Info for GE21 - m4 +vfat3GBTPhaseLookupTable["ge21"]["m4"][0] = 3 #VFAT0 +vfat3GBTPhaseLookupTable["ge21"]["m4"][1] = 3 #VFAT1 +vfat3GBTPhaseLookupTable["ge21"]["m4"][2] = 3 #VFAT2 +vfat3GBTPhaseLookupTable["ge21"]["m4"][3] = 9 #VFAT3 +vfat3GBTPhaseLookupTable["ge21"]["m4"][4] = 4 #VFAT4 +vfat3GBTPhaseLookupTable["ge21"]["m4"][5] = 3 #VFAT5 +vfat3GBTPhaseLookupTable["ge21"]["m4"][6] = 8 #VFAT6 +vfat3GBTPhaseLookupTable["ge21"]["m4"][7] = 8 #VFAT7 +vfat3GBTPhaseLookupTable["ge21"]["m4"][8] = 11 #VFAT8 +vfat3GBTPhaseLookupTable["ge21"]["m4"][9] = 6 #VFAT9 +vfat3GBTPhaseLookupTable["ge21"]["m4"][10] = 6 #VFAT10 +vfat3GBTPhaseLookupTable["ge21"]["m4"][11] = 4 #VFAT11 + # Fill Info for GE11 - Short # FIXME It would be great if this was in the DB and I could just load it from there... vfat3GBTPhaseLookupTable["ge11"]["short"][0] = 6 #VFAT0 diff --git a/gempython/tools/optohybrid_user_functions_xhal.py b/gempython/tools/optohybrid_user_functions_xhal.py index 84392838..cf207147 100644 --- a/gempython/tools/optohybrid_user_functions_xhal.py +++ b/gempython/tools/optohybrid_user_functions_xhal.py @@ -31,7 +31,7 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") """ # Debug flag self.debug = debug - + # Logger self.ohlogger = logging.getLogger(__name__) @@ -49,18 +49,18 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") self.vfatGBTPhases = vfat3GBTPhaseLookupTable[gemType][detType] self.typeDet = detType self.typeGEM = gemType - self.parentAMC = HwAMC(cardName, debug) + self.parentAMC = HwAMC(cardName, debug, gemType) # Define broadcast read self.bRead = self.parentAMC.lib.broadcastRead - self.bRead.argtypes = [c_uint, c_char_p, c_uint, POINTER(c_uint32)] + self.bRead.argtypes = [c_uint, c_char_p, c_uint, POINTER(c_uint32), c_uint] self.bRead.restype = c_uint # Define broadcast write self.bWrite = self.parentAMC.lib.broadcastWrite self.bWrite.argtypes = [c_uint, c_char_p, c_uint, c_uint] self.bWrite.restype = c_uint - + # Define the sbit mapping scan modules self.sbitMappingWithCalPulse = self.parentAMC.lib.checkSbitMappingWithCalPulse self.sbitMappingWithCalPulse.restype = c_uint @@ -80,17 +80,17 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") self.genScan.restype = c_uint self.genScan.argtypes = [c_uint, c_uint, c_uint, c_uint, c_uint, c_uint, c_bool, c_bool, c_uint, c_uint, - c_char_p, c_bool, c_bool, POINTER(c_uint32)] + c_char_p, c_bool, c_bool, POINTER(c_uint32), c_uint] self.genChannelScan = self.parentAMC.lib.genChannelScan self.genChannelScan.restype = c_uint self.genChannelScan.argtypes = [c_uint, c_uint, c_uint, c_uint, c_uint, c_uint, c_bool, c_bool, c_uint, c_bool, c_char_p, c_bool, - POINTER(c_uint32)] + POINTER(c_uint32), c_uint] self.dacScan = self.parentAMC.lib.dacScan self.dacScan.restype = c_uint - self.dacScan.argtypes = [ c_uint, c_uint, c_uint, c_uint, c_bool, POINTER(c_uint32) ] + self.dacScan.argtypes = [ c_uint, c_uint, c_uint, c_uint, c_bool, POINTER(c_uint32), c_uint] # Define the known V2b electronics scan registers self.KnownV2bElScanRegs = [ @@ -111,7 +111,7 @@ def broadcastRead(self,register,mask=0xff000000): outData = (c_uint32 * self.nVFATs)() try: - rpcResp = self.bRead(self.link, register, mask, outData) + rpcResp = self.bRead(self.link, register, mask, outData, self.nVFATs) except Exception as e: print e pass @@ -120,13 +120,13 @@ def broadcastRead(self,register,mask=0xff000000): raise OHRPCException("broadcastRead failed for device %i; reg: %s; with mask %x"%(self.link,register,mask), os.EX_SOFTWARE) return outData - + def broadcastWrite(self,register,value,mask=0xff000000): """ Perform a broadcast RPC write on the VFATs specified by mask Will return when operation has completed """ - + rpcResp = 0 try: @@ -163,7 +163,7 @@ def checkSbitMappingWithCalPulse(self, **kwargs): L1AInterval - Number of BX's inbetween L1A's mask - VFAT mask to use for excluding vfats from the trigger nevts - Number of events for each dac value in scan - outData - Pointer to an array of size (24*128*8*nevts) which + outData - Pointer to an array of size (self.nVFATs*128*8*nevts) which stores the results of the scan: bits [0,7] channel pulsed, bits [8:15] sbit observed, @@ -334,7 +334,7 @@ def getTriggerSource(self): else: print("HwOptoHybrid.getTriggerSource() - No support for v3 electronics, exiting") sys.exit(os.EX_USAGE) - + def getType(self): return (self.typeGEM,self.typeDet) @@ -342,7 +342,7 @@ def getVFATMask(self): """ V3 electronics only - Returns a 24 bit number that should be used as the VFAT Mask + Returns a self.nVFATs bit number that should be used as the VFAT Mask """ return self.parentAMC.getLinkVFATMask(self.link) @@ -370,7 +370,7 @@ def performCalibrationScan(self, **kwargs): mask - VFAT mask to use nevts - Number of events for each dac value in scan outData - Array of type c_uint32, if chan >= 0 array size - must be: ((dacMax - dacMin + 1) / stepSize) * 24. + must be: ((dacMax - dacMin + 1) / stepSize) * self.nVFATs. The first ((dacMax - dacMin + 1) / stepSize) array positions are for VFAT0, the next ((dacMax - dacMin + 1) / stepSize) are for VFAT1, @@ -454,9 +454,9 @@ def performCalibrationScan(self, **kwargs): useExtTrig = kwargs["useExtTrig"] if chan < 0: - return self.genChannelScan(nevts, self.link, mask, dacMin, dacMax, stepSize, enableCal, currentPulse, calSF, useExtTrig, scanReg, useUltra, kwargs["outData"]) + return self.genChannelScan(nevts, self.link, mask, dacMin, dacMax, stepSize, enableCal, currentPulse, calSF, useExtTrig, scanReg, useUltra, kwargs["outData"], self.nVFATs) else: - return self.genScan(nevts, self.link, dacMin, dacMax, stepSize, chan, enableCal, currentPulse, calSF, mask, scanReg, useUltra, useExtTrig, kwargs["outData"]) + return self.genScan(nevts, self.link, dacMin, dacMax, stepSize, chan, enableCal, currentPulse, calSF, mask, scanReg, useUltra, useExtTrig, kwargs["outData"], self.nVFATs) def performDacScan(self, outData, dacSelect, dacStep=1, mask=0x0, useExtRefADC=False): """ @@ -483,12 +483,12 @@ def performDacScan(self, outData, dacSelect, dacStep=1, mask=0x0, useExtRefADC=F exit(os.EX_USAGE) #Check length of results container - lenExpected = (maxVfat3DACSize[dacSelect][0] - 0+1)*24 / dacStep + lenExpected = (maxVfat3DACSize[dacSelect][0] - 0+1)*self.nVFATs / dacStep if (len(outData) != lenExpected): print("HwOptoHybrid::performDacScan(): I expected container of lenght {0} but provided 'outData' has length {1}",format(lenExpected, len(outData))) exit(os.EX_USAGE) - return self.dacScan(self.link, dacSelect, dacStep, mask, useExtRefADC, outData) + return self.dacScan(self.link, dacSelect, dacStep, mask, useExtRefADC, outData, self.nVFATs) def setDebug(self, debug): self.debug = debug @@ -500,7 +500,7 @@ def setSBitMask(self, sbitMask): Sets the sbit mask in the OH FPGA """ - + if self.parentAMC.fwVersion < 3: print("Parent AMC Major FW Version: %i"%(self.parentAMC.fwVersion)) print("Only implemented for v3 electronics, exiting") @@ -530,7 +530,7 @@ def setTriggerThrottle(self,throttle): """ Set the trigger throttle """ - + if self.parentAMC.fwVersion < 3: return self.parentAMC.writeRegister("GEM_AMC.OH.OH%d.CONTROL.TRIGGER.THROTTLE"%(self.link),throttle) else: @@ -539,7 +539,7 @@ def setTriggerThrottle(self,throttle): def setType(self, gemType, detType): """ - Sets the GEM type and detector type, updates the number of VFATs expected + Sets the GEM type and detector type, updates the number of VFATs expected and changes the VFAT GBT Phase lookup table gemType - string specifying gemType, expexted to be a key in gemVariants dictionary diff --git a/gempython/tools/vfat_user_functions_xhal.py b/gempython/tools/vfat_user_functions_xhal.py index 22edd35a..67b16c25 100644 --- a/gempython/tools/vfat_user_functions_xhal.py +++ b/gempython/tools/vfat_user_functions_xhal.py @@ -1,5 +1,5 @@ from gempython.tools.optohybrid_user_functions_xhal import * -from gempython.tools.hw_constants import gemVariants +from gempython.tools.hw_constants import gemVariants, vfatsPerGemVariant from gempython.utils.gemlogger import colormsg import logging @@ -20,7 +20,9 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") if detType not in gemVariants[gemType]: raise OHTypeException("HwVFAT: detType '{0}' not in the list of known detector types for gemType {1}; list of known detector types: {2}".format(detType, gemType, gemVariants[gemType]), os.EX_USAGE) - + + self.gemType = gemType + # Optohybrid self.parentOH = HwOptoHybrid(cardName, link, debug, gemType, detType) @@ -30,7 +32,7 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") self.confDacMonitor.restype = c_uint self.readADCs = self.parentOH.parentAMC.lib.readVFAT3ADC - self.readADCs.argTypes = [ c_uint, POINTER(c_uint32), c_uint, c_uint ] + self.readADCs.argTypes = [ c_uint, POINTER(c_uint32), c_bool, c_uint, c_uint ] self.readADCs.restype = c_uint # Define VFAT3 Configuration @@ -40,12 +42,12 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") # Get all channel regs self.getChannelRegistersVFAT3 = self.parentOH.parentAMC.lib.getChannelRegistersVFAT3 - self.getChannelRegistersVFAT3.argTypes = [ c_uint, c_uint, POINTER(c_uint32) ] + self.getChannelRegistersVFAT3.argTypes = [ c_uint, c_uint, POINTER(c_uint32), c_uint ] self.getChannelRegistersVFAT3.restype = c_uint # Get VFAT ChipID self.getVFAT3ChipIDs = self.parentOH.parentAMC.lib.getVFAT3ChipIDs - self.getVFAT3ChipIDs.argTypes = [ POINTER(c_uint32), c_uint, c_uint, c_bool ] + self.getVFAT3ChipIDs.argTypes = [ POINTER(c_uint32), c_uint, c_uint, c_bool, c_uint] self.getVFAT3ChipIDs.restype = c_uint # Turn off calpulses @@ -55,7 +57,7 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") # Write all channel regs self.setChannelRegistersVFAT3 = self.parentOH.parentAMC.lib.setChannelRegistersVFAT3 - self.setChannelRegistersVFAT3.argTypes = [ c_uint, c_uint, POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32) ] + self.setChannelRegistersVFAT3.argTypes = [ c_uint, c_uint, POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), POINTER(c_uint32), c_uint ] self.setChannelRegistersVFAT3.restype = c_uint # Set default parameters @@ -79,7 +81,7 @@ def __init__(self, cardName, link, debug=False, gemType="ge11", detType="short") } return - + def biasAllVFATs(self, mask=0x0, enable=False): # HW Dependent Configuration if self.parentOH.parentAMC.fwVersion > 2: @@ -99,7 +101,7 @@ def biasAllVFATs(self, mask=0x0, enable=False): #what about leaving any other settings? #not now, want a reproducible routine self.writeAllVFATs("ContReg0", 0x36, mask=mask) - + # User specified values - rely on the user to load self.paramsDefVals for key in self.paramsDefVals.keys(): self.writeAllVFATs(key,self.paramsDefVals[key],mask) @@ -124,18 +126,18 @@ def getAllChipIDs(self, mask=0x0, rawID=False): rawID - If true returns the rawID and does not apply the Reed-Muller decoding """ - chipIDData = (c_uint32 * 24)() - - rpcResp = self.getVFAT3ChipIDs(chipIDData, self.parentOH.link, mask, rawID) + chipIDData = (c_uint32 * vfatsPerGemVariant[self.gemType])() + + rpcResp = self.getVFAT3ChipIDs(chipIDData, self.parentOH.link, mask, rawID, vfatsPerGemVariant[self.gemType]) if rpcResp != 0: raise Exception("RPC response was non-zero, failed to get chipID data for OH{0}".format(self.parentOH.link)) - + return chipIDData def getAllChannelRegisters(self, mask=0x0): chanRegData = (c_uint32 * 3072)() - rpcResp = self.getChannelRegistersVFAT3(self.parentOH.link, mask, chanRegData) + rpcResp = self.getChannelRegistersVFAT3(self.parentOH.link, mask, chanRegData, vfatsPerGemVariant[self.gemType]) if rpcResp != 0: raise Exception("RPC response was non-zero, failed to get channel data for OH{0}".format(self.parentOH.link)) return chanRegData @@ -149,7 +151,7 @@ def readAllADCs(self, adcData, useExtRefADC=False, mask=0x0): mask - VFAT Mask """ - return self.readADCs(self.parentOH.link, adcData, useExtRefADC, mask) + return self.readADCs(self.parentOH.link, adcData, useExtRefADC, mask, vfatsPerGemVariant[self.gemType]) def readAllVFATs(self, reg, mask=0x0): vfatVals = self.parentOH.broadcastRead(reg,mask) @@ -242,13 +244,13 @@ def setAllChannelRegisters(self, chMask=None, pulse=None, trimARM=None, trimARMP if trimZCCPol is None: trimZCCPol = (c_uint32 * 3072)() - return self.setChannelRegistersVFAT3(self.parentOH.link, vfatMask, pulse, chMask, trimARM, trimARMPol, trimZCC, trimZCCPol) + return self.setChannelRegistersVFAT3(self.parentOH.link, vfatMask, pulse, chMask, trimARM, trimARMPol, trimZCC, trimZCCPol, vfatsPerGemVariant[self.gemType]) def setDebug(self, debug): self.debug = debug self.parentOH.setDebug(debug) return - + def setRunModeAll(self, mask=0x0, enable=True, debug=False): if self.parentOH.parentAMC.fwVersion > 2: if (enable): @@ -303,7 +305,7 @@ def setVFATCalPhaseAll(self, mask=0x0, phase=0, debug=False): else: self.writeAllVFATs("CalPhase", phase, mask) return - + def setVFATLatency(self, chip, lat, debug=False): if self.parentOH.parentAMC.fwVersion > 2: self.writeVFATRegisters(chip,{"CFG_LATENCY": lat}) @@ -318,7 +320,7 @@ def setVFATLatencyAll(self, mask=0x0, lat=0, debug=False): self.writeAllVFATs("Latency",lat,mask) return - + def setVFATMSPLAll(self, mask=0x0, mspl=4, debug=False): if self.parentOH.parentAMC.fwVersion > 2: self.writeAllVFATs("CFG_PULSE_STRETCH",mspl,mask) @@ -342,10 +344,10 @@ def setVFATThresholdAll(self, mask=0x0, vt1=100, vt2=0, debug=False): self.writeAllVFATs("VThreshold2",vt2,mask) return - + def writeAllVFATs(self, reg, value, mask=0x0): return self.parentOH.broadcastWrite(reg,value,mask) - + def writeVFAT(self, chip, reg, value, debug=False): baseNode = "" if self.parentOH.parentAMC.fwVersion > 2: