Ejemplo n.º 1
0
  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 ) )
Ejemplo n.º 2
0
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: