def DATEOBS_to_MJD(dateobs): """Convert DATE-OBS string from PSRFITS primary HDU to a MJD. Returns a 2-tuple: (integer part of MJD, fractional part of MJD) """ # Parse string using regular expression defined at top of file m = date_obs_re.match(dateobs) mjd_fracday = (float(m.group("hour")) + (float(m.group("min")) + (float(m.group("sec")) / 60.0)) / 60.0) / 24.0 mjd_day = calendar.date_to_MJD(float(m.group("year")), float(m.group("month")), float(m.group("day"))) return mjd_day, mjd_fracday
def DATEOBS_to_MJD(dateobs): """Convert DATE-OBS string from PSRFITS primary HDU to a MJD. Returns a 2-tuple: (integer part of MJD, fractional part of MJD) """ # Parse string using regular expression defined at top of file m = date_obs_re.match(dateobs) mjd_fracday = (float(m.group("hour")) + (float(m.group("min")) + \ (float(m.group("sec")) / 60.0)) / 60.0) / 24.0 mjd_day = calendar.date_to_MJD(float(m.group("year")), \ float(m.group("month")), float(m.group("day"))) return mjd_day, mjd_fracday
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()