def intensityRatio(self, wvlRange=None, wvlRanges=None, top=10): """ Plot the ratio of 2 lines or sums of lines. Shown as a function of density and/or temperature. For a single wavelength range, set wvlRange = [wMin, wMax] For multiple wavelength ranges, set wvlRanges = [[wMin1,wMax1],[wMin2,wMax2], ...] A plot of relative emissivities is shown and then a dialog appears for the user to choose a set of lines. """ # # self.Emiss={"temperature":temperature,"density":density,"wvl":wvl,"emiss":em, # "plotLabels":plotLabels} # # if not hasattr(self, 'Intensity'): try: self.intensity() except: print( ' intensities not calculated and emiss() is unable to calculate them' ) print(' perhaps the temperature and/or eDensity are not set') return # # everything in self.Intensity should be a numpy array # intens = copy.copy(self.Intensity) intensity = intens['intensity'] # # fontsize = 14 # # temperature = self.Temperature eDensity = self.EDensity temperature = self.Temperature intensity = intens['intensity'] # # temp=np.asarray(temperature,'Float32') ntemp = temperature.size if ntemp > 0: if temperature[0] == temperature[-1]: ntemp = 1 # ndens = eDensity.size if ndens > 0: if eDensity[0] == eDensity[-1]: ndens = 1 # print(' ndens = %5i ntemp = %5i' % (ndens, ntemp)) ionS = intens['ionS'] # see if we are dealing with more than a single ion ionSet = set(ionS) ionNum = len(ionSet) wvl = intens["wvl"] # plotLabels = intens["plotLabels"] # xLabel = plotLabels["xLabel"] # yLabel = plotLabels["yLabel"] # # find which lines are in the wavelength range if it is set # # if wvlRange: igvl = util.between(wvl, wvlRange) if len(igvl) == 0: print('no lines in wavelength range %12.2f - %12.2f' % (wvlRange[0], wvlRange[1])) return elif wvlRanges: igvl = [] for awvlRange in wvlRanges: igvl.extend(util.between(wvl, awvlRange)) if len(igvl) == 0: print('no lines in wavelength ranges specified ') return else: igvl = range(len(wvl)) # nlines = len(igvl) # # print ' nlines = ',nlines # print ' iglv = ',igvl igvl = np.take(igvl, wvl[igvl].argsort()) # find the top most intense lines # if top > nlines: top = nlines # maxIntens = np.zeros(nlines, 'Float64') for iline in range(nlines): maxIntens[iline] = intensity[:, igvl[iline]].max() for iline in range(nlines): if maxIntens[iline] == maxIntens.max(): maxAll = intensity[:, igvl[iline]] # line=range(nlines) igvlsort = np.take(igvl, np.argsort(maxIntens)) # print 'igvlsort = ', igvlsort topLines = igvlsort[-top:] # print ' topLines = ', topLines maxWvl = '%5.3f' % wvl[topLines[-1]] # maxline=topLines[-1] # topLines = topLines[wvl[topLines].argsort()] # # # need to make sure there are no negative values before plotting good = intensity > 0. intensMin = intensity[good].min() bad = intensity <= 0. intensity[bad] = intensMin # # # ntemp=self.Temperature.size # # ndens=self.EDensity.size # ylabel = 'Emissivity relative to ' + maxWvl if ionNum == 1: title = self.Spectroscopic else: title = '' # # if ndens == 1 and ntemp == 1: print(' only a single temperature and eDensity') return elif ndens == 1: xlabel = 'Temperature (K)' xvalues = self.Temperature outTemperature = self.Temperature # outDensity=np.zeros(ntemp,'Float64') # outDensity.fill(self.EDensity[0]) outDensity = self.EDensity desc_str = ' Density = %10.2e (cm)$^{-3}$' % self.EDensity[0] elif ntemp == 1: xvalues = self.EDensity # outTemperature=np.zeros(ndens,'Float64') # outTemperature.fill(self.Temperature[0]) outTemperature = self.Temperature outDensity = self.EDensity xlabel = r'$\rm{Electron Density (cm)^{-3}}$' desc_str = ' Temp = %10.2e (K)' % self.Temperature[0] else: outTemperature = self.Temperature outDensity = self.EDensity xlabel = 'Temperature (K)' xvalues = self.Temperature desc_str = ' Variable Density' # # put all actual plotting here # pl.ion() # if chInteractive: # pl.ion() # else: # pl.ioff() # # maxAll is an array ymax = np.max(intensity[:, topLines[0]] / maxAll) ymin = ymax pl.figure() ax = pl.subplot(111) nxvalues = len(xvalues) for iline in range(top): tline = topLines[iline] pl.loglog(xvalues, intensity[:, tline] / maxAll) if np.min(intensity[:, tline] / maxAll) < ymin: ymin = np.min(intensity[:, tline] / maxAll) if np.max(intensity[:, tline] / maxAll) > ymax: ymax = np.max(intensity[:, tline] / maxAll) skip = 2 start = divmod(iline, nxvalues)[1] for ixvalue in range(start, nxvalues, nxvalues // skip): if ionNum == 1: text = '%10.4f' % (wvl[tline]) else: text = '%s %10.4f' % (ionS[tline], wvl[tline]) pl.text(xvalues[ixvalue], intensity[ixvalue, tline] / maxAll[ixvalue], text) pl.xlim(xvalues.min(), xvalues.max()) # pl.ylim(ymin, ymax) pl.xlabel(xlabel, fontsize=fontsize) pl.ylabel(ylabel, fontsize=fontsize) if ndens == ntemp and ntemp > 1: pl.text(0.07, 0.5, title, horizontalalignment='left', verticalalignment='center', fontsize=fontsize, transform=ax.transAxes) # ax2 = pl.twiny() xlabelDen = r'Electron Density (cm$^{-3}$)' pl.xlabel(xlabelDen, fontsize=fontsize) pl.loglog(eDensity, intensity[:, topLines[top - 1]] / maxAll, visible=False) ax2.xaxis.tick_top() pl.ylim(ymin / 1.2, 1.2 * ymax) else: pl.ylim(ymin / 1.2, 1.2 * ymax) pl.title(title + desc_str, fontsize=fontsize) pl.draw() # need time to let matplotlib finish plotting time.sleep(0.5) # # get line selection # selectTags = [] for itop in topLines: if ionNum == 1: selectTags.append(str(wvl[itop])) else: selectTags.append(ionS[itop] + ' ' + str(wvl[itop])) # # numden = chGui.gui.choice2Dialog(wvl[topLines]) numden = chGui.gui.choice2Dialog(selectTags) # # num_idx and den_idx are tuples # num_idx = numden.numIndex if len(num_idx) == 0: print(' no numerator lines were selected') return # den_idx = numden.denIndex if len(den_idx) == 0: print(' no denominator lines were selected') return # numIntens = np.zeros(len(xvalues), 'Float64') for aline in num_idx: numIntens += intensity[:, topLines[aline]] # denIntens = np.zeros(len(xvalues), 'Float64') for aline in den_idx: denIntens += intensity[:, topLines[aline]] # # plot the desired ratio # maxAll is an array pl.figure() ax = pl.subplot(111) pl.loglog(xvalues, numIntens / denIntens) pl.xlim(xvalues.min(), xvalues.max()) pl.xlabel(xlabel, fontsize=fontsize) pl.ylabel('Ratio (' + self.Defaults['flux'] + ')', fontsize=fontsize) if ionNum == 1: desc = ionS[0] else: desc = '' for aline in num_idx: if ionNum == 1: desc += ' ' + str(wvl[topLines[aline]]) else: desc += ' ' + ionS[topLines[aline]] + ' ' + str( wvl[topLines[aline]]) desc += ' / ' for aline in den_idx: if ionNum == 1: desc += ' ' + str(wvl[topLines[aline]]) else: desc += ' ' + ionS[topLines[aline]] + ' ' + str( wvl[topLines[aline]]) if ndens == ntemp and ntemp > 1: pl.text(0.07, 0.5, desc, horizontalalignment='left', verticalalignment='center', fontsize=fontsize, transform=ax.transAxes) # ax2 = pl.twiny() xlabelDen = r'Electron Density (cm$^{-3}$)' pl.xlabel(xlabelDen, fontsize=fontsize) pl.loglog(eDensity, numIntens / denIntens, visible=False) ax2.xaxis.tick_top() else: # pl.ylim(ymin, ymax) pl.title(desc, fontsize=fontsize) # desc=title+' '+str(wvl[num_line])+' / '+str(wvl[den_line])+' '+desc_str # pl.title(desc, fontsize=fontsize) # pl.title(title+' '+str(wvl[num_line])+' / '+str(wvl[den_line])+' '+desc_str,fontsize=fontsize) # pl.draw() # pl.ioff() # pl.show() # # intensityRatioFileName=self.IonStr # for aline in num_idx: # intensityRatioFileName+= '_%3i'%(wvl[topLines[aline]]) # intensityRatioFileName+='_2' # for aline in den_idx: # intensityRatioFileName+= '_%3i'%(wvl[topLines[aline]]) cnt = desc.count(' ') intensityRatioFileName = desc.replace(' ', '_', cnt) + '.rat' intensityRatioFileName = intensityRatioFileName.lstrip('_').replace( '_/_', '-') self.IntensityRatio = { 'ratio': numIntens / denIntens, 'desc': desc, 'temperature': outTemperature, 'eDensity': outDensity, 'filename': intensityRatioFileName, 'numIdx': num_idx, 'denIdx': den_idx }
def intensityList(self, index=-1, wvlRange=None, wvlRanges=None, top=10, relative=0, outFile=0): ''' List the line intensities wvlRange, a 2 element tuple, list or array determines the wavelength range Top specifies to plot only the top strongest lines, default = 10 normalize = 1 specifies whether to normalize to strongest line, default = 0 rewrite of emissList ''' # # if not hasattr(self, 'Intensity'): try: self.intensity() except: print( ' intensities not calculated and emiss() is unable to calculate them' ) print(' perhaps the temperature and/or eDensity are not set') return # # everything in self.Intensity should be a numpy array # # # temperature = self.Temperature eDensity = self.EDensity # ndens = eDensity.size ntemp = temperature.size # # intens = copy.deepcopy(self.Intensity) intensity = intens['intensity'] ionS = intens['ionS'] wvl = intens['wvl'] lvl1 = intens['lvl1'] lvl2 = intens['lvl2'] pretty1 = intens['pretty1'] pretty2 = intens['pretty2'] obs = intens['obs'] avalue = intens['avalue'] # if ndens == 1 and ntemp == 1: dstr = ' - Density = %10.2e (cm$^{-3}$)' % (eDensity) tstr = ' - T = %10.2e (K)' % (temperature) elif ndens == 1 and ntemp > 1: if index < 0: index = ntemp / 2 print('using index = %5i specifying temperature = %10.2e' % (index, temperature[index])) self.Message = 'using index = %5i specifying temperature = %10.2e' % ( index, temperature[index]) intensity = intensity[index] elif ndens > 1 and ntemp == 1: if index < 0: index = ntemp / 2 print('using index =%5i specifying eDensity = %10.2e' % (index, eDensity[index])) self.Message = 'using index =%5i specifying eDensity = %10.2e' % ( index, eDensity[index]) intensity = intensity[index] elif ndens > 1 and ntemp > 1: if index < 0: index = ntemp / 2 print( 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e' % (index, temperature[index], eDensity[index])) self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e' % ( index, temperature[index], eDensity[index]) intensity = intensity[index] # # print('shpae of intensity 0 = %5i %5i'%(intensity.shape)) # if wvlRange: wvlIndex = util.between(wvl, wvlRange) elif wvlRanges: wvlIndex = [] for awvlRange in wvlRanges: wvlIndex.extend(util.between(wvl, awvlRange)) else: wvlIndex = range(wvl.size) # # get lines in the specified wavelength range # # print('shpae of intensity 1 = %5i %5i'%(intensity.shape)) # intensity = intensity[wvlIndex] ionS = ionS[wvlIndex] wvl = wvl[wvlIndex] lvl1 = lvl1[wvlIndex] lvl2 = lvl2[wvlIndex] avalue = avalue[wvlIndex] pretty1 = pretty1[wvlIndex] pretty2 = pretty2[wvlIndex] obs = obs[wvlIndex] # self.Error = 0 if wvl.size == 0: print('No lines in this wavelength interval') self.Error = 1 self.Message = 'No lines in this wavelength interval' return # elif top == 0: top = wvl.size elif top > wvl.size: top = wvl.size # # sort by intensity # isrt = np.argsort(intensity) ionS = ionS[isrt[-top:]] wvl = wvl[isrt[-top:]] lvl1 = lvl1[isrt[-top:]] lvl2 = lvl2[isrt[-top:]] obs = obs[isrt[-top:]] intensity = intensity[isrt[-top:]] avalue = avalue[isrt[-top:]] pretty1 = pretty1[isrt[-top:]] pretty2 = pretty2[isrt[-top:]] # # print('shpae of intensity 2= %5i %5i'%(intensity.shape)) # # must follow setting top # if relative: intensity = intensity / intensity[:top].max() # # idx = np.argsort(wvl) fmt1 = '%5s %5s %5s %25s - %-25s %12s %12s %12s %3s' fmt = '%5s %5i %5i %25s - %-25s %12.4f %12.3e %12.2e %1s' print(' ') print(' ------------------------------------------') print(' ') print(fmt1 % ('Ion', 'lvl1', 'lvl2', 'lower', 'upper', 'Wvl(A)', 'Intensity', 'A value', 'Obs')) for kdx in idx: print(fmt % (ionS[kdx], lvl1[kdx], lvl2[kdx], pretty1[kdx], pretty2[kdx], wvl[kdx], intensity[kdx], avalue[kdx], obs[kdx])) print(' ') print(' ------------------------------------------') print(' ') # self.Intensity['wvlTop'] = wvl[idx] self.Intensity['intensityTop'] = intensity[idx] if outFile: fmt1a = '%5s %5s %5s %25s - %-25s %12s %12s %12s %3s \n' fmt = '%5s %5i %5i %25s - %-25s %12.4f %12.3e %12.2e %1s \n' outpt = open(outFile, 'w') outpt.write(fmt1a % ('Ion', 'lvl1', 'lvl2', 'lower', 'upper', 'Wvl(A)', 'Intensity', 'A value', 'Obs')) for kdx in idx: outpt.write(fmt % (ionS[kdx], lvl1[kdx], lvl2[kdx], pretty1[kdx], pretty2[kdx], wvl[kdx], intensity[kdx], avalue[kdx], obs[kdx])) outpt.close()
def intensityPlot(self, index=-1, wvlRange=None, top=10, linLog='lin', relative=0, verbose=0, plotFile=0, saveFile=0, em=0): '''Plot the line intensities. wvlRange, a 2 element tuple, list or array determines the wavelength range Top specifies to plot only the top strongest lines, default = 10 linLog specifies a linear or log plot, want either lin or log, default = lin normalize = 1 specifies whether to normalize to strongest line, default = 0''' # title = self.Spectroscopic # if hasattr(self, 'Intensity'): intens = self.Intensity['intensity'] else: try: self.intensity(em=em) intens = self.Intensity['intensity'] except: print( ' emissivities not calculated and emiss() is unable to calculate them' ) print(' perhaps the temperature and/or eDensity are not set') return wvl = self.Intensity['wvl'] temperature = self.Temperature eDensity = self.EDensity # ndens = eDensity.size ntemp = temperature.size # if ndens == 1 and ntemp == 1: dstr = ' - Density = %10.2e (cm$^{-3}$)' % (eDensity) tstr = ' - T = %10.2e (K)' % (temperature) elif ndens == 1 and ntemp > 1: if index < 0: index = ntemp / 2 print('using index = %5i specifying temperature = %10.2e' % (index, temperature[index])) self.Message = 'using index = %5i specifying temperature = %10.2e' % ( index, temperature[index]) # if chInteractive: # print 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) # else: # self.Message = 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) intensity = self.Intensity['intensity'][index] dstr = ' - Density = %10.2e (cm$^{-3}$)' % eDensity tstr = ' - T = %10.2e (K)' % temperature[index] elif ndens > 1 and ntemp == 1: if index < 0: index = ntemp / 2 print('using index =%5i specifying eDensity = %10.2e' % (index, eDensity[index])) self.Message = 'using index =%5i specifying eDensity = %10.2e' % ( index, eDensity[index]) # if chInteractive: # print 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) # else: # self.Message = 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) intensity = self.Intensity['intensity'][index] dstr = ' - Density = %10.2e (cm$^{-3}$)' % eDensity[index] tstr = ' - T = %10.2e (K)' % temperature elif ndens > 1 and ntemp > 1: if index < 0: index = ntemp / 2 print( 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e' % (index, temperature[index], eDensity[index])) self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e' % ( index, temperature[index], eDensity[index]) # if chInteractive: # print 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index]) # else: # self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index]) intensity = self.Intensity['intensity'][index] dstr = ' - Density = %10.2e (cm$^{-3}$)' % eDensity[index] tstr = ' - T = %10.2e (K)' % temperature[index] if type(wvlRange) != type(None): wvlIndex = util.between(wvl, wvlRange) else: wvlIndex = range(wvl.size) intensity = intensity[wvlIndex] wvl = wvl[wvlIndex] # self.Error = 0 if wvl.size == 0: print('No lines in this wavelength interval') self.Error = 1 self.Message = 'No lines in this wavelength interval' # if chInteractive: # print 'No lines in this wavelength interval' # else: # self.Error = 1 # self.Message = 'No lines in this wavelength interval' return elif top == 0: top = wvl.size elif wvl.size > top: intsrt = np.argsort(intensity) wvl = wvl[intsrt[-top:]] intensity = intensity[intsrt[-top:]] else: top = wvl.size # must follow setting top # pl.figure() ylabel = 'intensity' if relative: intensity = intensity / intensity[-1] ylabel += ' (Relative)' # xlabel = 'Wavelength (' + self.Defaults['wavelength'] + ')' # ymin = 10.**(np.log10(intensity[0].min()).round(0) - 0.5) # pl.ion() # if chInteractive: # pl.ion() # else: # pl.ioff() # for idx in range(top): xx = [wvl[idx], wvl[idx]] if linLog == 'lin': yy = [0., intensity[idx]] pl.plot(xx, yy) else: yy = [ymin / 10., intensity[idx]] pl.semilogy(xx, yy) pl.xlabel(xlabel) pl.ylabel(ylabel) pl.title(title + tstr + dstr) if wvlRange: pl.axis([wvlRange[0], wvlRange[1], ymin, intensity.max()]) if plotFile: pl.savefig(plotFile)
def intensityRatio(self,wvlRange=None, wvlRanges=None,top=10): """ Plot the ratio of 2 lines or sums of lines. Shown as a function of density and/or temperature. For a single wavelength range, set wvlRange = [wMin, wMax] For multiple wavelength ranges, set wvlRanges = [[wMin1,wMax1],[wMin2,wMax2], ...] A plot of relative emissivities is shown and then a dialog appears for the user to choose a set of lines. """ # # self.Emiss={"temperature":temperature,"density":density,"wvl":wvl,"emiss":em, # "plotLabels":plotLabels} # # if not hasattr(self, 'Intensity'): try: self.intensity() except: print(' intensities not calculated and emiss() is unable to calculate them') print(' perhaps the temperature and/or eDensity are not set') return # # everything in self.Intensity should be a numpy array # # intens = copy.copy(self.Intensity) # intensity = intens['intensity'] # # fontsize=14 # # temperature = self.Temperature eDensity = self.EDensity temperature = self.Temperature # intensity = intens['intensity'] # # temp=np.asarray(temperature,'Float32') ntemp = temperature.size if ntemp > 0: if temperature[0] == temperature[-1]: ntemp = 1 # ndens = eDensity.size if ndens > 0: if eDensity[0] == eDensity[-1]: ndens = 1 # print(' ndens = %5i ntemp = %5i'%(ndens, ntemp)) ionS = self.Intensity['ionS'] # see if we are dealing with more than a single ion ionSet = set(ionS) ionNum = len(ionSet) wvl = self.Intensity["wvl"] # plotLabels = intens["plotLabels"] # xLabel = plotLabels["xLabel"] # yLabel = plotLabels["yLabel"] # # find which lines are in the wavelength range if it is set # # if wvlRange: igvl=util.between(wvl,wvlRange) if len(igvl) == 0: print('no lines in wavelength range %12.2f - %12.2f'%(wvlRange[0], wvlRange[1])) return elif wvlRanges: igvl = [] for awvlRange in wvlRanges: igvl.extend(util.between(wvl,awvlRange)) if len(igvl) == 0: print('no lines in wavelength ranges specified ') return else: igvl=range(len(wvl)) # nlines=len(igvl) # # print ' nlines = ',nlines # print ' iglv = ',igvl igvl=np.take(igvl,wvl[igvl].argsort()) # find the top most intense lines # if top > nlines: top=nlines # intensity = self.Intensity['intensity'] maxIntens = np.zeros(nlines,'Float64') for iline in range(nlines): maxIntens[iline] = intensity[:, igvl[iline]].max() for iline in range(nlines): if maxIntens[iline]==maxIntens.max(): maxAll=intensity[:, igvl[iline]] # line=range(nlines) igvlsort=np.take(igvl,np.argsort(maxIntens)) # print 'igvlsort = ', igvlsort topLines=igvlsort[-top:] # print ' topLines = ', topLines maxWvl='%5.3f' % wvl[topLines[-1]] # maxline=topLines[-1] # topLines=topLines[wvl[topLines].argsort()] # # # need to make sure there are no negative values before plotting good = intensity > 0. intensMin = intensity[good].min() bad = intensity <= 0. intensity[bad] = intensMin # # # ntemp=self.Temperature.size # # ndens=self.EDensity.size # ylabel='Intensity relative to '+maxWvl if ionNum == 1: title=self.Spectroscopic else: title = '' # # if ndens==1 and ntemp==1: print(' only a single temperature and eDensity') return elif ndens == 1: xlabel='Temperature (K)' xvalues=self.Temperature outTemperature=self.Temperature # outDensity=np.zeros(ntemp,'Float64') # outDensity.fill(self.EDensity[0]) outDensity = self.EDensity desc_str=' Density = %10.2e (cm)$^{-3}$' % self.EDensity[0] elif ntemp == 1: xvalues=self.EDensity # outTemperature=np.zeros(ndens,'Float64') # outTemperature.fill(self.Temperature[0]) outTemperature = self.Temperature outDensity=self.EDensity xlabel=r'$\rm{Electron Density (cm)^{-3}}$' desc_str=' Temp = %10.2e (K)' % self.Temperature[0] else: outTemperature=self.Temperature outDensity=self.EDensity xlabel='Temperature (K)' xvalues=self.Temperature desc_str=' Variable Density' # # put all actual plotting here # pl.ion() # if chInteractive: # pl.ion() # else: # pl.ioff() # # maxAll is an array ymax = np.max(intensity[:, topLines[0]]/maxAll) ymin = ymax pl.figure() ax = pl.subplot(111) nxvalues=len(xvalues) for iline in range(top): tline=topLines[iline] pl.loglog(xvalues,intensity[:, tline]/maxAll) if np.min(intensity[:, tline]/maxAll) < ymin: ymin = np.min(intensity[:, tline]/maxAll) if np.max(intensity[:, tline]/maxAll) > ymax: ymax = np.max(intensity[:, tline]/maxAll) skip=2 start=divmod(iline,nxvalues)[1] for ixvalue in range(start,nxvalues,nxvalues//skip): if ionNum == 1: text = '%10.4f'%(wvl[tline]) else: text = '%s %10.4f'%(ionS[tline], wvl[tline]) pl.text(xvalues[ixvalue], intensity[ixvalue, tline]/maxAll[ixvalue], text) pl.xlim(xvalues.min(),xvalues.max()) # pl.ylim(ymin, ymax) pl.xlabel(xlabel,fontsize=fontsize) pl.ylabel(ylabel,fontsize=fontsize) if ndens == ntemp and ntemp > 1: pl.text(0.07, 0.5,title, horizontalalignment='left', verticalalignment='center', fontsize=fontsize, transform = ax.transAxes) # ax2 = pl.twiny() xlabelDen=r'Electron Density (cm$^{-3}$)' pl.xlabel(xlabelDen, fontsize=fontsize) pl.loglog(eDensity,intensity[:, topLines[top-1]]/maxAll, visible=False) ax2.xaxis.tick_top() pl.ylim(ymin/1.2, 1.2*ymax) else: pl.ylim(ymin/1.2, 1.2*ymax) pl.title(title+desc_str,fontsize=fontsize) pl.draw() # need time to let matplotlib finish plotting time.sleep(0.5) # # get line selection # selectTags = [] for itop in topLines: if ionNum == 1: selectTags.append(str(wvl[itop])) else: selectTags.append(ionS[itop]+ ' '+ str(wvl[itop])) # # numden = chGui.gui.choice2Dialog(wvl[topLines]) numden = chGui.gui.choice2Dialog(selectTags) # # num_idx and den_idx are tuples # num_idx=numden.numIndex if len(num_idx) == 0: print(' no numerator lines were selected') return # den_idx=numden.denIndex if len(den_idx) == 0: print(' no denominator lines were selected') return # numIntens=np.zeros(len(xvalues),'Float64') for aline in num_idx: numIntens += intensity[:, topLines[aline]] # denIntens = np.zeros(len(xvalues),'Float64') for aline in den_idx: denIntens += intensity[:, topLines[aline]] # # plot the desired ratio # maxAll is an array pl.figure() ax = pl.subplot(111) pl.loglog(xvalues,numIntens/denIntens) pl.xlim(xvalues.min(),xvalues.max()) pl.xlabel(xlabel,fontsize=fontsize) pl.ylabel('Ratio ('+self.Defaults['flux']+')',fontsize=fontsize) if ionNum == 1: desc = ionS[0] else: desc = '' for aline in num_idx: if ionNum == 1: desc += ' ' + str(wvl[topLines[aline]]) else: desc += ' ' + ionS[topLines[aline]] + ' ' + str(wvl[topLines[aline]]) desc += ' / ' for aline in den_idx: if ionNum == 1: desc += ' ' + str(wvl[topLines[aline]]) else: desc += ' ' + ionS[topLines[aline]] + ' ' + str(wvl[topLines[aline]]) if ndens == ntemp and ntemp > 1: pl.text(0.07, 0.5,desc, horizontalalignment='left', verticalalignment='center', fontsize=fontsize, transform = ax.transAxes) # ax2 = pl.twiny() xlabelDen=r'Electron Density (cm$^{-3}$)' pl.xlabel(xlabelDen, fontsize=fontsize) pl.loglog(eDensity,numIntens/denIntens, visible=False) ax2.xaxis.tick_top() else: # pl.ylim(ymin, ymax) pl.title(desc,fontsize=fontsize) # desc=title+' '+str(wvl[num_line])+' / '+str(wvl[den_line])+' '+desc_str # pl.title(desc, fontsize=fontsize) # pl.title(title+' '+str(wvl[num_line])+' / '+str(wvl[den_line])+' '+desc_str,fontsize=fontsize) # pl.draw() # pl.ioff() # pl.show() # # intensityRatioFileName=self.IonStr # for aline in num_idx: # intensityRatioFileName+= '_%3i'%(wvl[topLines[aline]]) # intensityRatioFileName+='_2' # for aline in den_idx: # intensityRatioFileName+= '_%3i'%(wvl[topLines[aline]]) cnt = desc.count(' ') intensityRatioFileName = desc.replace(' ', '_', cnt) + '.rat' intensityRatioFileName = intensityRatioFileName.lstrip('_').replace('_/_','-') self.IntensityRatio={'ratio':numIntens/denIntens,'desc':desc, 'temperature':outTemperature,'eDensity':outDensity,'filename':intensityRatioFileName, 'numIdx':num_idx, 'denIdx':den_idx}
def intensityPlot(self, index=-1, wvlRange=None, top=10, linLog='lin', relative=0, verbose=0, plotFile = 0, saveFile=0, em=0 ): '''Plot the line intensities. wvlRange, a 2 element tuple, list or array determines the wavelength range Top specifies to plot only the top strongest lines, default = 10 linLog specifies a linear or log plot, want either lin or log, default = lin normalize = 1 specifies whether to normalize to strongest line, default = 0''' # title=self.Spectroscopic # if hasattr(self, 'Intensity'): intens = self.Intensity['intensity'] else: try: self.intensity(em=em) intens = self.Intensity['intensity'] except: print(' emissivities not calculated and emiss() is unable to calculate them') print(' perhaps the temperature and/or eDensity are not set') return wvl = self.Intensity['wvl'] temperature = self.Temperature eDensity = self.EDensity # ndens = eDensity.size ntemp = temperature.size # if ndens == 1 and ntemp == 1: dstr = ' - Density = %10.2e (cm$^{-3}$)' %(eDensity) tstr = ' - T = %10.2e (K)' %(temperature) elif ndens == 1 and ntemp > 1: if index < 0: index = ntemp/2 print('using index = %5i specifying temperature = %10.2e'%(index, temperature[index])) self.Message = 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) # if chInteractive: # print 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) # else: # self.Message = 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) intensity=self.Intensity['intensity'][index] dstr=' - Density = %10.2e (cm$^{-3}$)' % eDensity tstr=' - T = %10.2e (K)' % temperature[index] elif ndens > 1 and ntemp == 1: if index < 0: index = ntemp/2 print('using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index])) self.Message = 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) # if chInteractive: # print 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) # else: # self.Message = 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) intensity = self.Intensity['intensity'][index] dstr=' - Density = %10.2e (cm$^{-3}$)' % eDensity[index] tstr=' - T = %10.2e (K)' % temperature elif ndens > 1 and ntemp > 1: if index < 0: index = ntemp/2 print('using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index])) self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index]) # if chInteractive: # print 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index]) # else: # self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2e'%(index, temperature[index], eDensity[index]) intensity = self.Intensity['intensity'][index] dstr=' - Density = %10.2e (cm$^{-3}$)' % eDensity[index] tstr=' - T = %10.2e (K)' % temperature[index] if type(wvlRange) != type(None): wvlIndex = util.between(wvl, wvlRange) else: wvlIndex = range(wvl.size) intensity = intensity[wvlIndex] wvl = wvl[wvlIndex] # self.Error = 0 if wvl.size == 0: print('No lines in this wavelength interval') self.Error = 1 self.Message = 'No lines in this wavelength interval' # if chInteractive: # print 'No lines in this wavelength interval' # else: # self.Error = 1 # self.Message = 'No lines in this wavelength interval' return elif top == 0: top = wvl.size elif wvl.size > top: intsrt = np.argsort(intensity) wvl = wvl[intsrt[-top:]] intensity = intensity[intsrt[-top:]] else: top = wvl.size # must follow setting top # pl.figure() ylabel = 'intensity' if relative: intensity = intensity/intensity[-1] ylabel += ' (Relative)' # xlabel = 'Wavelength ('+self.Defaults['wavelength'] +')' # ymin = 10.**(np.log10(intensity[0].min()).round(0)-0.5 ) # pl.ion() # if chInteractive: # pl.ion() # else: # pl.ioff() # for idx in range(top): xx=[wvl[idx], wvl[idx]] if linLog == 'lin': yy=[0., intensity[idx]] pl.plot(xx, yy) else: yy=[ymin/10., intensity[idx]] pl.semilogy(xx, yy) pl.xlabel(xlabel) pl.ylabel(ylabel) pl.title(title+tstr+dstr) if wvlRange: pl.axis([wvlRange[0], wvlRange[1], ymin, intensity.max()]) if plotFile: pl.savefig(plotFile)
def intensityList(self, index=-1, wvlRange=None, wvlRanges=None, top=10, relative=0, outFile=0 ): ''' List the line intensities wvlRange, a 2 element tuple, list or array determines the wavelength range Top specifies to plot only the top strongest lines, default = 10 normalize = 1 specifies whether to normalize to strongest line, default = 0 rewrite of emissList ''' # # if not hasattr(self, 'Intensity'): try: self.intensity() except: print(' intensities not calculated and emiss() is unable to calculate them') print(' perhaps the temperature and/or eDensity are not set') return # # everything in self.Intensity should be a numpy array # # # temperature = self.Temperature eDensity = self.EDensity em = self.Em # ndens = eDensity.size ntemp = temperature.size # # intens = copy.deepcopy(self.Intensity) intensity = intens['intensity'] ionS = intens['ionS'] wvl = intens['wvl'] lvl1 = intens['lvl1'] lvl2 = intens['lvl2'] pretty1 = intens['pretty1'] pretty2 = intens['pretty2'] obs = intens['obs'] avalue = intens['avalue'] # if ndens == 1 and ntemp == 1: dstr = ' - Density = %10.2e (cm$^{-3}$)' %(eDensity) tstr = ' - T = %10.2e (K)' %(temperature) elif ndens == 1 and ntemp > 1: if index < 0: index = ntemp/2 print('using index = %5i specifying temperature = %10.2e'%(index, temperature[index])) self.Message = 'using index = %5i specifying temperature = %10.2e'%(index, temperature[index]) intensity=intensity[index] elif ndens > 1 and ntemp == 1: if index < 0: index = ntemp/2 print('using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index])) self.Message = 'using index =%5i specifying eDensity = %10.2e'%(index, eDensity[index]) intensity=intensity[index] elif ndens > 1 and ntemp > 1: if index < 0: index = ntemp/2 print('using index = %5i specifying temperature = %10.2e, eDensity = %10.2e em = %10.2e'%(index, temperature[index], eDensity[index], em[index])) self.Message = 'using index = %5i specifying temperature = %10.2e, eDensity = %10.2eem = %10.2e'%(index, temperature[index], eDensity[index], em[index]) intensity=intensity[index] # # print('shpae of intensity 0 = %5i %5i'%(intensity.shape)) # if wvlRange: wvlIndex=util.between(wvl,wvlRange) elif wvlRanges: wvlIndex = [] for awvlRange in wvlRanges: wvlIndex.extend(util.between(wvl,awvlRange)) else: wvlIndex = range(wvl.size) # # get lines in the specified wavelength range # # print('shpae of intensity 1 = %5i %5i'%(intensity.shape)) # intensity = intensity[wvlIndex] ionS = ionS[wvlIndex] wvl = wvl[wvlIndex] lvl1 = lvl1[wvlIndex] lvl2 = lvl2[wvlIndex] avalue = avalue[wvlIndex] pretty1 = pretty1[wvlIndex] pretty2 = pretty2[wvlIndex] obs = obs[wvlIndex] # self.Error = 0 if wvl.size == 0: print('No lines in this wavelength interval') self.Error = 1 self.Message = 'No lines in this wavelength interval' return # elif top == 0: top = wvl.size elif top > wvl.size: top = wvl.size # # sort by intensity # isrt = np.argsort(intensity) ionS = ionS[isrt[-top:]] wvl = wvl[isrt[-top:]] lvl1 = lvl1[isrt[-top:]] lvl2 = lvl2[isrt[-top:]] obs = obs[isrt[-top:]] intensity = intensity[isrt[-top:]] avalue = avalue[isrt[-top:]] pretty1 = pretty1[isrt[-top:]] pretty2 = pretty2[isrt[-top:]] # # print('shpae of intensity 2= %5i %5i'%(intensity.shape)) # # must follow setting top # if relative: intensity = intensity/intensity[:top].max() # # idx = np.argsort(wvl) fmt1 = '%5s %5s %5s %25s - %-25s %12s %12s %12s %3s' fmt = '%5s %5i %5i %25s - %-25s %12.4f %12.3e %12.2e %1s' print(' ') print(' ------------------------------------------') print(' ') print(fmt1%('Ion','lvl1','lvl2','lower','upper','Wvl(A)','Intensity','A value','Obs')) for kdx in idx: print(fmt%(ionS[kdx], lvl1[kdx], lvl2[kdx], pretty1[kdx], pretty2[kdx], wvl[kdx], intensity[kdx], avalue[kdx], obs[kdx])) print(' ') print(' ------------------------------------------') print(' ') # self.Intensity['wvlTop'] = wvl[idx] self.Intensity['intensityTop'] = intensity[idx] if outFile: fmt1a = '%5s %5s %5s %25s - %-25s %12s %12s %12s %3s \n' fmt = '%5s %5i %5i %25s - %-25s %12.4f %12.3e %12.2e %1s \n' outpt = open(outFile, 'w') outpt.write(fmt1a%('Ion','lvl1','lvl2','lower','upper','Wvl(A)','Intensity','A value','Obs')) for kdx in idx: outpt.write(fmt%(ionS[kdx], lvl1[kdx], lvl2[kdx], pretty1[kdx], pretty2[kdx], wvl[kdx], intensity[kdx], avalue[kdx], obs[kdx])) outpt.close()