Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

rcTrgFunctions.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2004
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 __facility__ = "Online"
00011 __abstract__ = "GLAST LAT Trigger Input Enable Interface classes"
00012 __author__   = "Jim Panetta <panetta@slac.stanford.edu> SLAC - GLAST I&T"
00013 __date__     = "2/14/04"
00014 __version__  = "$Revision: 2.3 $"
00015 __release__  = "$Name: R04-12-00 $"
00016 __credits__  = "SLAC"
00017 
00018 import LATTE.copyright_SLAC
00019 
00020 from TrgObject             import TrgObject
00021 from TrgConditionsValue    import TrgConditionsValue
00022 from TrgEngines            import *
00023 from NullObjects           import NullEngine
00024 from TrgInputEnables       import TrgTileEnables
00025 from TrgInputEnables       import TrgTowerBusyEnables
00026 from TrgCoincidences       import TrgCoincidence
00027 
00028 
00029 """rcTrgFunctions: Run control Interfaces for Trigger modules"""
00030 
00031 class rcTrgEngines(TrgEngines):
00032   """\brief rcTrgEngines Class
00033   
00034   Setup a LATTE based trigger engine system.
00035   All sixteen (16) engines are defined.  [0..14] are NullEngine, the last
00036   is a reserved engine that transmits the sweep marker on transitions.
00037   """
00038   def __init__(self):
00039     """\brief rcTrgEngines constructor
00040     """
00041     TrgEngines.__init__(self)
00042     self.__engines = []
00043     for i in range(TrgObject.ENGINE_NUMBER_MAX):
00044       self.__engines.append( NullEngine() )
00045     self.__engines.append( SweepMarkerEngine() )
00046     
00047   def replaceEngine(self,engineNumber,engine):
00048     """\brief replaceEngine() method
00049     
00050     Replace one of the engines.
00051     \param engineNumber: The engine number to replace [0..13]
00052     \param engine:  The replacement engine
00053     """
00054     if engineNumber == 0xf:
00055       raise IndexError, "Sorry, can't replace engine number 15"
00056     if engineNumber == 0xe:
00057       raise IndexError, "Sorry, can't replace engine number 14"
00058     self.__engines[engineNumber] = engine
00059     
00060   def engine(self, engineNumber):
00061     """\brief engine() method
00062     
00063     Return one of the engines
00064     \param engineNumber: The engine to return
00065     """
00066     if engineNumber < TrgObject.ENGINE_NUMBER_MIN or \
00067        engineNumber > TrgObject.ENGINE_NUMBER_MAX:
00068       raise IndexError, "engineNumber is out of range"
00069     return self.__engines[engineNumber]
00070 
00071 class SweepMarkerEngine(TrgEngine):
00072   """\brief SweepMarkerEngine class
00073   
00074      This class defines an engine which injects a sweep marker signal.  
00075      This engine is not prescaled.
00076   """
00077   SWEEP_MARKER = 5
00078   def __init__(self):
00079     """\brief SweepMarkerEngine constructor
00080     """
00081     TrgEngine.__init__(self)
00082     self.__request = rcTrgInjectMarker(SweepMarkerEngine.SWEEP_MARKER)
00083     
00084   def participate(self,conditionsValue):
00085     """\brief participate() method
00086     
00087     This function always returns False as this engine never 
00088     participates except when RunControl wants it to.
00089     """
00090     return False
00091     
00092   def prescale(self):
00093     """\brief prescale() method
00094     
00095     Returns 0.  This engine isn't prescaled
00096     """
00097     return 0
00098     
00099   def request(self):
00100     """\brief request() method
00101     
00102     Returns a TrgInjectMarker object
00103     """
00104     return self.__request
00105     
00106 class rcTrgInjectMarker(TrgInjectMarker):
00107   def __init__(self, marker):
00108     TrgInjectMarker.__init__(self, marker)
00109   def zeroSuppress(self):
00110     return True
00111   def sequence(self):
00112     return 1
00113     
00114 
00115 class rcTrgTileEnables(TrgTileEnables):
00116   """\brief rcTrgTileEnables class
00117   
00118   Class to abstract the additions of tiles to the input enable list.
00119   All tiles *not* in the enable list are specifically disabled
00120   """
00121   def __init__(self):
00122     """\brief rcTrgTileEnables constructor
00123     """
00124     TrgTileEnables.__init__(self)
00125     self.__tileA = []
00126     self.__tileB = []
00127 
00128   def tile(self, tileNumber):
00129     rc = 0
00130     if tileNumber in self.__tileA :
00131       rc |= 0x1
00132     if tileNumber in self.__tileB :
00133       rc |= 0x2
00134     return rc
00135 
00136   def addTile(self, tileNumber, side):
00137     if side & 0x1:
00138       self.__tileA.append(tileNumber)
00139     if side & 0x2:
00140       self.__tileB.append(tileNumber)
00141 
00142 class rcTrgCoincidence(TrgCoincidence):
00143   """\brief rcTrgCoincidence class
00144   
00145   Class to provide a function to add tiles to coincidence sets.
00146   Also does checking to see if tiles are in the allowed tile set
00147   """
00148   def __init__(self):
00149     TrgCoincidence.__init__(self)
00150     self.__pairList = {}
00151     from TrgGemRegisterGeometry import AcdTileNumbering as TN
00152     self.__badTiles = ( TN['NA0'], TN['NA1'], TN['NA2'], TN['NA3'], TN['NA4'], 
00153                         TN['NA5'], TN['NA6'], TN['NA7'], TN['NA8'], TN['NA9'], TN['NA10'] )
00154     
00155   def addPair(self, tile1, tile2):
00156     """\brief addPair(tile1, tile2)
00157     
00158     \param tile1 an integer
00159     \param tile2 an integer
00160     
00161     Add a tile pair, tile1,tile2 to a coincidence list.
00162     Note, the set of tile1 objects must be unique.
00163     """
00164     self.__checkTile(tile1)
00165     self.__checkTile(tile2)
00166     self.__pairList[tile1] = tile2
00167       
00168   def inCoincidence(self,tileNumber):
00169     self.__bounds(tileNumber)
00170     if self.__pairList.has_key(tileNumber):
00171       return self.__pairList[tileNumber]
00172     else:
00173       return -1  # Tile not in coincidence List
00174 
00175   def __checkTile(self, tile):
00176     self.__bounds(tile)
00177     # self.__badlist(tile)
00178     
00179   def __bounds(self,tile):
00180     if tile < TrgObject.TILE_NUMBER_MIN or \
00181        tile > TrgObject.TILE_NUMBER_MAX:
00182       msg = "Tile number %d is out of range" % tile
00183       raise IndexError, msg
00184       
00185   def __badlist(self, tile):
00186     if tile in self.__badTiles:
00187       msg = "Tile number %d is a non-assigned tile" % tile
00188       raise IndexError, msg
00189 
00190 class rcTrgTowerBusyEnables(TrgTowerBusyEnables):
00191   """\brief rcTrgTowerBusyEnables class
00192   
00193   Class to abstract the additions of towers to the tower-busy enable list.
00194   All towers *not* in the enable list are specifically disabled
00195   """
00196   def __init__(self):
00197     """\brief rcTrgTowerBusyEnables constructor
00198     """
00199     TrgTowerBusyEnables.__init__(self)
00200     self.__enab = 0x0
00201 
00202   def tower(self, towerNumber):
00203     if self.__enab & ( 1 << towerNumber):
00204       return True
00205     return False
00206 
00207   def addTower(self, towerNumber):
00208     self.__enab |= ( 1 << towerNumber);
00209 
00210 

Generated on Fri Jul 21 13:26:32 2006 for LATTE R04-12-00 by doxygen 1.4.3