Aus erstelltem Python File Funktion erstellen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vdv84
User
Beiträge: 19
Registriert: Montag 20. Januar 2014, 00:06

Hallo,

ich stehe vor folgendem Problem:
Ich habe den folgenden Python File erstellt, womit ich die Parameter eines Planeten herausfinden kann, nun möchte aus dieser Abfolge von Befehlen eine Funktion definieren, die ich in anderen Files als Modul importieren kann. Und zwar möchte ich diese Funktion für eine Vielzahl von Planeten durchführen lassen.

Den ausgewählten Planeten rufe ich mit nobj=x auf (Zeile 10):

Vielen Dank für jede Art von Hilfestellung, viele Grüße

vdv84

Code: Alles auswählen

# -*- coding: utf-8 -*-
from PyAstronomyKepler import keplerAccess as ka
import matplotlib.pylab as mpl
import numpy as np

kdb=ka.KeplerDB()
kpc=ka.KeplerPlanCan()
ac=kpc.getAllCandidates()

nobj=4
print "ac[nobj]", ac[nobj] #anders zu readKepler_3
nplanets = len(ac)
print "nplanets", nplanets

klc=ka.KeplerMultiLC(ac[nobj])
lcd=klc.getLCData(kid=ac[nobj], quarter=3, slc=True, cols=["TIME", "PDCSAP_FLUX"], verbose=False)
#anders zu readKepler_3

print len(lcd)
print lcd[0][:,1]

c=kpc.getCandidateInfo(kid=ac[nobj]) #anders zu readKepler_3
print c
print "bjdT0", c[0]["bjdT0"]
print "period", c[0]["period"]

t0=c[0]["bjdT0"]
print "t0", t0
P=c[0]["period"]
print "P", P
a=c[0]["a\\rs"]
print "a in RS", a
b=c[0]["b"]
print "b", b
RS=c[0]["rs"]
print "RS in R*", RS
ibo=np.arccos(b/a)
print "inc in Bogenmaß", ibo
inc=ibo/(2*np.pi)*360.
print "inc in Grad", inc
p=c[0]["rp\\rs"]
print "p=PR/SR", p
dur=c[0]["dur"]
print "dur in h", dur



for i in range(len(lcd)):
  x=lcd[i][:,0]
  y=lcd[i][:,1]
  
  print "xmax, xmin", x.max(),x.min()
  ntransit=np.ceil((x[-1]-x[0])/P)
  print "ntransit", ntransit
  transit_offset=np.ceil((x.min()-t0)/P)
  print "transit_off", transit_offset
  xtransit=(np.arange(ntransit)+transit_offset)*P+t0
  xdelta=c[0]["dur"]/48. #anders zu readKepler_3 (dur in h, x in days, dur kompletter transit)
  print "xdelta", xdelta
  
  #a) 1. Weg Transits entfernen
  xwot=x
  ywot=y
  for xt in xtransit:
    ind=np.where(np.logical_and(xwot >= xt-xdelta, xwot <= xt+xdelta))[0]
    #mpl.plot(x[ind], y[ind], 'ks', markersize=3)
    xwot=np.delete(xwot,ind)
    ywot=np.delete(ywot,ind)
  print "xtransit", xtransit
  #anders zu readKepler_3
  #mpl.plot(xwot, ywot, 'ms', markersize=7)
  
  #b) 2. Weg Transits entfernen
  #xwot=x
  #ywot=y
  #for xt in xtransit:
    #ind=np.where(np.logical_or(xwot <= xt-xdelta, xwot >= xt+xdelta))[0]
    #xwot=xwot[ind]
    #ywot=ywot[ind]
  #mpl.plot(xwot, ywot, 'ms', markersize=7)
  
  #mpl.plot(x, y)
  #mpl.show()
  #continue
  #exit()
  
  #fit für inaktive Sterne
  #reg=np.polyfit(xwot, ywot, 2)
  #fit=np.polyval(reg, x)
  #fitwot=np.polyval(reg,xwot)
  #res=ywot-fitwot
  #std=np.std(res)
  #ausr=np.where(np.logical_or(res >= 3*std, res <= -3*std))[0]
  ##mpl.plot(xwot, ywot)
  ##mpl.plot(xwot[ausr], res[ausr], 'mp')
  #xwotwoa=np.delete(xwot, ausr)
  #ywotwoa=np.delete(ywot, ausr)
  #regbest=np.polyfit(xwotwoa, ywotwoa, 2)
  #fitbest=np.polyval(regbest, x)
  #mpl.plot(xwotwoa, fitbest, "r-")
  #mpl.plot(x, fit, "r-")
  #mpl.show()
    
  #fit für aktive Sterne
  #xwota=x
  #ywota=y
  indtransits=[]
  for xtact1 in xtransit:
    indtransitandcon=np.where(np.logical_and(x >= xtact1-1.5*xdelta, x <= xtact1+1.5*xdelta))[0]
    indtransits.extend(indtransitandcon)
    #xwota=np.delete(xwota, indtransitandcon)
    #ywota=np.delete(ywota, indtransitandcon)
    #xtransitandcon=np.append(x, indtransitandcon)
    #ytransitandcon=np.append(y, indtransitandcon)
    #
    #mpl.show()
  xtransitandcon=x[indtransits]
  ytransitandcon=y[indtransits]
#mpl.plot(xtransitandcon, ytransitandcon, "b")
#mpl.show()
#mpl.plot(x, y)
#mpl.show()
#exit()
  
xonlycon=xtransitandcon
yonlycon=ytransitandcon
for xtact2 in xtransit:
  indonlytran=np.where(np.logical_and(xonlycon >= xtact2-xdelta, xonlycon <= xtact2+xdelta))
  xonlycon=np.delete(xonlycon, indonlytran)
  yonlycon=np.delete(yonlycon, indonlytran)
  #regact=np.polyfit(xonlycon, yonlycon, 2)
  #fitact=np.polyval(regact, xonlycon)
  #yonlycon /= fitact
  #mpl.plot(xonlycon, yonlycon, "gp")
  #mpl.show()
#exit()

xnorm=xtransitandcon
ynorm=ytransitandcon
yerr = np.zeros(ynorm.size)

for xtact3 in xtransit:
  contind=np.where(np.logical_and(xonlycon > xtact3-3*xdelta, xonlycon < xtact3+3*xdelta))
  if len(contind[0]) == 0: continue
  regact=np.polyfit(xonlycon[contind], yonlycon[contind], 2)

  ind=np.where(np.logical_and(xtransitandcon > xtact3-3*xdelta, xtransitandcon < xtact3+3*xdelta))  
  fitact=np.polyval(regact, xtransitandcon[ind])  
  ynorm[ind] /= fitact
  #mpl.plot(xtransitandcon, ynorm)
  #mpl.show()
  
  res=ynorm[contind]-1.0
  std=np.std(res)
  yerr[ind] += std
  
  #indau=np.where(np.logical_or(res >= 1.5*std, res <= -1.5*std))[0]
  #indnorm=np.delete(ind, indau)
  #xonlyconwoa=np.delete(xonlycon, indau)
  #yonlyconwoa=np.delete(yonlycon, indau)
  #regactwoa=np.polyfit(xonlyconwoa, yonlyconwoa, 2)
  #fitactwoa=np.polyval(regactwoa, xnorm[indnorm])
  #ynorm[indnorm] /= fitactwoa
  
#mpl.errorbar(xnorm, ynorm, yerr=yerr, fmt='bp', ms=2)
#mpl.show()
#exit()


#mpl.plot(x, y)
#mpl.show()
#exit()

  #ywot /= np.median(ywot)
  #for k in in range(len(x))
    #ysteig=(y[-1]-y[0])/(x[-1]-x[0])*x
    #y /= ysteig
  
  #mpl.plot(x, y)
  #for j in range(len(xtransit)): mpl.axvline(xtransit[j])
  #mpl.plot(xtransit, ytransit, color='k')
  #mpl.xlabel('time')
  #mpl.ylabel('flux')
  #mpl.title('Lichtkurve von kid=ac[0]')
  #mpl.xlim(0, 10)
  #mpl.ylim(-1.5, 2.0)
#mpl.show()








# ... and now the forTrans module
from PyAstronomy.modelSuite import forTrans as ft
# Load a simple timer for demonstration purposes
import time as timerMod

# Create MandelAgolLC object
ma = ft.MandelAgolLC()

# Set parameters
ma["per"] = P
#ma["i"] = 90.0
ma["i"] = inc
ma["a"] = a
ma["T0"] = float(t0)
ma["p"] = p #0.3
ma["linLimb"] = 0.5
ma["quadLimb"] = 0.5
ma["b"] = 0.

# Choose some (large) time axis
time = xnorm
#time = np.arange(xnorm.min(),xnorm.max(),.01)

# ... and calculate model
y = ma.evaluate(time)
#y += np.random.normal(0.,.01,time.size)
#yerr=np.ones(time.size)*.01

# Let's see what happened ...
#mpl.errorbar(time, y, yerr=yerr, fmt='kp', markersize=2)
#mpl.show()

ma.thaw(["per","T0","linLimb","quadLimb","a","i","p"])
ma.fit(time,ynorm,yerr=yerr, maxiter=1e4, maxfun=1e4, xtol=1e-8, ftol=1e-8)
ma.parameterSummary()
fit=ma.evaluate(time)

mpl.errorbar(xnorm, ynorm, yerr=yerr, fmt='bp', ms=2)
mpl.plot(time, y, 'rp', ms=2)
#mpl.hist(ynorm-y)
mpl.show()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@vdv84: da Du sowieso keine Befehle auf Modulebene ausführen solltest, packst Du alles in eine Funktion, identifizierst die Parameter (nobj) und die Rückgabewerte.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Respekt, soviel Code ohne ein vernünftiges Tutorial gelesen zu haben.
Du hast es doch bereits selbst gesagt, glieder den Kram in Funktionen und steuere deine Wahl durch einen Parameter.
Dein Code will ich mir nicht antun, neben krypt. Namen alles auf Modulebene und Leer- und Kommentarzeilen zum ertrinken.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
vdv84
User
Beiträge: 19
Registriert: Montag 20. Januar 2014, 00:06

Hallo,

schon mal danke für die Antworten. Ich habe daraus jetzt eine Schleife gemacht, das funktioniert auch soweit. Jetzt stehe ich aber vor dem nächsten Problem:
Ich möchte mit der Definition von "kepid" die Indizes der Objekte die diese Werte in der Liste "ac" annehmen, in eine neue Liste "kepind" einfügen und danach nur diese Indizes für nobj in der Schleife durchlaufen lassen.
Wie kann ich dabei von mehreren Werten gleichzeitig die Indizes erhalten, so dass nobj genau diese in der Schleife durchläuft? (Zeile 11-15)

Wenn ich mehrere Werte für kepid eingebe bekomme ich die Fehlermeldung:
ValueError: (11446443, 8554498) is not in list

Wenn ich nur einen Wert einfüge stoppt er aber gleich zu beginn der Schleife mit:
Traceback (most recent call last):
File "readKepler_ac4_mit_ma.py", line 15, in <module>
for nobj in kepind:
TypeError: 'int' object is not iterable


Hier dazu nochmal der Code bis zum Beginn der Schleife wie weit ich bis jetzt bin:

Code: Alles auswählen

# -*- coding: utf-8 -*-
from PyAstronomyKepler import keplerAccess as ka
import matplotlib.pylab as mpl
import numpy as np

kdb=ka.KeplerDB()
kpc=ka.KeplerPlanCan()
ac=kpc.getAllCandidates()
#print "ac", ac

kepid=8554498
kepind=ac.index(kepid)
print "kepind", kepind
print "ac[kepind]", ac[kepind]
for nobj in kepind:
  print "ac[nobj]", ac[nobj] #anders zu readKepler_3
  nplanets = len(ac)
  print "nplanets", nplanets

  klc=ka.KeplerMultiLC(ac[nobj])
  lcd=klc.getLCData(kid=ac[nobj], quarter=3, slc=True, cols=["TIME", "PDCSAP_FLUX"], verbose=False)
Vielen Dank und viele Grüße
vdv84
vdv84
User
Beiträge: 19
Registriert: Montag 20. Januar 2014, 00:06

ich hab dazu gerade versucht nochmal eine extra schleife für die indizes die ich haben will zu erstellen, bekomme dafür aber auch wieder eine fehlermeldung:

Code: Alles auswählen

kepid=[11446443, 8554498]
kepind=[]
for k in kepid:
  kind=ac.index(k)
  kepind.extend(kind)
print "kepind", kepind
print "ac[kepind]", ac[kepind]

for nobj in kepind:
  print "ac[nobj]", ac[nobj] #anders zu readKepler_3
  nplanets = len(ac)
  print "nplanets", nplanets

  klc=ka.KeplerMultiLC(ac[nobj])
Traceback (most recent call last):
File "readKepler_ac4_mit_ma.py", line 16, in <module>
kepind.extend(kind)
TypeError: 'int' object is not iterable

line 16 entspricht hier line 5
BlackJack

@vdv84: Mach Dir mal den Unterschied zwischen den Methoden `append()` und `extend()` auf Listen klar. Was die jeweils für einen Datentyp/Verhalten beim Argument erwarten und was das Ergebnis von dem jeweiligen Aufruf ist.
vdv84
User
Beiträge: 19
Registriert: Montag 20. Januar 2014, 00:06

ok, danke
ich habs hinbekommen.
Antworten