def find_calsource(self,datadir): ''' try to find, and then read the calsource file corresponding to the dataset ''' # look for files within the last hour, and then take the closest one to the start time # the files are in FITS format as of Wed 10 Apr 2019 10:21:35 CEST self.printmsg('trying to find calsource data corresponding to %s' % self.dataset_name,verbosity=2) # calsource directory is normally two up calsource_dir = '%s/calsource' % os.path.dirname(os.path.dirname(datadir)) filetype = 'calsource' datadir = calsource_dir search_start = self.obsdate - dt.timedelta(minutes=30) pattern = [] pattern.append('%s/calsource_%s*.fits' % (calsource_dir,search_start.strftime('%Y%m%dT%H'))) pattern.append('%s/calsource_%s*.fits' % (calsource_dir,self.obsdate.strftime('%Y%m%dT%H'))) files = [] for p in pattern: files += glob(p) if len(files)==0: self.printmsg('No %s data found in directory: %s' % (filetype,datadir),verbosity=1) return # find the file which starts before and nearest to obsdate filename = None file_delta = 1e6 for f in files: basename = os.path.basename(f) file_date = dt.datetime.strptime(basename,'calsource_%Y%m%dT%H%M%S.fits') delta = tot_seconds(self.obsdate - file_date) if np.abs(delta)<file_delta: file_delta = np.abs(delta) filename = f if file_delta>30: self.printmsg('Did not find a corresponding calsource file.') return self.printmsg('found calsource file which started %.1f seconds before the data acquisition' % file_delta) self.printmsg('reading calsource file: %s' % filename) hdulist=pyfits.open(filename) nhdu=len(hdulist) if nhdu!=2: self.printmsg("This doesn't look like a calsource file!") hdulist.close() return hdu = hdulist[1] if 'EXTNAME' not in hdu.header.keys()\ and hdu.header['EXTNAME']!='CALSOURCE': self.printmsg("This is not a calsource FITS file!") hdulist.close() return self.read_calsource_fits(hdu) hdulist.close() return
def calsource2fits(filename): starttime = dt.datetime.utcnow() sys.stdout.write('%s ... ' % filename) sys.stdout.flush() t, v = read_calsource_dat(filename) if t is None: return endtime = dt.datetime.utcnow() delta = tot_seconds(endtime - starttime) sys.stdout.write(' read file in %.1f seconds' % delta) sys.stdout.flush() starttime = dt.datetime.utcnow() fitsname = write_calsource_fits(t, v) if fitsname is None: return endtime = dt.datetime.utcnow() delta = tot_seconds(endtime - starttime) sys.stdout.write(' saved file in %.1f seconds\n' % delta) sys.stdout.flush() return
def onoff(self, states=None): ''' switch on or off devices we have to wait for the Energenie powerbar to reset ''' reset_delta = self.energenie_timeout # minimum time to wait now = dt.datetime.utcnow() delta = tot_seconds(now - self.energenie_lastcommand_date) if delta < reset_delta: extra_wait = reset_delta - delta time.sleep(extra_wait) ack = '' if states is not None: info = energenie_set_socket_states(states) if info['ok']: ack = 'OK-' else: ack = 'FAILED_SET_STATES-' if 'error_message' in info.keys(): self.log('energenie error: %s' % info['error_message']) self.log('energenie message: %s' % info['message']) # check for the on/off status time.sleep(reset_delta) # wait a bit before sending another command states_read = energenie_get_socket_states() if states_read is not None: ack += 'OK' self.log('retrieved energenie states: %s' % states_read, verbosity=2) else: ack += 'FAILED_GET_STATES' self.log('FAILED to get energenie states', verbosity=2) if ack.find('FAILED_GET_STATES') < 0: for socket_no in states_read.keys(): socket_idx = socket_no - 1 state = states_read[socket_no] dev = self.device_list[socket_idx] self.device_on[dev] = state self.energenie_lastcommand_date = dt.datetime.utcnow() return ack
def acquire(self, duration=None): ''' acquire data with timestamps from the Arduino Uno duration is given in seconds Fri 12 Apr 2019 14:17:47 CEST: change of behaviour. we don't return the data, we return the filename with the data "save" is no longer an option ''' if not self.connected: self.init() if not self.connected: return None, None self.clear_interrupt_flag() if duration is None: dt_duration = dt.timedelta(minutes=5) else: dt_duration = dt.timedelta(seconds=duration) self.log('##### arduino_acquire #####') if self.connection == 'serial': self.s.flush() else: client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #client.settimeout(2.0) client.bind(('', self.broadcast_port)) self.log('listening to Arduino on socket port %i' % self.broadcast_port) #y=[] #t=[] start_time = dt.datetime.utcnow() end_time = start_time + dt_duration now = dt.datetime.utcnow() # open a file for on-the-fly acquisition to disk outfile = start_time.strftime('calsource_%Y%m%dT%H%M%S.dat') h = open(outfile, 'w') ## acquisition for serial connection. Don't put the "if" inside the loop! if self.connection == 'serial': while now < end_time and not os.path.isfile( self.interrupt_flag_file): x = self.s.readline() val = x.strip() now = dt.datetime.utcnow() h.write('%s %s\n' % (now.strftime('%s.%f'), val)) #y.append(val) #t.append(now) else: counter = 0 while now < end_time and not os.path.isfile( self.interrupt_flag_file): x, addr = client.recvfrom(1024) # Mon 29 Apr 2019 16:31:25 CEST # now we are using the ADC on the Raspberry Pi and not the Arduino # the name "arduino" remains as a nickname now = dt.datetime.utcnow() #val = x.strip() #h.write('%s %s\n' % (now.strftime('%s.%f'),val)) # Sat 22 Jun 2019 23:19:53 CEST # now the Raspberry Pi PiGPS is sending packed data instead of string #dat = x.strip().split() #tstamp = dat[0] #val = dat[1] fmts = '<Bdq' data_tuple = struct.unpack(fmts, x) stx = data_tuple[0] tstamp = data_tuple[1] val = data_tuple[2] h.write('%.6f %i\n' % (tstamp, val)) #y.append(val) #t.append(now) counter += 1 end_time = now h.close() self.log('output file written: %s' % outfile) self.log('started data acquisition at %s' % start_time.strftime('%Y-%m-%d %H:%M:%S.%f UTC')) self.log(' ended data acquisition at %s' % end_time.strftime('%Y-%m-%d %H:%M:%S.%f UTC')) delta = end_time - start_time self.log('total acquisition time: %.3f seconds' % tot_seconds(delta)) self.clear_interrupt_flag() return outfile '''