2017-07-26 2 views
0

Ich habe eine Liste von Galaxien, die auf einer Healpix-Karte (die ich mit healpy zu tun habe) gezeichnet habe. Jede Galaxie hat einen bestimmten Fluss und ich muss sie so aufzeichnen, dass der Fluss fließt für jede Galaxie ist auf der Karte erhalten.Mit HEALPy Pixelzählungen speichern

Dies ist mein Code:

import numpy as np 
import matplotlib.pyplot as plt 
import healpy as hp 
pi = np.pi 

nside = 8 
xsize = 100 

ra = np.array([pi/4,pi/3]) 
dec = np.array([pi/4,pi/3]) 
flux = np.array([10,20]) 

hpm = np.zeros(hp.nside2npix(nside)) #Blank healpix map 
pixindex = hp.ang2pix(nside, dec, ra) 

np.add.at(hpm,pixindex,flux) #Add flux onto correct pixels 

img=hp.mollview(hpm,coord=['E'],xsize=xsize,return_projected_map=True) 
print(np.sum(img[img>0])) 

Das Ergebnis, das ich bekommen, ist 140 und nicht 30, welche die wahre Summe der Flüsse ist.

ich bekommen, was los ist und dass der gleiche Fluss wird mehrere Pixel verteilt (6 für die erste Galaxie und 4 Pixel für den zweiten) und ich bin mir bewusst, ich konnte einfach tun:

newimg = img * (np.sum(flux)/np.sum(img[img>0])) 

und dies würde die gesamte Photonenzahl erhalten, aber es würde nicht unbedingt die Photonenzahl jeder Galaxie erhalten, die ich brauche. d. h. diese Methode endet damit, dass die erste Galaxie einen Fluss von 12,86 und die zweite Galaxie einen Fluss von 17,14 liefert.

Gibt es eine Möglichkeit herauszufinden, wie viele Pixel jede Koordinate aufnimmt, um die Flussmenge zu ändern, die auf dieser Basis ausgegeben wird?

Vielen Dank im Voraus!

Antwort

1

Der xsize Parameter für die Funktion hp.mollview sollte nur für Plotzwecke verwendet werden. Wenn Sie möchten, dass die Auflösung der Karte manipulieren, verwenden hp.pixelfunc.ud_grade

Zum Beispiel, wenn Sie nside=8-nside=32 gehen wollen,

Nach der Linie

np.add.at(hpm, pixindex, flux) #Add flux onto correct pixels 

verwenden, um die ud_grade Funktion mit power=-2, so kann der Gesamtfluss erhalten werden:

hpm_nside_32 = hp.pixelfunc.ud_grade(hpm, power=-2, nside_out=32) 

die Summe

np.sum(hpm_nside_32) 

wird bei 30 konserviert werden.

Ich kann keine Lösung anbieten, wenn Sie das mollview benötigen, um das Flussmittel konserviert zu haben. Der nächste Wert, den ich erreichen kann, besteht darin, den img-Wert basierend auf dem Verhältnis der Anzahl der Pixel im Mollview-Bild und der Anzahl der Pixel im hpm zu skalieren. Der erste Term xsize * xsize/2. ist die Anzahl der Pixel in der Mollview, der zweite Term 2. * np.pi/8. ist das Verhältnis der Fläche einer Ellipse mit halb-kleiner Achse die Hälfte der Länge der großen Halbachse pi * r * 2r auf die Fläche eines Rechtecks ​​4r * 2r.

len(hpm)/((xsize * xsize/2.) * (2. * np.pi/8.)) * np.sum(img[img > 0]) 

Wenn xsize = 100, wird die Summe 27.380 werden; wenn xsize = 1000, ist die Näherung viel besser, bei 29.981; wenn xsize = 10000, wird der Gesamtfluss 29.988.

Eine alternative Art und Weise Sie eine gute Annäherung zu geben, ist das Verhältnis der Anzahl der nicht -inf Pixel in img auf die Anzahl der Pixel in der Karte zu berechnen (die 768 für nside=8 ist):

float(len(hpm))/float(np.sum(img>=0)) * np.sum(img[img>0]) 

Bei xsize = 100, 1000, 10000 wird der Fluss bei 28.295, 30.075, 29.998 liegen.