/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #!/usr/bin/env python 00002 # 00003 # Make a text table of the mapping between: 00004 # Detector Sensors: Identifies PMT/RPC by geometry in the experiment 00005 # Electronics Channels IDs: Identifies crate/board/connectors in electronics 00006 # Hardware IDs: Identifies specific pieces of hardware/barcodes 00007 # 00008 # Unconnected channels/hardware are identified using IDs of type 'Unknown' 00009 00010 import math 00011 from GaudiPython import gbl 00012 00013 # Make shortcuts to DayaBay classes 00014 Detector = gbl.DayaBay.Detector 00015 Site = gbl.Site 00016 DetectorId = gbl.DetectorId 00017 AdPmtSensor = gbl.DayaBay.AdPmtSensor 00018 PoolPmtSensor = gbl.DayaBay.PoolPmtSensor 00019 FeeChannelId = gbl.DayaBay.FeeChannelId 00020 HardwareId = gbl.DayaBay.HardwareId 00021 PmtHardwareId = gbl.DayaBay.PmtHardwareId 00022 FeeHardwareId = gbl.DayaBay.FeeHardwareId 00023 Hardware = gbl.DayaBay.Hardware 00024 00025 #for RPC 00026 FecChannelId = gbl.DayaBay.FecChannelId 00027 HardwareId = gbl.DayaBay.HardwareId 00028 RpcSensor = gbl.DayaBay.RpcSensor 00029 RpcHardwareId = gbl.DayaBay.RpcHardwareId 00030 FecHardwareId = gbl.DayaBay.FecHardwareId 00031 00032 def getRpcIds(): 00033 "Return a list of the RPC Detectors" 00034 global RpcIds 00035 return RpcIds 00036 00037 def getRpcSensorIds(): 00038 "Return a map of the RPC sensors by detector" 00039 RpcRows = range(1,10) 00040 NearRpcColumns = range(1,7) 00041 FarRpcColumns = range(1,10) 00042 RpcLayers = range(1,5) 00043 RpcStrips = range(1,9) 00044 NearRpcSensors= [ [row, column, layer, strip] for row in RpcRows for column in NearRpcColumns for layer in RpcLayers for strip in RpcStrips ] 00045 FarRpcSensors= [ [row, column, layer, strip] for row in RpcRows for column in FarRpcColumns for layer in RpcLayers for strip in RpcStrips ] 00046 00047 RpcSensorIds = {} 00048 for detector in getRpcIds(): 00049 rpcSensors = [] 00050 if detector.site() == Site.kFar: 00051 rpcSensors = FarRpcSensors 00052 else: 00053 rpcSensors = NearRpcSensors 00054 RpcSensorIds[detector] = [ RpcSensor(row, column, layer, strip, 00055 detector.site(), 00056 detector.detectorId()) 00057 for [row, column, layer, strip] in rpcSensors] 00058 return RpcSensorIds 00059 00060 def getFecChannelIds(): 00061 "Return a list of the FEC channel IDs" 00062 nFecConnectorsPerBoard = 32 00063 #nFeeBoardsAd = 13 00064 #nFeeBoardsNearIws = 8 00065 #nFeeBoardsNearOws = 11 00066 #nFeeBoardsFarIws = 10 00067 #nFeeBoardsFarOws = 14 00068 00069 fecIds = {} 00070 detectors = getRpcIds() 00071 rpcIds = getRpcSensorIds() 00072 for detector in detectors: 00073 nBoards = int(math.ceil( len(rpcIds[detector]) 00074 / float(nFecConnectorsPerBoard) ) ) 00075 fecIds[detector] = [FecChannelId(board, connector, 00076 detector.site(), 00077 detector.detectorId()) 00078 for board in range(1,nBoards+1) 00079 for connector in range(1,nFecConnectorsPerBoard+1)] 00080 00081 return fecIds 00082 00083 RpcIds = [ Detector(Site.kDayaBay, DetectorId.kRPC), 00084 Detector(Site.kLingAo, DetectorId.kRPC), 00085 Detector(Site.kFar, DetectorId.kRPC) ] 00086 00087 AdIds = [ Detector(Site.kDayaBay, DetectorId.kAD1), 00088 Detector(Site.kDayaBay, DetectorId.kAD2), 00089 Detector(Site.kLingAo, DetectorId.kAD1), 00090 Detector(Site.kLingAo, DetectorId.kAD2), 00091 Detector(Site.kFar, DetectorId.kAD1), 00092 Detector(Site.kFar, DetectorId.kAD2), 00093 Detector(Site.kFar, DetectorId.kAD3), 00094 Detector(Site.kFar, DetectorId.kAD4) ] 00095 00096 WaterVetoIds = [ Detector(Site.kDayaBay, DetectorId.kIWS), 00097 Detector(Site.kDayaBay, DetectorId.kOWS), 00098 Detector(Site.kLingAo, DetectorId.kIWS), 00099 Detector(Site.kLingAo, DetectorId.kOWS), 00100 Detector(Site.kFar, DetectorId.kIWS), 00101 Detector(Site.kFar, DetectorId.kOWS) ] 00102 00103 def getAdIds(): 00104 "Return a list of the AD Detectors" 00105 global AdIds 00106 return AdIds 00107 00108 def getAdPmtIds(): 00109 "Return a map of the AD PMTs by detector" 00110 AdRings = range(1,9) 00111 AdColumns = range(1,25) 00112 AdPmts8Inch = [ [ring, column] for ring in AdRings for column in AdColumns ] 00113 nCalibPmts = 6 00114 AdPmts2Inch = [ [0, calibIndex] for calibIndex in range(1,nCalibPmts + 1) ] 00115 AdPmts = AdPmts8Inch + AdPmts2Inch 00116 00117 AdPmtIds = {} 00118 for detector in getAdIds(): 00119 AdPmtIds[detector] = [ AdPmtSensor(ring, column, 00120 detector.site(), 00121 detector.detectorId()) 00122 for [ring,column] in AdPmts] 00123 return AdPmtIds 00124 00125 def getWaterVetoIds(): 00126 "Return a list of the Water Veto Detectors" 00127 global WaterVetoIds 00128 return WaterVetoIds 00129 00130 def getWaterVetoPmtIds(): 00131 "Return a map of the Water Veto PMTs by detector" 00132 # Taken from: 00133 # dybgaudi/Detector/XmlDetDesc/python/XmlDetDescGen/PoolPmtStructure/gen.py 00134 wallcounts = [9, 9, 8] 00135 nearInFin = [10,8,24,8,10,8,24,8,20] 00136 nearOutFin = [8,8,16,8,8,8,16,8,29] 00137 nearOutFout = [4,8,12,8,4,8,12,8] 00138 farInFin = [24,8,24,8,24,8,24,8,32] 00139 farOutFin = [16,8,16,8,16,8,16,8,32] 00140 farOutFout = [16,8,16,8,16,8,16,8] 00141 00142 nearIwsPmts = [] 00143 for wallNumber in range(1, wallcounts[0]+1): 00144 for wallSpot in range(1, nearInFin[wallNumber-1]+1): 00145 nearIwsPmts.append( [wallSpot, wallNumber, 1] ) 00146 00147 nearOwsPmts = [] 00148 for wallNumber in range(1, wallcounts[1]+1): 00149 for wallSpot in range(1, nearOutFin[wallNumber-1]+1): 00150 nearOwsPmts.append( [wallSpot, wallNumber, 1] ) 00151 for wallNumber in range(1, wallcounts[2]+1): 00152 for wallSpot in range(1, nearOutFout[wallNumber-1]+1): 00153 nearOwsPmts.append( [wallSpot, wallNumber, 0] ) 00154 00155 farIwsPmts = [] 00156 for wallNumber in range(1, wallcounts[0]+1): 00157 for wallSpot in range(1, farInFin[wallNumber-1]+1): 00158 farIwsPmts.append( [wallSpot, wallNumber, 1] ) 00159 00160 farOwsPmts = [] 00161 for wallNumber in range(1, wallcounts[1]+1): 00162 for wallSpot in range(1, farOutFin[wallNumber-1]+1): 00163 farOwsPmts.append( [wallSpot, wallNumber, 1] ) 00164 for wallNumber in range(1, wallcounts[2]+1): 00165 for wallSpot in range(1, farOutFout[wallNumber-1]+1): 00166 farOwsPmts.append( [wallSpot, wallNumber, 0] ) 00167 00168 PoolPmtIds = {} 00169 for detector in getWaterVetoIds(): 00170 poolPmts = [] 00171 if detector.site() == Site.kFar: 00172 if detector.detectorId() == DetectorId.kIWS: 00173 poolPmts = farIwsPmts 00174 else: 00175 poolPmts = farOwsPmts 00176 else: 00177 if detector.detectorId() == DetectorId.kIWS: 00178 poolPmts = nearIwsPmts 00179 else: 00180 poolPmts = nearOwsPmts 00181 PoolPmtIds[detector] = [ PoolPmtSensor(wallNumber, 00182 wallSpot, 00183 inwardFacing, 00184 detector.site(), 00185 detector.detectorId()) 00186 for [wallSpot, wallNumber, inwardFacing] in poolPmts] 00187 return PoolPmtIds 00188 00189 def getAllPmtIds(): 00190 "Return all PMT IDs" 00191 pmtIds = {} 00192 pmtIds.update(getAdPmtIds()) 00193 pmtIds.update(getWaterVetoPmtIds()) 00194 return pmtIds 00195 00196 def getFeeChannelIds(): 00197 "Return a list of the FEE channel IDs" 00198 nFeeConnectorsPerBoard = 16 00199 #nFeeBoardsAd = 13 00200 #nFeeBoardsNearIws = 8 00201 #nFeeBoardsNearOws = 11 00202 #nFeeBoardsFarIws = 10 00203 #nFeeBoardsFarOws = 14 00204 00205 feeIds = {} 00206 detectors = getAdIds() + getWaterVetoIds() 00207 pmtIds = getAllPmtIds() 00208 for detector in detectors: 00209 nBoards = int(math.ceil( len(pmtIds[detector]) 00210 / float(nFeeConnectorsPerBoard) ) ) 00211 feeIds[detector] = [FeeChannelId(board, connector, 00212 detector.site(), 00213 detector.detectorId()) 00214 for board in range(1,nBoards+1) 00215 for connector in range(1,nFeeConnectorsPerBoard+1)] 00216 00217 return feeIds 00218 00219 def pmtDescription(pmtId): 00220 "Return a string representation of PMT ID" 00221 if pmtId.detectorId() == DetectorId.kIWS: 00222 return "%s-wall%d-spot%d" % (pmtId.detName(), 00223 pmtId.wallNumber(), 00224 pmtId.wallSpot()) 00225 elif pmtId.detectorId() == DetectorId.kOWS: 00226 facing = None 00227 if pmtId.inwardFacing(): facing = "in" 00228 else: facing = "out" 00229 return "%s-wall%d-spot%d-%s" % (pmtId.detName(), 00230 pmtId.wallNumber(), 00231 pmtId.wallSpot(), 00232 facing) 00233 else: 00234 return "%s-ring%02d-column%02d" % (pmtId.detName(), 00235 pmtId.ring(), 00236 pmtId.column()) 00237 00238 def rpcDescription(rpcId): 00239 "Return a string representation of RPC ID" 00240 return "%s-row%02d-column%02d-layer%02d-strip-%02d" % (rpcId.detName(), 00241 rpcId.panelRow(), 00242 rpcId.panelColumn(), 00243 rpcId.layer(), 00244 rpcId.strip()) 00245 00246 def channelDescription(channelId): 00247 "Return a string representation of FEE/FEC channel ID" 00248 return "%s-board%02d-connector%02d" % (channelId.detName(), 00249 channelId.board(), 00250 channelId.connector()) 00251 00252 def hardwareDescription(hardwareId): 00253 "Return a string representation of the hardware ID" 00254 if hardwareId.type() == Hardware.kFee: 00255 return "%s-%d" % (Hardware.AsString(hardwareId.type()), 00256 hardwareId.boardId()) 00257 else: 00258 return "%s-%d" % (Hardware.AsString(hardwareId.type()), 00259 hardwareId.id()) 00260 00261 def printCableMap(): 00262 "Print a map of the cable connections" 00263 detectors = getAdIds() + getWaterVetoIds() 00264 pmtIds = getAllPmtIds() 00265 channelIds = getFeeChannelIds() 00266 pmt8inchHardwareIndex = 1 00267 pmt2inchHardwareIndex = 1 00268 boardHardwareNumber = {} 00269 nextFeeBoardNumber = 1 00270 print "# ChannelID Description ElecHardwareId Description SensorID Description SensorHardwareID Description" 00271 for detector in detectors: 00272 pmtIndex = 0 00273 currentPmts = pmtIds[detector] 00274 nPmts = len(currentPmts) 00275 for channelId in channelIds[detector]: 00276 pmtId = None 00277 pmtHardwareId = None 00278 if pmtIndex < nPmts: 00279 pmtId = currentPmts[pmtIndex] 00280 if pmtId.detName().find("AD")>0 and pmtId.ring() == 0: 00281 pmtHardwareId = PmtHardwareId(pmt2inchHardwareIndex, 00282 Hardware.kPmt2inch) 00283 pmt2inchHardwareIndex += 1 00284 else: 00285 pmtHardwareId = PmtHardwareId(pmt8inchHardwareIndex, 00286 Hardware.kPmt8inch) 00287 pmt8inchHardwareIndex += 1 00288 else: 00289 pmtId = AdPmtSensor() 00290 pmtHardwareId = HardwareId() 00291 boardId = channelId.boardId().fullPackedData() 00292 if not boardHardwareNumber.has_key( boardId ): 00293 boardHardwareNumber[boardId] = nextFeeBoardNumber 00294 nextFeeBoardNumber += 1 00295 feeHardwareId = FeeHardwareId(boardHardwareNumber[boardId], 00296 channelId.connector()) 00297 print "%12d %30s %14d %11s %12d %33s %16d %13s" % ( 00298 channelId.fullPackedData(), 00299 channelDescription(channelId), 00300 feeHardwareId.fullPackedData(), 00301 hardwareDescription(feeHardwareId), 00302 pmtId.fullPackedData(), 00303 pmtDescription(pmtId), 00304 pmtHardwareId.fullPackedData(), 00305 hardwareDescription(pmtHardwareId)) 00306 pmtIndex += 1 00307 00308 def printFecCableMap(): 00309 "Print a map of the cable connections" 00310 detectors = getRpcIds() 00311 rpcIds = getRpcSensorIds() 00312 channelIds = getFecChannelIds() 00313 boardHardwareNumber = {} 00314 nextFecBoardNumber = 1 00315 # print "# ChannelID Description ElecHardwareId Description SensorID Description SensorHardwareID Description" 00316 for detector in detectors: 00317 rpcIndex = 0 00318 currentRpcs = rpcIds[detector] 00319 nRpcs = len(currentRpcs) 00320 for channelId in channelIds[detector]: 00321 rpcId = None 00322 rpcHardwareId = None 00323 if rpcIndex < nRpcs: 00324 rpcId = currentRpcs[rpcIndex] 00325 iPanel = int(math.ceil(len(channelIds)/32)) 00326 rpcHardwareId = RpcHardwareId(iPanel, rpcId.layer(), rpcId.strip()) 00327 else: 00328 rpcId = RpcSensor() 00329 rpcHardwareId = HardwareId() 00330 boardId = channelId.boardId().fullPackedData() 00331 if not boardHardwareNumber.has_key( boardId ): 00332 boardHardwareNumber[boardId] = nextFecBoardNumber 00333 nextFecBoardNumber += 1 00334 fecHardwareId = FecHardwareId(boardHardwareNumber[boardId], 00335 channelId.connector()) 00336 # print channelId.fullPackedData(), rpcId.fullPackedData() 00337 print "%12d %30s %14d %11s %12d %33s %16d %13s" % ( 00338 channelId.fullPackedData(), 00339 channelDescription(channelId), 00340 fecHardwareId.fullPackedData(), 00341 hardwareDescription(fecHardwareId), 00342 rpcId.fullPackedData(), 00343 rpcDescription(rpcId), 00344 rpcHardwareId.fullPackedData(), 00345 hardwareDescription(rpcHardwareId)) 00346 rpcIndex += 1 00347 if __name__ == "__main__": 00348 printCableMap() #FEE 00349 printFecCableMap() #FEC 00350