예제 #1
0
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
예제 #2
0
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]
예제 #3
0
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