def jd_sun_alt(alt, jdin, lat, longit): delta = 0.002 alterr = 0.001 maxstep = 10000 i = 0 jdguess = jdin #[raval, decval] = SunCoords(jdguess) [raval, decval] = solar_equ_coords(jdguess) lstval = LST(jdguess, longit) alt2 = getalt(raval, decval, lstval, lat) if abs(alt2 - alt) < alterr: return jdin jdguess = jdguess + delta #[raval, decval] = SunCoords(jdguess) [raval, decval] = solar_equ_coords(jdguess) lstval = LST(jdguess, longit) alt3 = getalt(raval, decval, lstval, lat) err = alt3 - alt if abs(err) < alterr: return jdguess deriv = (alt3 - alt2) / delta while (abs(err) > alterr and i < maxstep): jdguess = jdguess - err / deriv #[raval, decval] = SunCoords(jdguess) [raval, decval] = solar_equ_coords(jdguess) lstval = LST(jdguess, longit) alt3 = getalt(raval, decval, lstval, lat) err = alt3 - alt i = i + 1 if i == maxstep - 1: sys.stderr.write( "Error determining the time at which the sun is at a given altitude.\n" ) #exit(2) if (i >= maxstep - 1): jdguess = -1000. return jdguess
def gettwilightJD(alt, nightyr, nightmo, nightday, lat, longit): # First determine jd at approximate true midnight (not corrected # for equation of time) for this location. jdut = julian_day(nightyr, nightmo, nightday, 24, 0, 0) jdmidapprox = jdut - longit/15./24. # Check if the sun is always above or below the altitude threshold on # a given night. #[raval, decval] = SunCoords(jdmidapprox) [raval, decval] = solar_equ_coords(jdmidapprox) if lat >= 0.0: if 90.0 - lat + decval < alt: # The sun is never up, set the start and stop times to be # midnight +- 0.5 return [jdmidapprox -0.5, jdmidapprox + 0.5] elif lat - (90.0 - decval) > alt: # The sun is always up, set the start and stop times to be # midnight return [jdmidapprox, jdmidapprox] else: if 90.0 + lat - decval < alt: return [jdmidapprox -0.5, jdmidapprox + 0.5] elif -lat - (90.0 + decval) > alt: # The sun is always up, set the start and stop times to be # midnight return [jdmidapprox, jdmidapprox] # Select trial evening and morning JD values ha = alt_to_HA(alt, decval, lat) jdeveapprox = jdmidapprox - ha/360.0 jdeve = jd_sun_alt(alt, jdeveapprox, lat, longit) jdmornapprox = jdmidapprox + ha/360.0 jdmorn = jd_sun_alt(alt, jdmornapprox, lat, longit) return [jdeve, jdmorn]
def FindVisibleTransits(yearstart, monthstart, daystart, yearstop, monthstop, daystop, RA, Dec, Period, Epoch, HalfDuration, obslat, obslongit, obstz, twialt, objalt, objname, objprio, objfutype, magv, starobj): # First generate a list of all transit start, stop, and midpoint times # Within the given date range. [jd1, jd2] = gettwilightJD(twialt, yearstart, monthstart, daystart, obslat, obslongit) if yearstart != yearstop or monthstart != monthstop or daystart != daystop: [jdtmp, jd2] = gettwilightJD(twialt, yearstop, monthstop, daystop, obslat, obslongit) nstart1 = math.floor((jd1 - Epoch + HalfDuration)/Period) nstop1 = math.floor((jd1 - Epoch - HalfDuration)/Period) if nstart1 > nstop1: # The object is in transit at evening twilight on the first night nstart = nstart1 else: nstart = math.floor((jd1 - Epoch)/Period) + 1 nstart2 = math.floor((jd2 - Epoch + HalfDuration)/Period) nstop2 = math.floor((jd2 - Epoch - HalfDuration)/Period) if nstart2 > nstop1: # The object is in transit at morning twilight on the last night nstop = nstart2 else: nstop = math.floor((jd1 - Epoch)/Period) jdcent = Epoch + Period*numpy.array(range(int(nstart),int(nstop+1))) if len(jdcent) == 0: # No transits are in this range return [] # Covert the series of transit center BJDs from the ephemeris into JDs command="vartools -i - -converttime input bjd output jd radec fix "+str(RA)+" "+str(Dec)+" -o - -quiet" process = subprocess.Popen(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) s="" for jd in jdcent: s=s+"%.17g 0 0.1\n" % jd (output, dum) = process.communicate(s) jdcent_corr=[] for f in output.split("\n"): if len(f.split()) > 0: jdcent_corr.append(float(f.split()[0])) jdcent = numpy.array(jdcent_corr) transits = [] # Now for each JD check if the object is above the horizon # and the sun is below the threshold for either the ingress, # midpoint, or egress for jd in jdcent: jdOOTstart = jd - HalfDuration - 0.0208333 jdstart = jd - HalfDuration jdstop = jd + HalfDuration jdOOTstop = jd + HalfDuration + 0.0208333 [rasun, decsun] = solar_equ_coords(jdstart) lststart = LST(jdstart,obslongit) altsunstart = getalt(rasun, decsun, lststart, obslat) altstart = getalt(RA, Dec, lststart, obslat) [rasun, decsun] = solar_equ_coords(jd) lstcent = LST(jd,obslongit) altsuncent = getalt(rasun, decsun, lstcent, obslat) altcent = getalt(RA, Dec, lstcent, obslat) [rasun, decsun] = solar_equ_coords(jdstart) lststop = LST(jdstop,obslongit) altsunstop = getalt(rasun, decsun, lststop, obslat) altstop = getalt(RA, Dec, lststop, obslat) if altsunstart < twialt and altstart > objalt: flag = "I" else: flag = "-" if altsuncent < twialt and altcent > objalt: flag = flag+"B" else: flag = flag+"-" if altsunstop < twialt and altstop > objalt: flag = flag+"E" else: flag = flag+"-" if flag != "---": [rasun, decsun] = solar_equ_coords(jdOOTstart) lstOOTstart = LST(jdOOTstart,obslongit) altsunOOTstart = getalt(rasun, decsun, lstOOTstart, obslat) altOOTstart = getalt(RA, Dec, lstOOTstart, obslat) [rasun, decsun] = solar_equ_coords(jdOOTstop) lstOOTstop = LST(jdOOTstop,obslongit) altsunOOTstop = getalt(rasun, decsun, lstOOTstop, obslat) altOOTstop = getalt(RA, Dec, lstOOTstop, obslat) if altsunOOTstart < twialt and altOOTstart > objalt: flag = "O"+flag else: flag = "-"+flag if altsunOOTstop < twialt and altOOTstop > objalt: flag = flag+"O" else: flag = flag+"-" [yr, mo, da, hr, mi, se] = jd2cal(jd, obstz) if hr >= 12: yr1 = yr mo1 = mo da1 = da hr1 = hr mi1 = mi se1 = se [yr2, mo2, da2, hr2, mi2, se2] = jd2cal(jd+1.0, obstz) else: yr2 = yr mo2 = mo da2 = da hr2 = hr mi2 = mi se2 = se [yr1, mo1, da1, hr1, mi1, se1] = jd2cal(jd-1.0, obstz) night = "%04d.%02d.%02d/%02d" % (yr1, mo1, da1, da2) [yrsta, mosta, dasta, hrsta, mista, sesta] = jd2cal(jdstart, obstz) [yrsto, mosto, dasto, hrsto, misto, sesto] = jd2cal(jdstop, obstz) [ramoon, decmoon] = lunar_equ_coords(jd) moonsep = angular_separation(RA, Dec, ramoon, decmoon) ltstart = "%02d:%02d" % (hrsta, mista) ltcent = "%02d:%02d" % (hr, mi) ltstop = "%02d:%02d" % (hrsto, misto) if objfutype == "pri" or objfutype == "sec": transits.append(TransitEvent(objname, objprio, math.floor((jd - Epoch + HalfDuration)/Period), night, flag, jdstart, ltstart, altstart, jd, ltcent, altcent, jdstop, ltstop, altstop, moonsep, objfutype, magv, starobj)) elif objfutype == "odd" or objfutype == "even": objNtran = int(round((jd - Epoch)/Period)) % 2 if objNtran == 0 and objfutype == "even": priotoshow = objprio elif objNtran == 1 and objfutype == "odd": priotoshow = objprio else: priotoshow = "..." transits.append(TransitEvent(objname, priotoshow, math.floor((jd - Epoch + HalfDuration)/Period), night, flag, jdstart, ltstart, altstart, jd, ltcent, altcent, jdstop, ltstop, altstop, moonsep, objfutype, magv, starobj)) for obj in transits: obj.priority() return transits