def get_correct_positions(self): """Reconstruct original wapp filename and check for correct beam positions from the coordinates table. Returns nothing, updates object in place. """ fn0 = os.path.basename(min(self.fns)).lstrip('4bit-').replace( 's0g0', '').replace('s1g0', '').replace('00100', '00000') # Get corrected beam positions matches = [line for line in open(config.basic.mock_coords_table, 'r') if \ line.replace('s0g0','').startswith(fn0)] if len(matches) > 1: matches = [matches[0]] if len(matches) == 0 and self.timestamp_mjd > 55378: # No corrected coords found, but coordinate problem is fixed, # so use header values. # MJD=55378 is July 1st 2010, it is a recent date by which # the coord problem is definitely corrected. (The problem # occured from Feb 2009 to Jan 28, 2010). self.right_ascension = self.orig_right_ascension self.declination = self.orig_declination self.ra_deg = self.orig_ra_deg self.dec_deg = self.orig_dec_deg self.galactic_longitude = self.orig_galactic_longitude self.galactic_latitude = self.orig_galactic_latitude elif len(matches) == 1: # Use values from coords table self.posn_corrected = True # Format of mock coords table is: # <first sub0 filename> <ra deg> <dec deg> <frac year> <lst hrs> <ALFA rot deg> split = matches[0].split() self.ra_deg = float(split[1]) self.dec_deg = float(split[2]) self.correct_ra = protractor.convert(self.ra_deg, 'deg', 'hmsstr')[0] self.correct_decl = protractor.convert(self.dec_deg, 'deg', 'dmsstr')[0] self.right_ascension = float(self.correct_ra.replace(':', '')) self.declination = float(self.correct_decl.replace(':', '')) l, b = sextant.equatorial_to_galactic(self.ra_deg, self.dec_deg, \ 'deg', 'deg', J2000=True) self.galactic_longitude = float(l) self.galactic_latitude = float(b) else: raise ValueError("Bad number of matches (%d) in coords table! " \ "(Files: %s)" % (len(matches), ", ".join(self.fns)))
def __init__(self, fitsfns): from formats import psrfits super(NuppiSplitPsrfitsData, self).__init__(fitsfns) self.obstype = 'Nuppi' self.beam_id = 0 # Parse filename to get the scan number m = self.fnmatch(fitsfns[0]) self.scan_num = m.groupdict()['scan'] self.obs_name = m.groupdict()['source'] self.num_ifs = self.specinfo.hdus[1].header['NPOL'] dayfrac = calendar.MJD_to_date(self.timestamp_mjd)[-1]%1 self.start_ast = int((dayfrac*24)*3600) self.start_ast %= 24*3600 self.specinfo = psrfits.SpectraInfo(self.fns) self.original_file = os.path.split(sorted(self.specinfo.filenames)[0])[-1] self.project_id = self.specinfo.project_id self.observers = self.specinfo.observer self.source_name = self.specinfo.source self.center_freq = self.specinfo.fctr self.num_channels_per_record = self.specinfo.num_channels self.channel_bandwidth = self.specinfo.df*1000.0 # In kHz self.sample_time = self.specinfo.dt*1e6 # In microseconds self.sum_id = int(self.specinfo.summed_polns) self.timestamp_mjd = self.specinfo.start_MJD[0] self.start_lst = self.specinfo.start_lst self.orig_start_az = self.specinfo.azimuth self.orig_start_za = self.specinfo.zenith_ang self.ra_deg = self.specinfo.ra2000 self.dec_deg = self.specinfo.dec2000 self.right_ascension = float(protractor.convert(self.ra_deg, \ 'deg', 'hmsstr')[0].replace(':', '')) self.declination = float(protractor.convert(self.dec_deg, \ 'deg', 'dmsstr')[0].replace(':', '')) l, b = sextant.equatorial_to_galactic(self.ra_deg, self.dec_deg, \ 'deg', 'deg', J2000=True) self.galactic_longitude = float(l) self.galactic_latitude = float(b) self.file_size = int(sum([os.path.getsize(fn) for fn in fitsfns])) self.observation_time = self.specinfo.T self.num_samples = self.specinfo.N self.data_size = self.num_samples * \ self.specinfo.bits_per_sample/8.0 * \ self.num_channels_per_record self.num_samples_per_record = self.specinfo.spectra_per_subint self.header_version = float(self.specinfo.header_version)
def get_correct_positions(self): """Reconstruct original wapp filename and check for correct beam positions from the coordinates table. Returns nothing, updates object in place. """ wappfn = '.'.join([self.project_id, self.source_name, \ "wapp%d" % (self.beam_id/2+1), \ "%5d" % int(self.timestamp_mjd), \ self.fnmatch(self.original_file).groupdict()['scan']]) # Get corrected beam positions matches = [line for line in open(COORDS_TABLE, 'r') if \ line.startswith(wappfn)] if len(matches) == 0 and self.timestamp_mjd > 54651: # No corrected coords found, but coordinate problem is fixed, # so use header values. # MJD=54651 is July 4th 2008, it is a recent date by which # the coord problem is definitely corrected. (The problem # was discovered and fixed in ~2005). self.right_ascension = self.orig_right_ascension self.declination = self.orig_declination self.ra_deg = self.orig_ra_deg self.dec_deg = self.orig_dec_deg self.galactic_longitude = self.orig_galactic_longitude self.galactic_latitude = self.orig_galactic_latitude elif len(matches) == 1: # Use values from coords table self.posn_corrected = True if self.beam_id % 2: # Even beam number. Use columns 2 and 3. self.correct_ra, self.correct_decl = matches[0].split()[1:3] else: self.correct_ra, self.correct_decl = matches[0].split()[3:5] self.right_ascension = float(self.correct_ra.replace(':', '')) self.declination = float(self.correct_decl.replace(':', '')) self.ra_deg = float( protractor.convert(self.correct_ra, 'hmsstr', 'deg')[0]) self.dec_deg = float( protractor.convert(self.correct_decl, 'dmsstr', 'deg')[0]) l, b = sextant.equatorial_to_galactic(self.correct_ra, self.correct_decl, \ 'sexigesimal', 'deg', J2000=True) self.galactic_longitude = float(l[0]) self.galactic_latitude = float(b[0]) else: raise ValueError("Bad number of matches (%d) in coords table!" % len(matches))
def get_correct_positions(self): """Reconstruct original wapp filename and check for correct beam positions from the coordinates table. Returns nothing, updates object in place. """ import config.basic wappfn = '.'.join([self.project_id, self.source_name, \ "wapp%d" % (self.beam_id/2+1), \ "%5d" % int(self.timestamp_mjd), \ self.fnmatch(self.original_file).groupdict()['scan']]) # Get corrected beam positions matches = [line for line in open(config.basic.coords_table, 'r') if \ line.startswith(wappfn)] if len(matches) == 0 and self.timestamp_mjd > 54651: # No corrected coords found, but coordinate problem is fixed, # so use header values. # MJD=54651 is July 4th 2008, it is a recent date by which # the coord problem is definitely corrected. (The problem # was discovered and fixed in ~2005). self.right_ascension = self.orig_right_ascension self.declination = self.orig_declination self.ra_deg = self.orig_ra_deg self.dec_deg = self.orig_dec_deg self.galactic_longitude = self.orig_galactic_longitude self.galactic_latitude = self.orig_galactic_latitude elif len(matches) == 1: # Use values from coords table self.posn_corrected = True if self.beam_id % 2: # Even beam number. Use columns 2 and 3. self.correct_ra, self.correct_decl = matches[0].split()[1:3] else: self.correct_ra, self.correct_decl = matches[0].split()[3:5] self.right_ascension = float(self.correct_ra.replace(':', '')) self.declination = float(self.correct_decl.replace(':', '')) self.ra_deg = float(protractor.convert(self.correct_ra, 'hmsstr', 'deg')[0]) self.dec_deg = float(protractor.convert(self.correct_decl, 'dmsstr', 'deg')[0]) l, b = sextant.equatorial_to_galactic(self.correct_ra, self.correct_decl, \ 'sexigesimal', 'deg', J2000=True) self.galactic_longitude = float(l[0]) self.galactic_latitude = float(b[0]) else: raise DataFileError("Bad number of matches (%d) in coords table! " \ "(Files: %s)" % (len(matches), ", ".join(self.fns)))
def __init__(self, fitsfns): """PSR fits Header object constructor. """ import psrfits #from formats import psrfits super(PsrfitsData, self).__init__(fitsfns) # Read information from files self.specinfo = psrfits.SpectraInfo(self.fns) self.original_file = os.path.split(sorted( self.specinfo.filenames)[0])[-1] self.project_id = self.specinfo.project_id self.observers = self.specinfo.observer self.source_name = self.specinfo.source self.center_freq = self.specinfo.fctr self.num_channels_per_record = self.specinfo.num_channels self.channel_bandwidth = self.specinfo.df * 1000.0 # In kHz self.sample_time = self.specinfo.dt * 1e6 # In microseconds self.sum_id = int(self.specinfo.summed_polns) self.timestamp_mjd = self.specinfo.start_MJD[0] self.start_lst = self.specinfo.start_lst self.orig_start_az = self.specinfo.azimuth self.orig_start_za = self.specinfo.zenith_ang self.orig_ra_deg = self.specinfo.ra2000 self.orig_dec_deg = self.specinfo.dec2000 self.orig_right_ascension = float(protractor.convert(self.orig_ra_deg, \ 'deg', 'hmsstr')[0].replace(':', '')) self.orig_declination = float(protractor.convert(self.orig_dec_deg, \ 'deg', 'dmsstr')[0].replace(':', '')) l, b = sextant.equatorial_to_galactic(self.orig_ra_deg, self.orig_dec_deg, \ 'deg', 'deg', J2000=True) self.orig_galactic_longitude = float(l) self.orig_galactic_latitude = float(b) self.get_correct_positions() self.file_size = int(sum([os.path.getsize(fn) for fn in fitsfns])) self.observation_time = self.specinfo.T self.num_samples = self.specinfo.N self.data_size = self.num_samples * \ self.specinfo.bits_per_sample/8.0 * \ self.num_channels_per_record self.num_samples_per_record = self.specinfo.spectra_per_subint self.header_version = float(self.specinfo.header_version)
def __init__(self, fitsfns): """PSR fits Header object constructor. """ from formats import psrfits super(PsrfitsData, self).__init__(fitsfns) # Read information from files self.specinfo = psrfits.SpectraInfo(self.fns) self.original_file = os.path.split(sorted(self.specinfo.filenames)[0])[-1] self.project_id = self.specinfo.project_id self.observers = self.specinfo.observer self.source_name = self.specinfo.source self.center_freq = self.specinfo.fctr self.num_channels_per_record = self.specinfo.num_channels self.channel_bandwidth = self.specinfo.df*1000.0 # In kHz self.sample_time = self.specinfo.dt*1e6 # In microseconds self.sum_id = int(self.specinfo.summed_polns) self.timestamp_mjd = self.specinfo.start_MJD[0] self.start_lst = self.specinfo.start_lst self.orig_start_az = self.specinfo.azimuth self.orig_start_za = self.specinfo.zenith_ang self.orig_ra_deg = self.specinfo.ra2000 self.orig_dec_deg = self.specinfo.dec2000 self.orig_right_ascension = float(protractor.convert(self.orig_ra_deg, \ 'deg', 'hmsstr')[0].replace(':', '')) self.orig_declination = float(protractor.convert(self.orig_dec_deg, \ 'deg', 'dmsstr')[0].replace(':', '')) l, b = sextant.equatorial_to_galactic(self.orig_ra_deg, self.orig_dec_deg, \ 'deg', 'deg', J2000=True) self.orig_galactic_longitude = float(l) self.orig_galactic_latitude = float(b) self.file_size = int(sum([os.path.getsize(fn) for fn in fitsfns])) self.observation_time = self.specinfo.T self.num_samples = self.specinfo.N self.data_size = self.num_samples * \ self.specinfo.bits_per_sample/8.0 * \ self.num_channels_per_record self.num_samples_per_record = self.specinfo.spectra_per_subint self.header_version = float(self.specinfo.header_version)
def __init__(self, wappfns, beamnum): """WAPP Data object constructor. """ super(WappData, self).__init__(wappfns) # Open wapp files, sort by offset since start of observation cmp_offset = lambda w1,w2: cmp(w1.header['timeoff'], w2.header['timeoff']) self.wapps = sorted([wapp.wapp(fn) for fn in wappfns], cmp=cmp_offset) w0 = self.wapps[0] # Check WAPP files are from the same observation if False in [w0.header['src_name'] == w.header['src_name'] \ for w in self.wapps]: raise ValueError("Source name is not consistent in all files.") if False in [w0.header['obs_date'] == w.header['obs_date'] \ for w in self.wapps]: raise ValueError("Observation date is not consistent in all files.") if False in [w0.header['start_time'] == w.header['start_time'] \ for w in self.wapps]: raise ValueError("Start time is not consistent in all files.") # Divide number of samples by 2 because beams are multiplexed # First entry is 0 because first file is start of observation sampoffset = np.cumsum([0]+[w.number_of_samples/2 for w in self.wapps]) if False in [w.header['timeoff']==samps for (w,samps) in \ zip(self.wapps, sampoffset)]: raise ValueError("Offset since start of observation not consistent.") self.original_file = os.path.split(w0.filename)[-1] matchdict = self.fnmatch(self.original_file).groupdict() if 'beam' in matchdict: self.beam_id = int(matchdict['beam']) else: self.beam_id = beamnum self.project_id = w0.header['project_id'] self.observers = w0.header['observers'] self.start_ast = w0.header['start_ast'] self.start_lst = w0.header['start_lst'] self.source_name = w0.header['src_name'] self.center_freq = w0.header['cent_freq'] self.num_channels_per_record = w0.header['num_lags'] # ALFA band is inverted self.channel_bandwidth = -abs(w0.header['bandwidth'] / \ float(self.num_channels_per_record)) self.num_ifs = w0.header['nifs'] self.sample_time = w0.header['samp_time'] # in micro seconds self.sum_id = w0.header['sum'] # Compute timestamp_mjd date = date_re.match(w0.header['obs_date']).groupdict() time = time_re.match(w0.header['start_time']).groupdict() dayfrac = (int(time['hour']) + \ (int(time['min']) + \ (int(time['sec']) / 60.0)) / 60.0) / 24.0 day = calendar.date_to_MJD(int(date['year']), int(date['month']), \ int(date['day'])) self.timestamp_mjd = day + dayfrac # Combine obs_name scan = matchdict()['scan'] self.obs_name = '.'.join([self.project_id, self.source_name, \ str(int(self.timestamp_mjd)), \ scan]) # Get beam positions self.beam_id = beamnum if beamnum == 7: b = 6 else: b = beamnum self.orig_start_az = w0.header['alfa_az'][b] if w0.header['start_az'] > 360.0 and self.orig_start_az < 360.0: self.orig_start_az += 360.0 self.orig_start_za = w0.header['alfa_za'][b] self.orig_ra_deg = w0.header['alfa_raj'][b]*15.0 self.orig_dec_deg = w0.header['alfa_decj'][b] self.orig_right_ascension = float(protractor.convert(self.orig_ra_deg, \ 'deg', 'hmsstr')[0].replace(':', '')) self.orig_declination = float(protractor.convert(self.orig_dec_deg, \ 'deg', 'dmsstr')[0].replace(':', '')) l, b = sextant.equatorial_to_galactic(self.orig_ra_deg, self.orig_dec_deg, \ 'deg', 'deg', J2000=True) self.orig_galactic_longitude = float(l) self.orig_galactic_latitude = float(b) self.get_correct_positions()
def __init__(self, wappfns, beamnum): """WAPP Data object constructor. """ super(WappData, self).__init__(wappfns) # Open wapp files, sort by offset since start of observation cmp_offset = lambda w1, w2: cmp(w1.header['timeoff'], w2.header[ 'timeoff']) self.wapps = sorted([wapp.wapp(fn) for fn in wappfns], cmp=cmp_offset) w0 = self.wapps[0] # Check WAPP files are from the same observation if False in [w0.header['src_name'] == w.header['src_name'] \ for w in self.wapps]: raise ValueError("Source name is not consistent in all files.") if False in [w0.header['obs_date'] == w.header['obs_date'] \ for w in self.wapps]: raise ValueError( "Observation date is not consistent in all files.") if False in [w0.header['start_time'] == w.header['start_time'] \ for w in self.wapps]: raise ValueError("Start time is not consistent in all files.") # Divide number of samples by 2 because beams are multiplexed # First entry is 0 because first file is start of observation sampoffset = np.cumsum([0] + [w.number_of_samples / 2 for w in self.wapps]) if False in [w.header['timeoff']==samps for (w,samps) in \ zip(self.wapps, sampoffset)]: raise ValueError( "Offset since start of observation not consistent.") self.original_file = os.path.split(w0.filename)[-1] matchdict = self.fnmatch(self.original_file).groupdict() if 'beam' in matchdict: self.beam_id = int(matchdict['beam']) else: self.beam_id = beamnum self.project_id = w0.header['project_id'] self.observers = w0.header['observers'] self.start_ast = w0.header['start_ast'] self.start_lst = w0.header['start_lst'] self.source_name = w0.header['src_name'] self.center_freq = w0.header['cent_freq'] self.num_channels_per_record = w0.header['num_lags'] # ALFA band is inverted self.channel_bandwidth = -abs(w0.header['bandwidth'] / \ float(self.num_channels_per_record)) self.num_ifs = w0.header['nifs'] self.sample_time = w0.header['samp_time'] # in micro seconds self.sum_id = w0.header['sum'] # Compute timestamp_mjd date = date_re.match(w0.header['obs_date']).groupdict() time = time_re.match(w0.header['start_time']).groupdict() dayfrac = (int(time['hour']) + \ (int(time['min']) + \ (int(time['sec']) / 60.0)) / 60.0) / 24.0 day = calendar.date_to_MJD(int(date['year']), int(date['month']), \ int(date['day'])) self.timestamp_mjd = day + dayfrac # Combine obs_name scan = matchdict()['scan'] self.obs_name = '.'.join([self.project_id, self.source_name, \ str(int(self.timestamp_mjd)), \ scan]) # Get beam positions self.beam_id = beamnum if beamnum == 7: b = 6 else: b = beamnum self.orig_start_az = w0.header['alfa_az'][b] if w0.header['start_az'] > 360.0 and self.orig_start_az < 360.0: self.orig_start_az += 360.0 self.orig_start_za = w0.header['alfa_za'][b] self.orig_ra_deg = w0.header['alfa_raj'][b] * 15.0 self.orig_dec_deg = w0.header['alfa_decj'][b] self.orig_right_ascension = float(protractor.convert(self.orig_ra_deg, \ 'deg', 'hmsstr')[0].replace(':', '')) self.orig_declination = float(protractor.convert(self.orig_dec_deg, \ 'deg', 'dmsstr')[0].replace(':', '')) l, b = sextant.equatorial_to_galactic(self.orig_ra_deg, self.orig_dec_deg, \ 'deg', 'deg', J2000=True) self.orig_galactic_longitude = float(l) self.orig_galactic_latitude = float(b) self.get_correct_positions()