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