def tophatbeam(loc,f,params): cpc=params[0] afwhm=params[1] if(len(loc.shape)==1): loc=np.array([loc]) output=np.ones(loc.shape[0]) output[geom.arc_length_list(loc,cpc)>afwhm]=0. return output
def gaussbeam(loc,f,params): if(len(loc.shape)==1): loc=np.array([loc]) cpc=params[0] afwhm=params[1] sep=geom.arc_length_list(loc,cpc) sigma=afwhm/np.sqrt(2.*np.log(2.))#*(180e6/f) return np.exp(-.5*(sep/sigma)**2.)
def beamP(self,f): #get the integrated beam power if(self.bfunc.__name__=='tophatbeam'): afwhm=self.params[1] return pi*(np.radians(afwhm/2))**2. elif(self.bfunc.__name__=='gaussbeam'): afwhm=self.params[1] sigma=np.radians(afwhm/np.sqrt(2.*np.log(2.)))#*(180e6/f)) return pi*sigma*sigma/2. elif(self.bfunc.__name__=='cosbeam'): afwhm=self.params[1] return np.radians(afwhm)**2./pi**2. elif(self.bfunc.__name__=='airybeam'): a=self.params[1] k=2*pi*f/c return 4*pi/(k*a)*4.*integrate.quad(lambda x: (special.jn(1,np.sqrt(1-x**2.))/np.sqrt(1-x**2.))**2.,0,1)[0] elif(self.bfunc.__name__=='mwabeam'): #integrate mwabeam over theta and phi obs=self.params[1] pcentre=self.params[0] pos=ephem.FixedBody() pos._ra=np.radians(pcentre[0]) pos._dec=np.radians(pcentre[1]) pos.compute(obs) az=float(repr(ephem.degrees(pos.az)))*180./np.pi alt=float(repr(ephem.degrees(pos.alt)))*180./np.pi cpc=[az,alt] sep=geom.arc_length_list(mwaSweetSpots[:,:2],cpc) delays=mwaSweetSpots[np.where(sep==sep.min())[0][0],3:].astype(int) dip_sep=mwa_primary_beam._DIPOLE_SEPARATION dipheight=mwa_primary_beam._DIPOLE_HEIGHT def mwaBeamI(theta,phi): rX,rY=mwa_primary_beam.MWA_Tile_analytic(theta,phi,freq=f,delays=delays,dipheight=dipheight,dip_sep=dip_sep,zenithnorm=True,power=True) return (rX+rY)/2.*np.sin(theta) return integrate.dblquad(mwaBeamI,0.,np.pi/2.,lambda x: 0., lambda x: 2.*np.pi)[0] elif(self.bfunc.__name__=='heraBeam'): fc=self.params[2] df=self.params[1] dPhi=np.radians(self.params[3]) dTheta=np.radians(self.params[4]) beamCube=self.params[5] fInd=np.round((f-fc)/df)+beamCube.shape[0]/2 if(fInd>=0 and fInd<beamCube.shape[0]): beamCube=beamCube*dPhi*dTheta _,_,thetaCube=np.meshgrid(np.zeros(beamCube.shape[1]),np.zeros(beamCube.shape[0]),np.arange(beamCube.shape[2])*dTheta) thetaCube=np.sin(thetaCube) return np.sum((beamCube[fInd,:,:]*thetaCube[fInd,:,:]).flatten())
def airybeam(loc,f,params): if(len(loc.shape)==1): loc=np.array([loc]) a=params[1]/2#params 1 is the aperture DIAMETER if(len(params)==3): fc=params[2] k=2*pi*fc/c else: k=2*pi*f/c cpc=params[0] sep=np.radians(geom.arc_length_list(loc,cpc)) x=k*np.sin(sep)*a output=(2*special.jn(1,x)/x)**2. output[sep==0.]=1. return output
def mwabeam(loc,f,params): #az,alt=obs.az,el(ra,dec) obs=params[1] pcentre=params[0] #find az el of pointing centre pos=ephem.FixedBody() pos._ra=np.radians(pcentre[0]) pos._dec=np.radians(pcentre[1]) pos.compute(obs) az=float(repr(ephem.degrees(pos.az)))*180./np.pi alt=float(repr(ephem.degrees(pos.alt)))*180./np.pi #find closets sweet splot cpc=[az,alt] # print 'center='+str(cpc) sep=geom.arc_length_list(mwaSweetSpots[:,:2],cpc) #print sep delays=mwaSweetSpots[np.where(sep==sep.min())[0][0],3:].astype(int) ra=loc[:,0] dec=loc[:,1] #azAlt=np.zeros(loc.shape) pos=ephem.FixedBody() # for ss in range(azAlt.shape[0]): # pos._ra=np.radians(loc[ss,0]) # pos._dec=np.radians(loc[ss,1]) # pos.compute(obs) # az=float(repr(ephem.degrees(pos.az))) # alt=float(repr(ephem.degrees(pos.alt))) # azAlt[ss,:]=az,alt lst=np.degrees(float(repr(obs.sidereal_time()))) #print 'lat='+str(float(repr(obs.lat))*180./np.pi) lat=float(repr(obs.lat))*180./np.pi #print 'delays='+str(delays) az,alt=ephem_utils.eq2horz(lst-ra,dec,lat) theta=(90.-alt)*math.pi/180. phi=az*math.pi/180. dip_sep=mwa_primary_beam._DIPOLE_SEPARATION dipheight=mwa_primary_beam._DIPOLE_HEIGHT rX,rY=mwa_primary_beam.MWA_Tile_analytic(theta,phi,freq=f,delays=delays,dipheight=dipheight,dip_sep=dip_sep,zenithnorm=True,power=True) #for now let's return the stokes sum return (rX+rY)/2.