def date2dict_times(date): day = Time(date, format='iso') longitude = '78d57m53s' latitude = '32d46m44s' elevation = 4500 * u.m location = EarthLocation.from_geodetic(longitude, latitude, elevation) iaohanle = Observer(location=location, name="IAO", timezone='Asia/Kolkata', description="GROWTH-India 70cm telescope") sunset_iao = iaohanle.sun_set_time(day, which='next') sunrise_iao = iaohanle.sun_rise_time(day, which='next') twelve_twil_eve_iao = iaohanle.twilight_evening_nautical(day, which='next') eighteen_twil_eve_iao = iaohanle.twilight_evening_astronomical( day, which='next') twelve_twil_morn_iao = iaohanle.twilight_morning_nautical(day, which='next') eighteen_twil_morn_iao = iaohanle.twilight_morning_astronomical( day, which='next') dict_times = OrderedDict() dict_times['Sunset '] = time2utc_ist(sunset_iao) dict_times['Sunrise '] = time2utc_ist(sunrise_iao) dict_times['Twelve degree Evening Twilight '] = time2utc_ist( twelve_twil_eve_iao) dict_times['Eighteen degree Evening Twilight '] = time2utc_ist( eighteen_twil_eve_iao) dict_times['Twelve degree Morning Twilight '] = time2utc_ist( twelve_twil_morn_iao) dict_times['Eighteen degree Morning Twilight '] = time2utc_ist( eighteen_twil_morn_iao) return dict_times
def astronomical_twilight(self, date_obs, site_longitude=30.335555, site_latitude=36.824166, site_elevation=2500, site_name="tug", time_zone="Europe/Istanbul", which="next"): """ It calculates astronomical twilight. @param date_obs @type date_obs: date @param site_longitude: Site longitude. @type site_longitude: float @param site_latitude: Site latitude. @type site_latitude: float @param site_elevation: Site elevation. @type site_elevation: float @param site_name: Station name: T60|T100|RTT150. @type site_name: string @param time_zone: Time zone. @type time_zone: int @param which: Which. @type which: string @return: tuple """ # TUG's location info settings tug = Observer(longitude=site_longitude*u.deg, latitude=site_latitude*u.deg, elevation=site_elevation*u.m, name=site_name, timezone=time_zone) # convert date astropy date format astropy_time = Time(date_obs) # evening tw calculate et = tug.twilight_evening_astronomical(astropy_time, which=which) # morning tw calculate mt = tug.twilight_morning_astronomical(astropy_time, which=which) # localized time conversion return(tug.astropy_time_to_datetime(mt), tug.astropy_time_to_datetime(et))
def astronomical_twilight(self, date_obs, site_longitude=30.335555, site_latitude=36.824166, site_elevation=2500, site_name="tug", time_zone="Europe/Istanbul", which="next"): """ It calculates astronomical twilight. @param date_obs @type date_obs: date @param site_longitude: Site longitude. @type site_longitude: float @param site_latitude: Site latitude. @type site_latitude: float @param site_elevation: Site elevation. @type site_elevation: float @param site_name: Station name: T60|T100|RTT150. @type site_name: string @param time_zone: Time zone. @type time_zone: int @param which: Which. @type which: string @return: tuple """ # TUG's location info settings tug = Observer(longitude=site_longitude * u.deg, latitude=site_latitude * u.deg, elevation=site_elevation * u.m, name=site_name, timezone=time_zone) # convert date astropy date format astropy_time = Time(date_obs) # evening tw calculate et = tug.twilight_evening_astronomical(astropy_time, which=which) # morning tw calculate mt = tug.twilight_morning_astronomical(astropy_time, which=which) # localized time conversion return (tug.astropy_time_to_datetime(mt), tug.astropy_time_to_datetime(et))
def get_twilights(start, end): """ Determine sunrise and sunset times """ location = EarthLocation( lat=+19.53602, lon=-155.57608, height=3400, ) obs = Observer(location=location, name='VYSOS', timezone='US/Hawaii') sunset = obs.sun_set_time(Time(start), which='next').datetime sunrise = obs.sun_rise_time(Time(start), which='next').datetime # Calculate and order twilights and set plotting alpha for each twilights = [ (start, 'start', 0.0), (sunset, 'sunset', 0.0), (obs.twilight_evening_civil(Time(start), which='next').datetime, 'ec', 0.1), (obs.twilight_evening_nautical(Time(start), which='next').datetime, 'en', 0.2), (obs.twilight_evening_astronomical(Time(start), which='next').datetime, 'ea', 0.3), (obs.twilight_morning_astronomical(Time(start), which='next').datetime, 'ma', 0.5), (obs.twilight_morning_nautical(Time(start), which='next').datetime, 'mn', 0.3), (obs.twilight_morning_civil(Time(start), which='next').datetime, 'mc', 0.2), (sunrise, 'sunrise', 0.1), ] twilights.sort(key=lambda x: x[0]) final = { 'sunset': 0.1, 'ec': 0.2, 'en': 0.3, 'ea': 0.5, 'ma': 0.3, 'mn': 0.2, 'mc': 0.1, 'sunrise': 0.0 } twilights.append((end, 'end', final[twilights[-1][1]])) return twilights
def get_twilights(self, config=None): """ Determine sunrise and sunset times """ print(' Determining sunrise, sunset, and twilight times') if config is None: from pocs.utils.config import load_config as pocs_config config = pocs_config()['location'] location = EarthLocation( lat=config['latitude'], lon=config['longitude'], height=config['elevation'], ) obs = Observer(location=location, name='PANOPTES', timezone=config['timezone']) sunset = obs.sun_set_time(Time(self.start), which='next').datetime sunrise = obs.sun_rise_time(Time(self.start), which='next').datetime # Calculate and order twilights and set plotting alpha for each twilights = [(self.start, 'start', 0.0), (sunset, 'sunset', 0.0), (obs.twilight_evening_civil(Time(self.start), which='next').datetime, 'ec', 0.1), (obs.twilight_evening_nautical(Time(self.start), which='next').datetime, 'en', 0.2), (obs.twilight_evening_astronomical(Time(self.start), which='next').datetime, 'ea', 0.3), (obs.twilight_morning_astronomical(Time(self.start), which='next').datetime, 'ma', 0.5), (obs.twilight_morning_nautical(Time(self.start), which='next').datetime, 'mn', 0.3), (obs.twilight_morning_civil(Time(self.start), which='next').datetime, 'mc', 0.2), (sunrise, 'sunrise', 0.1), ] twilights.sort(key=lambda x: x[0]) final = {'sunset': 0.1, 'ec': 0.2, 'en': 0.3, 'ea': 0.5, 'ma': 0.3, 'mn': 0.2, 'mc': 0.1, 'sunrise': 0.0} twilights.append((self.end, 'end', final[twilights[-1][1]])) return twilights
def get_twilights(start, end, webcfg, nsample=256): """ Determine sunrise and sunset times """ location = c.EarthLocation( lat=webcfg['site'].getfloat('site_lat'), lon=webcfg['site'].getfloat('site_lon'), height=webcfg['site'].getfloat('site_elevation'), ) obs = Observer(location=location, name=webcfg['site'].get('name', '')) sunset = obs.sun_set_time(Time(start), which='next').datetime sunrise = obs.sun_rise_time(Time(start), which='next').datetime # Calculate and order twilights and set plotting alpha for each twilights = [ (start, 'start', 0.0), (sunset, 'sunset', 0.0), (obs.twilight_evening_civil(Time(start), which='next').datetime, 'ec', 0.1), (obs.twilight_evening_nautical(Time(start), which='next').datetime, 'en', 0.2), (obs.twilight_evening_astronomical(Time(start), which='next').datetime, 'ea', 0.3), (obs.twilight_morning_astronomical(Time(start), which='next').datetime, 'ma', 0.5), (obs.twilight_morning_nautical(Time(start), which='next').datetime, 'mn', 0.3), (obs.twilight_morning_civil(Time(start), which='next').datetime, 'mc', 0.2), (sunrise, 'sunrise', 0.1), ] twilights.sort(key=lambda x: x[0]) final = { 'sunset': 0.1, 'ec': 0.2, 'en': 0.3, 'ea': 0.5, 'ma': 0.3, 'mn': 0.2, 'mc': 0.1, 'sunrise': 0.0 } twilights.append((end, 'end', final[twilights[-1][1]])) return twilights
def calculate_twilights(date): """ Determine sunrise and sunset times """ from astropy import units as u from astropy.time import Time from astropy.coordinates import EarthLocation from astroplan import Observer h = 4.2 * u.km R = (1.0 * u.earthRad).to(u.km) d = np.sqrt(h * (2 * R + h)) phi = (np.arccos((d / R).value) * u.radian).to(u.deg) MK = phi - 90 * u.deg location = EarthLocation( lat=19 + 49 / 60 + 33.40757 / 60**2, lon=-(155 + 28 / 60 + 28.98665 / 60**2), height=4159.58, ) obs = Observer(location=location, name='Keck', timezone='US/Hawaii') date = Time(dt.strptime(f'{date} 18:00:00', '%Y-%m-%d %H:%M:%S')) t = {} sunset = obs.sun_set_time(date, which='nearest', horizon=MK).datetime t['seto'] = sunset t['ento'] = obs.twilight_evening_nautical(Time(sunset), which='next').datetime t['eato'] = obs.twilight_evening_astronomical(Time(sunset), which='next').datetime t['mato'] = obs.twilight_morning_astronomical(Time(sunset), which='next').datetime t['mnto'] = obs.twilight_morning_nautical(Time(sunset), which='next').datetime t['riseo'] = obs.sun_rise_time(Time(sunset), which='next').datetime t['set'] = t['seto'].strftime('%H:%M UT') t['ent'] = t['ento'].strftime('%H:%M UT') t['eat'] = t['eato'].strftime('%H:%M UT') t['mat'] = t['mato'].strftime('%H:%M UT') t['mnt'] = t['mnto'].strftime('%H:%M UT') t['rise'] = t['riseo'].strftime('%H:%M UT') return t
def calculate_twilights(date): """ Determine sunrise and sunset times """ from astropy import units as u from astropy.time import Time from astropy.coordinates import EarthLocation from astroplan import Observer h = 4.2*u.km R = (1.0*u.earthRad).to(u.km) d = np.sqrt(h*(2*R+h)) phi = (np.arccos((d/R).value)*u.radian).to(u.deg) MK = phi - 90*u.deg location = EarthLocation( lat=19+49/60+33.40757/60**2, lon=-(155+28/60+28.98665/60**2), height=4159.58, ) obs = Observer(location=location, name='Keck', timezone='US/Hawaii') date = Time(dt.strptime(f'{date} 18:00:00', '%Y-%m-%d %H:%M:%S')) t = {} sunset = obs.sun_set_time(date, which='nearest', horizon=MK).datetime t['seto'] = sunset t['ento'] = obs.twilight_evening_nautical(Time(sunset), which='next').datetime t['eato'] = obs.twilight_evening_astronomical(Time(sunset), which='next').datetime t['mato'] = obs.twilight_morning_astronomical(Time(sunset), which='next').datetime t['mnto'] = obs.twilight_morning_nautical(Time(sunset), which='next').datetime t['riseo'] = obs.sun_rise_time(Time(sunset), which='next').datetime t['set'] = t['seto'].strftime('%H:%M UT') t['ent'] = t['ento'].strftime('%H:%M UT') t['eat'] = t['eato'].strftime('%H:%M UT') t['mat'] = t['mato'].strftime('%H:%M UT') t['mnt'] = t['mnto'].strftime('%H:%M UT') t['rise'] = t['riseo'].strftime('%H:%M UT') return t
def observe(request, method="POST"): if request.POST['observing_date'] == "": messages.error(request, 'Please choose a date!') if request.POST['name'] == "": messages.error(request, 'Object name cannot be empty!') if request.POST['ra'] == "": messages.error(request, 'Object RA cannot be empty!') if request.POST['dec'] == "": messages.error(request, 'Object Dec cannot be empty!') if request.POST['observing_date'] == "" or request.POST[ 'name'] == "" or request.POST['ra'] == "" or request.POST[ 'dec'] == "": return redirect('/') observatory = None offset = None for idx, val in enumerate(T['name']): if val == request.POST['observatory']: observatory = Observer(longitude=T['longitude'][idx] * u.deg, latitude=T['latitude'][idx] * u.deg, elevation=T['altitude'][idx] * u.m, name=T['name'][idx]) today = datetime.now() if tf.certain_timezone_at(lat=T['latitude'][idx], lng=T['longitude'][idx]) == None: return redirect('/error') tz_target = timezone( tf.certain_timezone_at(lat=T['latitude'][idx], lng=T['longitude'][idx])) # ATTENTION: tf.certain_timezone_at(...) could be None! handle error case today_target = tz_target.localize(today) today_utc = utc.localize(today) offset = (today_utc - today_target).total_seconds() * u.s # # offset = offsetfunction(observatory) observe_date = Time(request.POST['observing_date'] + ' 00:00:00', format='iso') sunset_here = observatory.sun_set_time(observe_date, which="nearest") + offset sunrise_here = observatory.sun_rise_time(observe_date, which="next") + offset midnight_here = observatory.midnight(observe_date, which="nearest") + offset astro_set = observatory.twilight_evening_astronomical(observe_date, which='nearest') astro_rise = observatory.twilight_morning_astronomical(observe_date, which='next') coords = SkyCoord(request.POST['ra'], request.POST['dec'], frame='icrs') target = FixedTarget(name=request.POST['name'], coord=coords) start_time = astro_set end_time = astro_rise delta_t = end_time - start_time observe_time = start_time + delta_t * np.linspace(0.0, 2.0, 100) plt.ioff() sky = plot_sky(target, observatory, observe_time) sky.figure.savefig('apps/project_app/static/project_app/plot_sky.png') plt.close() plt.ioff() airmass = plot_airmass(target, observatory, observe_time) airmass.figure.savefig( 'apps/project_app/static/project_app/plot_airmass.png') plt.close() plt.ioff() finder_image = plot_finder_image(target) finder_image[0].figure.savefig( 'apps/project_app/static/project_app/plot_finder_image.png') plt.close() request.session['context'] = { "sunset": Time(sunset_here, format="iso").value, "sunrise": Time(sunrise_here, format="iso").value, "date": Time(observe_date, format="iso").value, "midnight": Time(midnight_here, format="iso").value, "site": request.POST['observatory'], "ra": request.POST['ra'], "dec": request.POST['dec'], "name": request.POST['name'] } return redirect('/display')
def main(args=None): p = parser() opts = p.parse_args(args) # Late imports import operator import sys from astroplan import Observer from astroplan.plots import plot_airmass from astropy.coordinates import EarthLocation, SkyCoord from astropy.table import Table from astropy.time import Time from astropy import units as u from matplotlib import dates from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize from matplotlib.patches import Patch from matplotlib import pyplot as plt from tqdm import tqdm import pytz from ..io import fits from .. import moc from .. import plot # noqa from ..extern.quantile import percentile if opts.site is None: if opts.site_longitude is None or opts.site_latitude is None: p.error('must specify either --site or both ' '--site-longitude and --site-latitude') location = EarthLocation(lon=opts.site_longitude * u.deg, lat=opts.site_latitude * u.deg, height=(opts.site_height or 0) * u.m) if opts.site_timezone is not None: location.info.meta = {'timezone': opts.site_timezone} observer = Observer(location) else: if not ((opts.site_longitude is None) and (opts.site_latitude is None) and (opts.site_height is None) and (opts.site_timezone is None)): p.error('argument --site not allowed with arguments ' '--site-longitude, --site-latitude, ' '--site-height, or --site-timezone') observer = Observer.at_site(opts.site) m = fits.read_sky_map(opts.input.name, moc=True) # Make an empty airmass chart. t0 = Time(opts.time) if opts.time is not None else Time.now() t0 = observer.midnight(t0) ax = plot_airmass([], observer, t0, altitude_yaxis=True) # Remove the fake source and determine times that were used for the plot. del ax.lines[:] times = Time(np.linspace(*ax.get_xlim()), format='plot_date') theta, phi = moc.uniq2ang(m['UNIQ']) coords = SkyCoord(phi, 0.5 * np.pi - theta, unit='rad') prob = moc.uniq2pixarea(m['UNIQ']) * m['PROBDENSITY'] levels = np.arange(90, 0, -10) nlevels = len(levels) percentiles = np.concatenate((50 - 0.5 * levels, 50 + 0.5 * levels)) airmass = np.column_stack([ percentile(condition_secz(coords.transform_to(observer.altaz(t)).secz), percentiles, weights=prob) for t in tqdm(times) ]) cmap = ScalarMappable(Normalize(0, 100), plt.get_cmap()) for level, lo, hi in zip(levels, airmass[:nlevels], airmass[nlevels:]): ax.fill_between( times.plot_date, clip_verylarge(lo), # Clip infinities to large but finite values clip_verylarge(hi), # because fill_between cannot handle inf color=cmap.to_rgba(level), zorder=2) ax.legend([Patch(facecolor=cmap.to_rgba(level)) for level in levels], ['{}%'.format(level) for level in levels]) # ax.set_title('{} from {}'.format(m.meta['objid'], observer.name)) # Adapted from astroplan start = times[0] twilights = [ (times[0].datetime, 0.0), (observer.sun_set_time(Time(start), which='next').datetime, 0.0), (observer.twilight_evening_civil(Time(start), which='next').datetime, 0.1), (observer.twilight_evening_nautical(Time(start), which='next').datetime, 0.2), (observer.twilight_evening_astronomical(Time(start), which='next').datetime, 0.3), (observer.twilight_morning_astronomical(Time(start), which='next').datetime, 0.4), (observer.twilight_morning_nautical(Time(start), which='next').datetime, 0.3), (observer.twilight_morning_civil(Time(start), which='next').datetime, 0.2), (observer.sun_rise_time(Time(start), which='next').datetime, 0.1), (times[-1].datetime, 0.0), ] twilights.sort(key=operator.itemgetter(0)) for i, twi in enumerate(twilights[1:], 1): if twi[1] != 0: ax.axvspan(twilights[i - 1][0], twilights[i][0], ymin=0, ymax=1, color='grey', alpha=twi[1], linewidth=0) if twi[1] != 0.4: ax.axvspan(twilights[i - 1][0], twilights[i][0], ymin=0, ymax=1, color='white', alpha=0.8 - 2 * twi[1], zorder=3, linewidth=0) # Add local time axis timezone = (observer.location.info.meta or {}).get('timezone') if timezone: tzinfo = pytz.timezone(timezone) ax2 = ax.twiny() ax2.set_xlim(ax.get_xlim()) ax2.set_xticks(ax.get_xticks()) ax2.xaxis.set_major_formatter(dates.DateFormatter('%H:%M', tz=tzinfo)) plt.setp(ax2.get_xticklabels(), rotation=-30, ha='right') ax2.set_xlabel("Time from {} [{}]".format( min(times).to_datetime(tzinfo).date(), timezone)) if opts.verbose: # Write airmass table to stdout. times.format = 'isot' table = Table(masked=True) table['time'] = times table['sun_alt'] = np.ma.masked_greater_equal( observer.sun_altaz(times).alt, 0) table['sun_alt'].format = lambda x: '{}'.format(int(np.round(x))) for p, data in sorted(zip(percentiles, airmass)): table[str(p)] = np.ma.masked_invalid(data) table[str(p)].format = lambda x: '{:.01f}'.format(np.around(x, 1)) table.write(sys.stdout, format='ascii.fixed_width') # Show or save output. opts.output()
sunsets = np.unique(np.round(sunsets.mjd, decimals=4)) names = [ 'night', 'sunset', 'sun_n12_setting', 'sun_n18_setting', 'sun_n18_rising', 'sun_n12_rising', 'sunrise', 'moonrise', 'moonset' ] types = [int] types.extend([float] * (len(names) - 1)) almanac = np.zeros(sunsets.size, dtype=list(zip(names, types))) almanac['sunset'] = sunsets times = Time(sunsets, format='mjd') print('evening twilight 1') almanac['sun_n12_setting'] = observer.twilight_evening_nautical(times).mjd almanac['sun_n18_setting'] = observer.twilight_evening_astronomical( times).mjd almanac['sun_n18_rising'] = observer.twilight_morning_astronomical( times).mjd almanac['sun_n12_rising'] = observer.twilight_morning_nautical(times).mjd almanac['sunrise'] = observer.sun_rise_time(times).mjd almanac['moonset'] = observer.moon_set_time(times).mjd print('moonrise') almanac['moonrise'] = observer.moon_rise_time(times).mjd results.append(almanac) almanac = np.concatenate(results) umjds, indx = np.unique(almanac['sunset'], return_index=True) almanac = almanac[indx] almanac['night'] = np.arange(almanac['night'].size) np.savez('sunsets.npz', almanac=almanac)
def eop(self): IERS_A_in_cache() # astroplan.get_IERS_A_or_workaround() iers.conf.auto_download = False iers.conf.auto_max_age = None now = Time.now() longitude = '78d57m53s' latitude = '32d46m44s' elevation = 4500 * u.m location = EarthLocation.from_geodetic(longitude, latitude, elevation) iaohanle = Observer(location=location, timezone='Asia/Kolkata', name="IAO", description="IAO Hanle telescopes") iaohanle # Calculating the sunset, midnight and sunrise times for our observatory sunset_iao = iaohanle.sun_set_time(now, which='nearest') eve_twil_iao = iaohanle.twilight_evening_astronomical(now, which='nearest') midnight_iao = iaohanle.midnight(now, which='next') morn_twil_iao = iaohanle.twilight_morning_astronomical(now, which='next') sunrise_iao = iaohanle.sun_rise_time(now, which='next') moon_rise = iaohanle.moon_rise_time(eve_twil_iao, which='nearest') moon_set = iaohanle.moon_set_time(now, which='nearest') # moon_alt = iaohanle.moon_altaz(now).alt # moon_az = iaohanle.moon_altaz(now).az #lst_now = iaohanle.local_sidereal_time(now) #lst_mid = iaohanle.local_sidereal_time(midnight_iao) #print("LST at IAO now is {0:.2f}".format(lst_now)) #print("LST at IAO at local midnight will be {0:.2f}".format(lst_mid)) Automation.moon_strength = moon_illumination(midnight_iao) observing_time = (morn_twil_iao - eve_twil_iao).to(u.h) #print("Total Night hours at IAO tonight {0:.1f} ".format(observing_time)) img = Image.new('RGB', (850, 320), color=(0, 0, 0)) fnt = ImageFont.truetype( '/var/lib/defoma/gs.d/dirs/fonts/DejaVuSerif.ttf', 15) d = ImageDraw.Draw(img) d.text((10, 11), "IAO Hanle Coordinates: " + str(iaohanle), font=fnt, fill=(255, 255, 255)) d.text((10, 71), "Moon Illumination Strength : " + str(moon_illumination(midnight_iao)), font=fnt, fill=(255, 255, 255)) d.text((10, 101), "Sunset : " + Time(sunset_iao, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 131), "Astronomical evening twilight : " + Time(eve_twil_iao, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 161), "Astronomical morning twilight : " + Time(morn_twil_iao, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 191), "Sunrise : " + Time(sunrise_iao, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 221), "Moon Rise : " + Time(moon_rise, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 251), "Moon Set : " + Time(moon_set, out_subfmt='date_hms').iso + " UTC", font=fnt, fill=(255, 255, 255)) d.text((10, 281), "Total Astronomical hours tonight : " + str(observing_time), font=fnt, fill=(255, 255, 255)) img.save('tonight.png') img.close() t_start = eve_twil_iao t_end = morn_twil_iao # We can turn solar system objects into 'pseudo-fixed' targets to plan observations mercury_midnight = FixedTarget(name='Mercury', coord=get_body('mercury', midnight_iao)) mercury_midnight.coord venus_midnight = FixedTarget(name='Venus', coord=get_body('venus', midnight_iao)) venus_midnight.coord uranus_midnight = FixedTarget(name='Uranus', coord=get_body('uranus', midnight_iao)) uranus_midnight.coord neptune_midnight = FixedTarget(name='Neptune', coord=get_body('neptune', midnight_iao)) neptune_midnight.coord saturn_midnight = FixedTarget(name='Saturn', coord=get_body('saturn', midnight_iao)) saturn_midnight.coord jupiter_midnight = FixedTarget(name='Jupiter', coord=get_body('jupiter', midnight_iao)) jupiter_midnight.coord mars_midnight = FixedTarget(name='Mars', coord=get_body('mars', midnight_iao)) mars_midnight.coord targets = [ mercury_midnight, venus_midnight, mars_midnight, jupiter_midnight, saturn_midnight, uranus_midnight, neptune_midnight ] targets #for target in targets: #print(iaohanle.target_rise_time(now, target, which='next', horizon=10 * u.deg).iso) # iaohanle.altaz(now, targets[0]) # print(iaohanle.target_rise_time(now, target, which='next', horizon=10 * u.deg).iso) # iaohanle.altaz(now, targets[0]) times = (t_start - 0.5 * u.h) + (t_end - t_start + 1 * u.h) * np.linspace(0.0, 1.0, 20) for target in targets: plot_sky(target, iaohanle, times) plt.legend(loc=[1.0, 0]) plt.xlabel('Planets motion tonight') # plt.ylim(4,0.5) # plt.legend() plt.savefig('planets_motion.png') plt.close() # plt.legend(loc=[1.1,0]) coords1 = SkyCoord( '15h58m3s', '-18d10m0.0s', frame='icrs') # coordinates of Andromeda Galaxy (M32) tt1 = FixedTarget(name='Moon', coord=coords1) tt1.coord t_observe = t_start + (t_end - t_start) * np.linspace(0.0, 1.0, 20) plot_sky(tt1, iaohanle, t_observe) plt.xlabel('Moon motion tonight') plt.savefig('moon_motion.png') plt.close() if (eve_twil_iao <= now): Automation.eve_twilight_flag = 1 Automation.mor_twilight_flag = 0 Automation.moon_setting_flag = 0 elif (morn_twil_iao <= now): Automation.eve_twilight_flag = 0 Automation.mor_twilight_flag = 1 Automation.moon_setting_flag = 0 elif (Automation.moon_strength > 0.30): if (moon_rise <= now): Automation.eve_twilight_flag = 0 Automation.mor_twilight_flag = 0 Automation.moon_setting_flag = 1 elif (moon_set <= now): Automation.eve_twilight_flag = 1 Automation.mor_twilight_flag = 0 Automation.moon_setting_flag = 0
name="Lulin", description="Lulin 1.0-m telescope") # define functions def getyearDate(year): months = range(1, 13) date_list = [] for month in months: for day in range(monthrange(year, month)[1] + 1)[1:]: str1 = '{}-{:02d}-{:02d}'.format(year, month, day) date_list.append(str1) return date_list theyear = int(input('input year\n')) days = getyearDate(theyear) txtwrite = [] for day in days: t = Time(day) + 15 * u.h eve_twil = lulin.twilight_evening_astronomical(t, which='previous') morn_twil = lulin.twilight_morning_astronomical(t, which='next') eve_twil.format = 'unix' morn_twil.format = 'unix' print('{}\n'.format(day)) txtwrite.append('{} {} {}\n'.format(day, eve_twil.value, morn_twil.value)) with open('twil_time.txt', 'w') as f: list(map(f.write, txtwrite))
def plan_when_transits_will_occur( filename='targets.txt', observatory='Southern African Large Telescope', start='2017-06-22', end='2017-06-28', airmass_limit=2.5, moon_distance=10, do_secondary=True, method='by_night'): ''' Plan when targets will be visibile and transiting from a site. Inputs ------ filename : str A plain text file with the following columns: target : The name of the target (e.g. J0555-57). RA : The right ascension of the target (e.g. 05h55m32.62s). DEC : The declination of the target (e.g. -57d17m26.1s). epoch* : The epoch of the transit. Youc can either use: epoch_HJD-2400000 : HJD - 24500000 epoch_BJD-2455000 : MJD Period : The period of the system (days). Secondary : can be True or False depending on whether you want to see when the secondary transits will be. observatory : str The observatory you are observing from. See later for list of available observatories (accepted by astropy). start : str The first night of observation (e.g. 2017-08-31). end : str The last night of observation (e.g. 2017-09-10). airmass_limit : float The maximum airmass you want to observe through. moon_distance : float The closest the target can be t the moon in arcmins. do_secondary = True: Look for secondary eclipses assuming circularised orbits. Available observator names are: 'ALMA', 'Anglo-Australian Observatory', 'Apache Point', 'Apache Point Observatory', 'Atacama Large Millimeter Array', 'BAO', 'Beijing XingLong Observatory', 'Black Moshannon Observatory', 'CHARA', 'Canada-France-Hawaii Telescope', 'Catalina Observatory', 'Cerro Pachon', 'Cerro Paranal', 'Cerro Tololo', 'Cerro Tololo Interamerican Observatory', 'DCT', 'Discovery Channel Telescope', 'Dominion Astrophysical Observatory', 'Gemini South', 'Hale Telescope', 'Haleakala Observatories', 'Happy Jack', 'Jansky Very Large Array', 'Keck Observatory', 'Kitt Peak', 'Kitt Peak National Observatory', 'La Silla Observatory', 'Large Binocular Telescope', 'Las Campanas Observatory', 'Lick Observatory', 'Lowell Observatory', 'Manastash Ridge Observatory', 'McDonald Observatory', 'Medicina', 'Medicina Dish', 'Michigan-Dartmouth-MIT Observatory', 'Mount Graham International Observatory', 'Mt Graham', 'Mt. Ekar 182 cm. Telescope', 'Mt. Stromlo Observatory', 'Multiple Mirror Telescope', 'NOV', 'National Observatory of Venezuela', 'Noto', 'Observatorio Astronomico Nacional, San Pedro Martir', 'Observatorio Astronomico Nacional, Tonantzintla', 'Palomar', 'Paranal Observatory', 'Roque de los Muchachos', 'SAAO', 'SALT', 'SRT', 'Siding Spring Observatory', 'Southern African Large Telescope', 'Subaru', 'Subaru Telescope', 'Sutherland', 'Vainu Bappu Observatory', 'Very Large Array', 'W. M. Keck Observatory', 'Whipple', 'Whipple Observatory', 'aao', 'alma', 'apo', 'bmo', 'cfht', 'ctio', 'dao', 'dct', 'ekar', 'example_site', 'flwo', 'gemini_north', 'gemini_south', 'gemn', 'gems', 'greenwich', 'haleakala', 'irtf', 'keck', 'kpno', 'lapalma', 'lasilla', 'lbt', 'lco', 'lick', 'lowell', 'mcdonald', 'mdm', 'medicina', 'mmt', 'mro', 'mso', 'mtbigelow', 'mwo', 'noto', 'ohp', 'paranal', 'salt', 'sirene', 'spm', 'srt', 'sso', 'tona', 'vbo', 'vla'. ''' ################### # Try reading table ################### try: target_table = Table.read(filename, format='ascii') except: raise ValueError( 'I cant open the target file (make sure its ascii with the following first line:\ntarget RA DEC epoch_HJD-2400000 Period Secondary' ) ############################## # try reading observation site ############################## try: observation_site = coord.EarthLocation.of_site(observatory) observation_handle = Observer(location=observation_site) observation_handle1 = Observer.at_site(observatory) except: print(coord.EarthLocation.get_site_names()) raise ValueError('The site is not understood') ################################### # Try reading start and end times ################################### try: start_time = Time(start + ' 12:01:00', location=observation_site) end_time = Time(end + ' 12:01:00', location=observation_site) number_of_nights = int(end_time.jd - start_time.jd) time_range = Time([start + ' 12:01:00', end + ' 12:01:00']) print('Number of nights: {}'.format(number_of_nights)) except: raise ValueError('Start and end times not understood') ##################### # Now do constraints ##################### #try: constraints = [ AltitudeConstraint(0 * u.deg, 90 * u.deg), AirmassConstraint(3), AtNightConstraint.twilight_civil() ] #except: # raise ValueError('Unable to get set constraints') if method == 'by_night': for i in range(number_of_nights): start_time_tmp = start_time + TimeDelta( i, format='jd') # get start time (doesent need to be accurate) end_time_tmp = start_time + TimeDelta( i + 1, format='jd') # get start time (doesent need to be accurate) print('#' * 80) start_time_tmpss = start_time_tmp.datetime.ctime().split( ) # ['Fri', 'Dec', '24', '12:00:00', '2010'] print('Night {} - {} {} {} {}'.format(i + 1, start_time_tmpss[0], start_time_tmpss[2], start_time_tmpss[1], start_time_tmpss[-1])) print('#' * 80) # Now print Almnac information (sunset and end of evening twilight print('Almnac:') sun_set = observation_handle.sun_set_time(start_time_tmp, which='next') print('Sunset:\t\t\t\t\t\t\t' + sun_set.utc.datetime.ctime()) twilight_evening_astronomical = observation_handle.twilight_evening_astronomical( start_time_tmp, which='next') # -18 twilight_evening_nautical = observation_handle.twilight_evening_nautical( start_time_tmp, which='next') # -12 twilight_evening_civil = observation_handle.twilight_evening_civil( start_time_tmp, which='next') # -6 deg print('Civil evening twilight (-6 deg) (U.T.C):\t\t' + twilight_evening_civil.utc.datetime.ctime()) print('Nautical evening twilight (-12 deg) (U.T.C):\t\t' + twilight_evening_nautical.utc.datetime.ctime()) print('Astronomical evening twilight (-18 deg) (U.T.C):\t' + twilight_evening_astronomical.utc.datetime.ctime()) print('\n') twilight_morning_astronomical = observation_handle.twilight_morning_astronomical( start_time_tmp, which='next') # -18 twilight_morning_nautical = observation_handle.twilight_morning_nautical( start_time_tmp, which='next') # -12 twilight_morning_civil = observation_handle.twilight_morning_civil( start_time_tmp, which='next') # -6 deg print('Astronomical morning twilight (-18 deg) (U.T.C):\t' + twilight_morning_astronomical.utc.datetime.ctime()) print('Nautical morning twilight (-12 deg) (U.T.C):\t\t' + twilight_morning_nautical.utc.datetime.ctime()) print('Civil morning twilight (-6 deg) (U.T.C):\t\t' + twilight_morning_civil.utc.datetime.ctime()) sun_rise = observation_handle.sun_rise_time(start_time_tmp, which='next') print('Sunrise:\t\t\t\t\t\t' + sun_rise.utc.datetime.ctime()) print('\n') # stuff for creating plot plot_mids = [] plot_names = [] plot_widths = [] for j in range(len(target_table)): # Extract information star_coordinates = coord.SkyCoord('{} {}'.format( target_table['RA'][j], target_table['DEC'][j]), unit=(u.hourangle, u.deg), frame='icrs') star_fixed_coord = FixedTarget(coord=star_coordinates, name=target_table['target'][j]) #################### # Get finder image #################### ''' plt.close() try: finder_image = plot_finder_image(star_fixed_coord,reticle=True,fov_radius=10*u.arcmin) except: pass plt.savefig(target_table['target'][j]+'_finder_chart.eps') ''' P = target_table['Period'][j] Secondary_transit = target_table['Secondary'][j] transit_half_width = TimeDelta( target_table['width'][j] * 60 * 60 / 2, format='sec') # in seconds for a TimeDelta # now convert T0 to HJD -> JD -> BJD so we can cout period if 'epoch_HJD-2400000' in target_table.colnames: #print('Using HJD-2400000') T0 = target_table['epoch_HJD-2400000'][j] T0 = Time(T0 + 2400000, format='jd') # HJD given by WASP ltt_helio = T0.light_travel_time(star_coordinates, 'heliocentric', location=observation_site) T0 = T0 - ltt_helio # HJD -> JD ltt_bary = T0.light_travel_time(star_coordinates, 'barycentric', location=observation_site) T0 = T0 + ltt_bary # JD -> BJD elif 'epoch_BJD-2455000' in target_table.colnames: #print('Using BJD-2455000') T0 = target_table['epoch_BJD-2455000'][j] + 2455000 T0 = Time(T0, format='jd') # BJD else: print('\n\n\n\n FAILE\n\n\n\n') continue ########################################################## # Now start from T0 and count in periods to find transits ########################################################## # convert star and end time to BJD ltt_bary_start_time = start_time_tmp.light_travel_time( star_coordinates, 'barycentric', location=observation_site) # + TimeDelta(i,format='jd') start_time_bary = start_time_tmp + ltt_bary_start_time # + TimeDelta(i,format='jd') # convert start time to BJD ltt_bary_end_time_tmp = end_time_tmp.light_travel_time( star_coordinates, 'barycentric', location=observation_site) # + TimeDelta(i,format='jd') end_time_bary = end_time_tmp + ltt_bary_start_time #+ TimeDelta(i+1,format='jd') # convert end time to BJD and add 1 day 12pm -> 12pm the next day elapsed = end_time_bary - start_time_bary # now this is 24 hours from the start day 12:00 pm # now count transits time = Time(T0.jd, format='jd') # make a temporary copy transits = [] primary_count, secondary_count = 0, 0 while time.jd < end_time_bary.jd: if (time.jd > start_time_bary.jd) and (time.jd < end_time_bary.jd): if is_observable(constraints, observation_handle, [star_fixed_coord], times=[time])[0] == True: transits.append(time) primary_count += 1 if Secondary_transit == 'yes': timesecondary = time + TimeDelta(P / 2, format='jd') if (timesecondary.jd > start_time_bary.jd) and ( timesecondary.jd < end_time_bary.jd): if is_observable(constraints, observation_handle, [star_fixed_coord], times=[timesecondary])[0] == True: transits.append(timesecondary) secondary_count += 1 time = time + TimeDelta(P, format='jd') # add another P to T0 # Now find visible transits transits = [ i for i in transits if is_observable(constraints, observation_handle, [star_fixed_coord], times=[i])[0] == True ] if len(transits) == 0: message = '{} has no transits.'.format( target_table['target'][j]) print('-' * len(message)) print(message) print('-' * len(message)) print('\n') plt.close() continue else: message = '{} has {} primary transits and {} secondary transits.'.format( target_table['target'][j], primary_count, secondary_count) print('-' * len(message)) print(message) print('RA: {}'.format(target_table['RA'][j])) print('DEC: {}'.format(target_table['DEC'][j])) print('Epoch: 2000') print('T0 (BJD): {}'.format(T0.jd)) print('Period: {}'.format(P)) print('Transit width (hr): {}'.format( target_table['width'][j])) print('-' * len(message)) print('\n') for i in transits: # currently transit times are in BJD (need to convert to HJD to check ltt_helio = i.light_travel_time(star_coordinates, 'barycentric', location=observation_site) ii = i - ltt_helio ltt_helio = ii.light_travel_time(star_coordinates, 'heliocentric', location=observation_site) ii = ii + ltt_helio transit_1 = i - transit_half_width - TimeDelta( 7200, format='sec') # ingress - 2 hr transit_2 = i - transit_half_width - TimeDelta( 3600, format='sec') # ingress - 2 hr transit_3 = i - transit_half_width # ingress transit_4 = i + transit_half_width # egress transit_5 = i + transit_half_width + TimeDelta( 3600, format='sec') # ingress - 2 hr transit_6 = i + transit_half_width + TimeDelta( 7200, format='sec') # ingress - 2 hr if (((i.jd - time.jd) / P) - np.floor( (i.jd - time.jd) / P) < 0.1) or (( (i.jd - time.jd) / P) - np.floor( (i.jd - time.jd) / P) > 0.9): print('Primary Transit:') print('-' * len('Primary Transit')) if 0.4 < ((i.jd - time.jd) / P) - np.floor( (i.jd - time.jd) / P) < 0.6: print('Secondary Transit') print('-' * len('Secondary Transit')) ################## # now get sirmass ################## altaz = star_coordinates.transform_to( AltAz(obstime=transit_1, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_1, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Ingress - 2hr (U.T.C):\t\t\t\t\t' + transit_1.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=transit_2, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_2, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Ingress - 1hr (U.T.C):\t\t\t\t\t' + transit_2.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=transit_3, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_3, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Ingress (U.T.C):\t\t\t\t\t' + transit_3.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=i, location=observation_site)) hourangle = observation_handle1.target_hour_angle( i, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Mid transit (U.T.C):\t\t\t\t\t' + i.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=transit_4, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_4, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Egress (U.T.C):\t\t\t\t\t\t' + transit_4.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=transit_5, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_5, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Egress + 1hr (U.T.C):\t\t\t\t\t' + transit_5.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) altaz = star_coordinates.transform_to( AltAz(obstime=transit_6, location=observation_site)) hourangle = observation_handle1.target_hour_angle( transit_6, star_coordinates) hourangle = 24 * hourangle.degree / 360 if hourangle > 12: hourangle -= 24 print('Egress + 2hr (U.T.C):\t\t\t\t\t' + transit_6.utc.datetime.ctime() + '\tAirmass: {:.2f}\tHA:{:.2f}'.format( altaz.secz, hourangle)) print('HJD {} (to check with http://var2.astro.cz/)\n'. format(ii.jd)) # append stuff for plots plot_mids.append(i) # astropy Time plot_names.append(target_table['target'][j]) plot_widths.append(target_table['width'][j]) # Now plot plt.close() if len(plot_mids) == 0: continue date_formatter = dates.DateFormatter('%H:%M') #ax.xaxis.set_major_formatter(date_formatter) # now load dummy transit lightcurves xp, yp = np.load('lc.npy') xs, ys = np.load('lcs.npy') # x = np.linspace(0, 2*np.pi, 400) # y = np.sin(x**2) subplots_adjust(hspace=0.000) number_of_subplots = len( plot_names) # number of targets transiting that night time = sun_set + np.linspace(-1, 14, 100) * u.hour # take us to sunset for i, v in enumerate(xrange(number_of_subplots)): # exctract params width = plot_widths[v] name = plot_names[v] mid = plot_mids[v] # now set up dummy lc plot x_tmp = mid + xp * (width / 2) * u.hour # get right width in hours # now set up axis v = v + 1 ax1 = subplot(number_of_subplots, 1, v) ax1.xaxis.set_major_formatter(date_formatter) if v == 1: ax1.set_title(start) # plot transit model ax1.plot_date(x_tmp.plot_date, ys, 'k-') # plot continuum #xx =time.plot_date #xx = [uu for uu in xx if (uu<min(x_tmp.plot_date)) or (uu>max(x_tmp.plot_date))] #ax1.plot_date(xx, np.ones(len(xx)),'k--', alpha=0.3) ax1.set_xlim(min(time.plot_date), max(time.plot_date)) #ax1.plot_date(mid.plot_date, 0.5, 'ro') plt.setp(ax1.get_xticklabels(), rotation=30, ha='right') ax1.set_ylabel(name, rotation=45, labelpad=20) twilights = [ (sun_set.datetime, 0.0), (twilight_evening_civil.datetime, 0.1), (twilight_evening_nautical.datetime, 0.2), (twilight_evening_astronomical.datetime, 0.3), (twilight_morning_astronomical.datetime, 0.4), (twilight_morning_nautical.datetime, 0.3), (twilight_morning_civil.datetime, 0.2), (sun_rise.datetime, 0.1), ] for ii, twii in enumerate(twilights[1:], 1): ax1.axvspan(twilights[ii - 1][0], twilights[ii][0], ymin=0, ymax=1, color='grey', alpha=twii[1]) ax1.grid(alpha=0.5) ax1.get_yaxis().set_ticks([]) if v != number_of_subplots: ax1.get_xaxis().set_ticks([]) plt.xlabel('Time [U.T.C]') #plt.tight_layout() #plt.savefig('test.eps',format='eps') plt.show()
obs.sun_rise_time(time_obs, which='previous') # moon rise obs.moon_rise(time_obs, which='nearest') # moon set obs.moon_set(time_obs, which='nearest') # The above functions can be called with an `angle` keyword argument to specify # a particular horizon angle for rising or setting, or can be called with # convenience functions for particular morning/evening twilight. # For example, to compute astronomical twilight by specifying the `angle`: obs.sun_set_time(time_obs, which='next', angle=18*u.degree) # evening (astronomical) twilight obs.twilight_evening_astronomical(time_obs) # evening (nautical) twilight obs.twilight_evening_nautical(time_obs) # evening (civil) twilight obs.twilight_evening_civil(time_obs) # morning (nautical) twilight obs.twilight_morning_nautical(time_obs) # morning (civil) twilight obs.twilight_morning_civil(time_obs) # morning (astronomical) twilight obs.twilight_morning_astronomical(time_obs)
import numpy as np from astroplan import Observer from astropy.coordinates import EarthLocation import astropy.units as u from astropy.time import Time observer = Observer(longitude=-70.7494 * u.deg, latitude=-30.2444 * u.deg, elevation=2650.0 * u.m, name="LSST") mjd_start = 59853.5 times = Time(np.arange(mjd_start, mjd_start + 356.25 * 3, .3), format='mjd') tt = observer.twilight_evening_astronomical(times) ack = observer.moon_rise_time(times) round_ack = np.round(ack.mjd, decimals=5)
def post_save_night(sender, **kwargs): if not kwargs.get('raw', False): night = kwargs['instance'] location = night.location astropy_time = Time(datetime.combine(night.date, time(12))) astropy_time_delta = TimeDelta(600.0, format='sec') # guess if the moon is waxing or waning if ephem.next_full_moon(night.date) - ephem.Date(night.date) < ephem.Date(night.date) - ephem.previous_full_moon(night.date): waxing_moon = True else: waxing_moon = False observer = Observer( longitude=location.longitude, latitude=location.latitude, timezone='UTC' ) moon_phase = observer.moon_phase(astropy_time).value if waxing_moon: moon_phase = (math.pi - moon_phase) / (2 * math.pi) else: moon_phase = (math.pi + moon_phase) / (2 * math.pi) times = { 'sunset': observer.sun_set_time(astropy_time, which='next'), 'civil_dusk': observer.twilight_evening_civil(astropy_time, which='next'), 'nautical_dusk': observer.twilight_evening_nautical(astropy_time, which='next'), 'astronomical_dusk': observer.twilight_evening_astronomical(astropy_time, which='next'), 'midnight': observer.midnight(astropy_time, which='next'), 'astronomical_dawn': observer.twilight_morning_astronomical(astropy_time, which='next'), 'nautical_dawn': observer.twilight_morning_nautical(astropy_time, which='next'), 'civil_dawn': observer.twilight_morning_civil(astropy_time, which='next'), 'sunrise': observer.sun_rise_time(astropy_time, which='next'), } night.mjd = int(astropy_time.mjd) + 1 night.moon_phase = moon_phase for key in times: if times[key].jd > 0: setattr(night, key, times[key].to_datetime(timezone=utc)) post_save.disconnect(post_save_night, sender=sender) night.save() post_save.connect(post_save_night, sender=sender) moon_positions = [] for i in range(144): moon_altitude = observer.moon_altaz(astropy_time).alt.degree moon_position = MoonPosition( timestamp=astropy_time.to_datetime(timezone=utc), altitude=moon_altitude, location=location ) moon_positions.append(moon_position) astropy_time += astropy_time_delta MoonPosition.objects.bulk_create(moon_positions)
class tnsVis(): """ Object visability methods for calculating airmass, lengths of observable time for transient name server objects for different observing locations and dates """ def __init__(self, lat, lon, elevation, ra, dec, discDate, airmassConstraint=2): self.airmassConstraint = airmassConstraint self.altConstraint = math.degrees(math.asin(1 / self.airmassConstraint)) self.location = EarthLocation(lat=lat, lon=lon, height=elevation * u.m) self.discDate = discDate self.observer = Observer(location=self.location, name="LT") self.target = SkyCoord(ra=ra, dec=dec, unit=(u.hourangle, u.deg)) self.constraints = [ AirmassConstraint(self.airmassConstraint), AtNightConstraint.twilight_astronomical() ] print("Discovery Date :", discDate.value) def time_since_discovery(self): """ Returns astropy Time delta object of time since Discovery to time now """ return Time.now() - self.discDate def visible_time(self, date): """ For the evening after the date, specify the visible time within the constraintsself. Not really working at present """ # Find astronomical times for next night darkStart = self.observer.twilight_evening_astronomical(date, which=u'next') darkEnd = self.observer.twilight_morning_astronomical(darkStart, which=u'next') # Find rise and set times riseTime = self.observer.target_rise_time(date, self.target, which=u'next', horizon=self.altConstraint * u.deg) setTime = self.observer.target_set_time(date, self.target, which=u'next', horizon=self.altConstraint * u.deg) if (darkStart.value < riseTime.value) and (darkEnd.value > setTime.value): print("During night") return setTime - riseTime elif (darkStart.value > riseTime.value) and (darkEnd.value > setTime.value): print("Darkstart") elif (darkStart.value < riseTime.value) and (darkEnd.value < setTime.value): print("Darkend") elif (darkStart.value > riseTime.value) and (darkEnd.value < setTime.value): print("DarkstartandEnd") else: print("No Constraints matched!!") def reportDate(self, name): """ Input ATel name and scrape TNS web page for value using regex report the in astropy datetime format?? """ # Find AT or SN name. Seems best to take off 1st 3 characters objectAT = name[3:] print(objectAT) # Pull html down try: page = urllib.request.urlopen( ('https://wis-tns.weizmann.ac.il/object/' + objectAT)) bytes = page.read() text = bytes.decode("utf8") except urllib.error.HTTPError: return ('notFound') # Find the time_received value pattern = re.compile( r'class=\"cell-time_received\">\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d') match = re.findall(pattern, text) if match: # get down to YYYY-MM-DD HH:MM:SS value pattern = re.compile(r'\d\d\d\d\-\d\d-\d\d \d\d:\d\d:\d\d') reportDate = re.findall(pattern, match[0])[0] return reportDate else: return 'notFound' def reportDelay(self, date): """ Input the report date as an astropy Time object return the difference between the discovery and report in units of days """ reportDelay = date - self.discDate print("report : ", date) print("discdate : ", self.discDate) print("report.Delay : ", reportDelay) return reportDelay def plot(self, date): """ Produce plot of the object visability for date Modified from https://docs.astropy.org/en/stable/generated/examples/coordinates/plot_obs-planning.html """ import matplotlib.pyplot as plt from astropy.visualization import astropy_mpl_style plt.style.use(astropy_mpl_style) midnight = self.observer.midnight(date, which='next') delta_midnight = np.linspace(-2, 10, 100) * u.hour frame_night = AltAz(obstime=midnight + delta_midnight, location=self.location) targetaltazs_night = self.target.transform_to(frame_night) # Use `~astropy.coordinates.get_sun` to find the location of the Sun at 1000 from astropy.coordinates import get_sun delta_midnight = np.linspace(-12, 12, 1000) * u.hour times = midnight + delta_midnight frame = AltAz(obstime=times, location=self.location) sunaltazs = get_sun(times).transform_to(frame) # Do the same with `~astropy.coordinates.get_moon` to find when the moon is # up. Be aware that this will need to download a 10MB file from the internet # to get a precise location of the moon. from astropy.coordinates import get_moon moon = get_moon(times) moonaltazs = moon.transform_to(frame) ############################################################################## # Find the alt,az coordinates of M33 at those same times: targetaltazs = self.target.transform_to(frame) ############################################################################## # Make a beautiful figure illustrating nighttime and the altitudes of M33 and # the Sun over that time: plt.plot(delta_midnight, sunaltazs.alt, color='r', label='Sun') plt.plot(delta_midnight, moonaltazs.alt, color=[0.75] * 3, ls='--', label='Moon') plt.scatter(delta_midnight, targetaltazs.alt, c=targetaltazs.az, label='Target', lw=0, s=8, cmap='viridis') plt.fill_between(delta_midnight.to('hr').value, 0, 90, sunaltazs.alt < -0 * u.deg, color='0.5', zorder=0) plt.fill_between(delta_midnight.to('hr').value, 0, 90, sunaltazs.alt < -18 * u.deg, color='k', zorder=0) plt.hlines(self.altConstraint, -12, 12, colors='red', linestyles='dotted', lw=1) plt.colorbar().set_label('Azimuth [deg]') plt.legend(loc='upper left') plt.xlim(-12, 12) plt.xticks(np.arange(13) * 2 - 12) plt.ylim(0, 90) plt.xlabel('Hours from Local Midnight') plt.ylabel('Altitude [deg]') plt.show() def get_info(self, date): """ Prints useful info for a given time, for debugging mainly Alt - Az of target Alt - Az of sun Alt - Az of moon ..... """ return def objVis(self): """ Checks if transit is in between twilight hours. If not return error Returns the amount of time the object is above given airmass """ objVis = is_observable(self.constraints, self.observer, self.target, time_range=(self.discDate, self.discDate + 1 * u.day))[0] return objVis
types.extend([float] * (len(names) - 1)) base_al = np.zeros(1, dtype=list(zip(names, types))) while mjd < (mjd_start + duration): times = Time(mjd, format='mjd') sunsets = observer.sun_set_time(times, which='next') times = sunsets almanac = base_al.copy() almanac['sunset'] = sunsets.mjd almanac['moonset'] = observer.moon_set_time(times, which='next').mjd almanac['moonrise'] = observer.moon_rise_time(times, which='next').mjd almanac['sun_n12_setting'] = observer.twilight_evening_nautical( times, which='next').mjd times = observer.twilight_evening_astronomical(times, which='next') almanac['sun_n18_setting'] = times.mjd almanac['sun_n18_rising'] = observer.twilight_morning_astronomical( times, which='next').mjd almanac['sun_n12_rising'] = observer.twilight_morning_nautical( times, which='next').mjd almanac['sunrise'] = observer.sun_rise_time(times, which='next').mjd results.append(almanac) mjd = almanac['sunrise'] + t_step progress = (mjd - mjd_start) / duration * 100 text = "\rprogress = %.2f%%" % progress sys.stdout.write(text) sys.stdout.flush() almanac = np.concatenate(results)