Esempio n. 1
0
        def satpass(tmin, tmax):
            
            def nextpass(u):
                # Update target for rise/set calculations by updating tle
                rise, fall = 0, -1
                while rise>fall:             
                    self.obs.date = ephem.Date(u)                            # Set obs. date
                    target = ephem.readtle('TLE0',*tle.mount(u).split(','))  # Set appropriate TLE
                    passdata = self.obs.next_pass(target)                    # Compute passdata

                    print passdata

                    rise, fall = float(passdata[0]), float(passdata[4])
                    print passdata[2], passdata[3]
                    u = tm(u).eph()-ephem.minute
                return rise, fall                                        # Return rise/set times
                
            passes = []                                                      # Create container
            umin, umax = tm(tmin).eph(), tm(tmax).eph()                      # Convert to Julian dates
            for sat in self.sats.values():
                tle = TLE_config(sat, tmax)                                  # Mount TLE database file
                rise, fall = nextpass(umin)                                  # Find first pass 
                while rise<umax:
                    passes.append(Pass(sat,tm(rise),tm(fall),tle.now))       # Add pass info
                    rise, fall = nextpass(fall+5*ephem.second)               # Find next pass
            return passes
Esempio n. 2
0
 def printout1(self, tmin, tmax, show, passfile):
     #Print satellite pass search bounds
     if show:
         if passfile:
             print 'Retrieving satellite passes from file (truncated at bounds)...'
         else:
             print 'Calculating satellite passes (truncated at bounds)...'
         print 'From: %.1f -> %s\nTo:   %.1f -> %s\n'%(tm(tmin).utc,tm(tmin).eph(),
                                                       tm(tmax).utc,tm(tmax).eph())
     return
Esempio n. 3
0
    def passes(self, tmin, tmax, passfile=floc['Nov2015'], saveas=None, show=True):
        """Finds rise and set times of all passes falling within bounds

        Note: next_pass returns the following data as a tuple:
                  0- Rise time,      1- Rise azimuth
                  2- Max alt time,   3- Max alt
                  4- Set time,       5- Set azimuth """
        
        def satpass(tmin, tmax):
            
            def nextpass(u):
                # Update target for rise/set calculations by updating tle
                rise, fall = 0, -1
                while rise>fall:             
                    self.obs.date = ephem.Date(u)                            # Set obs. date
                    target = ephem.readtle('TLE0',*tle.mount(u).split(','))  # Set appropriate TLE
                    passdata = self.obs.next_pass(target)                    # Compute passdata

                    print passdata

                    rise, fall = float(passdata[0]), float(passdata[4])
                    print passdata[2], passdata[3]
                    u = tm(u).eph()-ephem.minute
                return rise, fall                                        # Return rise/set times
                
            passes = []                                                      # Create container
            umin, umax = tm(tmin).eph(), tm(tmax).eph()                      # Convert to Julian dates
            for sat in self.sats.values():
                tle = TLE_config(sat, tmax)                                  # Mount TLE database file
                rise, fall = nextpass(umin)                                  # Find first pass 
                while rise<umax:
                    passes.append(Pass(sat,tm(rise),tm(fall),tle.now))       # Add pass info
                    rise, fall = nextpass(fall+5*ephem.second)               # Find next pass
            return passes

        #Either calculate data or load from previously calculated data
        self.passlist = []
        self.printout1(tmin,tmax,show,passfile)                              # Print satpass range
        
        if passfile:
          with open(passfile) as f:
            for line in f:
                dat = line.strip().split(';')
                self.passlist.append(Pass(self.sats[dat[0]],tm(dat[1]),tm(dat[2]),dat[3]))
        else:
            sortkey = lambda x: (x.rise,x.fall)                          # Pass sorting method
            self.passlist = sorted(satpass(tmin,tmax), key=sortkey)      # Produce passlist
        
        self.printout2(self.passlist, self.sats, show)  # Print passes
        
        if saveas:
            with open(saveas,'w+') as f:
                [f.write('%s;%.2f;%.2f;%s\n'%(p.sat.ID,tm(p.rise).utc,tm(p.fall).utc,p.TLE)) for p in passlist]

        return self.passlist
Esempio n. 4
0
    def mount(self, t):
        t = tm(t)                                      # Convert to tm time
        if tm(self.now, 'tle') > t:                    # For backtracking
	    self.load()
        while tm(self.nxt, 'tle') <= t:  
           # Find last TLE before t
           try:              
              self.now = self.nxt
              self.nxt = self.data.next().strip()
           except StopIteration:
               break
        return self.now
Esempio n. 5
0
    def plot_tiles(tmin, tmax, tstep, chan, restrictions=None):

        if restrictions:
            e = Sateph(restrictions).ephemeris(tmin, tmax, tstep, quiet=False, restrict='full')
        else:
            e = Sateph().ephemeris(tmin, tmax, tstep, quiet=False, restrict='full')

        d = self.getdata(tmin.utc,tmax.utc,[chan])

        itp = {}
        for q in d.tiles:
            data = np.copy(d.rdata(q))
            if not data[0]:
                continue
            itp[q] = interp.interp1d(data[0],data[chan])

        for p in e:
            f, ax = plt.subplots(6, figsize=(16,10))
            plt.subplots_adjust(hspace=0.25, left=.06, right=.96)
            ax[0]=plt.subplot2grid((3,2), (0,0))
            ax[1]=plt.subplot2grid((3,2), (0,1), sharex=ax[0])
            ax[2]=plt.subplot2grid((3,2), (1,0), sharex=ax[0])
            ax[3]=plt.subplot2grid((3,2), (1,1), sharex=ax[0])
            ax[4]=plt.subplot2grid((3,2), (2,0), sharex=ax[0])
            ax[5]=plt.subplot2grid((3,2), (2,1), sharex=ax[0])

            pdata,eph = p[0],np.copy(p[1])
            sat, tiles = pdata[0], pdata[4]
            tmin, tmax = eph[0][0], eph[0][-1]
            eph[0]=eph[0]-tmin
            
            Satplot().plotpass([ax[0]],['alt'],sat,eph)
            ax[0].set_ylim([0,90])
            Satplot().plotpass([ax[1]],['alt'],sat,eph)
            ax[1].set_ylim([0,90])

            for q in tiles:
                anum = 2 if q['type']=='ref' else 4
                data = np.copy(d.rdata(q['desig'],tmin,tmax))
                data[0]=data[0]-tmin
                ax[anum].plot(data[0],data[chan])

                #change here to use sattimes
                xnew=np.arange(tmin,tmax,10)
                ynew=itp[q['desig']](xnew)-itp['rf0XX'](xnew)
                xnew=xnew-tmin
                ax[anum+1].plot(xnew,ynew)

            Satplot().setplot([ax[0]],['alt'], tm(0), tm(tmax-tmin))
            plt.show()
Esempio n. 6
0
 def printout2(self, plist, sats, show):
     #Print number of passes found for each satellite 
     print ''
     if show:  # Print pass data
         tabform = '%-8s%-12s%-24s%-24s'
         dform   = '%Y/%m/%d %H:%M:%S'
         print tabform%('Pass:'******'Sat:','Rise:','Set:')
         for i,p in zip(range(len(plist)),plist):
             print ' '+tabform%(i+1, p.sat.desig ,tm(p.rise).cal(dform), tm(p.fall).cal(dform))
         # Print pass count per satellite
         nstring = ''.join([i.sat.desig for i in plist])
         pcount = [(s.desig, nstring.count(s.desig)) for s in sats.values()]
         print '\nPasscount: %d'%sum(i[1] for i in pcount)
         for s in range(len(pcount)):
             print '%s   %-8s: %d  '%('' if s%4 else '\n',pcount[s][0],pcount[s][1]),
         print '\n' if s%4 else ''
     return
Esempio n. 7
0
 def compute(u, seek=False):
     # Keep constant tle for ephemeris calculation over single pass
     self.obs.date = ephem.Date(u.eph())
     self.target.compute(self.obs)
     alt_rad=self.target.alt
     alt_deg=(alt_rad/np.pi)*180.0
     az_rad=self.target.az
     az_deg=(az_rad/np.pi)*180.0
     return [tm(self.obs.date).utc, alt_deg, az_deg]
Esempio n. 8
0
 def geteph(timestamps):
     # Compute eph for single pass- operates in the form: target.compute(obs)
     timestamps = [tm(float(t)) for t in timestamps]
     for sat in self.sats.values():
        if (sat.desig == satellite_desig):
           sat_tuple=sat
     tle = TLE_config(sat_tuple, t_max)                                           # Mount TLE database file
     #print "latest TLE is from %s " % (tle.lastrecord())
     self.target = ephem.readtle('TLE0',*tle.mount(t_max).split(','))     # Set appropriate TLE
     #self.target = ephem.readtle('TLE0',*satpass.TLE.split(','))
     eph = [compute(u) for u in timestamps]
     return np.swapaxes(eph,0,1)
Esempio n. 9
0
            def nextpass(u):
                # Update target for rise/set calculations by updating tle
                rise, fall = 0, -1
                while rise>fall:             
                    self.obs.date = ephem.Date(u)                            # Set obs. date
                    target = ephem.readtle('TLE0',*tle.mount(u).split(','))  # Set appropriate TLE
                    passdata = self.obs.next_pass(target)                    # Compute passdata

                    print passdata

                    rise, fall = float(passdata[0]), float(passdata[4])
                    print passdata[2], passdata[3]
                    u = tm(u).eph()-ephem.minute
                return rise, fall                                        # Return rise/set times
Esempio n. 10
0
    def ephemeris(self, satpass=None, timestamps=None, ephfile=None, saveas=None, quiet=True):
        """Calculates ephemeris for passes within trange using step size tstep (excluding
        right bound if tmax-tmin%tstep!=0) to produce a list of numpy arrays in t,alt,azi"""
        
        if ephfile:
	    data = [line.strip().split(',') for line in open(ephfile)]
	    return [[float(j) for j in i] for i in data]
	            
        def compute(u, seek=False):
            # Keep constant tle for ephemeris calculation over single pass
            self.obs.date = ephem.Date(u.eph())
            self.target.compute(self.obs)
            return [tm(self.obs.date).utc, self.target.alt, self.target.az]
        
        # Compute eph for single pass- operates in the form: target.compute(obs)
        timestamps = [tm(t) for t in timestamps if tm(t)>satpass.rise and tm(t)<satpass.fall]
        self.target = ephem.readtle('TLE0',*satpass.TLE.split(','))
        eph = [compute(u) for u in timestamps]
        if saveas:
            with open(saveas,'w+') as f:
                [f.write('%.2f,%f,%f\n'%(e[0],e[1],e[2])) for e in eph]
        #return np.swapaxes(eph,0,1)
        return eph
Esempio n. 11
0
 def __init__(self, sat, tmax, uid=ST['login'],lim=None):
     self.sat = sat.ID                              # Associate class instance to NORAD ID
     print "Sat is %s" % self.sat
     self.tlefile = floc['TLEpath']%self.sat        # Define TLE database location for sat
     print "looking in %s " % self.tlefile
    
     # Use tail to check last TLE, update if required
     tmax = tm(tmax)
     print "tmax is %s" % tmax
     result = read['tail'](self.tlefile)
     #print "result is %s" % result
     tlelast = tm(result, 'tle') if result else tm(ST['newTLE'])
     #print "tlelast was %s"  % tlelast
     tlelast.utc = tlelast.utc + 100000
     #print "tlelast is now %s" % tlelast
     #print "tm(ST['newTLE'] is %s" % tm(ST['newTLE'])
     #print "tlelast is %s " % tlelast
     print 'Sat %s: Checking database...'%self.sat,
     
     # If required, repeatedly pull tles from SpaceTrack until all>tmax 
     while tlelast < tmax:   
         #wait for 5 secs as you are only allowed 20 queries per minute
         time.sleep(5)            
         dfrom, dupto = tm(tlelast-ST['safety']), tm(tlelast+ST['chunk'])
         query = ST['query']%(self.sat,dfrom,dupto,'limit/%d/' if lim else "")
         print "Requesting update from SpaceTrack:\n\n%s\n"%query
         os.system(ST['request']%(uid[0],uid[1],query,ST['cookies'],ST['dload']))
         print 'Validating and distributing to database...',
         #print ST['dload']
         with open(ST['dload']) as f:
             for d in f:
                 tlestring = '%s,%s\n'%(d.strip(),f.next().strip())
                 tletime = tm(tlestring, 'tle')
                 if tletime > tlelast:
                     open(self.tlefile,'a').write(tlestring)
                     tlelast = tletime
         if dupto > tmax:
             break
         tlelast=tm(tlelast+chunk)
     print 'OK'
     
     self.data = open(self.validate())              # Validate then mount database
     self.load()                                    # Load initial TLE
Esempio n. 12
0
 def compute(u, seek=False):
     # Keep constant tle for ephemeris calculation over single pass
     self.obs.date = ephem.Date(u.eph())
     self.target.compute(self.obs)
     return [tm(self.obs.date).utc, self.target.alt, self.target.az]