-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmanualFit.py
242 lines (231 loc) · 9.62 KB
/
manualFit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#!/usr/bin/env python
import os,shutil
import fileio,abund,fit,config,param,fit
from pyspec.spectrum import spectrum
from glob import glob
#import pylab,matplotlib
import numpy as np
import uuid
#from matplotlib.backends.backend_pdf import PdfPages
#origspec=spectrum('origspect.dat')
#ficaBin=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'bin/bin/fica.exe')
#useMachines=['mithrandir-local']
#fig=pylab.figure(1)
import elauncher
def runManual(param, gateways=None):
if gateways==None:
gateways = elauncher.gateways()
runPath = os.path.join(os.getcwd(), uuid.uuid4().hex)
param.targetDir = runPath
model = elauncher.cloudLaunch([param,], gateways.getAvailGateWays())
return model[0]
def saveOldFit():
os.system('cp spct.dat spct.old')
os.system('cp dica.dat dica.old')
os.system('cp comp.ind comp.old')
def onAtom(event):
# print event.xdata,event.ydata,event.key
if event.key=='a': printLines(event.xdata)
def printLines(wl,sample=80):
id=getLastID()
llist=getHistLList(id)
min,max=llist['shift'].searchsorted(wl-sample),llist['shift'].searchsorted(wl+sample)
llistSample=llist[min:max]
sortedID=np.argsort(llistSample)
print "------------------------------------------------"
for id in sortedID[::-1]:
print '%.3f %.3f %.3f %s %s'%tuple(llistSample[['eqw','shift','rest','atom','ion']][id])
print "------------------------------------------------"
def printCurMerits():
id=getLastID()
aSpec=getHistSpec(id)
aSpecOld=getHistSpec(id-1)
divSpec=origspec/aSpec
divSpecOld=origspec/aSpecOld
subSpec=fit.getSubSpec(aSpec,origspec)
subSpecOld=fit.getSubSpec(aSpecOld,origspec)
checkElements=['Ni','Co','Fe','Ca','Ti','Cr','Si','S','O','C','Mg']
#checkIons=[[]]
print "General integral: %s last: %s"%(fit.getDiffIntBin(subSpec,1)[1],fit.getDiffIntBin(subSpecOld,1)[1])
print "Integral slope: %s last: %s"%(fit.getIntSlope(subSpec),fit.getIntSlope(subSpecOld))
print "UV excess: %s last: %s"%(fit.getUVInt(subSpec),fit.getUVInt(subSpecOld))
print "UV comparison (UV to optical): %s last: %s"%(fit.getUVIntComp(subSpec),fit.getUVIntComp(subSpecOld))
print "---------------- Element Ratios --------"
for element in checkElements:
try:
print "Element %s: %.5f last: %.5f "%(element,getElementMerit(element,divSpec,threshold=0),getElementMerit(element,divSpecOld,threshold=0,id=id-1))
except Exception as inst:
print "Problem getting %s merit: %s"%(element,inst)
print "________________ Ion Ratios ------------"
def runElementRatio(dica,comp,element,ratios=[0.5,2],ax=None):
abundance=comp[element]
ratioSpec=[]
for ratio in ratios+[1]:
comp[element]=ratio*abundance
runManual(dica,comp,origspec,backup=False)
ratioSpec.append(spectrum('spct.dat',usecols=(0,2)))
if ax==None:
fig=pylab.figure(1)
fig.clf()
ax=fig.add_subplot(111)
ax.plot(origspec.x,origspec.y,lw=3,color='blue')
for ratio,spec in zip(ratios+[1],ratioSpec):
ax.plot(spec.x,spec.y,label='%s = %s'%(element,ratio*abundance))
ax.legend()
def runMultiElement(dica,comp,elements=['Ni0','Fe0','Si','S','Ti','C','Mg'],ratios=[0.5,2],output='multi_element.pdf'):
pdf = PdfPages(output)
fig=pylab.figure(1)
for element in elements:
print '----------------------------------------------------------------'
print "Doing Element %s"%element
os.sytem('growlnotify -m Doing Element %s'%element)
fig.clf()
ax=fig.add_subplot(111)
runElementRatio(dica,comp,element,ratios,ax=ax)
fig.savefig(pdf,format='pdf')
pdf.close()
os.sytem('growlnotify --sticky -m Done with multielement')
def getElementMerit(element,divSpec,threshold=5,samples=np.array([0.,30.]),id=None):
if id==None: id=getLastID()
llist=getHistLList(id)
cont=divSpec.fitContinuum(func='poly5')
normDivSpec=divSpec/cont
selLList=llist[llist['atom']==element.upper()]
selLList=selLList[selLList['eqw']>threshold]
if selLList.size==0: raise Exception('No lines found to build merit')
lineMerit=[]
eqwWeights=[]
for line in selLList:
sampleSlice=slice(*(line[1]+samples))
#print element.lower()
if element.lower()=='ca':
caSample=np.array([-60,0])
# print "Ca is a special element and will be treated specially:"
# print "Integrating sample %s"%(line[1]+caSample)
sampleSlice=slice(*(line[1]+caSample))
if divSpec.x.min()<sampleSlice.start and divSpec.x.max()>sampleSlice.stop:
lineMerit.append(np.median(normDivSpec[sampleSlice].y))
eqwWeights.append(line[0])
if len(lineMerit)==0: raise Exception('All lines outside of the observed spectrum')
return np.average(lineMerit,weights=eqwWeights)
def getIonMerit(element,ion,divSpec,threshold=5,samples=np.array([0.,30.]),llist=None):
if llist==None: llist=getCurLList()
cont=divSpec.fitContinuum(func='poly5')
normDivSpec=divSpec/cont
selLList=llist[llist['atom']==element.upper()]
selLList=selLList[selLList['ion']==ion.upper()]
selLList=selLList[selLList['eqw']>threshold]
if selLList.size==0: raise Exception('No lines found to build merit')
lineMerit=[]
eqwWeights=[]
for line in selLList:
sampleSlice=slice(*(line[1]+samples))
if divSpec.x.min()<sampleSlice.start and divSpec.x.max()>sampleSlice.stop:
lineMerit.append(np.median(normDivSpec[sampleSlice].y))
eqwWeights.append(line[0])
return np.average(lineMerit,weights=eqwWeights)
def plotHist(id=None):
if id==None:
id=getLastID()
aspec=getHistSpec(id)
aspecOld=getHistSpec(id-1)
fig=pylab.figure(1)
fig.clf()
ax=fig.add_subplot(111)
ax.plot(origspec.x,origspec.y,'k')
ax.plot(aspec.x,aspec.y,'r')
ax.plot(aspecOld.x,aspecOld.y,'g')
def plotElement(element,threshold=5,cmap=None,alpha=0.5):
llist=getCurLList()
selLList=llist[llist['atom']==element.upper()]
ax=pylab.gca()
normfunc=matplotlib.colors.LogNorm()
normColors=normfunc(selLList['eqw'])
for i,line in enumerate(selLList):
if line['eqw']<threshold: continue
ax.axvline(line['shift'],alpha=alpha,lw=4,color=cmap(normColors[i]))
pylab.get_current_fig_manager().canvas.draw()
def plotCur():
aspec=getCurSpectrum()
fig=pylab.figure(1)
fig.clf()
ax=fig.add_subplot(111)
ax.plot(origspec.x,origspec.y,'k')
ax.plot(aspec.x,aspec.y,'r')
def setElemAbundNormToO(comp,elem,abund):
comp=comp.copy()
oldElemAbundance=comp[elem]
deltaElemAbundance=oldElemAbundance-abund
comp['O']+=deltaElemAbundance
comp[elem]=abund
return comp
def getCurLList():
id=getLastID()
#sbib=fileio.sbibfile('sbib.dat').read_data()
return getHistLList(id)
def getCurSpectrum():
return spectrum('spct.dat',usecols=(0,2))
def getHistSpec(id):
return spectrum('hist/spct.bak%04d'%id,usecols=(0,2))
def printHist(dicaKeys=['log_lbol','v_ph'],compKeys=['Fe0','Fe','Ni0','Si','S','Cr','Ti','Mg'],max=10):
#dica=fileio.dicafile('dica.dat').read_data()
#comp=fileio.compfile('comp.ind').read_data()
#print comp
dicaStr=['%s=%s'%item for item in dica.items() if item[0] in dicaKeys]
compStr=['%s=%s'%item for item in comp.items() if item[0] in compKeys]
#print 'Current: '+' '.join(dicaStr+compStr)
#print '------------------------------------'
dicaFiles=glob('hist/dica.bak????')
compFiles=glob('hist/comp.bak????')
dicaFiles.sort()
compFiles.sort()
for dicaFile,compFile in zip(dicaFiles,compFiles)[::-1][:max]:
id=int(dicaFile[-4:])
dica=fileio.dicafile(dicaFile).read_data()
comp=fileio.compfile(compFile).read_data()
#print comp
dicaStr=['%s=%s'%item for item in dica.items() if item[0] in dicaKeys]
compStr=['%s=%s'%item for item in comp.items() if item[0] in compKeys]
print 'id=%s |'%id+' '.join(dicaStr+compStr)
def backupFit(id=None):
#backupFiles=['dica.dat', 'comp.ind', 'spct.dat', 'sbib.dat', 'stst.dat','yhea.dat']
backupFiles=['dica.dat','comp.ind','stst.dat', 'diagn.dat', 'yhea.dat', 'lhea.dat', 'spcp.dat', 'sica.dat', 'eica.dat', 'spct.dat', 'atmd.oud', 'ptfn.dat', 'taul.dat', 'sbib.dat']
if id==None:
files=glob('hist/dica.bak????')
if files==[]: id=1
else: id=max([int(item[-4:]) for item in files])+1
for iFile in backupFiles:
try:
print "Copying %s to %s"%(iFile,'hist/%s.bak%04d'%(iFile[:-4],id))
shutil.move(iFile,'hist/%s.bak%04d'%(iFile[:-4],id))
except:
print "Had trouble copying %s"%iFile
return id
def getLastID():
files=glob('hist/dica.bak????')
return max([int(item[-4:]) for item in files])
def getHistComp(id):
compData=fileio.compfile('hist/comp.bak%04d'%id).read_data()
return param.comp(compData)
def getHistDica(id):
dicaData=fileio.dicafile('hist/dica.bak%04d'%id).read_data()
return param.dica(dicaData)
def getHistLList(id):
sbib=fileio.sbibfile('hist/sbib.bak%04d'%id).read_data()
return sbib['llist']
def getLastComp():
id=getLastID()
return getHistComp(id)
def getLastDica():
id=getLastID()
return getHistDica(id)
def getPrevDica():
dicaFile=os.path.join(config.getLastMainDir(),'manual','dica.dat')
dica=fileio.dicafile(dicaFile).read_data()
print "Time=%s"%config.getTimeFromExplosion()
dica['t']=config.getTimeFromExplosion()
return dica
def getPrevComp():
compFile=os.path.join(config.getLastMainDir(),'manual','comp.ind')
comp=param.comp(fileio.compfile(compFile).read_data())
return comp