def ktofr(clu, obsids, zz, nnhhlab, checkfit): print ' -----------> checkbgfit4 for ' + clu clean() gc.collect() set_stat('cstat') locclu = 'mfe_' + clu (rac, decc) = centradec.getrd(locclu) if not os.path.exists(locclu + '/bginfield/'): os.mkdir(locclu + '/bginfield/') if not os.path.exists(locclu + '/reg/'): os.mkdir(locclu + '/reg/') if not os.path.exists(locclu + '/spec/'): os.mkdir(locclu + '/spec/') if not os.path.exists(locclu + '/ktofrsp/'): os.mkdir(locclu + '/ktofrsp/') ccdname = 'i567' ccdlist = ['0,1,2,3', '5', '6', '7'] ccdindex = {'i': 0, '5': 1, '6': 2, '7': 3} # dataplot = ChipsCurve() # modelplot = ChipsHistogram() # dataplot.symbol.style='plus' # dataplot.symbol.size=3 # dataplot.line.style='none' # modelplot.line.color = "red" # modelplot.line.thickness = 3 # create simplechipsreg regions. for ob in obsids: os.system('punlearn skyfov') os.system('skyfov ' + locclu + '/clean' + ob + '.fits ' + locclu + '/reg/simplechipsreg' + ob + '.fits clobber=yes') # which CCD's are present in each OBSID presccdglob = [] for iob in range(len(obsids)): presccdglob.append(whichccd2z_loc.find(clu, obsids[iob])) # Remove OBSID's which do not have any good CCD's: emptyobs = [] for iob in range(len(obsids)): ob = obsids[iob] for ccd in str(presccdglob[iob]): if not os.path.exists(locclu+'/spec/sp'+ob+'_ccd'+ccd+'_center.wrmf') \ or not os.path.exists(locclu+'/spec/bgarf'+ob+'_ccd'+ccd+'.fits') \ or not os.path.exists(locclu+'/spec/bgspsimple'+ob+'_ccd'+ccd+'.fits') \ or not os.path.exists(locclu+'/spec/bgrmf'+ob+'_ccd'+ccd+'.fits') : presccdglob[iob] = presccdglob[iob].replace(ccd, '') if presccdglob[iob] == '': emptyobs.append(iob) emptyobs.reverse() for iob in emptyobs: del obsids[iob] del presccdglob[iob] anfile = open(locclu + '/bginfield_all.reg', 'r') anline = anfile.readline() anline = anfile.readline() pbg1 = float(anline.split(',')[2][0:-1]) * 60 / 0.492 pbg2 = float(anline.split(',')[3][0:-3]) * 60 / 0.492 anfile.close() # Create BG annulus for each OBSIDS, which excludes the pt srcs # Get presccd presccd = [] for iob in range(len(obsids)): ob = obsids[iob] intermed1 = radreg4simple2.radreg(clu, ob, pbg1, pbg2, locclu + '/bginfield/outer' + ob) presccd.append(intermed1) # Make sure that some needed files were created. If not, remove from prescccd # any CCD wich is missing PI, ARF or RMF file for iob in range(len(obsids)): ob = obsids[iob] for ccd in str(presccd[iob]): if not os.path.exists( locclu + '/spec/sp' + ob + '_ccd' + ccd + '_center.wrmf') or ccd not in presccdglob[iob]: presccd[iob] = presccd[iob].replace(ccd, '') #if not os.path.exists(locclu+'/spec/sp'+ob+'_ccd'+ccd+'_center.wrmf') : presccd[iob] = presccd[iob].replace(ccd, '') srcstr = '' for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] os.system('punlearn dmextract') os.system( 'dmextract "' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccdlist[ccdindex[ccd]] + '][sky=region(' + locclu + '/bginfield/outer' + ob + '_ccd' + ccd + '_xfov_pt_simple.reg)][bin PI]" ' + locclu + '/bginfield/sp' + ob + '_ccd' + ccd + '.fits opt=pha1 wmap="[energy=300:2000][bin det=8]" clobber=yes' ) # Make ARF given the WMAP from the above spectrum file #pbk = asol6_loc.asol(ob,'pbk') acao = asol6_loc.asol(ob, 'asol') os.system('punlearn mkwarf') os.system('pset mkwarf infile="' + locclu + '/bginfield/sp' + ob + '_ccd' + ccd + '.fits[WMAP]"') os.system('pset mkwarf outfile=' + locclu + '/bginfield/warf' + ob + '_ccd' + ccd + '.fits') os.system('pset mkwarf weightfile=' + locclu + '/bginfield/wfef' + ob + '_ccd' + ccd + '.fits') #os.system('pset mkwarf pbkfile='+pbk) os.system('pset mkwarf egridspec="0.3:11.0:0.01"') os.system('pset mkwarf asolfile=' + acao) os.system('mkwarf verbose=1 mode=h clobber=yes') os.system('rm ' + locclu + '/bginfield/wfef' + ob + '_ccd' + ccd + '.fits') # Make sure (AGAIN) that all the needed files were created. If not, remove from prescccd # any CCD wich is missing PI, ARF or RMF file for iob in range(len(obsids)): ob = obsids[iob] for ccd in str(presccd[iob]): if not os.path.exists(locclu + '/bginfield/warf' + ob + '_ccd' + ccd + '.fits') or not os.path.exists( locclu + '/bginfield/sp' + ob + '_ccd' + ccd + '.fits') or ccd not in presccdglob[iob]: presccd[iob] = presccd[iob].replace(ccd, '') if not os.path.exists(locclu + '/spec/sp' + ob + '_ccd' + ccd + '_center.wrmf'): presccdglob[iob] = presccdglob[iob].replace(ccd, '') presccd[iob] = presccd[iob].replace(ccd, '') # load infield BG for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] load_pha(ob + '.' + ccd, locclu + '/bginfield/sp' + ob + '_ccd' + ccd + '.fits') load_rmf(ob + '.' + ccd, locclu + '/spec/sp' + ob + '_ccd' + ccd + '_center.wrmf') load_arf(ob + '.' + ccd, locclu + '/bginfield/warf' + ob + '_ccd' + ccd + '.fits') srcstr = srcstr + '"' + ob + '.' + ccd + '",' # Fit the BG using blank sky AND infield BG data loadbg4z8simple2_write.bg(clu, obsids, presccdglob, presccd, srcstr, zz, nnhhlab, checkfit) # Make and save plots for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccdglob[iob])): ccd = presccdglob[iob][iccd] if ccd in presccd[iob]: plot_fit_resid(ob + '.' + ccd) if os.path.exists('fitplots/checkbgfit4infield_' + clu + '_' + ob + '_ccd' + ccd + '.eps'): os.remove('fitplots/checkbgfit4infield_' + clu + '_' + ob + '_ccd' + ccd + '.eps') print_window( 'fitplots/checkbgfit4infield_' + clu + '_' + ob + '_ccd' + ccd, ['format', 'eps', 'orientation', 'landscape']) delete_window('all') plot_fit_resid('bg' + ob + '.' + ccd) if os.path.exists('fitplots/checkbgfit4blanksky_' + clu + '_' + ob + '_ccd' + ccd + '.eps'): os.remove('fitplots/checkbgfit4blanksky_' + clu + '_' + ob + '_ccd' + ccd + '.eps') print_window( 'fitplots/checkbgfit4blanksky_' + clu + '_' + ob + '_ccd' + ccd, ['format', 'eps', 'orientation', 'landscape']) delete_window('all')
def radreg(clu, ob, rlo, rhi, prefix) : locclu = 'mfe_'+clu (rac, decc) = centradec.getrd(locclu) badskyfovob = ['3182', '897', '11708'] acao = asol6_loc.asol(ob,'asol') ccdname='i567' ccdlist=['0,1,2,3','5','6','7'] # Get the SKY coodinates of the center. os.system('punlearn dmcoords') os.system('dmcoords '+locclu+'/clean'+ob+'.fits asolfile="'+acao+'" option=cel ra='+rac+' dec='+decc+' celfmt=hms') xc = commands.getoutput('pget dmcoords x') yc = commands.getoutput('pget dmcoords y') xcf = float(xc) ycf = float(yc) # ra, dec in degrees os.system('punlearn dmcoords') os.system('dmcoords '+locclu+'/clean'+ob+'.fits asolfile="'+acao+'" option=sky x='+xc+' y='+yc+' celfmt=deg') racd = float(commands.getoutput('pget dmcoords ra')) decd = float(commands.getoutput('pget dmcoords dec')) # Make a list of point sources, to be able to choose which ones are close # to a given shell for it to be excluded. ptfile = open(locclu+'/reg/pt0mfe_wcs.reg', 'r') regline = ptfile.readline() regv = [] ptr=[] # how far from (rac,decc) in pixels ptdr=[] # 'radius' of circle/ellipse in pixels while regline != '\n' and regline != '' : if regline[0] != '#' : regv.append(regline) s1=regline.partition('(') s2=s1[2].partition(':') hh=float(s2[0]) s3=s2[2].partition(':') mm=float(s3[0]) s4=s3[2].partition(',') ss=float(s4[0]) ptra = 15.*(hh+mm/60.+ss/3600.) s5=s4[2].partition(':') dd=float(s5[0]) if s5[0][0]=='+' : ff=1. elif s5[0][0]=='-' : ff=-1. s6=s5[2].partition(':') am=float(s6[0]) s7=s6[2].partition(',') ac=float(s7[0]) ptdec= dd + ff * (am/60. + ac/3600.) d2 = ( ( (ptra-racd) * numpy.cos(decd/180.*numpy.pi) ) ** 2. + (ptdec-decd) ** 2. ) * (3600./0.492)**2. ptr.append( d2**0.5 ) if s1[0] == 'ellipse' : s8=s7[2].partition("',") s9=s8[2].partition("',") ptdr.append(60./0.492*max(float(s8[0]),float(s9[0]))) elif s1[0] == 'circle' : s8=s7[2].partition("'") ptdr.append(60./0.492*float(s8[0])) else : print print 'BAAAAAAAAAAAAAD REGIOOOOOOOOOOOON' print regline = ptfile.readline() ptfile.close() # get CCD regions chipx=commands.getoutput('dmlist "'+locclu+'/reg/simplechipsreg'+ob+'.fits[cols x]" data,clean') t1 = chipx.split('\n') t1.remove(t1[0]) chipy=commands.getoutput('dmlist "'+locclu+'/reg/simplechipsreg'+ob+'.fits[cols y]" data,clean') u1 = chipy.split('\n') u1.remove(u1[0]) ccdid=commands.getoutput('dmlist "'+locclu+'/reg/simplechipsreg'+ob+'.fits[cols ccd_id]" data,clean') c1 = ccdid.split('\n') c1.remove(c1[0]) # goodchips[0] contains indices to u1, t1 or c1 that pertain to chip I (ie ACIS-I) # goodchips[1] contains indices to u1, t1 or c1 that pertain to chip 5 # goodchips[2] contains indices to u1, t1 or c1 that pertain to chip 6 # goodchips[3] contains indices to u1, t1 or c1 that pertain to chip 7 goodchips=[[],[],[],[]] # I 5 6 7 for i in range(len(c1)) : if int(c1[i]) in (0,1,2,3) : goodchips[0].append(i) if int(c1[i]) == 5 : goodchips[1].append(i) if int(c1[i]) == 6 : goodchips[2].append(i) if int(c1[i]) == 7 : goodchips[3].append(i) # ccdreg will contain the regions (in string format) corresponding to # the CCD's I, 5, 6 and 7 ccdreg=[[],[],[],[]] ccdregfileappend=[False,False,False,False] for iccd in range(4) : if len(goodchips[iccd]) > 0 : for igood in range(len(goodchips[iccd])) : i = goodchips[iccd][igood] polyx = [] t2=t1[i] t3=t2.lstrip() t4=t3.partition(' ') while ('NaN' not in t4[0]) and (t4[1] != '') : polyx.append(float(t4[0])) t2=t4[2] t3=t2.lstrip() t4=t3.partition(' ') polyy = [] u2=u1[i] u3=u2.lstrip() u4=u3.partition(' ') while ('NaN' not in u4[0]) and (u4[1] != '') : polyy.append(float(u4[0])) u2=u4[2] u3=u2.lstrip() u4=u3.partition(' ') ccdreg[iccd].append('polygon(') for j in range(len(polyx)) : ccdreg[iccd][igood] = ccdreg[iccd][igood] + str(polyx[j]) + ',' + str(polyy[j]) + ',' ccdreg[iccd][igood] = ccdreg[iccd][igood][0:-1] ccdreg[iccd][igood] = ccdreg[iccd][igood] + ')' if not os.path.exists(locclu+'/reg/obsimple'+ob+'ccd'+ccdname[iccd]+'.reg') and \ ob not in badskyfovob : # <--- list of obsids where ccd region was created mannually, because # skyfov returned wrong region ccdregfile = open(locclu+'/reg/obsimple'+ob+'ccd'+ccdname[iccd]+'.reg', 'w') for igood in range(len(goodchips[iccd])) : ccdregfile.write(' +'+ccdreg[iccd][igood]) ccdregfile.close() ccdregfileappend[iccd]=True # Hi BG corner region if os.path.exists(locclu+'/reg/hibgcorner'+ob+'.reg') : hibgfile = open(locclu+'/reg/hibgcorner'+ob+'.reg','r') hibgstr = hibgfile.readline() hibgfile.close() hibgx = float( hibgstr[7:-1].split(',')[0] ) hibgy = float( hibgstr[7:-1].split(',')[1] ) hibgr = ( (hibgx-xcf)**2. + (hibgy-ycf)**2. )**0.5 # make region of intersection of annulus with chip regions MINUS PTSRCs presccd='' for iccd in range(4) : if len(ccdreg[iccd]) > 0 : # write region to file if ob not in badskyfovob : fovptfile = open(prefix+'_ccd'+str(ccdname[iccd])+'_xfov_pt_simple.reg', 'w') for ii in range(len(ccdreg[iccd])) : fovptfile.write('+annulus('+xc+','+yc+','+str(rlo)+','+str(rhi)+') * '+ccdreg[iccd][ii]+'\n') for jj in range(len(ptr)) : # add point source regions which lie within this annulus if ptr[jj]-ptdr[jj] <= rhi and ptr[jj]+ptdr[jj] >= rlo : fovptfile.write('-'+regv[jj][0:-1]+' ') if iccd == 0 and os.path.exists(locclu+'/reg/hibgcorner'+ob+'.reg') and hibgr-1095. <= rhi and hibgr+1095. >= rlo : fovptfile.write( '-'+hibgstr[0:-1] ) fovptfile.write('\n') fovptfile.close() elif os.path.exists(locclu+'/reg/obsimple'+ob+'ccd'+ccdname[iccd]+'.reg') : fovptfile = open(prefix+'_ccd'+str(ccdname[iccd])+'_xfov_pt_simple.reg', 'w') for ii in range(len(ccdreg[iccd])) : obsimplefile = open(locclu+'/reg/obsimple'+ob+'ccd'+ccdname[iccd]+'.reg', 'r') obsimpleline = obsimplefile.readline().replace('\n','').replace(' +',' ') fovptfile.write('+annulus('+xc+','+yc+','+str(rlo)+','+str(rhi)+') * '+obsimpleline+'\n') for jj in range(len(ptr)) : # add point source regions which lie within this annulus if ptr[jj]-ptdr[jj] <= rhi and ptr[jj]+ptdr[jj] >= rlo : fovptfile.write('-'+regv[jj][0:-1]+' ') if iccd == 0 and os.path.exists(locclu+'/reg/hibgcorner'+ob+'.reg') and hibgr-1095. <= rhi and hibgr+1095. >= rlo : fovptfile.write( '-'+hibgstr[0:-1] ) fovptfile.write('\n') obsimplefile.close() fovptfile.close() # add a good CCD to presccd (radial shell dependent if float(commands.getoutput('dmlist "'+locclu+'/clean'+ob+'.fits[ccd_id='+ccdlist[iccd]+'][sky=region('+prefix+'_ccd'+str(ccdname[iccd])+'_xfov_pt_simple.reg)]" counts')) > 0 and os.path.exists(locclu+'/bg/bg'+ob+'_ccd'+ccdname[iccd]+'r_en.fits') : presccd=presccd+ccdname[iccd] else : if ob not in badskyfovob : os.remove(prefix+'_ccd'+str(ccdname[iccd])+'_xfov_pt_simple.reg') # presccd is a string containing the CCD's found in this range rlo -> rhi return presccd
def sp(clu, ob, r1mpc): locclu = 'mfe_' + clu origclu = 'orig_' + clu os.system('punlearn ardlib') acao = asol6_loc.asol(ob, 'asol') if not os.path.exists(locclu + '/spec'): os.mkdir(locclu + '/spec') (rac, decc) = centradec.getrd(locclu) # simple in, out and bg regions (w/o point source exclusion) reginfile = open(locclu + '/reg/in.reg', 'w') reginfile.write('circle(' + rac + ',' + decc + ',' + str(r1mpc / 10) + '")\n') reginfile.close() regoutfile = open(locclu + '/reg/out.reg', 'w') regoutfile.write('annulus(' + rac + ',' + decc + ',' + str(r1mpc / 10) + '",' + str(r1mpc) + '")\n') regoutfile.close() regbgfile = open(locclu + '/reg/bg.reg', 'w') regbgfile.write('circle(' + rac + ',' + decc + ',' + str(r1mpc) + '")\n') regbgfile.close() # make chip regions using skyfov os.system('punlearn skyfov') os.system('skyfov ' + locclu + '/clean' + ob + '.fits ' + locclu + '/reg/chipsreg' + ob + '.fits aspect=' + acao + ' mskfile=' + asol6_loc.asol(ob, 'msk1')) pbk = asol6_loc.asol(ob, 'pbk') regv = ['in2', 'out2'] ctsin0 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=0]" counts') ctsin1 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=1]" counts') ctsin2 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=2]" counts') ctsin3 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=3]" counts') ctsin5 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=5]" counts') ctsin6 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=6]" counts') ctsin7 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/in.reg)][ccd_id=7]" counts') ctsout0 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=0]" counts') ctsout1 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=1]" counts') ctsout2 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=2]" counts') ctsout3 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=3]" counts') ctsout5 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=5]" counts') ctsout6 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=6]" counts') ctsout7 = commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/out.reg)][ccd_id=7]" counts') # Create regions file combining field-of-view regions and point source exclusion regions chipreg.make(clu, ob, r1mpc, float(ctsin0), float(ctsin1), float(ctsin2), float(ctsin3), float(ctsin5), float(ctsin6), float(ctsin7), float(ctsout0), float(ctsout1), float(ctsout2), float(ctsout3), float(ctsout5), float(ctsout6), float(ctsout7)) ccdv = ['i', '5', '6', '7'] ccdlist = ['0,1,2,3', '5', '6', '7'] for iccd in range(len(ccdv)): # RMF ----------------------- #if not os.path.exists(locclu+'/spec/sp'+ob+'_ccd'+ccdv[iccd]+'_center.wrmf') and #if float(commands.getoutput('dmlist "'+locclu+'/clean'+ob+'.fits[ccd_id='+ccdlist[iccd]+']" counts')) > 0 if os.path.exists(locclu + '/bg/bg' + ob + '_ccd' + ccdv[iccd] + 'r.fits'): rmf4ent5.rmf(locclu, ob, ccdv[iccd]) for ireg in range(len(regv)): for iccd in range(len(ccdv)): # the region file, below, is created if there are enough counts in the region # of interest. if os.path.exists(locclu + '/reg/' + regv[ireg] + '_' + ob + '_ccd' + ccdv[iccd] + '.reg') and os.path.exists( locclu + '/bg/bg' + ob + '_ccd' + ccdv[iccd] + 'r.fits'): # DMEXTRACT ----------- os.system('punlearn dmextract') os.system('pset dmextract infile="' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + regv[ireg] + '_' + ob + '_ccd' + ccdv[iccd] + '.reg)][bin PI]"') os.system('pset dmextract outfile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '.pi') os.system('pset dmextract opt=pha1') os.system('pset dmextract wmap="[energy=300:2000][bin det=8]"') os.system('dmextract verbose=1 mode=h') # DMGROUP ----------- os.system('punlearn dmgroup') os.system('pset dmgroup infile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '.pi') os.system('pset dmgroup outfile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '_grp.pi') os.system('pset dmgroup grouptype=ADAPTIVE grouptypeval=30') os.system('pset dmgroup xcolumn="channel" ycolumn="counts"') os.system('pset dmgroup binspec=""') os.system('dmgroup verbose=1 mode=h') # MKWARF -------------- os.system('punlearn mkwarf') os.system('pset mkwarf infile="' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '.pi[WMAP]"') os.system('pset mkwarf outfile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '.warf') os.system('pset mkwarf weightfile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '.wfef') #os.system('pset mkwarf pbkfile='+pbk) os.system('pset mkwarf egridspec="0.3:11.0:0.01"') os.system('pset mkwarf asolfile=' + acao) os.system('mkwarf verbose=1 mode=h') # DMEXTRACT BG ----------- os.system('punlearn dmextract') os.system('pset dmextract infile="' + locclu + '/bg/bg' + ob + '_ccd' + ccdv[iccd] + 'r.fits[sky=region(' + locclu + '/reg/' + regv[ireg] + '_' + ob + '_ccd' + ccdv[iccd] + '.reg)][bin PI]"') os.system('pset dmextract outfile=' + locclu + '/spec/sp' + ob + '_' + regv[ireg] + '_ccd' + ccdv[iccd] + '_bgbg2.pi') os.system('pset dmextract opt=pha1') os.system('dmextract verbose=1 mode=h')
def make(clu, ob, r1mpc, ctsIN0, ctsIN1, ctsIN2, ctsIN3, ctsIN5, ctsIN6, ctsIN7, ctsOUT0, ctsOUT1, ctsOUT2, ctsOUT3, ctsOUT5, ctsOUT6, ctsOUT7): (rac, decc) = centradec.getrd('mfe_' + clu) instr = 'circle(' + rac + ',' + decc + ',' + str(r1mpc / 10) + '")' outstr = 'annulus(' + rac + ',' + decc + ',' + str( r1mpc / 10) + '",' + str(r1mpc) + '")' bgstr = 'circle(' + rac + ',' + decc + ',' + str(r1mpc) + '")' regfits = cr.read_file('mfe_' + clu + '/reg/chipsreg' + ob + '.fits') rx = cr.copy_colvals(regfits, 'x') ry = cr.copy_colvals(regfits, 'y') rccd = cr.copy_colvals(regfits, 'ccd_id') # POINT SOURCES WITH A MINUS SIGN FOR EXCLUSION filept = open('mfe_' + clu + '/reg/pt0mfe_wcs.reg', 'r') linept = filept.readline() linept = filept.readline() exclpt = '' while linept != '' and linept != '\n': exclpt = exclpt + ' -' + linept linept = filept.readline() filept.close() #HI-BG corner region hibgbool = False if os.path.exists('mfe_' + clu + '/reg/hibgcorner' + ob + '.reg'): hibgbool = True filecorner = open('mfe_' + clu + '/reg/hibgcorner' + ob + '.reg', 'r') hibgreg = filecorner.readline() filecorner.close() # combine ptsrcs and hi bg corner fileexc = open('mfe_' + clu + '/reg/exclpt' + ob + '.reg', 'w') fileexc.write(exclpt) if hibgbool: fileexc.write(hibgreg) fileexc.close() acisiccds = '0123' # OBSERVATIONS WITH CHIPS 0,1,2,3 -- IN region if ctsIN0 + ctsIN1 + ctsIN2 + ctsIN3 >= 40: file1 = open('mfe_' + clu + '/reg/in2_' + ob + '_ccdi.reg', 'w') for ii in range(len(rccd)): if str(rccd[ii]) in acisiccds: sstr = '+polygon(' for jj in range(rx.shape[1]): if nn.isfinite(rx[ii, jj]): if jj == 0: sstr = sstr + str(rx[ii, jj]) + ',' + str(ry[ii, jj]) else: sstr = sstr + ',' + str(rx[ii, jj]) + ',' + str( ry[ii, jj]) sstr = sstr + ')' file1.write(sstr + ' * ' + instr) if hibgbool: file1.write(exclpt + ' -' + hibgreg) else: file1.write(exclpt) file1.close() # OBSERVATIONS WITH CHIPS 0,1,2,3 -- OUT/BG regions if ctsOUT0 + ctsOUT1 + ctsOUT2 + ctsOUT3 >= 500: file2 = open('mfe_' + clu + '/reg/out2_' + ob + '_ccdi.reg', 'w') file3 = open('mfe_' + clu + '/reg/bg2_' + ob + '_ccdi.reg', 'w') for ii in range(len(rccd)): if str(rccd[ii]) in acisiccds: sstr = '+polygon(' for jj in range(rx.shape[1]): if nn.isfinite(rx[ii, jj]): if jj == 0: sstr = sstr + str(rx[ii, jj]) + ',' + str(ry[ii, jj]) else: sstr = sstr + ',' + str(rx[ii, jj]) + ',' + str( ry[ii, jj]) sstr = sstr + ')' file2.write(sstr + ' * ' + outstr) if hibgbool: file2.write(exclpt + ' -' + hibgreg) else: file2.write(exclpt) file3.write(sstr + ' * ' + bgstr) if hibgbool: file2.write(exclpt + ' -' + hibgreg) else: file2.write(exclpt) file2.close() file3.close() # OBSERVATIONS WITH CHIPS 5, 6 AND 7 chipv = [5, 6, 7] # ---> must be integer!! regionname = ['in2', 'out2', 'bg2'] regionstr = [instr, outstr, bgstr] mincounts = [40, 500, 500] cts = nn.zeros((len(regionname), len(chipv))) cts[0, 0] = ctsIN5 cts[1, 0] = ctsOUT5 if ctsIN5 >= 40 or ctsOUT5 >= 500: cts[2, 0] = 500 + 1 cts[0, 1] = ctsIN6 cts[1, 1] = ctsOUT6 if ctsIN6 >= 40 or ctsOUT6 >= 500: cts[2, 1] = 500 + 1 cts[0, 2] = ctsIN7 cts[1, 2] = ctsOUT7 if ctsIN7 >= 40 or ctsOUT7 >= 500: cts[2, 2] = 500 + 1 for ichip in range(len(chipv)): chip = chipv[ichip] for ireg in range(len(regionname)): if cts[ireg, ichip] >= mincounts[ireg]: for ii in range(len(rccd)): if rccd[ii] == chip: file1 = open( 'mfe_' + clu + '/reg/' + regionname[ireg] + '_' + ob + '_ccd' + str(chip) + '.reg', 'w') sstr = '+polygon(' for jj in range(rx.shape[1]): if nn.isfinite(rx[ii, jj]): if jj == 0: sstr = sstr + str(rx[ii, jj]) + ',' + str( ry[ii, jj]) else: sstr = sstr + ',' + str( rx[ii, jj]) + ',' + str(ry[ii, jj]) sstr = sstr + ')' file1.write(sstr + ' * ' + regionstr[ireg]) file1.write(exclpt) file1.close()
def ktofr(clu, obsids, r1mpc, zz, nnhhlab): print ' -----------> ktofr14loc for ' + clu clean() gc.collect() set_stat('cstat') # local directory for this cluster locclu = 'mfe_' + clu # coords of center of the cluster (rac, decc) = centradec.getrd(locclu) # don't use these observations badhienobs = [ '7686', '7688', '7689', '7690', '7692', '7693', '7694', '7696', '7701' ] if not os.path.exists(locclu + '/ktofrsp/'): os.mkdir(locclu + '/ktofrsp/') # Chandra CCDs to look for data in ccdname = 'i567' ccdlist = ['0,1,2,3', '5', '6', '7'] # Plotting settings dataplot = ChipsCurve() modelplot = ChipsHistogram() dataplot.symbol.style = 'plus' dataplot.symbol.size = 3 dataplot.line.style = 'none' modelplot.line.color = "red" modelplot.line.thickness = 3 # create simplechipsreg regions. for ob in obsids: os.system('punlearn skyfov') os.system('skyfov ' + locclu + '/clean' + ob + '.fits ' + locclu + '/reg/simplechipsreg' + ob + '.fits clobber=yes') # which CCD's are present in each OBSID presccdglob = [] for iob in range(len(obsids)): presccdglob.append(whichccd2z_loc.find(clu, obsids[iob])) # Reset these global variables globmod.globstr1 = '' globmod.globstr2 = '' for iob in range(len(obsids)): ob = obsids[iob] # Make file with only counts in energy range .3-7keV os.system('punlearn dmcopy') os.system('dmcopy "' + locclu + '/clean' + ob + '.fits[energy=300:7000]" ' + locclu + '/evt' + ob + '_b.fits') # get the coordinates of the center in SKY units os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits asolfile=' + asol6_loc.asol(ob, 'asol') + ' ra=' + rac + ' dec=' + decc + ' option=cel celfmt=hms') xs = commands.getoutput('pget dmcoords x') ys = commands.getoutput('pget dmcoords y') # Make region containing all ptsrcs and hi-BG corner region os.system('cp ' + locclu + '/reg/pt0mfe_wcs.reg ' + locclu + '/reg/pt_hibg' + ob + '.reg') if os.path.exists(locclu + '/reg/hibgcorner' + ob + '.reg'): os.system('more ' + locclu + '/reg/hibgcorner' + ob + '.reg >> ' + locclu + '/reg/pt_hibg' + ob + '.reg') # Make file with the radial coordinate of each photon count os.system( 'dmtcalc "' + locclu + '/evt' + ob + '_b.fits[col -time,-ccd_id,-node_id,-expno,-chip,-tdet,-det,-phas,-pha_ro,-energy,-pi,-fltgrade,-grade,-status][exclude sky=region(' + locclu + '/reg/pt_hibg' + ob + '.reg)]" "' + locclu + '/evtrad' + ob + '.txt[opt kernel=text/simple]" expr="r2=((' + xs + '-sky[0])^2)+((' + ys + '-sky[1])^2)"') # Get the radial coord of EACH photon count! # To be used to determine if we have enough counts # for a given radial bin to get 10% error on best-fit # kT value. r = [] # in Mpc for ob in obsids: rfile = open(locclu + '/evtrad' + ob + '.txt', 'r') intermed = rfile.readline() intermed = rfile.readline() intermed = rfile.readline() # first data-containing line while intermed != '' and intermed != '\n': r.append(0.492 / r1mpc * float(intermed.split(' ')[2][0:-1])**0.5) intermed = rfile.readline() rfile.close() r.sort() # Define rmin and rmax rmax = r[-1] rmin = 1.2 / r1mpc # The first radius, defined by rmin for imin in range(len(r)): if r[imin] >= rmin: break # imin is the index where r >= rmin # Read abundance from cluname_TZ.txt tzfile = open('cluname_TZ.txt', 'r') intermed = 'init' while intermed != '': intermed = tzfile.readline() if intermed.split()[0] == clu: abin = float(intermed.split()[2]) about = float(intermed.split()[4]) ktin = float(intermed.split()[1]) ktout = float(intermed.split()[3]) break tzfile.close() # Bin the radial data rbnd = [rmin] # the 1st radius ct1bin = 100 i = imin + ct1bin while i < len(r): rbnd.append(r[i]) i = i + ct1bin rbnd = n.array(rbnd) # Load Hi-energy count in losrc regions losrchienct = n.ones((len(obsids), 4)) * -1 for iob in range(len(obsids)): ob = obsids[iob] sclfile = open(locclu + '/ctofr/scl' + ob + '.txt', 'r') for iccd in range(4): intermed = sclfile.readline() if intermed.split()[2].lower() != 'nan': losrchienct[iob, iccd] = float(intermed.split()[2]) sclfile.close() # Load string containing exculsion of all point sources excstr = [] for ob in obsids: excfile = open(locclu + '/reg/exclpt' + ob + '.reg', 'r') excstr.append(excfile.readline()) excfile.close() ################### make radial bins which contain enough counts for a best-fit kT with 10% error ######################## ccdindex = {'i': 0, '5': 1, '6': 2, '7': 3} vrstat = [] vkt = [] vktp = [] vktm = [] ishell = 0 rz1 = [] rz2 = [] ishell = 0 # the index of everything created new, in this loop. only increases, when we get a satisfactory fit. i1 = 0 # index to rbnd indicating inner radius i2 = 1 # index to rbnd indicating outer radius while i2 <= len(rbnd) - 1: ct = 1 while ct <= 10: print '======== loop ct =', ct # get annulus temperature from cluname_TZ.txt, based on in/out regions if ishell == 0: if (rbnd[i1] + rbnd[i2]) / 2 <= 0.1 and ktin > 0: tshell = ktin elif (rbnd[i1] + rbnd[i2]) / 2 > 0.1 and ktout > 0: tshell = ktout if ktin < 0 and ktout > 0: tshell = ktout elif ktout < 0 and ktin > 0: tshell = ktin else: tshell = 5. else: tshell = vkt[ishell - 1] # Calculate BG fraction in the annulus sclbgct = 0 for iob in range(len(obsids)): ob = obsids[iob] annfile = open('antemp.reg', 'w') annfile.write('annulus(' + rac + ',' + decc + ',' + str(rbnd[i1] * r1mpc) + '",' + str(rbnd[i2] * r1mpc) + '")\n') annfile.write(excstr[iob]) annfile.close() for ccd in presccdglob[iob]: sclbgct = sclbgct + float( commands.getoutput( 'dmlist "' + locclu + '/bg/bg' + ob + '_ccd' + ccd + 'r_en.fits[sky=region(antemp.reg)]" counts') ) / float( commands.getoutput( 'dmkeypar ' + locclu + '/bg/bg' + ob + '_ccd' + ccd + 'r_en.fits exposure echo+')) * float( commands.getoutput('dmkeypar ' + locclu + '/evt' + ob + '_b.fits exposure echo+')) os.remove('antemp.reg') bgfrac = sclbgct / float(i2 - i1) / ct1bin # given approx. kT and BGfrac, how many counts do we need for 10% error? nnec = (500 * 10.**(1.976 * bgfrac)) * (tshell / 2.)**1.7 nnec = max(nnec, 153.) # 153counts is the value at BGf=0, kT=1keV. # We take this as the min number of counts for making a kT bin inec0 = min(int(nnec / ct1bin) + i1 + 1, len(rbnd) - 1) # making sure that rhi/rlo >= 1.25: i125 = n.where(rbnd >= 1.25 * rbnd[i1]) if len(i125[0]) == 0: i125 = [[len(rbnd) - 1]] inec = max(inec0, i125[0][0]) if inec <= i2 or inec == len(rbnd) - 1: i2 = inec break else: i2 = inec ct = ct + 1 if ct >= 11: os.system('echo ' + str(ishell) + ' >> ' + locclu + '/shells_nocnvg.txt') rz1.append(rbnd[i1]) rz2.append(rbnd[i2]) ################# make spec and fit #################################### # Get the CCD's present in this shell presccd = [] # the ccd's that are present in this SHELL! for iob in range(len(obsids)): ob = obsids[iob] # radreg4 returns the ccd's that are present in this SHELL! # and makes the regions necessary for them to be used in fits.. intermed1 = radreg4simple3.radreg( clu, ob, rz1[-1] * r1mpc / .492, rz2[-1] * r1mpc / .492, locclu + '/ktofrsp/kt14an' + ob + '_' + str(ishell)) presccd.append(intermed1) for ccd in str(presccd[iob]): # Make the spectra for SHELL x CCD os.system('punlearn dmextract') os.system( 'dmextract "' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccdlist[ccdindex[ccd]] + '][sky=region(' + locclu + '/ktofrsp/kt14an' + ob + '_' + str(ishell) + '_ccd' + ccd + '_xfov_pt_simple.reg)][bin PI]" ' + locclu + '/ktofrsp/sp14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits opt=pha1 wmap="[energy=300:2000][bin det=8]" clobber=yes' ) # Make ARF given the WMAP from the above spectrum file #pbk = asol6_loc.asol(ob,'pbk') acao = asol6_loc.asol(ob, 'asol') os.system('punlearn mkwarf') os.system('pset mkwarf infile="' + locclu + '/ktofrsp/sp14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits[WMAP]"') os.system('pset mkwarf outfile=' + locclu + '/ktofrsp/warf14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits') os.system('pset mkwarf weightfile=' + locclu + '/ktofrsp/wfef14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits') #os.system('pset mkwarf pbkfile='+pbk) os.system('pset mkwarf egridspec="0.3:11.0:0.01"') os.system('pset mkwarf asolfile=' + acao) os.system('mkwarf verbose=1 mode=h clobber=yes') os.system('rm ' + locclu + '/ktofrsp/wfef14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits') # Make BG spectra and load them, only once for ishell=0 # This is here because it uses ktofrsp/ktan14*.reg, created just # above in radreg4simple2.radreg() if ishell == 0: infieldccd, infieldgalperbs, infieldcxbperbs = loadbg4z8simple3.bg( clu, obsids, presccdglob) for iob in range(len(obsids)): ob = obsids[iob] for ccd in str(presccdglob[iob]): exec 'gal1bg_' + ob + '_' + ccd + '_normval = float( gal1bg_' + ob + '_' + ccd + '.norm.val )' exec 'cxbbg_' + ob + '_' + ccd + '_amplval = float( cxbbg_' + ob + '_' + ccd + '.ampl.val )' bginf_present = False iob_in = -1 for iob in range(len(obsids)): if len(infieldccd[iob]) > 0: bginf_present = True iob_in = iob # Make sure that all the needed files were created. If not, remove from prescccd # any CCD wich is missing PI, ARF or RMF file firstiob = -1 for iob in range(len(obsids)): ob = obsids[iob] for ccd in str(presccd[iob]): if not os.path.exists(locclu+'/ktofrsp/warf14_'+ob+'_'+str(ishell)+'_ccd'+ccd+'.fits') \ or not os.path.exists(locclu+'/spec/sp'+ob+'_ccd'+ccd+'_center.wrmf') \ or not os.path.exists(locclu+'/ktofrsp/sp14_'+ob+'_'+str(ishell)+'_ccd'+ccd+'.fits') \ or ccd not in presccdglob[iob] : presccd[iob] = presccd[iob].replace(ccd, '') if len(presccd[iob]) > 0 and firstiob == -1: firstiob = iob print print '))))))))))))) clu = ', clu print '))))))))))))) obsids = ', obsids print '))))))))))))) ishell = ', ishell print '))))))))))))) presccdglob = ', presccdglob print '))))))))))))) presccd = ', presccd print # Load data we just made srcstr = '' for iob in range(len(obsids)): ob = obsids[iob] for ccd in presccd[iob]: load_pha( ob + '.' + str(ishell) + '.' + ccd, locclu + '/ktofrsp/sp14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits') load_rmf( ob + '.' + str(ishell) + '.' + ccd, locclu + '/spec/sp' + ob + '_ccd' + ccd + '_center.wrmf') load_arf( ob + '.' + str(ishell) + '.' + ccd, locclu + '/ktofrsp/warf14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits') bgscl = get_data(ob + '.' + str(ishell) + '.' + ccd).backscal * get_data(ob + '.' + str( ishell) + '.' + ccd).exposure / get_data( 'bg' + ob + '.' + ccd).backscal / get_data('bg' + ob + '.' + ccd).exposure newhienbgscl = calc_data_sum( id=ob + '.' + str(ishell) + '.' + ccd, lo=9.5, hi=12) / calc_data_sum( id='bg' + ob + '.' + ccd, lo=9.5, hi=12) srcstr = srcstr + '"' + ob + '.' + str( ishell) + '.' + ccd + '",' # the source model rsp = get_response(ob + '.' + str(ishell) + '.' + ccd) bgrsp = get_response('bg' + ob + '.' + ccd) groupzeros.grp(ob + '.' + str(ishell) + '.' + ccd, ':.3,7:') if ob not in badhienobs: exec 'set_full_model( "' + ob + '.' + str( ishell ) + '.' + ccd + '", rsp(xsphabs.ab * xsapec.em' + str( ishell ) + '_' + ob + '_' + ccd + ' ) + newhienbgscl * bgrsp( powlaw1d.p1_' + ob + '_' + ccd + ' + powlaw1d.p2_' + ob + '_' + ccd + ' + exp.e1_' + ob + '_' + ccd + ' + gauss1d.g1_' + ob + '_' + ccd + ' + gauss1d.g2_' + ob + '_' + ccd + ' + gauss1d.g3_' + ob + '_' + ccd + ' + gauss1d.g5_' + ob + '_' + ccd + ' ) + rsp( xsphabs.ab * powlaw1d.cxbbg_' + ob + '_' + ccd + ' + xsapec.gal1bg_' + ob + '_' + ccd + ' ) )' else: exec 'set_full_model( "' + ob + '.' + str( ishell ) + '.' + ccd + '", rsp(xsphabs.ab * xsapec.em' + str( ishell ) + '_' + ob + '_' + ccd + ' ) + bgscl * bgrsp( powlaw1d.p1_' + ob + '_' + ccd + ' + powlaw1d.p2_' + ob + '_' + ccd + ' + exp.e1_' + ob + '_' + ccd + ' + gauss1d.g1_' + ob + '_' + ccd + ' + gauss1d.g2_' + ob + '_' + ccd + ' + gauss1d.g3_' + ob + '_' + ccd + ' + gauss1d.g5_' + ob + '_' + ccd + ' ) + rsp( xsphabs.ab * powlaw1d.cxbbg_' + ob + '_' + ccd + ' + xsapec.gal1bg_' + ob + '_' + ccd + ' ) )' # If we fit the in-field BG, then obtain gal1 and cxb components from it if bginf_present: exec 'set_par( gal1bg_' + ob + '_' + ccd + '.norm, val=infieldgalperbs[iob_in][0]*get_data("' + ob + '.' + str( ishell) + '.' + ccd + '").backscal )' exec 'set_par( cxbbg_' + ob + '_' + ccd + '.ampl, val=infieldcxbperbs[iob_in][0]*get_data("' + ob + '.' + str( ishell) + '.' + ccd + '").backscal )' # if no in-field BG, then scale down the values of gal1 and cxb, which were already # read by loadbg4z8simple. scaling is according to ratio of backscal of source spec # to backscal of BG spec else: exec 'set_par( gal1bg_' + ob + '_' + ccd + '.norm, val=get_data("' + ob + '.' + str( ishell ) + '.' + ccd + '").backscal * gal1bg_' + ob + '_' + ccd + '_normval )' exec 'set_par( cxbbg_' + ob + '_' + ccd + '.ampl, val=get_data("' + ob + '.' + str( ishell ) + '.' + ccd + '").backscal * cxbbg_' + ob + '_' + ccd + '_amplval )' # Setting abundance parameter, kT and redshift for ccd in presccd[iob]: exec 'set_par( em' + str( ishell) + '_' + ob + '_' + ccd + '.redshift, val=' + str( zz) + ')' exec 'set_par( em' + str( ishell ) + '_' + ob + '_' + ccd + '.abundanc, val=0.3, min=0, max=5, frozen=False)' exec 'set_par( em' + str( ishell ) + '_' + ob + '_' + ccd + '.kt, val=5, min=0, max=40, frozen=False)' if iob != firstiob or ccd != presccd[firstiob][0]: exec 'link( em' + str( ishell) + '_' + ob + '_' + ccd + '.kt, em' + str( ishell) + '_' + obsids[firstiob] + '_' + presccd[ firstiob][0] + '.kt )' exec 'link( em' + str( ishell) + '_' + ob + '_' + ccd + '.abundanc, em' + str( ishell) + '_' + obsids[firstiob] + '_' + presccd[ firstiob][0] + '.abundanc )' if srcstr[0:-1] != '': # if there is data to fit: # Set nH if clu != 'a478': set_par(ab.nh, val=nnhhlab, min=nnhhlab / 10., max=nnhhlab * 10., frozen=True) else: set_par(ab.nh, val=nnhhlab * 1.1, min=nnhhlab, max=nnhhlab * 100., frozen=False) # Setting normalizations, link norms if backscal covers 95-105 % of annulus area iobiccd1 = [-1, -1] anarea = n.pi * ((rz2[-1] * r1mpc / .492)**2. - (rz1[-1] * r1mpc / .492)**2.) for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] bspix2 = float( commands.getoutput( 'dmkeypar ' + locclu + '/ktofrsp/sp14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits backscal echo+')) * 64.0 * 1024.**2. if iobiccd1 == [ -1, -1 ] or bspix2 / anarea < 0.95 or bspix2 / anarea > 1.05: exec 'set_par(em' + str( ishell ) + '_' + ob + '_' + ccd + '.norm, val=0.02, min=2e-4, max=2.)' exec 'emnorm0=abs(float(em' + str( ishell ) + '_' + ob + '_' + ccd + '.norm.val)*calc_data_sum(id="' + ob + '.' + str( ishell ) + '.' + ccd + '",lo=0.3,hi=7.0)/calc_model_sum(id="' + ob + '.' + str( ishell) + '.' + ccd + '",lo=0.3,hi=7.0))' exec 'set_par(em' + str( ishell ) + '_' + ob + '_' + ccd + '.norm, val=float(emnorm0), min=0., max=float(emnorm0*1e3) )' if iobiccd1 == [ -1, -1 ] and bspix2 / anarea >= 0.95 and bspix2 / anarea <= 1.05: iobiccd1 = [iob, iccd] else: #link to first norm value relbs = bspix2 / float( commands.getoutput( 'dmkeypar ' + locclu + '/ktofrsp/sp14_' + obsids[iobiccd1[0]] + '_' + str(ishell) + '_ccd' + presccd[iobiccd1[0]][iobiccd1[1]] + '.fits backscal echo+')) / (64.0 * 1024.**2.) exec 'link(em' + str( ishell) + '_' + ob + '_' + ccd + '.norm, em' + str( ishell) + '_' + obsids[ iobiccd1[0]] + '_' + presccd[iobiccd1[0]][ iobiccd1[1]] + '.norm * relbs )' # Fitting exec 'fit(' + srcstr[0:-1] + ')' # plotting if ishell != 0: delete_window('all') x1 = [0., 0.5, 0., 0.5] y1 = [0.5, 0.5, 0., 0.] for iob in range(len(obsids)): ob = obsids[iob] if len(presccd[iob]) > 0: add_window(8.5, 8.5, 'inches') for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] add_frame(x1[iccd], y1[iccd], x1[iccd] + 0.5, y1[iccd] + 0.5) add_curve( get_data_plot(ob + '.' + str(ishell) + '.' + ccd).x, get_data_plot(ob + '.' + str(ishell) + '.' + ccd).y, dataplot) add_histogram( get_model_plot(ob + '.' + str(ishell) + '.' + ccd).xlo, get_model_plot(ob + '.' + str(ishell) + '.' + ccd).xhi, get_model_plot(ob + '.' + str(ishell) + '.' + ccd).y, modelplot) set_plot_title(clu + ' OB' + ob + ' CCD' + ccd) split(2) add_curve( get_resid_plot(ob + '.' + str(ishell) + '.' + ccd).x, get_resid_plot(ob + '.' + str(ishell) + '.' + ccd).y, dataplot) add_hline(0) if os.path.exists('fitplots/ktofr14_' + clu + '_' + ob + '_' + str(ishell) + '_hien.eps'): os.remove('fitplots/ktofr14_' + clu + '_' + ob + '_' + str(ishell) + '_hien.eps') if len(presccd[iob]) > 0: print_window( 'fitplots/ktofr14_' + clu + '_' + ob + '_' + str(ishell) + '_hien', ['format', 'eps', 'orientation', 'landscape']) normv = -1 * n.ones((len(obsids), 4)) if get_fit_results().rstat < 3: # Error calculation exec 'proj(' + srcstr + ' em' + str(ishell) + '_' + obsids[ firstiob] + '_' + presccd[firstiob][0] + '.kt )' #15 if get_proj_results().parmaxes[0]!=None or ishell2==len(r1)-1 : vkt.append(get_proj_results().parvals[0]) vktp.append(get_proj_results().parmaxes[0]) vktm.append(get_proj_results().parmins[0]) vrstat.append(get_fit_results().rstat) # save normalizations for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] exec 'normv[iob,ccdindex[ccd]]=em' + str( ishell) + '_' + ob + '_' + ccd + '.norm.val' # best-fit Z exec 'bestfitz = em' + str(ishell) + '_' + obsids[ firstiob] + '_' + presccd[firstiob][0] + '.abundanc.val' # best-fit nH bestfitnh = ab.nh.val else: # No error calculation for bad fits vkt.append(n.nan) vktp.append(n.nan) vktm.append(n.nan) vrstat.append(get_fit_results().rstat) # save normalizations for iob in range(len(obsids)): ob = obsids[iob] for iccd in range(len(presccd[iob])): ccd = presccd[iob][iccd] normv[iob, ccdindex[ccd]] = n.nan # best-fit Z bestfitz = n.nan # best-fit nH bestfitnh = n.nan globmod.globstr1 = globmod.globstr1 + str(rz1[-1]) + ' ' + str( rz2[-1]) + ' ' + str(vkt[-1]) + ' ' + str( vktm[-1]) + ' ' + str(vktp[-1]) + ' ' + str( vrstat[-1]) + ' ' + str(-1) + ' ' + str( -1) + ' ' + str(-1) + ' ' + str( bestfitz) + ' ' + str(bestfitnh) + '\n' # save normalization results: # rin, rout globmod.globstr3 = globmod.globstr3 + str(rz1[-1]) + '\t' + str( rz2[-1]) + '\t' # the normalization for each (ob,ccd) for iob in range(len(obsids)): ob = obsids[iob] for ccd in presccd[iob]: globmod.globstr3 = globmod.globstr3 + '-1' + ' ' #13 used to be: +str(normv[iob,ccdindex[ccd]]) +' ' globmod.globstr3 = globmod.globstr3 + '\t' # the solid angle covered by dataset as a fraction of total # annulus solid angle, PI (Rout^2-Rin^2) for iob in range(len(obsids)): ob = obsids[iob] for ccd in presccd[iob]: bspix2 = float( commands.getoutput( 'dmkeypar ' + locclu + '/ktofrsp/sp14_' + ob + '_' + str(ishell) + '_ccd' + ccd + '.fits backscal echo+')) * 64.0 * 1024.**2. globmod.globstr3 = globmod.globstr3 + str( bspix2 / anarea) + ' ' # Reduced statistic globmod.globstr3 = globmod.globstr3 + '\t' + '-1' + '\t' #13 used too be: str(vrstat[-1]) + '\t' # Number of net counts, using backscal scaling for iob in range(len(obsids)): ob = obsids[iob] for ccd in presccd[iob]: bgct = get_data(ob + '.' + str( ishell) + '.' + ccd).backscal * get_data( ob + '.' + str(ishell) + '.' + ccd).exposure / get_data( 'bg' + ob + '.' + ccd).backscal / get_data( 'bg' + ob + '.' + ccd ).exposure * calc_data_sum( id='bg' + ob + '.' + ccd, lo=0.3, hi=7.0 ) # the number of BG counts to be subtracted globmod.globstr3 = globmod.globstr3 + str( max( calc_data_sum( id=ob + '.' + str(ishell) + '.' + ccd, lo=0.3, hi=7.0) - bgct, 1.)) + " " globmod.globstr3 = globmod.globstr3 + '\t' # the --HE-- normalization for each (ob,ccd) for iob in range(len(obsids)): ob = obsids[iob] for ccd in presccd[iob]: globmod.globstr3 = globmod.globstr3 + str(normv[ iob, ccdindex[ccd]]) + ' ' #13 normv used to be normhev globmod.globstr3 = globmod.globstr3 + '\t' # Reduced statistic -- HE -- globmod.globstr3 = globmod.globstr3 + '\t' + str( vrstat[-1]) #13 vrstat used to be vrstathien globmod.globstr3 = globmod.globstr3 + '\n' ############### end of fitting if statement ############################ # For the next ishell loop: i1 = i2 i2 = i1 + 1 ishell = ishell + 1 ########################### end of ishell loop ############################## kthfile = open(locclu + '/ktofr14_hien.txt', 'w') kthfile.write(globmod.globstr1) kthfile.close() normfile = open(locclu + '/ktofr14_norm3.txt', 'w') normfile.write(globmod.globstr3) normfile.close() os.system('sed -i s/None/Nan/g ' + locclu + '/ktofr14_hien.txt') os.system('sed -i s/None/Nan/g ' + locclu + '/ktofr14_norm3.txt')
def radial(clu, ob, r1mpcpix, rmax, obsids): # obsids param only used to get bg count to compare with counts from merged file. # all operations done on ob, which is one element of obsids. locclu = 'mfe_' + clu if not os.path.exists(locclu + '/radp' + ob): os.mkdir(locclu + '/radp' + ob) # create high-energy photons only event file, to use to estimate BG level os.system('punlearn dmcopy') os.system('dmcopy "' + locclu + '/clean' + ob + '.fits[energy=9500:12000]" ' + locclu + '/hien' + ob + '.fits') # center of the cluster acao = asol6_loc.asol(ob, 'asol') (rac, decc) = centradec.getrd(locclu) os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits asolfile="' + acao + '" option=cel ra=' + rac + ' dec=' + decc + ' celfmt=hms') xc = commands.getoutput('pget dmcoords x') yc = commands.getoutput('pget dmcoords y') xcf = float(xc) ycf = float(yc) # ra, dec in degrees os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits asolfile="' + acao + '" option=sky x=' + xc + ' y=' + yc + ' celfmt=deg') racd = float(commands.getoutput('pget dmcoords ra')) decd = float(commands.getoutput('pget dmcoords dec')) # read all point source areas to subtract them later from observed area ptfile = open(locclu + '/reg/pt0mfe_wcs.reg', 'r') regline = ptfile.readline() regv = [] ptr = [] # how far from (rac,decc) in pixels ptdr = [] # 'radius' of circle/ellipse in pixels while regline != '\n' and regline != '': if regline[0] != '#': regv.append(regline) s1 = regline.partition('(') s2 = s1[2].partition(':') hh = float(s2[0]) s3 = s2[2].partition(':') mm = float(s3[0]) s4 = s3[2].partition(',') ss = float(s4[0]) ptra = 15. * (hh + mm / 60. + ss / 3600.) s5 = s4[2].partition(':') dd = float(s5[0]) if s5[0][0] == '+': ff = 1. elif s5[0][0] == '-': ff = -1. s6 = s5[2].partition(':') am = float(s6[0]) s7 = s6[2].partition(',') ac = float(s7[0]) ptdec = dd + ff * (am / 60. + ac / 3600.) d2 = (((ptra - racd) * numpy.cos(decd / 180. * numpy.pi))**2. + (ptdec - decd)**2.) * (3600. / 0.492)**2. ptr.append(d2**0.5) if s1[0] == 'ellipse': s8 = s7[2].partition("',") s9 = s8[2].partition("',") ptdr.append(60. / 0.492 * max(float(s8[0]), float(s9[0]))) elif s1[0] == 'circle': s8 = s7[2].partition("'") ptdr.append(60. / 0.492 * float(s8[0])) else: print print 'BAAAAAAAAAAAAAD REGIOOOOOOOOOOOON' print regline = ptfile.readline() ptfile.close() # get chip regions chipx = commands.getoutput('dmlist "' + locclu + '/reg/chipsreg' + ob + '.fits[cols x]" data,clean') t1 = chipx.split('\n') t1.remove(t1[0]) chipy = commands.getoutput('dmlist "' + locclu + '/reg/chipsreg' + ob + '.fits[cols y]" data,clean') u1 = chipy.split('\n') u1.remove(u1[0]) # find chips 0,1,2,3 ccdid = commands.getoutput('dmlist "' + locclu + '/reg/chipsreg' + ob + '.fits[cols ccd_id]" data,clean') c1 = ccdid.split('\n') c1.remove(c1[0]) goodchips = [[], [], [], []] # I 5 6 7 for i in range(len(c1)): if int(c1[i]) in (0, 1, 2, 3): goodchips[0].append(i) if int(c1[i]) == 5: goodchips[1].append(i) if int(c1[i]) == 6: goodchips[2].append(i) if int(c1[i]) == 7: goodchips[3].append(i) ccdreg = [[], [], [], []] for iccd in range(4): if len(goodchips[iccd]) > 0: for igood in range(len(goodchips[iccd])): i = goodchips[iccd][igood] polyx = [] t2 = t1[i] t3 = t2.lstrip() t4 = t3.partition(' ') while ('NaN' not in t4[0]) and (t4[1] != ''): polyx.append(float(t4[0])) t2 = t4[2] t3 = t2.lstrip() t4 = t3.partition(' ') polyy = [] u2 = u1[i] u3 = u2.lstrip() u4 = u3.partition(' ') while ('NaN' not in u4[0]) and (u4[1] != ''): polyy.append(float(u4[0])) u2 = u4[2] u3 = u2.lstrip() u4 = u3.partition(' ') ccdreg[iccd].append('polygon(') for j in range(len(polyx)): ccdreg[iccd][igood] = ccdreg[iccd][igood] + str( polyx[j]) + ',' + str(polyy[j]) + ',' ccdreg[iccd][igood] = ccdreg[iccd][igood][0:-1] ccdreg[iccd][igood] = ccdreg[iccd][igood] + ')' ccdname = ['i', '5', '6', '7'] for iccd in range(4): if len(ccdreg[iccd]) > 0: os.system('punlearn dmcopy') os.system('dmcopy "' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r.fits[energy=300:7000]" ' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r_en.fits') if not os.path.exists(locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r_en.fits'): ccdreg[iccd] = [] exposure = float( commands.getoutput('dmkeypar ' + locclu + '/evt' + ob + '_c.fits exposure echo+')) # Making radbins5.txt vrlo = [] vrhi = [] if not os.path.exists(locclu + '/radbins5.txt'): rmin = 1.2 / .492 # in pixels. 1.2" = angular size of 10kpc at z=1 rlo = rmin rhi = rmin * 1.25 hienrlo1 = -1 hienrlo2 = -1 hienrlo3 = -1 ct1 = 0 ct2 = 0 ct3 = 0 print 'rmax ', rmax while rhi <= rmax: # make annulus-minus-ptsrc region for the shell between rlo and rhi. regfile = open(locclu + '/an_test.reg', 'w') regfile.write('annulus(' + xc + ',' + yc + ',' + str(rlo) + ',' + str(rhi) + ')\n') for ii in range(len(ptr)): if ptr[ii] - ptdr[ii] <= rhi and ptr[ii] + ptdr[ii] >= rlo: regfile.write('-' + regv[ii]) regfile.close() ct = float( commands.getoutput('dmlist "' + locclu + '/mrgclean_en.fits[sky=region(' + locclu + '/an_test.reg)]" counts')) sclbgct = 0. for oobb in obsids: for ccdn in ['i', '5', '6', '7']: if os.path.exists(locclu + '/bg/bg' + oobb + '_ccd' + ccdn + 'r_en.fits'): sclbgct = sclbgct + float( commands.getoutput('dmkeypar ' + locclu + '/clean' + oobb + '.fits exposure echo+') ) / float( commands.getoutput( 'dmkeypar ' + locclu + '/bg/bg' + oobb + '_ccd' + ccdn + 'r_en.fits exposure echo+' )) * float( commands.getoutput( 'dmlist "' + locclu + '/bg/bg' + oobb + '_ccd' + ccdn + 'r_en.fits[sky=region(' + locclu + '/an_test.reg)]" counts')) shellct = ct - sclbgct os.remove(locclu + '/an_test.reg') print rlo, rhi, shellct # shell has enough counts, OR we've reached rmax if shellct > 100 or rhi > 0.99 * rmax: vrlo.append(rlo) vrhi.append(rhi) if rhi > 0.99 * rmax: break # radius where we start measuring hi-energy counts if ct <= 1.5 * sclbgct: if ct1 == 0: hienrlo1 = float(rlo) # first choice ct1 = ct1 + int(ct) if ct <= 2.0 * sclbgct: if ct2 == 0: hienrlo2 = float( rlo) # second choice, in case 1st doesnt exist ct2 = ct2 + int(ct) if ct <= 3.0 * sclbgct: if ct3 == 0: hienrlo3 = float(rlo) # 3rd choice ct3 = ct3 + int(ct) rlo = float(rhi) rhi = rhi * 1.25 else: if ct == 0 and len(vrlo) == 0: rlo = float(rhi) rhi = rhi * 1.25 if rhi > rmax: rhi = rmax hienrlofile = open(locclu + '/hienrlo.txt', 'w') hienrlofile.write('1.5 ' + str(hienrlo1) + ' ' + str(ct1) + '\n') hienrlofile.write('2 ' + str(hienrlo2) + ' ' + str(ct2) + '\n') hienrlofile.write('3 ' + str(hienrlo3) + ' ' + str(ct3) + '\n') hienrlofile.close() binfile = open(locclu + '/radbins5.txt', 'w') for ir in range(len(vrlo)): binfile.write(str(vrlo[ir]) + ' ' + str(vrhi[ir]) + '\n') binfile.close() xinfile = open(locclu + '/ctofr/xin.txt', 'w') for ir in range(len(vrlo)): xinfile.write(str(vrlo[ir] / r1mpcpix) + '\n') xinfile.close() xoutfile = open(locclu + '/ctofr/xout.txt', 'w') for ir in range(len(vrhi)): xoutfile.write(str(vrhi[ir] / r1mpcpix) + '\n') xoutfile.close() # the case where radbins5.txt has been created in a previous ob: else: # Loading radial bin edges, from radbins5.txt binfile = open(locclu + '/radbins5.txt', 'r') linestr = binfile.readline() while linestr != '': intermed = linestr.split(' ') vrlo.append(float(intermed[0])) vrhi.append(float(intermed[1][0:-1])) linestr = binfile.readline() binfile.close() # Hi BG corner region if os.path.exists(locclu + '/reg/hibgcorner' + ob + '.reg'): hibgfile = open(locclu + '/reg/hibgcorner' + ob + '.reg', 'r') hibgstr = hibgfile.readline() hibgfile.close() hibgx = float(hibgstr[7:-1].split(',')[0]) hibgy = float(hibgstr[7:-1].split(',')[1]) hibgr = ((hibgx - xcf)**2. + (hibgy - ycf)**2.)**0.5 hien = [[], [], [], []] bghien = [[], [], [], []] hienomega = [[], [], [], []] ccdlist = ['0,1,2,3', '5', '6', '7'] scl = [-1, -1, -1, -1] for iccd in range(4): if len(ccdreg[iccd]) > 0: scl[iccd] = exposure / float( commands.getoutput('dmkeypar "' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r_en.fits" exposure echo+')) radintfile2err = open( locclu + '/ctofr/srcprof' + ob + '_ccd' + ccdname[iccd] + '.txt', 'w') # poisson and systematic errors added in quadrature radintfile2err.write("# R1 R2 SB SBERR\n") bgfile = open( locclu + '/ctofr/bkgprof' + ob + '_ccd' + ccdname[iccd] + '.txt', 'w') bsfile = open( locclu + '/ctofr/omega' + ob + '_ccd' + ccdname[iccd] + '.txt', 'w') bgexp = float( commands.getoutput('dmkeypar ' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r_en.fits exposure echo+')) for i in range(len(vrlo)): # make region of intersection of annulus with chip regions fovfile = open( locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov.reg', 'w') for ii in range(len(ccdreg[iccd])): fovfile.write('+annulus(' + xc + ',' + yc + ',' + str(vrlo[i]) + ',' + str(vrhi[i]) + ') * ' + ccdreg[iccd][ii] + '\n') fovfile.close() # make region of intersection of annulus with chip regions MINUS PTSRCs fovptfile = open( locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg', 'w') for ii in range(len(ccdreg[iccd])): fovptfile.write('+annulus(' + xc + ',' + yc + ',' + str(vrlo[i]) + ',' + str(vrhi[i]) + ') * ' + ccdreg[iccd][ii] + '\n') for jj in range(len(ptr)): if ptr[jj] - ptdr[jj] <= vrhi[ i] and ptr[jj] + ptdr[jj] >= vrlo[i]: fovptfile.write('-' + regv[jj][0:-1] + ' ') if os.path.exists(locclu + '/reg/hibgcorner' + ob + '.reg') and hibgr - 1095. <= vrhi[ i] and hibgr + 1095. >= vrlo[i]: fovptfile.write('-' + hibgstr[0:-1]) fovptfile.write('\n') fovptfile.close() # calculate counts/area/solidangle/second ct = float( commands.getoutput('dmlist "' + locclu + '/evt' + ob + '_c.fits[sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg)]" counts')) bgct = float( commands.getoutput( 'dmlist "' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r_en.fits[energy=700:2000][sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg)]" counts') ) # more exact than above (deleted) line, but could be slower if many ptsrcs #netct = ct - bgct * scl[iccd] # make spectrum of annulus os.system('punlearn dmextract') os.system('dmextract "' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccdlist[iccd] + '][sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg)][bin PI]" ' + locclu + '/radp' + ob + '/sp' + str(i) + '_ccd' + ccdname[iccd] + '.fits opt=pha1 wmap="[energy=700:2000][bin det=8]"') # calculate hi-energy SB hien[iccd].append( float( commands.getoutput('dmlist "' + locclu + '/hien' + ob + '.fits[ccd_id=' + ccdlist[iccd] + '][sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg)]" counts'))) bghien[iccd].append( float( commands.getoutput( 'dmlist "' + locclu + '/bg/bg' + ob + '_ccd' + ccdname[iccd] + 'r.fits[energy=9500:12000][sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov_pt.reg)]" counts'))) hienomega[iccd].append( float( commands.getoutput('dmkeypar ' + locclu + '/radp' + ob + '/sp' + str(i) + '_ccd' + ccdname[iccd] + '.fits backscal echo+'))) # make ARF for radial bin arf4radp4.arf(clu, ob, i, ccdname[iccd]) # calculate solid angle from BACKSCAL keyword in spectrum file bs = float( commands.getoutput('dmkeypar ' + locclu + '/radp' + ob + '/sp' + str(i) + '_ccd' + ccdname[iccd] + '.fits backscal echo+')) # calculate effective area os.system('punlearn dmstat') # this if statement handles the case when the annulus thickness is less than a pixel, # which causes dmstat to return area=0 if vrhi[i] - vrlo[i] > 1.5: if vrhi[i] <= 0.1 * r1mpcpix: os.system('dmstat "' + locclu + '/instmap/expmap' + ob + '_ccd' + ccdname[iccd] + '_in.fits[sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov.reg)]" centroid=no') else: os.system('dmstat "' + locclu + '/instmap/expmap' + ob + '_ccd' + ccdname[iccd] + '_out.fits[sky=region(' + locclu + '/radp' + ob + '/an' + str(i) + '_ccd' + ccdname[iccd] + '_xfov.reg)]" centroid=no') else: if vrhi[i] <= 0.1 * r1mpcpix: os.system('dmstat "' + locclu + '/instmap/expmap' + ob + '_ccd' + ccdname[iccd] + '_in.fits[sky=circle(' + xc + ',' + yc + ',' + str(vrhi[i]) + ')]" centroid=no') else: os.system('dmstat "' + locclu + '/instmap/expmap' + ob + '_ccd' + ccdname[iccd] + '_out.fits[sky=circle(' + xc + ',' + yc + ',' + str(vrhi[i]) + ')]" centroid=no') try: area = float(commands.getoutput('pget dmstat out_mean')) except ValueError: area = 0 # the above try-exept is for the case, where the expmap needed to calulate area doesnt exist. # this can happen when the there is no intersection between the in/out region and a ccd. if bs != 0 and area != 0 and ct != 0: sb = ct / bs / area / exposure #sberr = ( ct + scl**2.*bgct )**.5 / bs / area / exposure # poisson error sberr = ct**.5 / bs / area / exposure # poisson error radintfile2err.write( str(vrlo[i] / r1mpcpix) + ' ' + str(vrhi[i] / r1mpcpix) + ' ' + str(sb) + ' ' + str( (sberr**2. + sb**2. / 25.)**0.5) + '\n') # poisson and 1/5 fraction, added in quadrature bgsb = bgct / bs / area / bgexp bgsberr = bgct**0.5 / bs / area / bgexp bgfile.write( str(vrlo[i] / r1mpcpix) + ' ' + str(vrhi[i] / r1mpcpix) + ' ' + str(bgsb) + ' ' + str(bgsberr) + '\n') bsfile.write( str(vrlo[i] / r1mpcpix) + ' ' + str(bs) + ' ' + str(bs * 64.0 * 1024.**2. / (numpy.pi) / (vrhi[i]**2 - vrlo[i]**2)) + '\n') radintfile2err.close() bgfile.close() bsfile.close() # write BG scaling factors from hi-energy counts # get the 1000 outermost counts, and save their region hientot = [0., 0., 0., 0.] bghientot = [0., 0., 0., 0.] hienomegatot = [0., 0., 0., 0.] sclfile = open(locclu + '/ctofr/scl' + ob + '.txt', 'w') for iccd in range(4): if len(ccdreg[iccd]) > 0: irlo = len(vrlo) - 1 while hientot[iccd] < 1e3 and irlo >= 0: hientot[iccd] = hientot[iccd] + hien[iccd][irlo] bghientot[iccd] = bghientot[iccd] + bghien[iccd][irlo] hienomegatot[iccd] = hienomegatot[iccd] + hienomega[iccd][irlo] irlo = irlo - 1 irlo = irlo + 1 if bghientot[iccd] != 0: # write the BG counts and backscales sclfile.write( str(scl[iccd]) + ' ' + str(hientot[iccd] / bghientot[iccd]) + ' ' + str(hientot[iccd]) + ' ' + str(bghientot[iccd]) + ' ' + str(hienomegatot[iccd]) + ' ' + str(irlo) + ' ' + str(vrlo[irlo]) + '\n') # make region out of which we estimate the Hi-energy cts in the src dataset losrcregfile = open( locclu + '/reg/losrc' + ob + '_ccd' + ccdname[iccd] + '.reg', 'w') for polyg in ccdreg[iccd]: losrcregfile.write('+annulus(' + xc + ',' + yc + ',' + str(vrlo[irlo]) + ',' + str(vrhi[-1]) + ') * ' + polyg + '\n') for jj in range(len(ptr)): if ptr[jj] - ptdr[jj] <= vrhi[ -1] and ptr[jj] + ptdr[jj] >= vrlo[irlo]: losrcregfile.write('-' + regv[jj][0:-1] + ' ') if iccd == 0 and os.path.exists( locclu + '/reg/hibgcorner' + ob + '.reg') and hibgr - 1095. <= vrhi[ -1] and hibgr + 1095. >= vrlo[irlo]: losrcregfile.write('-' + hibgstr[0:-1]) losrcregfile.write('\n') losrcregfile.close() # extract spectrum from the above region, to get the BACKSCAL value from the spectrum os.system('punlearn dmextract') os.system('dmextract "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/losrc' + ob + '_ccd' + ccdname[iccd] + '.reg)][bin PI]" ' + locclu + '/spec/losrc' + ob + '_ccd' + ccdname[iccd] + '.fits opt=pha1 wmap="[energy=700:2000][bin det=8]"') else: sclfile.write( str(scl[iccd]) + ' ' + 'NaN ' + str(hientot[iccd]) + ' ' + str(bghientot[iccd]) + ' ' + str(hienomegatot[iccd]) + ' ' + str(irlo) + ' ' + str(vrlo[irlo]) + '\n') # if this ccd is not in this obsid else: sclfile.write('-1 -1 -1 -1 -1 -1 -1\n') sclfile.close()
def rmf(locclu, ob, ccdstr): acao = asol6_loc.asol(ob, 'asol') (rac, decc) = centradec.getrd(locclu) caldbfolder = commands.getoutput('echo $CALDB') if ccdstr == 'i': ccdlist = '0,1,2,3' else: ccdlist = ccdstr os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits ' + acao + ' ra=' + rac + ' dec=' + decc + ' option=cel celfmt=hms mode=h') chipx = commands.getoutput('pget dmcoords chipx') chipy = commands.getoutput('pget dmcoords chipy') centerccd = commands.getoutput('pget dmcoords chip_id') if centerccd not in ccdlist: os.system('punlearn dmstat') os.system('dmstat "' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccdlist + '][cols x]" median=yes') xx = commands.getoutput('pget dmstat out_median') os.system('punlearn dmstat') os.system('dmstat "' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccdlist + '][cols y]" median=yes') yy = commands.getoutput('pget dmstat out_median') os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits ' + acao + ' x=' + xx + ' y=' + yy + ' option=sky mode=h') chipx = commands.getoutput('pget dmcoords chipx') chipy = commands.getoutput('pget dmcoords chipy') centerccd = commands.getoutput('pget dmcoords chip_id') if float(chipx) < 1: chipx = '1' if float(chipx) > 1024: chipx = '1024' if float(chipy) < 1: chipy = '1' if float(chipy) > 1024: chipy = '1024' # RMF ----------------------- fptemp = float( commands.getoutput('dmkeypar ' + locclu + '/clean' + ob + '.fits fp_temp echo+')) tgaincor = commands.getoutput('dmkeypar ' + locclu + '/clean' + ob + '.fits tgaincor echo+') cticor = commands.getoutput('dmkeypar ' + locclu + '/clean' + ob + '.fits cti_corr echo+') ctiapp = commands.getoutput('dmkeypar ' + locclu + '/clean' + ob + '.fits cti_app echo+') # using mkacisrmf or... if (fptemp < 158. or (fptemp >= 158. and ccdstr in ['5', '7'])) and ( ctiapp != 'NNNNNNNNNN' or cticor == 'TRUE' or cticor == '1') and (tgaincor == 'T'): gainfile = commands.getoutput('dmkeypar ' + locclu + '/clean' + ob + '.fits gainfile echo+') gainver = gainfile.split('.fits')[0][-1] caldbls = commands.getoutput('ls $CALDB/data/chandra/acis/p2_resp/' + gainfile[0:15] + '*' + gainver + '.fits') caldbresp = caldbls.split('\n') if len(caldbresp) != 1: print print print ' ############### MORE OR LESS THAN ONE P2RESP FILES FOUND !!!!!!!!!! ###################' print print os.system('punlearn mkacisrmf') os.system('pset mkacisrmf infile=' + caldbresp[0]) os.system('pset mkacisrmf outfile=' + locclu + '/spec/sp' + ob + '_ccd' + ccdstr + '_center.wrmf') os.system('pset mkacisrmf energy="0.3:11.0:0.01" channel="1:1024:1"') os.system('pset mkacisrmf chantype="PI"') os.system('pset mkacisrmf wmap=none') os.system('pset mkacisrmf chipx=' + chipx) os.system('pset mkacisrmf chipy=' + chipy) os.system('pset mkacisrmf ccd_id=' + centerccd) os.system('pset mkacisrmf gain=' + caldbfolder + '/data/chandra/acis/det_gain/' + gainfile) os.system('pset mkacisrmf asolfile=none') os.system('mkacisrmf mode=h verbose=1') # using mkrmf else: os.system('punlearn acis_fef_lookup') os.system('acis_fef_lookup ' + locclu + '/clean' + ob + '.fits chipx=' + chipx + ' chipy=' + chipy + ' chipid=' + centerccd) os.system('punlearn mkrmf') os.system('pset mkrmf infile=' + commands.getoutput('pget acis_fef_lookup outfile')) os.system('pset mkrmf outfile=' + locclu + '/spec/sp' + ob + '_ccd' + ccdstr + '_center.wrmf') os.system('pset mkrmf axis1="energy=0.3:11.0:0.01"') os.system('pset mkrmf axis2="pi=1:1024:1"') os.system('pset mkrmf weights=none') os.system('mkrmf verbose=1 mode=h')
def exp(clu, obsids, inorout): locclu = 'mfe_' + clu origclu = 'orig_' + clu #os.system( 'echo "binsrc2, \''+clu+'\' , \'src'+inorout+'.txt\' " | idl' ) binsrc2.bin(clu, 'src' + inorout + '.txt') (rac, decc) = centradec.getrd(locclu) if not os.path.exists(locclu + '/instmap'): os.mkdir(locclu + '/instmap') hardobs = hardsoft3.hardsoft(clu, obsids, 'h') softobs = hardsoft3.hardsoft(clu, obsids, 's') for i in range(len(obsids)): ob = obsids[i] acao = asol6_loc.asol(ob, 'asol') os.system('punlearn ardlib') os.system('acis_set_ardlib ' + asol6_loc.asol(ob, 'bpix')) ccds = '' # if this is the in region, then check if there are counts in in region # but if it's the out region, only check if there are counts in the ccd of interest: # the reason is we want to include data that is beyond the out region, which stops # at 1Mpc if inorout == 'in': if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=0]" counts')) > 0: ccds = ccds + '0' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=1]" counts')) > 0: ccds = ccds + '1' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=2]" counts')) > 0: ccds = ccds + '2' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=3]" counts')) > 0: ccds = ccds + '3' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=5]" counts')) > 0: ccds = ccds + '5' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=6]" counts')) > 0: ccds = ccds + '6' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[sky=region(' + locclu + '/reg/' + inorout + '.reg)][ccd_id=7]" counts')) > 0: ccds = ccds + '7' else: if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=0]" counts')) > 0: ccds = ccds + '0' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=1]" counts')) > 0: ccds = ccds + '1' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=2]" counts')) > 0: ccds = ccds + '2' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=3]" counts')) > 0: ccds = ccds + '3' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=5]" counts')) > 0: ccds = ccds + '5' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=6]" counts')) > 0: ccds = ccds + '6' if int( commands.getoutput('dmlist "' + locclu + '/clean' + ob + '.fits[ccd_id=7]" counts')) > 0: ccds = ccds + '7' # ccdscoma='' # for j in range(len(ccds)-1) : ccdscoma=ccdscoma+ccds[j]+',' # ccdscoma=ccdscoma+ccds[-1] if not os.path.exists(locclu + '/evt' + ob + '_c.fits'): os.system('punlearn dmcopy') os.system('dmcopy "' + locclu + '/clean' + ob + '.fits[energy=700:2000]" ' + locclu + '/evt' + ob + '_c.fits') #[ccd_id='+ccdscoma+'] for j in range(len(ccds)): if not os.path.exists(locclu + '/instmap/asphist' + ob + '_ccd' + ccds[j] + '.fits'): os.system('punlearn asphist') os.system('pset asphist infile=' + acao) os.system('pset asphist outfile=' + locclu + '/instmap/asphist' + ob + '_ccd' + ccds[j] + '.fits') os.system('pset asphist evtfile="' + locclu + '/clean' + ob + '.fits[ccd_id=' + ccds[j] + ']"') os.system('asphist verbose=1 mode=h') # Make instrument map for j in range(len(ccds)): os.system('punlearn mkinstmap') os.system('pset mkinstmap pixelgrid="1:1024:#1024,1:1024:#1024"') os.system('pset mkinstmap maskfile=' + asol6_loc.asol(ob, 'msk1')) #os.system('pset mkinstmap pbkfile='+asol6_loc.asol(ob,'pbk')) os.system('pset mkinstmap dafile=CALDB') os.system('pset mkinstmap spectrumfile=' + locclu + '/spec/binsrc' + inorout + '.txt') os.system('pset mkinstmap obsfile=' + locclu + '/clean' + ob + '.fits') os.system('pset mkinstmap detsubsys=ACIS-' + ccds[j]) os.system('pset mkinstmap outfile=' + locclu + '/instmap/winstmap' + ob + '_ccd' + ccds[j] + '_' + inorout + '.fits') os.system('mkinstmap mode=h verbose=1') os.system('punlearn dmcoords') os.system('dmcoords ' + locclu + '/clean' + ob + '.fits asolfile=' + acao + ' option=cel ra=' + rac + ' dec=' + decc + ' celfmt=hms') xc = commands.getoutput('pget dmcoords x') yc = commands.getoutput('pget dmcoords y') xcf = float(xc) ycf = float(yc) xs = commands.getoutput('dmlist "' + locclu + '/evt' + ob + '_c.fits[cols x]" data,clean') xsv = xs.split('\n') xsv.remove(xsv[0]) for ii in range(len(xsv)): xsv[ii] = float(xsv[ii]) ys = commands.getoutput('dmlist "' + locclu + '/evt' + ob + '_c.fits[cols y]" data,clean') ysv = ys.split('\n') ysv.remove(ysv[0]) for ii in range(len(ysv)): ysv[ii] = float(ysv[ii]) xmin = min(xsv) xmax = max(xsv) ymin = min(ysv) ymax = max(ysv) # Make exposure map os.system('punlearn mkexpmap') os.system('pset mkexpmap normalize=yes') os.system('pset mkexpmap xygrid=' + str(xmin) + ':' + str(xmax) + ':4,' + str(ymin) + ':' + str(ymax) + ':4') os.system('pset mkexpmap useavgaspect=no') os.system('pset mkexpmap mode=h') for j in range(len(ccds)): os.system('mkexpmap instmapfile=' + locclu + '/instmap/winstmap' + ob + '_ccd' + ccds[j] + '_' + inorout + '.fits outfile=' + locclu + '/instmap/expmap' + ob + '_ccd' + ccds[j] + '_' + inorout + '.fits asphistfile=' + locclu + '/instmap/asphist' + ob + '_ccd' + ccds[j] + '.fits verbose=1') # if ACIS-I ccd's are preset, merge them. if '0' in ccds or '1' in ccds or '2' in ccds or '3' in ccds: # Reproject exposure map hmrgstr = '' for ccd in '0123': if ccd in ccds: hmrgstr = hmrgstr + ',' + locclu + '/instmap/expmap' + ob + '_ccd' + ccd + '_' + inorout + '.fits' hmrgstr = hmrgstr[1:] os.system('punlearn reproject_image') os.system('pset reproject_image infile="' + hmrgstr + '"') os.system('pset reproject_image outfile=' + locclu + '/instmap/expmap' + ob + '_ccdi_' + inorout + '.fits') os.system('pset reproject_image matchfile=' + locclu + '/instmap/expmap' + ob + '_ccd' + ccds[0] + '_' + inorout + '.fits') os.system('pset reproject_image method=average') os.system('reproject_image mode=h') os.system( 'dmhedit ' + locclu + '/instmap/expmap' + ob + '_ccdi_' + inorout + '.fits filelist="" op=add key=BUNIT value="cm**2" mode=h') # clean up files not needed for j in range(len(ccds)): os.remove(locclu + '/instmap/winstmap' + ob + '_ccd' + ccds[j] + '_' + inorout + '.fits') # more cleanup os.system('rm ' + locclu + '/instmap/expmap*_ccd[0123]_*.fits')