Newer
Older
STAging / scripts / STLibrary / STChannelID.py
#!/usr/bin/env python
"""
STChannelID.py: retrieve ID and name of layers, sectors, etc. from an LHCb::STChannelID integer.

Sample usage:
In [1]: id = STChannelID(10815631)
In [2]: STNames().uniqueSectorName(id)
Out[2]: 'IT1ASideX1Sector2'
"""
__author__  = "Elena Graverini"
__email__   = "elena.graverini@cern.ch"
__version__ = "1.0"
__date__    = "03/12/2014"


class STChannelID():
    """
    STChannelID: retrieve detector type, station, region, layer, sector
    and strip from an LHCb::STChannelID integer.
    """
    def __init__(self, m_channelID):
        self.channelID           = long(m_channelID)
        self.stripBits           = 0
        self.sectorBits          = 10
        self.detRegionBits       = 15
        self.layerBits           = 18
        self.stationBits         = 21
        self.typeBits            = 23   
        self.stripMask           = 0x3ffL
        self.sectorMask          = 0x7c00L
        self.detRegionMask       = 0x38000L
        self.layerMask           = 0x1c0000L
        self.stationMask         = 0x600000L
        self.typeMask            = 0x1800000L
        self.typeTT              = 0
        self.typeIT              = 1
        self.uniqueLayerMask     = self.layerMask + self.stationMask
        self.uniqueDetRegionMask = self.detRegionMask + self.layerMask + self.stationMask
        self.uniqueSectorMask    = self.sectorMask + self.detRegionMask + self.layerMask + self.stationMask
        self.type = ((self.channelID & self.typeMask) >> self.typeBits)
        self.isTT = (self.type == self.typeTT)
        self.isIT = (self.type == self.typeIT)
        self.station = ((self.channelID & self.stationMask) >> self.stationBits)
        self.detRegion = ((self.channelID & self.detRegionMask) >> self.detRegionBits)
        self.uniqueDetRegion = ((self.channelID & self.uniqueDetRegionMask) >> self.detRegionBits)
        self.layer = ((self.channelID & self.layerMask) >> self.layerBits)
        self.uniqueLayer = ((self.channelID & self.uniqueLayerMask) >> self.layerBits)
        self.sector = ((self.channelID & self.sectorMask) >> self.sectorBits)
        self.uniqueSector = ((self.channelID & self.uniqueSectorMask) >> self.sectorBits)
        self.strip = ((self.channelID & self.stripMask) >> self.stripBits) # goes from 1 to 384 (IT) or 1 to 512 (TT)
        #if self.detRegion == 3:
        #    print self.channelID, self.type, self.station, self.layer, self.detRegion, self.sector


class STNames():
    """
    STNames: retrieve detector name, station name, region name,
    layer name and sector name from an STChannelID object.
    """
    def __init__(self):
        self.TTstations = ["a", "b"]
        self.TTlayers = [["X", "U"], ["V", "X"]]
        self.TTuniqueLayers = []
        for (ind,s) in enumerate(self.TTstations):
            for l in self.TTlayers[ind]:
                self.TTuniqueLayers.append('TT'+s+l)
        self.TTregions = ["C", "B", "A"]#["A", "B", "C"]
        self.ITlayers = ["X1", "U", "V", "X2"]
        self.ITboxes = ["CSide", "ASide", "Bottom", "Top"]

    def detectorName(self, id):
        if id.isTT:
            return "TT"
        else:
            return "IT"

    def stationName(self, id):
        if id.isTT:
            return self.TTstations[id.station-1]
        else:
            return str(id.station)

    def regionName(self, id):
        if id.isTT:
            return "Region" + self.TTregions[id.detRegion-1]
        else:
            return self.ITboxes[id.detRegion-1]

    def layerName(self, id):
        if id.isTT:
            return self.TTlayers[id.station-1][id.layer-1]
        else:
            return self.ITlayers[id.layer-1]

    def uniqueLayerName(self, id):
        if id.isTT:
            name = (  self.detectorName(id)
                    + self.stationName(id)
                    + self.layerName(id)  )
        else:
            name = (  self.detectorName(id)
                    + self.stationName(id)
                    + self.regionName(id)
                    + self.layerName(id)  )
        return name

    def sectorName(self, id):
        return "Sector" + str(id.sector)

    def uniqueSectorName(self, id):
        if id.isTT:
            name = (  self.uniqueLayerName(id)
                    + self.regionName(id)
                    + self.sectorName(id)  )
        else:
            name = (  self.uniqueLayerName(id)
                    + self.sectorName(id)  )
        return name

    def locateTTSector(self, uSectorName):
        uLayer = uSectorName.split('Region')[0]
        region, sector = uSectorName.split('Region')[1].split('Sector')
        return uLayer, region, int(sector)

STNames_instance = STNames()