00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 import math
00011 from GaudiPython import gbl
00012
00013
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
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
00064
00065
00066
00067
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
00133
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
00200
00201
00202
00203
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
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
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()
00349 printFecCableMap()
00350