|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
|
import sys, os, os.path
|
|
|
import traceback
|
|
|
import cgi, Cookie
|
|
|
import time, datetime
|
|
|
import types
|
|
|
import numpy
|
|
|
import numpy.fft
|
|
|
import scipy.linalg
|
|
|
import scipy.special
|
|
|
#import Numeric
|
|
|
|
|
|
import Misc_Routines
|
|
|
import TimeTools
|
|
|
import JroAntSetup
|
|
|
import Graphics_OverJro
|
|
|
import Astro_Coords
|
|
|
|
|
|
class JroPattern():
|
|
|
def __init__(self,pattern=0,path=None,filename=None,nptsx=101,nptsy=101,maxphi=5,fftopt=0, \
|
|
|
getcut=0,dcosx=None,dcosy=None,eomwl=6,airwl=4):
|
|
|
"""
|
|
|
JroPattern class creates an object to represent the useful parameters for beam mode-
|
|
|
lling of the Jicamarca VHF radar.
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
pattern = An integer (See JroAntSetup to know the available values) to load a prede-
|
|
|
fined configuration. The default value is 0. To use a user-defined configuration
|
|
|
pattern must be None.
|
|
|
path = A string giving the directory that contains the user-configuration file. PATH
|
|
|
will work if pattern is None.
|
|
|
filename = A string giving the name of the user-configuration file. FILENAME will
|
|
|
work if pattern is None.
|
|
|
nptsx = A scalar to specify the number of points used to define the angular resolu-
|
|
|
tion in the "x" axis. The default value is 101.
|
|
|
nptsy = A scalar to specify the number of points used to define the angular resolu-
|
|
|
tion in the "x" axis. The default value is 101.
|
|
|
maxphi = A scalar giving the maximum (absolute) angle (in degree) to model the ante-
|
|
|
nna pattern. The default value is 5 degrees.
|
|
|
fftopt = Set this input to 1 to model the beam using FFT. To model using antenna
|
|
|
theory set to 0 (default value).
|
|
|
getcut = Set to 1 to show an antenna cut instead of a contour plot of itself (set to
|
|
|
0). The defautl value is 0.
|
|
|
dcosx = An array giving the directional cosines for the x-axis. DCOSX will work if
|
|
|
getcut is actived.
|
|
|
dcosy = An array giving the directional cosines for the y-axis. DCOSY will work if
|
|
|
getcut is actived.
|
|
|
eomwl = A scalar giving the radar wavelength. The default value is 6m (50 MHZ).
|
|
|
airwl = Set this input to float (or intger) to specify the wavelength (in meters) of
|
|
|
the transmitted EOM wave in the air. The default value is 4m.
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Object-oriented Programming by Freddy Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
# Getting antenna configuration.
|
|
|
setup = JroAntSetup.ReturnSetup(path=path,filename=filename,pattern=pattern)
|
|
|
|
|
|
ues = setup["ues"]
|
|
|
phase = setup["phase"]
|
|
|
gaintx = setup["gaintx"]
|
|
|
gainrx = setup["gainrx"]
|
|
|
justrx = setup["justrx"]
|
|
|
|
|
|
# Defining attributes for JroPattern class.
|
|
|
# Antenna configuration
|
|
|
self.uestx = ues
|
|
|
self.phasetx = phase
|
|
|
self.gaintx = gaintx
|
|
|
self.uesrx = ues
|
|
|
self.phaserx = phase
|
|
|
self.gainrx = gainrx
|
|
|
self.justrx = justrx
|
|
|
|
|
|
# Pattern resolution & method to model
|
|
|
self.maxphi = maxphi
|
|
|
self.nptsx = nptsx
|
|
|
self.nptsy = nptsy
|
|
|
self.fftopt = fftopt
|
|
|
|
|
|
# To get a cut of the pattern.
|
|
|
self.getcut = getcut
|
|
|
|
|
|
maxdcos = numpy.sin(maxphi*Misc_Routines.CoFactors.d2r)
|
|
|
if dcosx==None:dcosx = ((numpy.arange(nptsx,dtype=float)/(nptsx-1))-0.5)*2*maxdcos
|
|
|
if dcosy==None:dcosy = ((numpy.arange(nptsy,dtype=float)/(nptsy-1))-0.5)*2*maxdcos
|
|
|
self.dcosx = dcosx
|
|
|
self.dcosy = dcosy
|
|
|
self.nx = dcosx.size
|
|
|
self.ny = dcosy.size*(getcut==0) + (getcut==1)
|
|
|
|
|
|
self.eomwl = eomwl
|
|
|
self.airwl = airwl
|
|
|
|
|
|
self.kk = 2.*numpy.pi/eomwl
|
|
|
|
|
|
self.pattern = None
|
|
|
self.meanpos = None
|
|
|
self.norpattern = None
|
|
|
self.maxpattern = None
|
|
|
|
|
|
self.title = setup["title"]
|
|
|
|
|
|
self.getPattern()
|
|
|
|
|
|
def getPattern(self):
|
|
|
"""
|
|
|
getpattern method returns the modelled total antenna pattern and its mean position.
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
pattern = An array giving the Modelled antenna pattern.
|
|
|
mean_pos = A 2-elements array giving the mean position of the main beam.
|
|
|
|
|
|
Examples
|
|
|
--------
|
|
|
>> [pattern, mean_pos] = JroPattern(pattern=2).getPattern()
|
|
|
>> print meanpos
|
|
|
[ 8.08728085e-14 -4.78193873e-14]
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
if (self.fftopt>0) and (self.getcut>0):
|
|
|
#print "Conflict bewteen fftopt and getcut"
|
|
|
#print "To get a cut of the antenna pattern uses ffopt=0"
|
|
|
return None, None
|
|
|
|
|
|
if (self.fftopt==0):
|
|
|
# Getting antenna pattern using the array method
|
|
|
self.pattern = self.__usingArray(rx=1)
|
|
|
if (self.justrx==0):self.pattern = self.pattern*self.__usingArray(rx=0)
|
|
|
|
|
|
elif (self.fftopt>0):
|
|
|
# Getting antenna pattern using FFT method
|
|
|
self.pattern = self.__usingFFT(rx=1)
|
|
|
if (self.justrx==0):self.pattern = self.pattern*self.__usingFFT(rx=0)
|
|
|
|
|
|
self.maxpattern = numpy.nanmax(self.pattern)
|
|
|
self.norpattern = self.pattern/self.maxpattern
|
|
|
if self.getcut==0:self.__getBeamPars()
|
|
|
|
|
|
def __usingArray(self,rx):
|
|
|
"""
|
|
|
__usingArray method returns the Jicamarca antenna pattern computed using array model
|
|
|
|
|
|
pattern = dipolepattern x modulepattern
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
rx = Set to 1 to use the Rx information. Otherwise set to 0 for Tx.
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
pattern = An array giving the modelled antenna pattern using the array model.
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
if rx==1:
|
|
|
ues = self.uesrx
|
|
|
phase = self.phaserx
|
|
|
gain = self.gainrx
|
|
|
elif rx==0:
|
|
|
ues = self.uestx
|
|
|
phase = self.phasetx
|
|
|
gain = self.gaintx
|
|
|
|
|
|
ues = ues*360./self.airwl
|
|
|
phase = phase*360./self.airwl
|
|
|
|
|
|
for ii in range(4):
|
|
|
if ii==0:dim = numpy.array([4,0,8,4]) # WEST
|
|
|
elif ii==1:dim = numpy.array([0,0,4,4]) # NORTH
|
|
|
elif ii==2:dim = numpy.array([0,4,4,8]) # EAST
|
|
|
elif ii==3:dim = numpy.array([4,4,8,8]) # SOUTH
|
|
|
xi = dim[0]; xf = dim[2]; yi = dim[1]; yf = dim[3]
|
|
|
phase[xi:xf,yi:yf] = phase[xi:xf,yi:yf] + ues[ii]
|
|
|
|
|
|
phase = -phase
|
|
|
|
|
|
ar = self.eomwl*numpy.array([[0.5,6., 24.5],[0.5,6.,24.5]])
|
|
|
nr = numpy.array([[12.,4.,2.],[12.,4.,2.]])
|
|
|
lr = 0.25*self.eomwl*numpy.array([[0,0.,0],[0.,0,0]])
|
|
|
|
|
|
# Computing module and dipole patterns.
|
|
|
pattern = (numpy.abs(self.__dipPattern(ar,nr,lr)*self.__modPattern(phase,gain)))**2
|
|
|
|
|
|
return pattern
|
|
|
|
|
|
def __usingFFT(self,rx):
|
|
|
"""
|
|
|
__usingFFT method returns the Jicamarca antenna pattern computed using The Fast Fou-
|
|
|
rier Transform.
|
|
|
|
|
|
pattern = iFFT(FFT(gain*EXP(j*phase)))
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
rx = Set to 1 to use the Rx information. Otherwise set to 0 for Tx.
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
pattern = An array giving the modelled antenna pattern using the array model.
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
if rx==1:
|
|
|
ues = self.uesrx
|
|
|
phase = self.phaserx
|
|
|
gain = self.gainrx
|
|
|
elif rx==0:
|
|
|
ues = self.uestx
|
|
|
phase = self.phasetx
|
|
|
gain = self.gaintx
|
|
|
|
|
|
ues = ues*360./self.airwl
|
|
|
phase = phase*360./self.airwl
|
|
|
|
|
|
for ii in range(4):
|
|
|
if ii==0:dim = numpy.array([4,0,8,4]) # WEST
|
|
|
elif ii==1:dim = numpy.array([0,0,4,4]) # NORTH
|
|
|
elif ii==2:dim = numpy.array([0,4,4,8]) # EAST
|
|
|
elif ii==3:dim = numpy.array([4,4,8,8]) # SOUTH
|
|
|
xi = dim[0]; xf = dim[2]; yi = dim[1]; yf = dim[3]
|
|
|
phase[xi:xf,yi:yf] = phase[xi:xf,yi:yf] + ues[ii]
|
|
|
|
|
|
phase = -phase
|
|
|
|
|
|
delta_x = self.eomwl/2.
|
|
|
delta_y = self.eomwl/2.
|
|
|
|
|
|
nxfft = 2048
|
|
|
nyfft = 2048
|
|
|
dcosx = (numpy.arange(nxfft) - (0.5*nxfft))/(nxfft*delta_x)*self.eomwl
|
|
|
dcosy = (numpy.arange(nyfft) - (0.5*nyfft))/(nyfft*delta_y)*self.eomwl
|
|
|
|
|
|
fft_gain = numpy.zeros((nxfft,nyfft))
|
|
|
fft_phase = numpy.zeros((nxfft,nyfft))
|
|
|
|
|
|
nx = 8
|
|
|
ny = 8
|
|
|
ndx =12
|
|
|
ndy =12
|
|
|
for iy in numpy.arange(ny):
|
|
|
for ix in numpy.arange(nx):
|
|
|
ix1 = nxfft/2-self.nx/2*ndx+ix*ndx
|
|
|
if ix<(nx/2):ix1 = ix1 - 1
|
|
|
if ix>=(nx/2):ix1 = ix1 + 1
|
|
|
|
|
|
iy1 = nyfft/2-ny/2*ndx+iy*ndy
|
|
|
if iy<(ny/2):iy1 = iy1 - 1
|
|
|
if iy>=(ny/2):iy1 = iy1 + 1
|
|
|
|
|
|
fft_gain[ix1:ix1+ndx-1,iy1:iy1+ndy-1] = gain[ix,ny-1-iy]
|
|
|
fft_phase[ix1:ix1+ndx-1,iy1:iy1+ndy-1] = phase[ix,ny-1-iy]
|
|
|
|
|
|
|
|
|
fft_phase = fft_phase*Misc_Routines.CoFactors.d2r
|
|
|
|
|
|
pattern = numpy.abs(numpy.fft.fft2(fft_gain*numpy.exp(numpy.complex(0,1)*fft_phase)))**2
|
|
|
pattern = numpy.fft.fftshift(pattern)
|
|
|
|
|
|
xvals = numpy.where((dcosx>=(numpy.min(self.dcosx))) & (dcosx<=(numpy.max(self.dcosx))))
|
|
|
yvals = numpy.where((dcosy>=(numpy.min(self.dcosy))) & (dcosy<=(numpy.max(self.dcosy))))
|
|
|
|
|
|
pattern = pattern[xvals[0][0]:xvals[0][-1],yvals[0][0]:yvals[0][-1]]
|
|
|
|
|
|
return pattern
|
|
|
|
|
|
def __readAttenuation(self):
|
|
|
"""
|
|
|
_readAttenuation reads the attenuations' file and returns an array giving these va-
|
|
|
lues (dB). The ext file must be in the directory "resource".
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
attenuation = An array giving attenuation values read from the text file.
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
attenuation = None
|
|
|
# foldr = sys.path[-1] + os.sep + "resource" + os.sep
|
|
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
|
|
#foldr = './resource'
|
|
|
#filen = "attenuation.txt"
|
|
|
attenuationFile = os.path.join(base_path,"resource","attenuation.txt")
|
|
|
#ff = open(os.path.join(foldr,filen),'r')
|
|
|
ff = open(attenuationFile,'r')
|
|
|
exec(ff.read())
|
|
|
ff.close()
|
|
|
|
|
|
return attenuation
|
|
|
|
|
|
def __dipPattern(self,ar,nr,lr):
|
|
|
"""
|
|
|
_dipPattern function computes the dipole's pattern to the Jicamarca radar. The next
|
|
|
equation defines the pattern as a function of the mainlobe direction:
|
|
|
|
|
|
sincx = SIN(k/2*n0x*(a0x*SIN(phi)*COS(alpha)))/SIN(k/2*(a0x*SIN(phi)*COS(alpha)))
|
|
|
sincy = SIN(k/2*n0y*(a0y*SIN(phi)*SIN(alpha)))/SIN(k/2*(a0y*SIN(phi)*SIN(alpha)))
|
|
|
A0(phi,alpha) = sincx*sincy
|
|
|
Parameters
|
|
|
----------
|
|
|
ar = ?
|
|
|
nr = ?
|
|
|
lr = ?
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
dipole = An array giving antenna pattern from the dipole point of view..
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
dipole = numpy.zeros((self.nx,self.ny),dtype=complex)
|
|
|
for iy in range(self.ny):
|
|
|
for ix in range(self.nx):
|
|
|
yindex = iy*(self.getcut==0) + ix*(self.getcut==1)
|
|
|
|
|
|
argx = ar[0,0]*self.dcosx[ix] - lr[0,0]
|
|
|
junkx = numpy.sin(0.5*self.kk*nr[0,0]*argx)/numpy.sin(0.5*self.kk*argx)
|
|
|
if argx == 0.0: junkx = nr[0,0]
|
|
|
|
|
|
argy = ar[1,0]*self.dcosy[yindex] - lr[1,0]
|
|
|
junky = numpy.sin(0.5*self.kk*nr[1,0]*argy)/numpy.sin(0.5*self.kk*argy)
|
|
|
if argy == 0.0: junky = nr[1,0]
|
|
|
|
|
|
dipole[ix,iy] = junkx*junky
|
|
|
|
|
|
return dipole
|
|
|
|
|
|
def __modPattern(self,phase,gain):
|
|
|
"""
|
|
|
ModPattern computes the module's pattern to the Jicamarca radar. The next equation
|
|
|
defines the pattern as a function mainlobe direction:
|
|
|
|
|
|
phasex = pos(x)*SIN(phi)*COS(alpha)
|
|
|
phasey = pos(y)*SIN(phi)*SIN(alpha)
|
|
|
|
|
|
A1(phi,alpha) = TOTAL(gain*EXP(COMPLEX(0,k*(phasex+phasey)+phase)))
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
phase = Bidimensional array (8x8) giving the phase (in meters) of each module.
|
|
|
gain = Bidimensional array (8x8) giving to define modules will be active (ones)
|
|
|
and which will not (zeros).
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
module = An array giving antenna pattern from the module point of view..
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
pos = self.eomwl*self.__readAttenuation()
|
|
|
posx = pos[0,:,:]
|
|
|
posy = pos[1,:,:]
|
|
|
|
|
|
phase = phase*Misc_Routines.CoFactors.d2r
|
|
|
module = numpy.zeros((self.nx,self.ny),dtype=complex)
|
|
|
for iy in range(self.ny):
|
|
|
for ix in range(self.nx):
|
|
|
yindex = iy*(self.getcut==0) + ix*(self.getcut==1)
|
|
|
phasex = posx*self.dcosx[ix]
|
|
|
phasey = posy*self.dcosy[yindex]
|
|
|
tmp = gain*numpy.exp(numpy.complex(0,1.)*(self.kk*(phasex+phasey)+phase))
|
|
|
module[ix,iy] = tmp.sum()
|
|
|
|
|
|
return module
|
|
|
|
|
|
def __getBeamPars(self):
|
|
|
"""
|
|
|
_getBeamPars computes the main-beam parameters of the antenna.
|
|
|
|
|
|
Modification history
|
|
|
--------------------
|
|
|
Developed by Jorge L. Chau.
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 20 September 2009.
|
|
|
"""
|
|
|
|
|
|
dx = self.dcosx[1] - self.dcosx[0]
|
|
|
dy = self.dcosy[1] - self.dcosy[0]
|
|
|
|
|
|
amp = self.norpattern
|
|
|
|
|
|
xx = numpy.resize(self.dcosx,(self.nx,self.nx)).transpose()
|
|
|
yy = numpy.resize(self.dcosy,(self.ny,self.ny))
|
|
|
|
|
|
mm0 = amp[numpy.where(amp > 0.5)]
|
|
|
xx0 = xx[numpy.where(amp > 0.5)]
|
|
|
yy0 = yy[numpy.where(amp > 0.5)]
|
|
|
|
|
|
xc = numpy.sum(mm0*xx0)/numpy.sum(mm0)
|
|
|
yc = numpy.sum(mm0*yy0)/numpy.sum(mm0)
|
|
|
rc = numpy.sqrt(mm0.size*dx*dy/numpy.pi)
|
|
|
|
|
|
nnx = numpy.where(numpy.abs(self.dcosx - xc) < rc)
|
|
|
nny = numpy.where(numpy.abs(self.dcosy - yc) < rc)
|
|
|
|
|
|
mm1 = amp[numpy.min(nnx):numpy.max(nnx)+1,numpy.min(nny):numpy.max(nny)+1]
|
|
|
xx1 = self.dcosx[numpy.min(nnx):numpy.max(nnx)+1]
|
|
|
yy1 = self.dcosy[numpy.min(nny):numpy.max(nny)+1]
|
|
|
|
|
|
# fitting data into the main beam.
|
|
|
import gaussfit
|
|
|
params = gaussfit.fitgaussian(mm1)
|
|
|
|
|
|
# Tranforming from indexes to axis' values
|
|
|
xcenter = xx1[0] + (((xx1[xx1.size-1] - xx1[0])/(xx1.size -1))*(params[1]))
|
|
|
ycenter = yy1[0] + (((yy1[yy1.size-1] - yy1[0])/(yy1.size -1))*(params[2]))
|
|
|
xwidth = ((xx1[xx1.size-1] - xx1[0])/(xx1.size-1))*(params[3])*(1/Misc_Routines.CoFactors.d2r)
|
|
|
ywidth = ((yy1[yy1.size-1] - yy1[0])/(yy1.size-1))*(params[4])*(1/Misc_Routines.CoFactors.d2r)
|
|
|
meanwx = (xwidth*ywidth)
|
|
|
meanpos = numpy.array([xcenter,ycenter])
|
|
|
|
|
|
#print 'Position: %f %f' %(xcenter,ycenter)
|
|
|
#print 'Widths: %f %f' %(xwidth, ywidth)
|
|
|
#print 'BWHP: %f' %(2*numpy.sqrt(2*meanwx)*numpy.sqrt(-numpy.log(0.5)))
|
|
|
|
|
|
self.meanpos = meanpos
|
|
|
|
|
|
|
|
|
class BField():
|
|
|
def __init__(self,year=None,doy=None,site=1,heights=None,alpha_i=90):
|
|
|
"""
|
|
|
BField class creates an object to get the Magnetic field for a specific date and
|
|
|
height(s).
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
year = A scalar giving the desired year. If the value is None (default value) then
|
|
|
the current year will be used.
|
|
|
doy = A scalar giving the desired day of the year. If the value is None (default va-
|
|
|
lue) then the current doy will be used.
|
|
|
site = An integer to choose the geographic coordinates of the place where the magne-
|
|
|
tic field will be computed. The default value is over Jicamarca (site=1)
|
|
|
heights = An array giving the heights (km) where the magnetic field will be modeled By default the magnetic field will be computed at 100, 500 and 1000km.
|
|
|
alpha_i = Angle to interpolate the magnetic field.
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Object-oriented Programming by Freddy Galindo, ROJ, 07 October 2009.
|
|
|
"""
|
|
|
|
|
|
tmp = time.localtime()
|
|
|
if year==None: year = tmp[0]
|
|
|
if doy==None: doy = tmp[7]
|
|
|
self.year = year
|
|
|
self.doy = doy
|
|
|
self.site = site
|
|
|
if heights==None:heights = numpy.array([100,500,1000])
|
|
|
self.heights = heights
|
|
|
self.alpha_i = alpha_i
|
|
|
|
|
|
def getBField(self,maglimits=numpy.array([-7,-7,7,7])):
|
|
|
"""
|
|
|
getBField models the magnetic field for a different heights in a specific date.
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
maglimits = An 4-elements array giving ..... The default value is [-7,-7,7,7].
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
dcos = An 4-dimensional array giving the directional cosines of the magnetic field
|
|
|
over the desired place.
|
|
|
alpha = An 3-dimensional array giving the angle of the magnetic field over the desi-
|
|
|
red place.
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 07 October 2009.
|
|
|
"""
|
|
|
|
|
|
x_ant = numpy.array([1,0,0])
|
|
|
y_ant = numpy.array([0,1,0])
|
|
|
z_ant = numpy.array([0,0,1])
|
|
|
|
|
|
if self.site==0:
|
|
|
title_site = "Magnetic equator"
|
|
|
coord_site = numpy.array([-76+52./60.,-11+57/60.,0.5])
|
|
|
elif self.site==1:
|
|
|
title_site = 'Jicamarca'
|
|
|
coord_site = [-76-52./60.,-11-57/60.,0.5]
|
|
|
theta = (45+5.35)*numpy.pi/180. # (50.35 and 1.46 from Fleish Thesis)
|
|
|
delta = -1.46*numpy.pi/180
|
|
|
|
|
|
x_ant1 = numpy.roll(self.rotvector(self.rotvector(x_ant,1,delta),3,theta),1)
|
|
|
y_ant1 = numpy.roll(self.rotvector(self.rotvector(y_ant,1,delta),3,theta),1)
|
|
|
z_ant1 = numpy.roll(self.rotvector(self.rotvector(z_ant,1,delta),3,theta),1)
|
|
|
|
|
|
ang0 = -1*coord_site[0]*numpy.pi/180.
|
|
|
ang1 = coord_site[1]*numpy.pi/180.
|
|
|
x_ant = self.rotvector(self.rotvector(x_ant1,2,ang1),3,ang0)
|
|
|
y_ant = self.rotvector(self.rotvector(y_ant1,2,ang1),3,ang0)
|
|
|
z_ant = self.rotvector(self.rotvector(z_ant1,2,ang1),3,ang0)
|
|
|
else:
|
|
|
# print "No defined Site. Skip..."
|
|
|
return None
|
|
|
|
|
|
nhei = self.heights.size
|
|
|
pt_intercep = numpy.zeros((nhei,2))
|
|
|
nfields = 1
|
|
|
|
|
|
grid_res = 0.5
|
|
|
nlon = numpy.int(maglimits[2] - maglimits[0])/grid_res + 1
|
|
|
nlat = numpy.int(maglimits[3] - maglimits[1])/grid_res + 1
|
|
|
|
|
|
location = numpy.zeros((nlon,nlat,2))
|
|
|
mlon = numpy.atleast_2d(numpy.arange(nlon)*grid_res + maglimits[0])
|
|
|
mrep = numpy.atleast_2d(numpy.zeros(nlat) + 1)
|
|
|
location0 = numpy.dot(mlon.transpose(),mrep)
|
|
|
|
|
|
mlat = numpy.atleast_2d(numpy.arange(nlat)*grid_res + maglimits[1])
|
|
|
mrep = numpy.atleast_2d(numpy.zeros(nlon) + 1)
|
|
|
location1 = numpy.dot(mrep.transpose(),mlat)
|
|
|
|
|
|
location[:,:,0] = location0
|
|
|
location[:,:,1] = location1
|
|
|
|
|
|
alpha = numpy.zeros((nlon,nlat,nhei))
|
|
|
rr = numpy.zeros((nlon,nlat,nhei,3))
|
|
|
dcos = numpy.zeros((nlon,nlat,nhei,2))
|
|
|
|
|
|
global first_time
|
|
|
|
|
|
first_time = None
|
|
|
for ilon in numpy.arange(nlon):
|
|
|
for ilat in numpy.arange(nlat):
|
|
|
outs = self.__bdotk(self.heights,
|
|
|
self.year + self.doy/366.,
|
|
|
coord_site[1],
|
|
|
coord_site[0],
|
|
|
coord_site[2],
|
|
|
coord_site[1]+location[ilon,ilat,1],
|
|
|
location[ilon,ilat,0]*720./180.)
|
|
|
|
|
|
alpha[ilon, ilat,:] = outs[1]
|
|
|
rr[ilon, ilat,:,:] = outs[3]
|
|
|
|
|
|
mrep = numpy.atleast_2d((numpy.zeros(nhei)+1)).transpose()
|
|
|
tmp = outs[3]*numpy.dot(mrep,numpy.atleast_2d(x_ant))
|
|
|
tmp = tmp.sum(axis=1)
|
|
|
dcos[ilon,ilat,:,0] = tmp/numpy.sqrt((outs[3]**2).sum(axis=1))
|
|
|
|
|
|
mrep = numpy.atleast_2d((numpy.zeros(nhei)+1)).transpose()
|
|
|
tmp = outs[3]*numpy.dot(mrep,numpy.atleast_2d(y_ant))
|
|
|
tmp = tmp.sum(axis=1)
|
|
|
dcos[ilon,ilat,:,1] = tmp/numpy.sqrt((outs[3]**2).sum(axis=1))
|
|
|
|
|
|
return dcos, alpha, nlon, nlat
|
|
|
|
|
|
|
|
|
def __bdotk(self,heights,tm,gdlat=-11.95,gdlon=-76.8667,gdalt=0.0,decd=-12.88, ham=-4.61666667):
|
|
|
|
|
|
global first_time
|
|
|
# Mean Earth radius in Km WGS 84
|
|
|
a_igrf = 6371.2
|
|
|
|
|
|
bk = numpy.zeros(heights.size)
|
|
|
alpha = numpy.zeros(heights.size)
|
|
|
bfm = numpy.zeros(heights.size)
|
|
|
rr = numpy.zeros((heights.size,3))
|
|
|
rgc = numpy.zeros((heights.size,3))
|
|
|
|
|
|
ObjGeodetic = Astro_Coords.Geodetic(gdlat,gdalt)
|
|
|
[gclat,gcalt] = ObjGeodetic.change2geocentric()
|
|
|
|
|
|
gclat = gclat*numpy.pi/180.
|
|
|
gclon = gdlon*numpy.pi/180.
|
|
|
|
|
|
# Antenna position from center of Earth
|
|
|
ca_vector = [numpy.cos(gclat)*numpy.cos(gclon),numpy.cos(gclat)*numpy.sin(gclon),numpy.sin(gclat)]
|
|
|
ca_vector = gcalt*numpy.array(ca_vector)
|
|
|
|
|
|
dec = decd*numpy.pi/180.
|
|
|
|
|
|
# K vector respect to the center of earth.
|
|
|
klon = gclon + ham*numpy.pi/720.
|
|
|
k_vector = [numpy.cos(dec)*numpy.cos(klon),numpy.cos(dec)*numpy.sin(klon),numpy.sin(dec)]
|
|
|
k_vector = numpy.array(k_vector)
|
|
|
|
|
|
for ih in numpy.arange(heights.size):
|
|
|
# Vector from Earth's center to volume of interest
|
|
|
rr[ih,:] = k_vector*heights[ih]
|
|
|
cv_vector = numpy.squeeze(ca_vector) + rr[ih,:]
|
|
|
|
|
|
cv_gcalt = numpy.sqrt(numpy.sum(cv_vector**2.))
|
|
|
cvxy = numpy.sqrt(numpy.sum(cv_vector[0:2]**2.))
|
|
|
|
|
|
radial = cv_vector/cv_gcalt
|
|
|
east = numpy.array([-1*cv_vector[1],cv_vector[0],0])/cvxy
|
|
|
comp1 = east[1]*radial[2] - radial[1]*east[2]
|
|
|
comp2 = east[2]*radial[0] - radial[2]*east[0]
|
|
|
comp3 = east[0]*radial[1] - radial[0]*east[1]
|
|
|
north = -1*numpy.array([comp1, comp2, comp3])
|
|
|
|
|
|
rr_k = cv_vector - numpy.squeeze(ca_vector)
|
|
|
u_rr = rr_k/numpy.sqrt(numpy.sum(rr_k**2.))
|
|
|
|
|
|
cv_gclat = numpy.arctan2(cv_vector[2],cvxy)
|
|
|
cv_gclon = numpy.arctan2(cv_vector[1],cv_vector[0])
|
|
|
|
|
|
bhei = cv_gcalt-a_igrf
|
|
|
blat = cv_gclat*180./numpy.pi
|
|
|
blon = cv_gclon*180./numpy.pi
|
|
|
bfield = self.__igrfkudeki(bhei,tm,blat,blon)
|
|
|
|
|
|
B = (bfield[0]*north + bfield[1]*east - bfield[2]*radial)*1.0e-5
|
|
|
|
|
|
bfm[ih] = numpy.sqrt(numpy.sum(B**2.)) #module
|
|
|
bk[ih] = numpy.sum(u_rr*B)
|
|
|
alpha[ih] = numpy.arccos(bk[ih]/bfm[ih])*180/numpy.pi
|
|
|
rgc[ih,:] = numpy.array([cv_gclon, cv_gclat, cv_gcalt])
|
|
|
|
|
|
return bk, alpha, bfm, rr, rgc
|
|
|
|
|
|
|
|
|
def __igrfkudeki(self,heights,time,latitude,longitude,ae=6371.2):
|
|
|
"""
|
|
|
__igrfkudeki calculates the International Geomagnetic Reference Field for given in-
|
|
|
put conditions based on IGRF2005 coefficients.
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
heights = Scalar or vector giving the height above the Earth of the point in ques-
|
|
|
tion in kilometers.
|
|
|
time = Scalar or vector giving the decimal year of time in question (e.g. 1991.2).
|
|
|
latitude = Latitude of point in question in decimal degrees. Scalar or vector.
|
|
|
longitude = Longitude of point in question in decimal degrees. Scalar or vector.
|
|
|
ae =
|
|
|
first_time =
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
bn =
|
|
|
be =
|
|
|
bd =
|
|
|
bmod =
|
|
|
balpha =
|
|
|
first_time =
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 03 October 2009.
|
|
|
"""
|
|
|
|
|
|
global first_time
|
|
|
global gs, hs, nvec, mvec, maxcoef
|
|
|
|
|
|
heights = numpy.atleast_1d(heights)
|
|
|
time = numpy.atleast_1d(time)
|
|
|
latitude = numpy.atleast_1d(latitude)
|
|
|
longitude = numpy.atleast_1d(longitude)
|
|
|
|
|
|
if numpy.max(latitude)==90:
|
|
|
# print "Field calculations are not supported at geographic poles"
|
|
|
pass
|
|
|
|
|
|
# output arrays
|
|
|
bn = numpy.zeros(heights.size)
|
|
|
be = numpy.zeros(heights.size)
|
|
|
bd = numpy.zeros(heights.size)
|
|
|
|
|
|
if first_time==None:first_time=0
|
|
|
|
|
|
time0 = time[0]
|
|
|
if time!=first_time:
|
|
|
#print "Getting coefficients for", time0
|
|
|
[periods,g,h ] = self.__readIGRFcoeff()
|
|
|
top_year = numpy.max(periods)
|
|
|
nperiod = (top_year - 1900)/5 + 1
|
|
|
|
|
|
maxcoef = 10
|
|
|
if time0>=2000:maxcoef = 12
|
|
|
|
|
|
|
|
|
# Normalization array for Schmidt fucntions
|
|
|
multer = numpy.zeros((2+maxcoef,1+maxcoef)) + 1
|
|
|
for cn in (numpy.arange(maxcoef)+1):
|
|
|
for rm in (numpy.arange(cn)+1):
|
|
|
tmp = numpy.arange(2*rm) + cn - rm + 1.
|
|
|
multer[rm+1,cn] = ((-1.)**rm)*numpy.sqrt(2./tmp.prod())
|
|
|
|
|
|
schmidt = multer[1:,1:].transpose()
|
|
|
|
|
|
# n and m arrays
|
|
|
nvec = numpy.atleast_2d(numpy.arange(maxcoef)+2)
|
|
|
mvec = numpy.atleast_2d(numpy.arange(maxcoef+1)).transpose()
|
|
|
|
|
|
# Time adjusted igrf g and h with Schmidt normalization
|
|
|
# IGRF coefficient arrays: g0(n,m), n=1, maxcoeff,m=0, maxcoeff, ...
|
|
|
if time0<top_year:
|
|
|
dtime = (time0 - 1900) % 5
|
|
|
ntime = (time0 - 1900 - dtime)/5
|
|
|
else:
|
|
|
# Estimating coefficients for times > top_year
|
|
|
dtime = (time0 - top_year) + 5
|
|
|
ntime = g[:,0,0].size - 2
|
|
|
|
|
|
g0 = g[ntime,1:maxcoef+1,:maxcoef+1]
|
|
|
h0 = h[ntime,1:maxcoef+1,:maxcoef+1]
|
|
|
gdot = g[ntime+1,1:maxcoef+1,:maxcoef+1]-g[ntime,1:maxcoef+1,:maxcoef+1]
|
|
|
hdot = h[ntime+1,1:maxcoef+1,:maxcoef+1]-h[ntime,1:maxcoef+1,:maxcoef+1]
|
|
|
gs = (g0 + dtime*(gdot/5.))*schmidt[:maxcoef,0:maxcoef+1]
|
|
|
hs = (h0 + dtime*(hdot/5.))*schmidt[:maxcoef,0:maxcoef+1]
|
|
|
|
|
|
first_time = time0
|
|
|
|
|
|
for ii in numpy.arange(heights.size):
|
|
|
# Height dependence array rad = (ae/(ae+height))**(n+3)
|
|
|
rad = numpy.atleast_2d((ae/(ae + heights[ii]))**(nvec+1))
|
|
|
|
|
|
# Sin and Cos of m times longitude phi arrays
|
|
|
mphi = mvec*longitude[ii]*numpy.pi/180.
|
|
|
cosmphi = numpy.atleast_2d(numpy.cos(mphi))
|
|
|
sinmphi = numpy.atleast_2d(numpy.sin(mphi))
|
|
|
|
|
|
# Cos of colatitude theta
|
|
|
c = numpy.cos((90 - latitude[ii])*numpy.pi/180.)
|
|
|
|
|
|
# Legendre functions p(n,m|c)
|
|
|
[p,dp]= scipy.special.lpmn(maxcoef+1,maxcoef+1,c)
|
|
|
p = p[:,:-1].transpose()
|
|
|
s = numpy.sqrt((1. - c)*(1 + c))
|
|
|
|
|
|
# Generate derivative array dpdtheta = -s*dpdc
|
|
|
dpdtheta = c*p/s
|
|
|
for m in numpy.arange(maxcoef+2): dpdtheta[:,m] = m*dpdtheta[:,m]
|
|
|
dpdtheta = dpdtheta + numpy.roll(p,-1,axis=1)
|
|
|
|
|
|
# Extracting arrays required for field calculations
|
|
|
p = p[1:maxcoef+1,:maxcoef+1]
|
|
|
dpdtheta = dpdtheta[1:maxcoef+1,:maxcoef+1]
|
|
|
|
|
|
# Weigh p and dpdtheta with gs and hs coefficients.
|
|
|
gp = gs*p
|
|
|
hp = hs*p
|
|
|
gdpdtheta = gs*dpdtheta
|
|
|
hdpdtheta = hs*dpdtheta
|
|
|
# Calcultate field components
|
|
|
matrix0 = numpy.dot(gdpdtheta,cosmphi)
|
|
|
matrix1 = numpy.dot(hdpdtheta,sinmphi)
|
|
|
bn[ii] = numpy.dot(rad,(matrix0 + matrix1))
|
|
|
matrix0 = numpy.dot(hp,(mvec*cosmphi))
|
|
|
matrix1 = numpy.dot(gp,(mvec*sinmphi))
|
|
|
be[ii] = numpy.dot((-1*rad),((matrix0 - matrix1)/s))
|
|
|
matrix0 = numpy.dot(gp,cosmphi)
|
|
|
matrix1 = numpy.dot(hp,sinmphi)
|
|
|
bd[ii] = numpy.dot((-1*nvec*rad),(matrix0 + matrix1))
|
|
|
|
|
|
bmod = numpy.sqrt(bn**2. + be**2. + bd**2.)
|
|
|
btheta = numpy.arctan(bd/numpy.sqrt(be**2. + bn**2.))*180/numpy.pi
|
|
|
balpha = numpy.arctan(be/bn)*180./numpy.pi
|
|
|
|
|
|
#bn : north
|
|
|
#be : east
|
|
|
#bn : radial
|
|
|
#bmod : module
|
|
|
|
|
|
|
|
|
return bn, be, bd, bmod, btheta, balpha
|
|
|
|
|
|
def str2num(self, datum):
|
|
|
try:
|
|
|
return int(datum)
|
|
|
except:
|
|
|
try:
|
|
|
return float(datum)
|
|
|
except:
|
|
|
return datum
|
|
|
|
|
|
def __readIGRFfile(self, filename):
|
|
|
list_years=[]
|
|
|
for i in range(1,24):
|
|
|
list_years.append(1895.0 + i*5)
|
|
|
|
|
|
epochs=list_years
|
|
|
epochs.append(epochs[-1]+5)
|
|
|
nepochs = numpy.shape(epochs)
|
|
|
|
|
|
gg = numpy.zeros((13,14,nepochs[0]),dtype=float)
|
|
|
hh = numpy.zeros((13,14,nepochs[0]),dtype=float)
|
|
|
|
|
|
coeffs_file=open(filename)
|
|
|
lines=coeffs_file.readlines()
|
|
|
|
|
|
coeffs_file.close()
|
|
|
|
|
|
for line in lines:
|
|
|
items = line.split()
|
|
|
g_h = items[0]
|
|
|
n = self.str2num(items[1])
|
|
|
m = self.str2num(items[2])
|
|
|
|
|
|
coeffs = items[3:]
|
|
|
|
|
|
for i in range(len(coeffs)-1):
|
|
|
coeffs[i] = self.str2num(coeffs[i])
|
|
|
|
|
|
#coeffs = numpy.array(coeffs)
|
|
|
ncoeffs = numpy.shape(coeffs)[0]
|
|
|
|
|
|
if g_h == 'g':
|
|
|
# print n," g ",m
|
|
|
gg[n-1,m,:]=coeffs
|
|
|
elif g_h=='h':
|
|
|
# print n," h ",m
|
|
|
hh[n-1,m,:]=coeffs
|
|
|
# else :
|
|
|
# continue
|
|
|
|
|
|
# Ultimo Reordenamiento para almacenar .
|
|
|
gg[:,:,nepochs[0]-1] = gg[:,:,nepochs[0]-2] + 5*gg[:,:,nepochs[0]-1]
|
|
|
hh[:,:,nepochs[0]-1] = hh[:,:,nepochs[0]-2] + 5*hh[:,:,nepochs[0]-1]
|
|
|
|
|
|
# return numpy.array([gg,hh])
|
|
|
periods = numpy.array(epochs)
|
|
|
g = gg
|
|
|
h = hh
|
|
|
return periods, g, h
|
|
|
|
|
|
|
|
|
def __readIGRFcoeff(self,filename="igrf10coeffs.dat"):
|
|
|
"""
|
|
|
__readIGRFcoeff reads the coefficients from a binary file which is located in the
|
|
|
folder "resource."
|
|
|
|
|
|
Parameter
|
|
|
---------
|
|
|
filename = A string to specify the name of the file which contains thec coeffs. The
|
|
|
default value is "igrf10coeffs.dat"
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
periods = A lineal array giving...
|
|
|
g1 =
|
|
|
h1 =
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 03 October 2009.
|
|
|
"""
|
|
|
|
|
|
# # igrfile = sys.path[-1] + os.sep + "resource" + os.sep + filename
|
|
|
# igrfile = os.path.join('./resource',filename)
|
|
|
# f = open(igrfile,'rb')
|
|
|
# #f = open(os.getcwd() + os.sep + "resource" + os.sep + filename,'rb')
|
|
|
#
|
|
|
# # Reading SkyNoise Power (lineal scale)
|
|
|
# periods = numpy.fromfile(f,numpy.dtype([('var','<f4')]),23)
|
|
|
# periods = periods['var']
|
|
|
#
|
|
|
# g = numpy.fromfile(f,numpy.dtype([('var','<f8')]),23*14*14)
|
|
|
# g = g['var'].reshape((14,14,23)).transpose()
|
|
|
#
|
|
|
# h = numpy.fromfile(f,numpy.dtype([('var','<f8')]),23*14*14)
|
|
|
# h = h['var'].reshape((14,14,23)).transpose()
|
|
|
#
|
|
|
# f.close()
|
|
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
|
|
filename = os.path.join(base_path,"resource","igrf11coeffs.txt")
|
|
|
|
|
|
period_v, g_v, h_v = self.__readIGRFfile(filename)
|
|
|
g2 = numpy.zeros((14,14,24))
|
|
|
h2 = numpy.zeros((14,14,24))
|
|
|
g2[1:14,:,:] = g_v
|
|
|
h2[1:14,:,:] = h_v
|
|
|
|
|
|
g = numpy.transpose(g2, (2,0,1))
|
|
|
h = numpy.transpose(h2, (2,0,1))
|
|
|
periods = period_v.copy()
|
|
|
|
|
|
return periods, g, h
|
|
|
|
|
|
def rotvector(self,vector,axis=1,ang=0):
|
|
|
"""
|
|
|
rotvector function returns the new vector generated rotating the rectagular coords.
|
|
|
|
|
|
Parameters
|
|
|
----------
|
|
|
vector = A lineal 3-elements array (x,y,z).
|
|
|
axis = A integer to specify the axis used to rotate the coord systems. The default
|
|
|
value is 1.
|
|
|
axis = 1 -> Around "x"
|
|
|
axis = 2 -> Around "y"
|
|
|
axis = 3 -> Around "z"
|
|
|
ang = Angle of rotation (in radians). The default value is zero.
|
|
|
|
|
|
Return
|
|
|
------
|
|
|
rotvector = A lineal array of 3 elements giving the new coordinates.
|
|
|
|
|
|
Modification History
|
|
|
--------------------
|
|
|
Converted to Python by Freddy R. Galindo, ROJ, 01 October 2009.
|
|
|
"""
|
|
|
|
|
|
if axis==1:
|
|
|
t = [[1,0,0],[0,numpy.cos(ang),numpy.sin(ang)],[0,-numpy.sin(ang),numpy.cos(ang)]]
|
|
|
elif axis==2:
|
|
|
t = [[numpy.cos(ang),0,-numpy.sin(ang)],[0,1,0],[numpy.sin(ang),0,numpy.cos(ang)]]
|
|
|
elif axis==3:
|
|
|
t = [[numpy.cos(ang),numpy.sin(ang),0],[-numpy.sin(ang),numpy.cos(ang),0],[0,0,1]]
|
|
|
|
|
|
rotvector = numpy.array(numpy.dot(numpy.array(t),numpy.array(vector)))
|
|
|
|
|
|
return rotvector
|
|
|
|
|
|
|
|
|
class overJroShow:
|
|
|
|
|
|
# __serverdocspath = '/usr/local/www/htdocs'
|
|
|
# __tmpDir = 'overJro/tempReports'
|
|
|
# __serverdocspath = '/Users/dsuarez/Pictures'
|
|
|
# __tmpDir = 'overjro'
|
|
|
__serverdocspath = None
|
|
|
__tmpDir = None
|
|
|
|
|
|
def __init__(self):
|
|
|
self.year = None
|
|
|
self.month = None
|
|
|
self.dom = None
|
|
|
self.pattern = None
|
|
|
self.maxphi = None
|
|
|
self.heights = None
|
|
|
self.filename = None
|
|
|
self.showType = None
|
|
|
self.path = None
|
|
|
self.objects = None
|
|
|
self.nptsx = 101
|
|
|
self.nptsy = 101
|
|
|
self.fftopt = 0
|
|
|
self.site = 1
|
|
|
self.dcosx = 1
|
|
|
self.dcosy = 1
|
|
|
self.dcosxrange = None
|
|
|
self.dcosyrange = None
|
|
|
self.maxha_min= 0.
|
|
|
self.show_object = None
|
|
|
self.dcosx_mag = None
|
|
|
self.dcosy_mag = None
|
|
|
self.ha_mag = None
|
|
|
self.time_mag = None
|
|
|
self.main_dec = None
|
|
|
self.ObjC = None
|
|
|
self.ptitle = ''
|
|
|
self.path4plotname = None
|
|
|
self.plotname0 = None
|
|
|
self.plotname1 = None
|
|
|
self.plotname2 = None
|
|
|
self.scriptHeaders = 0
|
|
|
# self.outputHead('Show Plot')
|
|
|
# self.printBody()
|
|
|
|
|
|
def setScriptState(self):
|
|
|
self.madForm = cgi.FieldStorage()
|
|
|
|
|
|
if self.madForm.has_key('serverdocspath'):
|
|
|
self.__serverdocspath = self.madForm.getvalue('serverdocspath')#'/usr/local/www/htdocs'
|
|
|
|
|
|
if self.madForm.has_key('tmpdir'):
|
|
|
self.__tmpDir = self.madForm.getvalue('tmpdir')#'overJro/tempReports'
|
|
|
|
|
|
if self.madForm.has_key('showType'):
|
|
|
self.showType = int(self.madForm.getvalue('showType'))
|
|
|
|
|
|
if self.showType == 0 or self.showType == 1:
|
|
|
|
|
|
# if self.madForm.has_key('year') and \
|
|
|
# self.madForm.has_key('month') and \
|
|
|
# self.madForm.has_key('dom') and \
|
|
|
# self.madForm.has_key('pattern') and \
|
|
|
# self.madForm.has_key('maxphi') and \
|
|
|
# self.madForm.has_key('objects') and \
|
|
|
# self.madForm.has_key('heights'):
|
|
|
|
|
|
if self.madForm.has_key('year') and \
|
|
|
self.madForm.has_key('month') and \
|
|
|
self.madForm.has_key('dom') and \
|
|
|
self.madForm.has_key('maxphi') and \
|
|
|
self.madForm.has_key('objects') and \
|
|
|
self.madForm.has_key('heights'):
|
|
|
|
|
|
self.year = int(self.madForm.getvalue('year'))
|
|
|
self.month = int(self.madForm.getvalue('month'))
|
|
|
self.dom = int(self.madForm.getvalue('dom'))
|
|
|
self.maxphi = float(self.madForm.getvalue('maxphi'))
|
|
|
|
|
|
if self.madForm.has_key('pattern'):
|
|
|
|
|
|
tmp_pattern = self.madForm.getvalue('pattern') #pattern es predifinido en listado o definido por el usuario
|
|
|
self.pattern=[]
|
|
|
if tmp_pattern[0] == '[':
|
|
|
tmp_pattern=tmp_pattern[1:]
|
|
|
|
|
|
if tmp_pattern[-1] == ']':
|
|
|
tmp_pattern=tmp_pattern[0:len(tmp_pattern)-1]
|
|
|
|
|
|
for s in tmp_pattern.split(','):
|
|
|
self.pattern.append(float(s))
|
|
|
elif self.madForm.has_key('filename'):
|
|
|
if self.madForm.has_key('filename'):
|
|
|
self.filename = self.madForm.getvalue('filename') # nombre de archivo: patron de radiacion definido por el usuario
|
|
|
|
|
|
if self.madForm.has_key('path'):
|
|
|
self.path = self.madForm.getvalue('path') #path donde se encuentra el archivo: patron de radiacion del usuario
|
|
|
|
|
|
else:
|
|
|
print "Content-Type: text/html\n"
|
|
|
print '<h3> This cgi plot script was called without the proper arguments.</h3>'
|
|
|
print '<p> This is a script used to plot Antenna Cuts over Jicamarca Antenna</p>'
|
|
|
print '<p> Required arguments:</p>'
|
|
|
print '<p> pattern - chekbox indicating objects over jicamarca antenna</p>'
|
|
|
print '<p> or'
|
|
|
print '<p> filename - The pattern defined by users is a file text'
|
|
|
print '<p> path - folder with pattern files'
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
tmp_heights = self.madForm.getvalue('heights')
|
|
|
self.heights=[]
|
|
|
if tmp_heights[0] == '[':
|
|
|
tmp_heights=tmp_heights[1:]
|
|
|
|
|
|
if tmp_heights[-1] == ']':
|
|
|
tmp_heights=tmp_heights[0:len(tmp_heights)-1]
|
|
|
|
|
|
for s in tmp_heights.split(','):
|
|
|
self.heights.append(float(s))
|
|
|
self.heights = numpy.array(self.heights)
|
|
|
|
|
|
tmp_objects = self.madForm.getvalue('objects') #lista con los objetos a graficar en el patron de radiacion
|
|
|
self.objects=[]
|
|
|
if tmp_objects[0] == '[':
|
|
|
tmp_objects=tmp_objects[1:]
|
|
|
|
|
|
if tmp_objects[-1] == ']':
|
|
|
tmp_objects=tmp_objects[0:len(tmp_objects)-1]
|
|
|
|
|
|
for s in tmp_objects.split(','):
|
|
|
self.objects.append(int(s))
|
|
|
|
|
|
if self.showType == 1:
|
|
|
if numpy.sum(self.objects) == 0:
|
|
|
if self.scriptHeaders == 0:
|
|
|
print "Content-Type: text/html\n"
|
|
|
print '<h3> This cgi plot script was called without the proper arguments.</h3>'
|
|
|
print '<p> This is a script used to plot Antenna Cuts over Jicamarca Antenna</p>'
|
|
|
print '<p> Required arguments:</p>'
|
|
|
print '<p> objects - chekbox indicating objects over jicamarca antenna</p>'
|
|
|
print '<p> Please, options in "Select Object" must be checked'
|
|
|
sys.exit(0)
|
|
|
|
|
|
#considerar para futura implementacion
|
|
|
if self.madForm.has_key('filename'):
|
|
|
self.filename = self.madForm.getvalue('filename') # nombre de archivo: patron de radiacion definido por el usuario
|
|
|
|
|
|
if self.madForm.has_key('path'):
|
|
|
self.path = self.madForm.getvalue('path') #path donde se encuentra el archivo: patron de radiacion del usuario
|
|
|
|
|
|
|
|
|
else:
|
|
|
if self.scriptHeaders == 0:
|
|
|
print "Content-Type: text/html\n"
|
|
|
|
|
|
print '<h3> This cgi plot script was called without the proper arguments.</h3>'
|
|
|
print '<p> This is a script used to plot Pattern Field and Celestial Objects over Jicamarca Antenna</p>'
|
|
|
print '<p> Required arguments:</p>'
|
|
|
print '<p> year - year of event</p>'
|
|
|
print '<p> month - month of event</p>'
|
|
|
print '<p> dom - day of month</p>'
|
|
|
print '<p> pattern - pattern is defined by "Select an Experiment" list box</p>'
|
|
|
print '<p> maxphi - maxphi is defined by "Max Angle" text box</p>'
|
|
|
print '<p> objects - objects is a list defined by checkbox in "Select Object"</p>'
|
|
|
print '<p> heights - heights is defined by "Heights" text box, for default heights=[100,500,1000]</p>'
|
|
|
print '<p> showType - showType is a hidden element for show plot of Pattern&Object or Antenna Cuts or Sky Noise</p>'
|
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
if self.showType == 2:
|
|
|
if self.madForm.has_key('year') and \
|
|
|
self.madForm.has_key('month') and \
|
|
|
self.madForm.has_key('dom'):
|
|
|
|
|
|
self.year = int(self.madForm.getvalue('year'))
|
|
|
self.month = int(self.madForm.getvalue('month'))
|
|
|
self.dom = int(self.madForm.getvalue('dom'))
|
|
|
|
|
|
else:
|
|
|
if self.scriptHeaders == 0:
|
|
|
print "Content-Type: text/html\n"
|
|
|
print '<h3> This cgi plot script was called without the proper arguments.</h3>'
|
|
|
print '<p> This is a script used to plot Sky Noise over Jicamarca Antenna</p>'
|
|
|
print '<p> Required arguments:</p>'
|
|
|
print '<p> year - year of event</p>'
|
|
|
print '<p> month - month of event</p>'
|
|
|
print '<p> dom - day of month</p>'
|
|
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
|
def initParameters1(self):
|
|
|
|
|
|
gui=1
|
|
|
if self.pattern==None:
|
|
|
if gui==1: self.filename = self.filename.split(',')
|
|
|
|
|
|
pattern = numpy.atleast_1d(self.pattern)
|
|
|
filename = numpy.atleast_1d(self.filename)
|
|
|
|
|
|
npatterns = numpy.max(numpy.array([pattern.size,filename.size]))
|
|
|
|
|
|
self.pattern = numpy.resize(pattern,npatterns)
|
|
|
self.filename = numpy.resize(filename,npatterns)
|
|
|
|
|
|
self.doy = datetime.datetime(self.year,self.month,self.dom).timetuple().tm_yday
|
|
|
|
|
|
|
|
|
if self.objects==None:
|
|
|
self.objects=numpy.zeros(5)
|
|
|
else:
|
|
|
tmp = numpy.atleast_1d(self.objects)
|
|
|
self.objects = numpy.zeros(5)
|
|
|
self.objects[0:tmp.size] = tmp
|
|
|
|
|
|
self.show_object = self.objects
|
|
|
|
|
|
self.maxha_min = 4*self.maxphi*numpy.sqrt(2)*1.25
|
|
|
|
|
|
|
|
|
if self.heights==None:
|
|
|
self.heights = numpy.array([100.,500.,1000.])
|
|
|
|
|
|
|
|
|
|
|
|
#ROJ geographic coordinates and time zone
|
|
|
self.glat = -11.95
|
|
|
self.glon = -76.8667
|
|
|
self.UT = 5 #timezone
|
|
|
|
|
|
self.glat = -11.951481
|
|
|
self.glon = -76.874383
|
|
|
|
|
|
|
|
|
self.junkjd = TimeTools.Time(self.year,self.month,self.dom).change2julday()
|
|
|
self.junklst = TimeTools.Julian(self.junkjd).change2lst(longitude=self.glon)
|
|
|
|
|
|
# Finding RA of observatory for a specific date
|
|
|
self.ra_obs = self.junklst*Misc_Routines.CoFactors.h2d
|
|
|
|
|
|
def initParameters(self):
|
|
|
|
|
|
# Defining plot filenames
|
|
|
self.path4plotname = os.path.join(self.__serverdocspath,self.__tmpDir)
|
|
|
print "PATH4"
|
|
|
print os.path.join(self.__serverdocspath,self.__tmpDir)
|
|
|
self.plotname0 = 'over_jro_0_%i.png'% (time.time()) #plot pattern & objects
|
|
|
self.plotname1 = 'over_jro_1_%i.png'% (time.time()) #plot antenna cuts
|
|
|
self.plotname2 = 'over_jro_2_%i.png'% (time.time()) #plot sky noise
|
|
|
|
|
|
# Defining antenna axes respect to geographic coordinates (See Ochs report).
|
|
|
# alfa = 1.46*Misc_Routines.CoFactors.d2r
|
|
|
# theta = 51.01*Misc_Routines.CoFactors.d2r
|
|
|
|
|
|
alfa = 1.488312*Misc_Routines.CoFactors.d2r
|
|
|
th = 6.166710 + 45.0
|
|
|
theta = th*Misc_Routines.CoFactors.d2r
|
|
|
|
|
|
sina = numpy.sin(alfa)
|
|
|
cosa = numpy.cos(alfa)
|
|
|
MT1 = numpy.array([[1,0,0],[0,cosa,-sina],[0,sina,cosa]])
|
|
|
sinb = numpy.sin(theta)
|
|
|
cosb = numpy.cos(theta)
|
|
|
MT2 = numpy.array([[cosb,sinb,0],[-sinb,cosb,0],[0,0,1]])
|
|
|
self.MT3 = numpy.array(numpy.dot(MT2, MT1)).transpose()
|
|
|
|
|
|
self.xg = numpy.dot(self.MT3.transpose(),numpy.array([1,0,0]))
|
|
|
self.yg = numpy.dot(self.MT3.transpose(),numpy.array([0,1,0]))
|
|
|
self.zg = numpy.dot(self.MT3.transpose(),numpy.array([0,0,1]))
|
|
|
|
|
|
def plotPattern(self):
|
|
|
# Plotting Antenna patterns.
|
|
|
npatterns = numpy.size(self.pattern)
|
|
|
|
|
|
if npatterns==1:
|
|
|
if self.pattern[0] == None: npatterns = self.filename.__len__()
|
|
|
|
|
|
date = TimeTools.Time(self.year,self.month,self.dom).change2strdate(mode=2)
|
|
|
|
|
|
mesg = 'Over Jicamarca: ' + date[0]
|
|
|
|
|
|
title = ''
|
|
|
|
|
|
for ii in numpy.arange(npatterns):
|
|
|
ObjAnt = JroPattern(pattern=self.pattern[ii],
|
|
|
filename=self.filename[ii],
|
|
|
path=self.path,
|
|
|
nptsx=self.nptsx,
|
|
|
nptsy=self.nptsy,
|
|
|
maxphi=self.maxphi,
|
|
|
fftopt=self.fftopt)
|
|
|
|
|
|
title += ObjAnt.title
|
|
|
# Plotting Contour Map
|
|
|
print "Antes de la creacion"
|
|
|
self.path4plotname = '/home/fquino/workspace/radarsys/webapp/apps/abs/static/images'
|
|
|
print self.path4plotname
|
|
|
print self.plotname0
|
|
|
dum = Graphics_OverJro.AntPatternPlot()
|
|
|
dum.contPattern(iplot=ii,
|
|
|
gpath=self.path4plotname,
|
|
|
filename=self.plotname0,
|
|
|
mesg=mesg,
|
|
|
amp=ObjAnt.norpattern,
|
|
|
x=ObjAnt.dcosx,
|
|
|
y=ObjAnt.dcosy,
|
|
|
getCut=ObjAnt.getcut,
|
|
|
title=title)
|
|
|
# title=ObjAnt.title)
|
|
|
# self.ptitle = ObjAnt.title
|
|
|
if ii==0:
|
|
|
self.figure = dum.figure
|
|
|
|
|
|
if ii != (npatterns-1):
|
|
|
title += '+'
|
|
|
|
|
|
|
|
|
vect_ant = numpy.array([ObjAnt.meanpos[0],ObjAnt.meanpos[1],numpy.sqrt(1-numpy.sum(ObjAnt.meanpos**2.))])
|
|
|
|
|
|
vect_geo = numpy.dot(scipy.linalg.inv(self.MT3),vect_ant)
|
|
|
|
|
|
vect_polar = Misc_Routines.Vector(numpy.array(vect_geo),direction=1).Polar2Rect()
|
|
|
|
|
|
[ra,dec,ha] = Astro_Coords.AltAz(vect_polar[1],vect_polar[0],self.junkjd).change2equatorial()
|
|
|
|
|
|
print'Main beam position (HA(min), DEC(degrees)): %f %f'%(ha*4.,dec)
|
|
|
|
|
|
self.main_dec = dec
|
|
|
|
|
|
self.ptitle = title
|
|
|
|
|
|
Graphics_OverJro.AntPatternPlot().plotRaDec(gpath=self.path4plotname,filename=self.plotname0,jd=self.junkjd, ra_obs=self.ra_obs, xg=self.xg, yg=self.yg, x=ObjAnt.dcosx, y=ObjAnt.dcosy)
|
|
|
|
|
|
self.dcosx = ObjAnt.dcosx
|
|
|
|
|
|
self.dcosy = ObjAnt.dcosy
|
|
|
|
|
|
self.dcosxrange = [numpy.min(self.dcosx),numpy.max(self.dcosx)]
|
|
|
|
|
|
self.dcosyrange = [numpy.min(self.dcosy),numpy.max(self.dcosy)]
|
|
|
|
|
|
def plotBfield(self):
|
|
|
|
|
|
if self.show_object[0]>0:
|
|
|
# Getting B field
|
|
|
ObjB = BField(self.year,self.doy,self.site,self.heights)
|
|
|
|
|
|
|
|
|
[dcos, alpha, nlon, nlat] = ObjB.getBField()
|
|
|
|
|
|
# Plotting B field.
|
|
|
# print "Drawing magnetic field over Observatory"
|
|
|
|
|
|
Obj = Graphics_OverJro.BFieldPlot()
|
|
|
|
|
|
Obj.plotBField(self.path4plotname,self.plotname0,dcos,alpha,nlon,nlat,self.dcosxrange,self.dcosyrange,ObjB.heights,ObjB.alpha_i)
|
|
|
|
|
|
if self.show_object[0]>1:
|
|
|
|
|
|
Bhei = 0
|
|
|
|
|
|
dcosx = Obj.alpha_location[:,0,Bhei]
|
|
|
|
|
|
dcosy = Obj.alpha_location[:,1,Bhei]
|
|
|
|
|
|
vect_ant = [dcosx,dcosy,numpy.sqrt(1.-(dcosx**2. + dcosy**2.))]
|
|
|
|
|
|
vect_ant = numpy.array(vect_ant)
|
|
|
|
|
|
vect_geo = numpy.dot(scipy.linalg.inv(self.MT3),vect_ant)
|
|
|
|
|
|
vect_geo = numpy.array(vect_geo).transpose()
|
|
|
|
|
|
vect_polar = Misc_Routines.Vector(vect_geo,direction=1).Polar2Rect()
|
|
|
|
|
|
[ra,dec,ha] = Astro_Coords.AltAz(vect_polar[1,:],vect_polar[0,:],self.junkjd).change2equatorial()
|
|
|
|
|
|
val = numpy.where(ha>=180)
|
|
|
|
|
|
if val[0].size>0:ha[val] = ha[val] -360.
|
|
|
|
|
|
val = numpy.where(numpy.abs(ha)<=self.maxphi)
|
|
|
|
|
|
if val[0].size>2:
|
|
|
|
|
|
self.dcosx_mag = dcosx[val]
|
|
|
|
|
|
self.dcosy_mag = dcosy[val]
|
|
|
|
|
|
self.ha_mag = ha[val]
|
|
|
|
|
|
self.time_mag = 0
|
|
|
|
|
|
def plotCelestial(self):
|
|
|
|
|
|
ntod = 24.*16.
|
|
|
|
|
|
tod = numpy.arange(ntod)/ntod*24.
|
|
|
|
|
|
[month,dom] = TimeTools.Doy2Date(self.year,self.doy).change2date()
|
|
|
|
|
|
jd = TimeTools.Time(self.year,month,dom,tod+self.UT).change2julday()
|
|
|
|
|
|
if numpy.sum(self.show_object[1:]>0)!=0:
|
|
|
|
|
|
self.ObjC = Graphics_OverJro.CelestialObjectsPlot(jd,self.main_dec,tod,self.maxha_min,self.show_object)
|
|
|
|
|
|
self.ObjC.drawObject(self.glat,
|
|
|
self.glon,
|
|
|
self.xg,
|
|
|
self.yg,
|
|
|
self.dcosxrange,
|
|
|
self.dcosyrange,
|
|
|
self.path4plotname,
|
|
|
self.plotname0)
|
|
|
|
|
|
def plotAntennaCuts(self):
|
|
|
# print "Drawing antenna cuts"
|
|
|
|
|
|
incha = 0.05 # min
|
|
|
nha = numpy.int32(2*self.maxha_min/incha) + 1.
|
|
|
newha = numpy.arange(nha)/nha*2.*self.maxha_min - self.maxha_min
|
|
|
nha_star = numpy.int32(200./incha)
|
|
|
star_ha = (numpy.arange(nha_star) - (nha_star/2))*nha_star
|
|
|
|
|
|
#Init ObjCut for PatternCutPlot()
|
|
|
view_objects = numpy.where(self.show_object>0)
|
|
|
subplots = len(view_objects[0])
|
|
|
ObjCut = Graphics_OverJro.PatternCutPlot(subplots)
|
|
|
|
|
|
for io in (numpy.arange(5)):
|
|
|
if self.show_object[io]==2:
|
|
|
if io==0:
|
|
|
if self.dcosx_mag.size!=0:
|
|
|
dcosx = self.dcosx_mag
|
|
|
dcosy = self.dcosy_mag
|
|
|
dcosz = 1 - numpy.sqrt(dcosx**2. + dcosy**2.)
|
|
|
|
|
|
# Finding rotation of B respec to antenna coords.
|
|
|
[mm,bb] = scipy.polyfit(dcosx,dcosy,1)
|
|
|
alfa = 0.0
|
|
|
theta = -1.*numpy.arctan(mm)
|
|
|
sina = numpy.sin(alfa); cosa = numpy.cos(alfa)
|
|
|
MT1 = [[1,0,0],[0,cosa,-sina],[0,sina,cosa]]
|
|
|
MT1 = numpy.array(MT1)
|
|
|
sinb = numpy.sin(theta); cosb = numpy.cos(theta)
|
|
|
MT2 = [[cosb,sinb,0],[-sinb,cosb,0],[0,0,1]]
|
|
|
MT2 = numpy.array(MT2)
|
|
|
MT3_mag = numpy.dot(MT2, MT1)
|
|
|
MT3_mag = numpy.array(MT3_mag).transpose()
|
|
|
# Getting dcos respec to B coords
|
|
|
vector = numpy.array([dcosx,dcosy,dcosz])
|
|
|
nvector = numpy.dot(MT3_mag,vector)
|
|
|
nvector = numpy.array(nvector).transpose()
|
|
|
|
|
|
## print 'Rotation (deg) %f'%(theta/Misc_Routines.CoFactors.d2r)
|
|
|
|
|
|
yoffset = numpy.sum(nvector[:,1])/nvector[:,1].size
|
|
|
# print 'Dcosyoffset %f'%(yoffset)
|
|
|
|
|
|
ha = self.ha_mag*4.
|
|
|
time = self.time_mag
|
|
|
width_star = 0.1 # half width in minutes
|
|
|
otitle = 'B Perp. cut'
|
|
|
# else:
|
|
|
# print "No B perp. over Observatory"
|
|
|
#
|
|
|
#
|
|
|
elif io==1:
|
|
|
if self.ObjC.dcosx_sun.size!=0:
|
|
|
dcosx = self.ObjC.dcosx_sun
|
|
|
dcosy = self.ObjC.dcosy_sun
|
|
|
ha = self.ObjC.ha_sun*4.0
|
|
|
time = self.ObjC.time_sun
|
|
|
width_star = 2. # half width in minutes
|
|
|
otitle = 'Sun cut'
|
|
|
# else:
|
|
|
# print "Sun is not passing over Observatory"
|
|
|
|
|
|
elif io==2:
|
|
|
if self.ObjC.dcosx_moon.size!=0:
|
|
|
dcosx = self.ObjC.dcosx_moon
|
|
|
dcosy = self.ObjC.dcosy_moon
|
|
|
ha = self.ObjC.ha_moon*4
|
|
|
time = self.ObjC.time_moon
|
|
|
m_distance = 404114.6 # distance to the Earth in km
|
|
|
m_diameter = 1734.4 # diameter in km.
|
|
|
width_star = numpy.arctan(m_distance/m_diameter)
|
|
|
width_star = width_star/2./Misc_Routines.CoFactors.d2r*4.
|
|
|
otitle = 'Moon cut'
|
|
|
# else:
|
|
|
# print "Moon is not passing over Observatory"
|
|
|
|
|
|
elif io==3:
|
|
|
if self.ObjC.dcosx_hydra.size!=0:
|
|
|
dcosx = self.ObjC.dcosx_hydra
|
|
|
dcosy = self.ObjC.dcosy_hydra
|
|
|
ha = self.ObjC.ha_hydra*4.
|
|
|
time = self.ObjC.time_hydra
|
|
|
width_star = 0.25 # half width in minutes
|
|
|
otitle = 'Hydra cut'
|
|
|
# else:
|
|
|
# print "Hydra is not passing over Observatory"
|
|
|
|
|
|
elif io==4:
|
|
|
if self.ObjC.dcosx_galaxy.size!=0:
|
|
|
dcosx = self.ObjC.dcosx_galaxy
|
|
|
dcosy = self.ObjC.dcosy_galaxy
|
|
|
ha = self.ObjC.ha_galaxy*4.
|
|
|
time = self.ObjC.time_galaxy
|
|
|
width_star = 25. # half width in minutes
|
|
|
otitle = 'Galaxy cut'
|
|
|
# else:
|
|
|
# print "Galaxy center is not passing over Jicamarca"
|
|
|
#
|
|
|
#
|
|
|
hour = numpy.int32(time)
|
|
|
mins = numpy.int32((time - hour)*60.)
|
|
|
secs = numpy.int32(((time - hour)*60. - mins)*60.)
|
|
|
|
|
|
ObjT = TimeTools.Time(self.year,self.month,self.dom,hour,mins,secs)
|
|
|
subtitle = ObjT.change2strdate()
|
|
|
|
|
|
star_cut = numpy.exp(-(star_ha/width_star)**2./2.)
|
|
|
|
|
|
pol = scipy.polyfit(ha,dcosx,3.)
|
|
|
polx = numpy.poly1d(pol); newdcosx = polx(newha)
|
|
|
pol = scipy.polyfit(ha,dcosy,3.)
|
|
|
poly = numpy.poly1d(pol);newdcosy = poly(newha)
|
|
|
|
|
|
patterns = []
|
|
|
for icut in numpy.arange(self.pattern.size):
|
|
|
# Getting Antenna cut.
|
|
|
Obj = JroPattern(dcosx=newdcosx,
|
|
|
dcosy=newdcosy,
|
|
|
getcut=1,
|
|
|
pattern=self.pattern[icut],
|
|
|
path=self.path,
|
|
|
filename=self.filename[icut])
|
|
|
|
|
|
Obj.getPattern()
|
|
|
|
|
|
patterns.append(Obj.pattern)
|
|
|
|
|
|
|
|
|
ObjCut.drawCut(io,
|
|
|
patterns,
|
|
|
self.pattern.size,
|
|
|
newha,
|
|
|
otitle,
|
|
|
subtitle,
|
|
|
self.ptitle)
|
|
|
|
|
|
ObjCut.saveFig(self.path4plotname,self.plotname1)
|
|
|
|
|
|
def plotSkyNoise(self):
|
|
|
# print 'Creating SkyNoise map over Jicamarca'
|
|
|
dom = self.dom
|
|
|
month = self.month
|
|
|
year = self.year
|
|
|
|
|
|
julian = TimeTools.Time(year,month,dom).change2julday()
|
|
|
|
|
|
[powr,time, lst] = Astro_Coords.CelestialBodies().skyNoise(julian)
|
|
|
|
|
|
Graphics_OverJro.SkyNoisePlot([year,month,dom],powr,time,lst).getPlot(self.path4plotname,self.plotname2)
|
|
|
|
|
|
|
|
|
def outputHead(self,title):
|
|
|
print "Content-Type: text/html"
|
|
|
print
|
|
|
self.scriptHeaders = 1
|
|
|
print '<html>'
|
|
|
print '<head>'
|
|
|
print '\t<title>' + title + '</title>'
|
|
|
print '<style type="text/css">'
|
|
|
print 'body'
|
|
|
print '{'
|
|
|
print 'background-color:#ffffff;'
|
|
|
print '}'
|
|
|
print 'h1'
|
|
|
print '{'
|
|
|
print 'color:black;'
|
|
|
print 'font-size:18px;'
|
|
|
print 'text-align:center;'
|
|
|
print '}'
|
|
|
print 'p'
|
|
|
print '{'
|
|
|
print 'font-family:"Arial";'
|
|
|
print 'font-size:16px;'
|
|
|
print 'color:black;'
|
|
|
print '}'
|
|
|
print '</style>'
|
|
|
# self.printJavaScript()
|
|
|
print '</head>'
|
|
|
|
|
|
def printJavaScript(self):
|
|
|
print
|
|
|
|
|
|
def printBody(self):
|
|
|
print '<body>'
|
|
|
# print '<h1>Test Input Parms</h1>'
|
|
|
# for key in self.madForm.keys():
|
|
|
# #print '<p> name=' + str(key)
|
|
|
# if type(self.madForm.getvalue(key)) == types.ListType:
|
|
|
# for value in self.madForm.getvalue(key):
|
|
|
# print '<p> name=' + str(key) + \
|
|
|
# ' value=' + value + ''
|
|
|
# else:
|
|
|
# print '<p> name=' + str(key) + \
|
|
|
# ' value=' + str(cgi.escape(self.madForm.getvalue(key))) + ''
|
|
|
|
|
|
print '<form name="form1" method="post" target="showFrame">'
|
|
|
print ' <div align="center">'
|
|
|
print ' <table width=98% border="1" cellpadding="1">'
|
|
|
print ' <tr>'
|
|
|
print ' <td colspan="2" align="center">'
|
|
|
if self.showType == 0:
|
|
|
print ' <IMG SRC="%s" BORDER="0" >'%(os.path.join(os.sep + self.__tmpDir,self.plotname0))
|
|
|
if self.showType == 1:
|
|
|
print ' <IMG SRC="%s" BORDER="0" >'%(os.path.join(os.sep + self.__tmpDir,self.plotname1))
|
|
|
if self.showType == 2:
|
|
|
print ' <IMG SRC="%s" BORDER="0" >'%(os.path.join(os.sep + self.__tmpDir,self.plotname2))
|
|
|
print ' </td>'
|
|
|
print ' </tr>'
|
|
|
print ' </table>'
|
|
|
print ' </div>'
|
|
|
print '</form>'
|
|
|
|
|
|
print '</body>'
|
|
|
print '</html>'
|
|
|
|
|
|
#def execute(self, serverdocspath, tmpdir, currentdate, finalpath, showType=0, maxphi=5.0, objects="[1,1]", heights="[150,500,1000]"):
|
|
|
def setInputParameters(self, serverpath, currentdate, finalpath, showType=0, maxphi=5.0, objects="[1,1]", heights="[150,500,1000]"):
|
|
|
self.objects=[]
|
|
|
self.heights=[]
|
|
|
#self.__serverdocspath = serverdocspath
|
|
|
self.__serverdocspath = os.path.split(serverpath)[0]
|
|
|
#self.__tmpDir = tmpdir
|
|
|
self.__tmpDir = os.path.split(serverpath)[1]
|
|
|
self.showType = int(showType)
|
|
|
self.year = int(currentdate.strftime("%Y")) # Get year of currentdate
|
|
|
self.month = int(currentdate.strftime("%m")) # Get month of currentdate
|
|
|
self.dom = int(currentdate.strftime("%d")) # Get day of currentdate
|
|
|
self.filename = os.path.split(finalpath)[1]
|
|
|
self.path = os.path.split(finalpath)[0]
|
|
|
self.maxphi = float(maxphi)
|
|
|
|
|
|
tmp_objects = (objects.replace("[","")).replace("]","")
|
|
|
for s in tmp_objects.split(','):
|
|
|
self.objects.append(int(s))
|
|
|
|
|
|
tmp_heights = (heights.replace("[","")).replace("]","")
|
|
|
for s in tmp_heights.split(','):
|
|
|
self.heights.append(float(s))
|
|
|
self.heights = numpy.array(self.heights)
|
|
|
|
|
|
def setupParameters(self):
|
|
|
self.initParameters()
|
|
|
|
|
|
def initParametersCGI(self):
|
|
|
self.setScriptState()
|
|
|
self.initParameters()
|
|
|
|
|
|
def execute(self):
|
|
|
if self.showType == 0 or self.showType == 1:
|
|
|
self.initParameters1()
|
|
|
self.plotPattern()
|
|
|
|
|
|
if numpy.sum(self.show_object>0) != 0:
|
|
|
self.plotBfield()
|
|
|
self.plotCelestial()
|
|
|
|
|
|
if numpy.sum(self.show_object>1) != 0:
|
|
|
self.plotAntennaCuts()
|
|
|
|
|
|
if self.showType == 2:
|
|
|
self.plotSkyNoise()
|
|
|
|
|
|
def getPlot(self):
|
|
|
print "GETPLot"
|
|
|
print os.path.join(self.__serverdocspath,self.__tmpDir,self.plotname0)
|
|
|
return os.path.join(self.__serverdocspath,self.__tmpDir,self.plotname0)
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
# Script overJroShow.py
|
|
|
# This script only calls the init function of the class overJroShow()
|
|
|
# All work is done by the init function
|
|
|
|
|
|
newOverJro = overJroShow()
|
|
|
newOverJro.initParametersCGI()
|
|
|
newOverJro.execute()
|
|
|
|