+ self.integ = integval
+
+ #
+ # Timeout function
+ # Used to update LMST display, as well as current
+ # continuum value
+ #
+ # We also write external data-logging files here
+ #
+ def lmst_timeout(self):
+ self.locality.date = ephem.now()
+ if self.setimode == False:
+ x = self.probe.level()
+ sidtime = self.locality.sidereal_time()
+ # LMST
+ s = str(ephem.hours(sidtime)) + " " + self.sunstate
+ # Continuum detector value
+ if self.setimode == False:
+ sx = "%7.4f" % x
+ s = s + "\nDet: " + str(sx)
+ else:
+ sx = "%2d" % self.hitcounter
+ s1 = "%2d" % self.s1hitcounter
+ s2 = "%2d" % self.s2hitcounter
+ sa = "%4.2f" % self.avgdelta
+ sy = "%3.1f-%3.1f" % (self.CHIRP_LOWER, self.CHIRP_UPPER)
+ s = s + "\nHits: " + str(sx) + "\nS1:" + str(s1) + " S2:" + str(s2)
+ s = s + "\nAv D: " + str(sa) + "\nCh lim: " + str(sy)
+
+ self.myform['lmst_high'].set_value(s)
+
+ #
+ # Write data out to recording files
+ #
+ if self.setimode == False:
+ self.write_continuum_data(x,sidtime)
+ self.write_spectral_data(self.fft_outbuf,sidtime)
+
+ else:
+ self.seti_analysis(self.fft_outbuf,sidtime)
+ now = time.time()
+ if ((self.scanning == True) and ((now - self.seti_then) > self.setifreq_timer)):
+ self.seti_then = now
+ self.setifreq_current = self.setifreq_current + self.fft_input_rate
+ if (self.setifreq_current > self.setifreq_upper):
+ self.setifreq_current = self.setifreq_lower
+ self.set_freq(self.setifreq_current)
+ # Make sure we zero-out the hits array when changing
+ # frequency.
+ self.hits_array[:,:] = 0.0
+ self.hit_intensities[:,:] = 0.0
+
+ def fft_outfunc(self,data,l):
+ self.fft_outbuf=data
+
+ def write_continuum_data(self,data,sidtime):
+
+ # Create localtime structure for producing filename
+ foo = time.localtime()
+ pfx = self.prefix
+ filenamestr = "%s/%04d%02d%02d%02d" % (pfx, foo.tm_year,
+ foo.tm_mon, foo.tm_mday, foo.tm_hour)
+
+ # Open the data file, appending
+ continuum_file = open (filenamestr+".tpdat","a")
+
+ flt = "%6.3f" % data
+ inter = self.decln
+ integ = self.integ
+ fc = self.observing
+ fc = fc / 1000000
+ bw = self.bw
+ bw = bw / 1000000
+ ga = self.gain
+
+ now = time.time()
+
+ #
+ # If time to write full header info (saves storage this way)
+ #
+ if (now - self.continuum_then > 20):
+ self.sun.compute(self.locality)
+ enow = ephem.now()
+ sun_insky = "Down"
+ self.sunstate = "Dn"
+ if ((self.sun.rise_time < enow) and (enow < self.sun.set_time)):
+ sun_insky = "Up"
+ self.sunstate = "Up"
+ self.continuum_then = now
+
+ continuum_file.write(str(ephem.hours(sidtime))+" "+flt+" Dn="+str(inter)+",")
+ continuum_file.write("Ti="+str(integ)+",Fc="+str(fc)+",Bw="+str(bw))
+ continuum_file.write(",Ga="+str(ga)+",Sun="+str(sun_insky)+"\n")
+ else:
+ continuum_file.write(str(ephem.hours(sidtime))+" "+flt+"\n")
+
+ continuum_file.close()
+ return(data)
+
+ def write_spectral_data(self,data,sidtime):
+
+ now = time.time()
+ delta = 10
+
+ # If time to write out spectral data
+ # We don't write this out every time, in order to
+ # save disk space. Since the spectral data are
+ # typically heavily averaged, writing this data
+ # "once in a while" is OK.
+ #
+ if (now - self.spectral_then >= delta):
+ self.spectral_then = now
+
+ # Get localtime structure to make filename from
+ foo = time.localtime()
+
+ pfx = self.prefix
+ filenamestr = "%s/%04d%02d%02d%02d" % (pfx, foo.tm_year,
+ foo.tm_mon, foo.tm_mday, foo.tm_hour)
+
+ # Open the file
+ spectral_file = open (filenamestr+".sdat","a")
+
+ # Setup data fields to be written
+ r = data
+ inter = self.decln
+ fc = self.observing
+ fc = fc / 1000000
+ bw = self.bw
+ bw = bw / 1000000
+ av = self.avg_alpha
+
+ # Write those fields
+ spectral_file.write("data:"+str(ephem.hours(sidtime))+" Dn="+str(inter)+",Fc="+str(fc)+",Bw="+str(bw)+",Av="+str(av))
+ spectral_file.write (" [ ")
+ for r in data:
+ spectral_file.write(" "+str(r))
+
+ spectral_file.write(" ]\n")
+ spectral_file.close()
+ return(data)
+
+ return(data)
+
+ def seti_analysis(self,fftbuf,sidtime):
+ l = len(fftbuf)
+ x = 0
+ hits = []
+ hit_intensities = []
+ if self.seticounter < self.setitimer:
+ self.seticounter = self.seticounter + 1
+ return
+ else:
+ self.seticounter = 0
+
+ # Run through FFT output buffer, computing standard deviation (Sigma)
+ avg = 0
+ # First compute average
+ for i in range(0,l):
+ avg = avg + fftbuf[i]
+ avg = avg / l
+
+ sigma = 0.0
+ # Then compute standard deviation (Sigma)
+ for i in range(0,l):
+ d = fftbuf[i] - avg
+ sigma = sigma + (d*d)
+
+ sigma = Numeric.sqrt(sigma/l)