def __init__( self, parsetFilename, partition, testname ): self.partition = partition self.testname = testname # configure the correlator before the parsets are added such that they will use the right paths testfilename = self.testname for c in " :": testfilename = testfilename.replace(c,"_") self.logdir = "%s/%s" % (Locations.files["logdir"],testfilename) self.results = { "started": False, "terminated": False, "logdir": self.logdir, } self.parset = Parset() self.olapparset_filename = "%s/OLAP.parset" % (Locations.files["configdir"],) self.rtcpparset_filename = parsetFilename for f in [self.olapparset_filename, self.rtcpparset_filename]: self.parset.readFile( Locations.resolvePath( f ) )
class ParsetTester: """ Tests a parset by starting the correlator in a separate process and inserting the parset. Usage example: pt = ParsetTester( "RTCP.parset", partition, "name of test" ) # adjust the parset at will -- it has been read but not post-processed pt.setNrSubbands( 248 ) pt.parset["Observation.outputCorrelatedData"] = True # run it and validate the logs pt.runParset() pt.validate( [NoErrors()] ) # clean up logs and data products (if desired) pt.cleanup() """ def __init__( self, parsetFilename, partition, testname ): self.partition = partition self.testname = testname # configure the correlator before the parsets are added such that they will use the right paths testfilename = self.testname for c in " :": testfilename = testfilename.replace(c,"_") self.logdir = "%s/%s" % (Locations.files["logdir"],testfilename) self.results = { "started": False, "terminated": False, "logdir": self.logdir, } self.parset = Parset() self.olapparset_filename = "%s/OLAP.parset" % (Locations.files["configdir"],) self.rtcpparset_filename = parsetFilename for f in [self.olapparset_filename, self.rtcpparset_filename]: self.parset.readFile( Locations.resolvePath( f ) ) def setNrSubbands( self, nrSubbands ): """ Use subbands 0 .. nrSubbands. """ subbands = [i for i in xrange(nrSubbands)] beams = [0 for i in xrange(nrSubbands)] rspboards = [i//61 for i in xrange(nrSubbands)] rspslots = [i%61 for i in xrange(nrSubbands)] override_keys = { "Observation.subbandList": subbands, "Observation.beamList": beams, "Observation.rspBoardList": rspboards, "Observation.rspSlotList": rspslots, } for k,v in override_keys.iteritems(): self.parset[k] = v def setNrStations( self, nrStations ): """ Use fake stations 0 .. nrStations which map to this partition. Uses at most |partition| stations. """ psets = PartitionPsets[self.partition][:nrStations] ipsuffixes = [ip.split(".")[3] for ip in psets] stations = ["S%s" % (s,) for s in ipsuffixes] del self.parset["OLAP.CNProc.phaseOnePsets"] self.parset.forceStations( stations ) def setNrPencilBeams( self, nrBeams, sap = 0 ): """ Use nrBeams fake beams. """ self.parset["Observation.Beam[%d].nrTiedArrayBeams" % (sap,)] = nrBeams for n in xrange(nrBeams): self.parset["Observation.Beam[%d].TiedArrayBeam[%d].angle1" % (sap,n)] = 0 self.parset["Observation.Beam[%d].TiedArrayBeam[%d].angle2" % (sap,n)] = n def runParset( self, starttimeout = 30, runtime = 60, stoptimeout = 120, parsetstartdelay = 30 ): # finalise and check parset BEFORE we start doing anything fancy self.parset = buildParset( parset=self.parset, args="start=+%d,run=%d" % (parsetstartdelay,runtime,), partition=self.partition ) self.parset.preWrite() self.parset.check() self.results["started"] = True class CorrelatorThread(Thread): def __init__(self,partition): Thread.__init__(self) self.partition = partition def run(self): runCorrelator( self.partition ) info( "********** Starting test '%s' **********" % (self.testname,) ) try: # start the correlator (ni a separate process to allow full control in runCorrelator info( "Starting correlator." ) pid = os.fork() if pid == 0: # child process try: Locations.files["logdir"] = self.logdir info("Logdir = %s" % (self.logdir,)) try: os.makedirs( self.logdir ) except OSError,e: warning( "Error creating directory %s: %s" % (self.logdir,e) ) runCorrelator( self.partition ) except: error( "Correlator aborted." ) os._exit(1) else: info( "Correlator stopped." ) os._exit(0) else: