def sample_lonlat(self, n): """ Sample 2D distribution of points in lon, lat """ # From http://en.wikipedia.org/wiki/Ellipse#General_parametric_form # However, Martin et al. (2009) use PA theta "from North to East" # Definition of phi (position angle) is offset by pi/4 # Definition of t (eccentric anamoly) remains the same (x,y-frame usual) # In the end, everything is trouble because we use glon, glat... radius = self.sample_radius(n) a = radius b = self.jacobian * radius t = 2. * np.pi * numpy.random.rand(n) cost, sint = np.cos(t), np.sin(t) phi = np.pi / 2. - np.deg2rad(self.theta) cosphi, sinphi = np.cos(phi), np.sin(phi) x = a * cost * cosphi - b * sint * sinphi y = a * cost * sinphi + b * sint * cosphi if self.projector is None: logger.debug("Creating AITOFF projector for sampling") projector = Projector(self.lon, self.lat, 'ait') else: projector = self.projector lon, lat = projector.imageToSphere(x, y) return lon, lat
def sample_lonlat(self, n): """ Sample 2D distribution of points in lon, lat """ # From http://en.wikipedia.org/wiki/Ellipse#General_parametric_form # However, Martin et al. (2009) use PA theta "from North to East" # Definition of phi (position angle) is offset by pi/4 # Definition of t (eccentric anamoly) remains the same (x,y-frame usual) # In the end, everything is trouble because we use glon, glat... radius = self.sample_radius(n) a = radius; b = self.jacobian * radius t = 2. * np.pi * numpy.random.rand(n) cost,sint = np.cos(t),np.sin(t) phi = np.pi/2. - np.deg2rad(self.theta) cosphi,sinphi = np.cos(phi),np.sin(phi) x = a*cost*cosphi - b*sint*sinphi y = a*cost*sinphi + b*sint*cosphi if self.projector is None: logger.debug("Creating AITOFF projector for sampling") projector = Projector(self.lon,self.lat,'ait') else: projector = self.projector lon, lat = projector.imageToSphere(x, y) return lon, lat
def randomPositions(input, nside_pix, n=1): """ Generate n random positions within a full HEALPix mask of booleans, or a set of (lon, lat) coordinates. nside_pix is meant to be at coarser resolution than the input mask or catalog object positions so that gaps from star holes, bleed trails, cosmic rays, etc. are filled in. Return the longitude and latitude of the random positions and the total area (deg^2). Probably there is a faster algorithm, but limited much more by the simulation and fitting time than by the time it takes to generate random positions within the mask. """ input = numpy.array(input) if len(input.shape) == 1: subpix = numpy.nonzero( input )[0] # All the valid pixels in the mask at the NSIDE for the input mask lon, lat = pix2ang(healpy.npix2nside(len(input)), subpix) elif len(input.shape) == 2: lon, lat = input[0], input[1] # All catalog object positions else: logger.warning( 'Unexpected input dimensions for skymap.randomPositions') pix = surveyPixel(lon, lat, nside_pix) # Area with which the random points are thrown area = len(pix) * healpy.nside2pixarea(nside_pix, degrees=True) lon = [] lat = [] for ii in range(0, n): # Choose an unmasked pixel at random, which is OK because HEALPix is an equal area scheme pix_ii = pix[numpy.random.randint(0, len(pix))] lon_ii, lat_ii = ugali.utils.projector.pixToAng(nside_pix, pix_ii) projector = ugali.utils.projector.Projector(lon_ii, lat_ii) inside = False while not inside: # Apply random offset arcminToDegree = 1 / 60. resolution = arcminToDegree * healpy.nside2resol(nside_pix, arcmin=True) x = 2. * (numpy.random.rand() - 0.5) * resolution # Using factor 2 to be conservative y = 2. * (numpy.random.rand() - 0.5) * resolution lon_candidate, lat_candidate = projector.imageToSphere(x, y) # Make sure that the random position does indeed fall within the randomly selected pixel if ugali.utils.projector.angToPix(nside_pix, lon_candidate, lat_candidate) == pix_ii: inside = True lon.append(lon_candidate) lat.append(lat_candidate) return numpy.array(lon), numpy.array(lat), area
def randomPositions(input, nside_pix, n=1): """ Generate n random positions within a full HEALPix mask of booleans, or a set of (lon, lat) coordinates. nside_pix is meant to be at coarser resolution than the input mask or catalog object positions so that gaps from star holes, bleed trails, cosmic rays, etc. are filled in. Return the longitude and latitude of the random positions and the total area (deg^2). Probably there is a faster algorithm, but limited much more by the simulation and fitting time than by the time it takes to generate random positions within the mask. """ input = numpy.array(input) if len(input.shape) == 1: subpix = numpy.nonzero(input)[0] # All the valid pixels in the mask at the NSIDE for the input mask lon, lat = pix2ang(healpy.npix2nside(len(input)), subpix) elif len(input.shape) == 2: lon, lat = input[0], input[1] # All catalog object positions else: logger.warning('Unexpected input dimensions for skymap.randomPositions') pix = surveyPixel(lon, lat, nside_pix) # Area with which the random points are thrown area = len(pix) * healpy.nside2pixarea(nside_pix, degrees=True) lon = [] lat = [] for ii in range(0, n): # Choose an unmasked pixel at random, which is OK because HEALPix is an equal area scheme pix_ii = pix[numpy.random.randint(0, len(pix))] lon_ii, lat_ii = ugali.utils.projector.pixToAng(nside_pix, pix_ii) projector = ugali.utils.projector.Projector(lon_ii, lat_ii) inside = False while not inside: # Apply random offset arcminToDegree = 1 / 60. resolution = arcminToDegree * healpy.nside2resol(nside_pix, arcmin=True) x = 2. * (numpy.random.rand() - 0.5) * resolution # Using factor 2 to be conservative y = 2. * (numpy.random.rand() - 0.5) * resolution lon_candidate, lat_candidate = projector.imageToSphere(x, y) # Make sure that the random position does indeed fall within the randomly selected pixel if ugali.utils.projector.angToPix(nside_pix, lon_candidate, lat_candidate) == pix_ii: inside = True lon.append(lon_candidate) lat.append(lat_candidate) return numpy.array(lon), numpy.array(lat), area