def run(self, evfile, scfile, sra, sdec, rad, bra, bdec, brad, tmin, tmax, emin, emax, enbin, irfs, cube, outroot, dcostheta, thetamax, binsz, zmax): import time from psfcor import arfcreate import pyfits tstart = tmin tstop = tmax scf = pyfits.open(scfile) tstart_sc = float(scf[0].header['TSTART']) tstop_sc = float(scf[0].header['TSTOP']) scf.close() self.putlog(os.environ['PFILES']) if tstart == "INDEF": tstart = tstart_sc else: try: tstart = float(tstart) except: self.putlog("Warning: Error converting tstart to float.") self.putlog("Using start time from SC file.") if tstop == "INDEF": tstop = tstop_sc else: try: tstop = float(tstop) except: self.putlog("Warning: Error converting tstart to float.") if tstart > tstart_sc: tstart = tstart_sc if tstop > tstop_sc: tstop = tstop_sc expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(sdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(sdec)+"*#deg)*COS((RA-"+\ str(sra)+")*#deg))/#deg<"+str(rad)+".AND.TIME>"+str(tstart)+".AND.TIME<"+str(tstop) pid = str(os.getpid()) src_ef = 'ev' + pid + '_src.fits' bkg_ef = 'ev' + pid + '_bkg.fits' srcf = outroot + '_src.pha' bkgf = outroot + '_bkg.pha' if self.state == "running": try: self.putlog( "***Running FSELECT to produce event file for the source region***" ) subprocess.call(["fselect", evfile, '!' + src_ef, expr]) except: self.putlog("Error occured when running FSELECT for src.") self.stop() else: pass fh = pyfits.open(src_ef, mode='update') hdu = fh[1].header hdu['DSVAL2 '] = "CIRCLE(" + str(sra) + "," + str( sdec) + "," + str(rad) + ")" fh.close() expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(bdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(bdec)+"*#deg)*COS((RA-"+\ str(bra)+")*#deg))/#deg<"+str(brad)+".AND.TIME>"+str(tstart)+".AND.TIME<"+str(tstop) if self.state == "running": try: self.putlog( "***Running FSELECT to produce event file for the background region***" ) subprocess.call(["fselect", evfile, '!' + bkg_ef, expr]) except: self.putlog("Error occured when running FSELECT for backgrnd.") self.stop() if self.state == "running": self.putlog( "***Running GTBIN to produce spectrum for the source region***" ) time.sleep(0.05) evbin['algorithm'] = 'PHA1' evbin['ebinalg'] = 'LOG' evbin['evfile'] = src_ef evbin['scfile'] = scfile evbin['outfile'] = srcf evbin['tstart'] = tstart evbin['tstop'] = tstop evbin['emin'] = emin evbin['emax'] = emax evbin['enumbins'] = enbin evbin['chatter'] = '10' self.putlog(evbin.command()) catchError = "at the top level:" gterr = False inf, outf = evbin.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog( "GTBIN error during source region extraction! Exiting...") self.state = "stop" if self.state == "running": evbin['evfile'] = bkg_ef evbin['outfile'] = bkgf self.putlog( "***Running GTBIN to produce spectrum for the background region***" ) time.sleep(0.05) self.putlog(evbin.command()) catchError = "at the top level:" gterr = False inf, outf = evbin.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog( "GTBIN error during background region extraction! Exiting..." ) self.state = "stop" # response fh = pyfits.open(srcf, mode='update') hdu = fh[1].header # hdu['DSVAL2 '] = "CIRCLE("+str(sra)+ ","+str(self.analysis.dec)+","+ \ # str(self.analysis.obs_pars["roi"])+")" if self.state == "running": self.putlog("***Running gtrspgen (response generator)***") rspf = outroot + '.rsp' gtrsp['respalg'] = "PS" gtrsp['specfile'] = srcf gtrsp['scfile'] = scfile gtrsp['thetacut'] = thetamax gtrsp['outfile'] = rspf gtrsp['irfs'] = irfs gtrsp['dcostheta'] = dcostheta gtrsp['emin'] = 100.0 gtrsp['emax'] = 300000.0 gtrsp['enumbins'] = 100 gtrsp['chatter'] = 0 self.putlog(gtrsp.command()) catchError = "at the top level:" gterr = False inf, outf = gtrsp.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True # self.putlog(str(gterr)) inf.close() outf.close() if gterr: self.putlog("GTRSPGEN error! Exiting...") self.stop() time.sleep(0.05) # PSF if self.state == "running": self.putlog("***Running gtpsf (PSF generator)***") psff = outroot + '_psf.fits' gtpsf['expcube'] = cube gtpsf['dec'] = sdec gtpsf['ra'] = sra gtpsf['outfile'] = psff gtpsf['irfs'] = irfs gtpsf['emin'] = 100.0 gtpsf['emax'] = 300000.0 gtpsf['nenergies'] = 101 gtpsf['thetamax'] = thetamax gtpsf['ntheta'] = int(thetamax / dcostheta) gtpsf['chatter'] = 0 self.putlog(gtpsf.command()) catchError = "at the top level:" gterr = False inf, outf = gtpsf.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog("GTPSF error! Exiting...") self.stop() # ARF if self.state == "running": arff = outroot + ".arf" try: out = arfcreate(arff, rad, rspf, psff) self.putlog(out) except: self.putlog("ARFCREATE error! Exiting...") self.stop() hdu['RESPFILE'] = rspf hdu['BACKFILE'] = bkgf hdu['ANCRFILE'] = arff hdu['BACKSCAL'] = 1.0 fh.flush() fh.close() fh = pyfits.open(bkgf, mode='update') hdu = fh[1].header hdu['BACKSCAL'] = (brad / rad)**2 fh.flush() fh.close() # self.logit(out) # Clean up try: os.system('rm -f ' + psff) os.system('rm -f src' + pid + '*') os.system('rm -f bkg' + pid + '*') os.system('rm -f ev' + pid + '*') os.system('rm -f rsp' + pid + '*') except: pass if self.state == "running": self.state = "done" if self.state == "stop": self.state = "stopped"
def run(self,evfile,scfile,sra,sdec,rad,bra,bdec,brad, tmin,tmax,emin,emax,enbin,irfs,cube,outroot, dcostheta,thetamax,binsz,zmax): import time from psfcor import arfcreate import pyfits tstart = tmin tstop = tmax scf = pyfits.open(scfile) tstart_sc = float(scf[0].header['TSTART']) tstop_sc = float(scf[0].header['TSTOP']) scf.close() self.putlog(os.environ['PFILES']) if tstart == "INDEF": tstart = tstart_sc else: try: tstart = float(tstart) except: self.putlog("Warning: Error converting tstart to float.") self.putlog("Using start time from SC file.") if tstop == "INDEF": tstop = tstop_sc else: try: tstop = float(tstop) except: self.putlog("Warning: Error converting tstart to float.") if tstart > tstart_sc: tstart = tstart_sc if tstop > tstop_sc: tstop = tstop_sc expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(sdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(sdec)+"*#deg)*COS((RA-"+\ str(sra)+")*#deg))/#deg<"+str(rad)+".AND.TIME>"+str(tstart)+".AND.TIME<"+str(tstop) pid = str(os.getpid()) src_ef = 'ev'+pid+'_src.fits' bkg_ef = 'ev'+pid+'_bkg.fits' srcf = outroot+'_src.pha' bkgf = outroot+'_bkg.pha' if self.state == "running": try: self.putlog("***Running FSELECT to produce event file for the source region***") subprocess.call(["fselect",evfile,'!'+src_ef,expr]) except: self.putlog("Error occured when running FSELECT for src.") self.stop() else: pass fh = pyfits.open(src_ef,mode='update') hdu = fh[1].header hdu['DSVAL2 '] = "CIRCLE("+str(sra)+","+str(sdec)+","+str(rad)+")" fh.close() expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(bdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(bdec)+"*#deg)*COS((RA-"+\ str(bra)+")*#deg))/#deg<"+str(brad)+".AND.TIME>"+str(tstart)+".AND.TIME<"+str(tstop) if self.state == "running": try: self.putlog("***Running FSELECT to produce event file for the background region***") subprocess.call(["fselect",evfile,'!'+bkg_ef,expr]) except: self.putlog("Error occured when running FSELECT for backgrnd.") self.stop() if self.state == "running": self.putlog("***Running GTBIN to produce spectrum for the source region***") time.sleep(0.05) evbin['algorithm'] = 'PHA1' evbin['ebinalg'] = 'LOG' evbin['evfile'] = src_ef evbin['scfile'] = scfile evbin['outfile'] = srcf evbin['tstart'] = tstart evbin['tstop'] = tstop evbin['emin'] = emin evbin['emax'] = emax evbin['enumbins'] = enbin evbin['chatter'] = '10' self.putlog(evbin.command()) catchError = "at the top level:" gterr = False inf,outf = evbin.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog("GTBIN error during source region extraction! Exiting...") self.state = "stop" if self.state == "running": evbin['evfile'] = bkg_ef evbin['outfile'] = bkgf self.putlog("***Running GTBIN to produce spectrum for the background region***") time.sleep(0.05) self.putlog(evbin.command()) catchError = "at the top level:" gterr = False inf,outf = evbin.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog("GTBIN error during background region extraction! Exiting...") self.state = "stop" # response fh = pyfits.open(srcf,mode='update') hdu = fh[1].header # hdu['DSVAL2 '] = "CIRCLE("+str(sra)+ ","+str(self.analysis.dec)+","+ \ # str(self.analysis.obs_pars["roi"])+")" if self.state == "running": self.putlog( "***Running gtrspgen (response generator)***") rspf = outroot+'.rsp' gtrsp['respalg'] = "PS" gtrsp['specfile'] = srcf gtrsp['scfile'] = scfile gtrsp['thetacut'] = thetamax gtrsp['outfile'] = rspf gtrsp['irfs'] = irfs gtrsp['dcostheta'] = dcostheta gtrsp['emin'] = 100.0 gtrsp['emax'] = 300000.0 gtrsp['enumbins'] = 100 gtrsp['chatter'] = 0 self.putlog(gtrsp.command()) catchError = "at the top level:" gterr = False inf,outf = gtrsp.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True # self.putlog(str(gterr)) inf.close() outf.close() if gterr: self.putlog("GTRSPGEN error! Exiting...") self.stop() time.sleep(0.05) # PSF if self.state == "running": self.putlog("***Running gtpsf (PSF generator)***") psff = outroot+'_psf.fits' gtpsf['expcube'] = cube gtpsf['dec'] = sdec gtpsf['ra'] = sra gtpsf['outfile'] = psff gtpsf['irfs'] = irfs gtpsf['emin'] = 100.0 gtpsf['emax'] = 300000.0 gtpsf['nenergies'] = 101 gtpsf['thetamax'] = thetamax gtpsf['ntheta'] = int(thetamax/dcostheta) gtpsf['chatter'] = 0 self.putlog(gtpsf.command()) catchError = "at the top level:" gterr = False inf,outf = gtpsf.runWithOutput(print_command=False) for line in outf: self.putlog(line) if line.find(catchError) != -1: gterr = True inf.close() outf.close() if gterr: self.putlog("GTPSF error! Exiting...") self.stop() # ARF if self.state == "running": arff = outroot+".arf" try: out = arfcreate(arff,rad,rspf,psff) self.putlog(out) except: self.putlog("ARFCREATE error! Exiting..." ) self.stop() hdu['RESPFILE'] = rspf hdu['BACKFILE'] = bkgf hdu['ANCRFILE'] = arff hdu['BACKSCAL'] = 1.0 fh.flush() fh.close() fh = pyfits.open(bkgf,mode='update') hdu = fh[1].header hdu['BACKSCAL'] = (brad/rad)**2 fh.flush() fh.close() # self.logit(out) # Clean up try: os.system('rm -f '+psff) os.system('rm -f src'+pid+'*') os.system('rm -f bkg'+pid+'*') os.system('rm -f ev'+pid+'*') os.system('rm -f rsp'+pid+'*') except: pass if self.state == "running": self.state = "done" if self.state == "stop": self.state = "stopped"
def run(self, evfile, scfile, sra, sdec, rad, bra, bdec, brad, cube, tbin, irfs, tstart, tstop, emin, emax, enbin, outfile, dcostheta, thetamax, binsz, zmax, pl_index, index_free, logfile): ''' Given the LAT dat event file (evfile), source and background regions, Generates a full flux curve using xspec fits for every interval. Parameters: evfile - observation event file, create with gtmktime scfile - observation house keeping file sra - source RA sdec - source DEC rad - source RAD (degrees) bra - background RA bdec - background DEC brad - background region radius outfile [lc.fits] - output lightcurve FITS file tbin [86400] - final flux curve time binnig (sec). tstart [INDEF] - start time (MET sec). If INDEF the value is taken from the evfile. tstop [INDEF] - start time (MET sec). If INDEF the value is taken from the evfile. emin [100.0] - lower energy limit of the energy interval (MeV). emin [300000.0] - upper energy of the energy interval (MeV). enbin [20] - number of the energy bins to use in xspec fits. cube - the galactic cube file. If not given or does not exist - it will be calculated (takes a long time!!!). binsz [1.0], zmax [100.0] - corresponding gtltcube parameters if a cube is to be calculated. thetamax [60.0],dcostheta [0.05] - corresponding parameters for psf and response calculations. See gtpsf,gtrspgen help for details. pl_index [2.5] - starting value for the photon index of the power law fits to data. index_free [False] - if False the index is fixed at pl_index value ''' logf = open(logfile, "w") res_str = "" scf = pyfits.open(scfile) tstart_sc = float(scf[0].header['TSTART']) tstop_sc = float(scf[0].header['TSTOP']) if tstart == "INDEF": tstart = tstart_sc else: try: tstart = float(tstart) except: res_str += "Warning: Error converting tstart to float.\n" res_str += "Using start time from SC file." self.putlog("Warning: Error converting tstart to float.") self.putlog("Using start time from SC file.") if tstop == "INDEF": tstop = tstop_sc else: try: tstop = float(tstop) except: res_str += "Warning: Error converting tstop to float.\n" res_str += "Using stop time from SC file.\n" self.putlog("Warning: Error converting tstart to float.") logf.write("Using stop time from SC file.\n") try: tbin = float(tbin) except: res_str += "Warning: Error converting tbin to float.\n" self.putlog("Warning: Error converting tbin to float.") logf.close() return -1, res_str if tbin < 0.0: res_str += "Negative tbin. Exit!.\n" logf.write("Negative tbin. Exit!.\n") logf.close() self.putlog("Negative tbin. Exit!.") return -1, res_str if tstart > tstart_sc: tstart = tstart_sc if tstop > tstop_sc: tstop = tstop_sc expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(sdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(sdec)+"*#deg)*COS((RA-"+\ str(sra)+")*#deg))/#deg<"+str(rad) pid = str(os.getpid()) src_ef = 'ev' + pid + '_src.fits' bkg_ef = 'ev' + pid + '_bkg.fits' if self.state == "running": try: subprocess.call(["fselect", evfile, '!' + src_ef, expr]) except: res_str += "Error occured when running FSELECT for src.\n" self.putlog("Error occured when running FSELECT for src.") else: res_str += "Src events extraction OK.\n" # putlog("Src events extraction OK.") fh = pyfits.open(src_ef, mode='update') hdu = fh[1].header hdu['DSVAL2 '] = "CIRCLE(" + str(sra) + "," + str(sdec) + ",25.0)" fh.close() expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(bdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(bdec)+"*#deg)*COS((RA-"+\ str(bra)+")*#deg))/#deg<"+str(brad) if self.state == "running": try: subprocess.call(["fselect", evfile, '!' + bkg_ef, expr]) except: res_str += "Error occured when running FSELECT for backgrnd.\n" self.putlog("Error occured when running FSELECT for backgrnd.") else: res_str += "Bkg extraction OK.\n" # putlog("Bkg extraction OK.") # ltcube if self.state == "running": cubecalc = False if not os.path.exists(cube): cubecalc = True if cubecalc: gtcube['evfile'] = src_ef gtcube['scfile'] = scfile gtcube['outfile'] = cube gtcube['dcostheta'] = dcostheta gtcube['binsz'] = binsz gtcube['zmax'] = zmax res_str += gtcube.command() out = gtcube.runWithOutput(print_command=False)[1] xxx = out.read() res_str += out.read() logf.write(xxx) t1 = tstart t2 = t1 + tbin nsp = 0 # psf if self.state == "running": psff = 'psf' + pid + '.fits' gtpsf['expcube'] = cube gtpsf['dec'] = sdec gtpsf['ra'] = sra gtpsf['outfile'] = psff gtpsf['irfs'] = irfs gtpsf['emin'] = 100.0 gtpsf['emax'] = 300000.0 gtpsf['nenergies'] = 101 gtpsf['thetamax'] = thetamax gtpsf['ntheta'] = int(thetamax / dcostheta) gtpsf['chatter'] = 0 res_str += gtpsf.command() out = gtpsf.runWithOutput(print_command=False)[1] xxx = out.read() res_str += xxx logf.write(xxx) # openning xspec session try: os.system('rm -f xspec' + pid + '_lc.txt') os.system('touch xspec' + pid + '_lc.txt') except: pass arff = 'arf' + pid + '.arf' # response hdu0 = fh[0].header cflux = -9.0 # flexp = pyfits.open('gtbin.lc') # lcdata = flexp[1].data ind10 = int(0) ind25 = int(0) ind50 = int(0) ind75 = int(0) # self.putlog('Lightcurve thread: Sarting the main loop') # Main loop nbin = (tstop - tstart) / tbin while t1 < tstop and self.state == "running": if (t1 - tstart) / tbin > 0.1 * nbin and ind10 == 0: self.putlog("Progress: 10%") ind10 = 1 if (t1 - tstart) / tbin > 0.25 * nbin and ind25 == 0: self.putlog("Progress: 25%") ind25 = 1 if (t1 - tstart) / tbin > 0.5 * nbin and ind50 == 0: self.putlog("Progress: 50%") ind50 = 1 if (t1 - tstart) / tbin > 0.75 * nbin and ind75 == 0: self.putlog("Progress: 75%") ind75 = 1 # self.putlog('Sarting loop '+str(nsp)) logf.write("Interval: " + str(nsp) + " Tstart = " + str(t1) + " Tstop = " + str(t2) + "\n") expr = "TIME>" + str(t1) + ".AND.TIME<" + str(t2) sef1 = 'ev' + pid + '_src' + str(nsp) + '_1.fits' bef1 = 'ev' + pid + '_bkg' + str(nsp) + '_1.fits' try: subprocess.call(["fselect", src_ef, '!' + sef1, expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) try: subprocess.call(["fselect", bkg_ef, '!' + bef1, expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) expr = "START>" + str(t1) + ".AND.STOP<" + str(t2) sef = 'ev' + pid + '_src' + str(nsp) + '.fits' bef = 'ev' + pid + '_bkg' + str(nsp) + '.fits' try: subprocess.call(["fselect", sef1 + '+2', '!' + sef, expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) try: subprocess.call(["fselect", bef1 + '+2', '!' + bef, expr]) except: xxx = "Error occured when running FSELECT for src.\n" self.putlog("Error occured when running FSELECT for src.") res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) srcf = 'src' + pid + str(nsp) + '.pha' evbin['algorithm'] = 'PHA1' evbin['ebinalg'] = 'LOG' evbin['evfile'] = sef evbin['scfile'] = scfile evbin['outfile'] = srcf evbin['tstart'] = t1 evbin['tstop'] = t2 evbin['emin'] = emin evbin['emax'] = emax evbin['enumbins'] = enbin evbin['chatter'] = '10' res = evbin.runWithOutput(print_command=False)[1] xxx = res.read() res_str += xxx # logf.write(xxx+"\n") bkgf = 'bkg' + pid + str(nsp) + '.pha' evbin['evfile'] = bef evbin['outfile'] = bkgf res = evbin.runWithOutput(print_command=False)[1] xxx = res.read() res_str += xxx # logf.write(xxx+"\n") # response if 1: # if nsp == 0: rspf = 'rsp' + pid + str(nsp) + '.rsp' gtrsp['respalg'] = "PS" gtrsp['specfile'] = srcf gtrsp['scfile'] = scfile gtrsp['thetacut'] = thetamax gtrsp['outfile'] = rspf gtrsp['irfs'] = irfs gtrsp['dcostheta'] = dcostheta gtrsp['emin'] = 100.0 gtrsp['emax'] = 300000.0 gtrsp['enumbins'] = 100 gtrsp['chatter'] = 0 xxx = gtrsp.command() res_str += xxx # logf.write(xxx+"\n") out = gtrsp.runWithOutput(print_command=False)[1] xxx = out.read() res_str += xxx # logf.write(xxx+"\n") if nsp == 0: arfcreate(arff, rad, rspf, psff) # Write keywords to source spectrum file sp.call(['fparkey', bkgf, srcf, 'BACKFILE']) sp.call(['fparkey', rspf, srcf, 'RESPFILE']) sp.call(['fparkey', arff, srcf, 'ANCRFILE']) sp.call(['fparkey', '1.0', srcf, 'BACKSCAL']) sp.call( ['fparkey', str((self.brad / self.srad)**2), bkgf, 'BACKSCAL']) time.sleep(0.05) if not os.path.exists(srcf) or not os.path.exists(bkgf) or \ not os.path.exists(arff) or not os.path.exists(rspf): self.state = "stop" self.putlog( "Lightcurve extractor: something wrong, files are missing. Stoping." ) if self.state != "running": break xspecf = open('xspec' + pid + str(nsp) + '.xcm', 'w') xspecf.write('log xspec' + pid + str(nsp) + '.log\n') xspecf.write('query yes\n') xspecf.write('data 1 ' + srcf + ' \n') xspecf.write('notice 1:' + str(emin * 1000.0) + '-' + str(emax * 1000.0) + ' \n') xspecf.write('ignore 1: **-' + str(emin * 1000.0) + ' ' + str(emax * 1000.0) + '-** \n') if index_free: xspecf.write("model cpflux*pow & "+str(emin*1000.0)+" -1 0 0 1e10 1e10 & "+\ str(emax*1000.0)+" -1 0 0 1e16 1e16 & {0} 0.01 & {1} 0.01 & 1.0 -1 & \n".\ format(cflux,pl_index)) else: xspecf.write("model cpflux*pow & "+str(emin*1000.0)+" -1 0 0 1e10 1e10 & "+\ str(emax*1000.0)+" -1 0 0 1e10 1e10 & {0} 0.01 & {1} -1 & 1.0 -1 & \n".\ format(cflux,pl_index)) xspecf.write('renorm\n') xspecf.write('fit 500\n') xspecf.write('tclout param 3\n') xspecf.write('set cf [lindex $xspec_tclout 0]\n') xspecf.write('tclout param 4\n') xspecf.write('set pl [lindex $xspec_tclout 0]\n') xspecf.write('error max 1000000.0 3\n') xspecf.write('tclout error 3\n') xspecf.write('set cferr [lrange $xspec_tclout 0 1]\n') if index_free: xspecf.write('error 4\n') xspecf.write('tclout error 4\n') xspecf.write('set plerr [lrange $xspec_tclout 0 1]\n') else: xspecf.write('set plerr "0.0 0.0"\n') # xspr.stdin.write('tclout statistic\n') # xspr.stdin.write('set chi $xspec_tclout\n') xspecf.write('catch {exec echo ' + str(0.5 * (t1 + t2)) + " " + str(0.5 * (t2 - t1)) + ' $cf $cferr $pl $plerr > xspec_lc' + pid + str(nsp) + '.txt } \n') xspecf.write('quit\n') xspecf.write('yes\n') xspecf.close() xspr = sp.Popen(['xspec', 'xspec' + pid + str(nsp) + '.xcm'], stdout=sp.PIPE, stdin=sp.PIPE, stderr=sp.STDOUT) # xspr = sp.call(['xspec','xspec'+str(nsp)+'.xcm']) out = xspr.communicate() os.system('cat xspec_lc' + pid + str(nsp) + '.txt >> xspec' + pid + '_lc.txt') nsp += 1 t1 += tbin t2 = min(tstop, t1 + tbin) # End of the main loop # fh.close() if self.state == "running": flis = open('cols.lis', 'w') flis.write('TIME E\n') flis.write('TIMEDEL E\n') flis.write('FLUX E\n') flis.write('LOGFMIN E\n') flis.write('LOGFMAX E\n') flis.write('INDEX E\n') flis.write('INDMIN E\n') flis.write('INDMAX E\n') flis.close() fhead = open('head.lis', 'w') fhead.write( 'TELESCOP GLAST / name of telescope generating data\n') fhead.write('INSTRUME LAT / name of instrument generating data\n') fhead.write('CREATOR LATSPEC / Software creating file\n') fhead.write('EMIN ' + str(emin) + ' / Lower energy limit, Mev\n') fhead.write('EMAX ' + str(emax) + ' / Upper energy limit, Mev\n') fhead.close() sp.call(["rm", '-f', 'lc1.fits', 'lc2.fits']) pr1 = sp.Popen([ "fcreate", 'cols.lis', 'xspec' + pid + '_lc.txt', 'lc' + pid + '1.fits', "headfile=head.lis" ]) pr1.wait() # time.sleep(0.01) # pr2.wait() # time.sleep(0.01) pr3 = sp.Popen([ "fcalc", 'lc' + pid + '1.fits', 'lc' + pid + '2.fits', 'ERROR', '0.5*(LOGFMAX-LOGFMIN)' ]) # out = pr3.communicate() pr3.wait() os.system('rm -f ' + outfile) pr2 = sp.Popen([ "fcalc", 'lc' + pid + '2.fits', outfile, 'INDEXERR', '0.5*(INDMAX-INDMIN)' ]) pr2.wait() # Clean up sp.call(["rm", '-f', 'lc' + pid + '1.fits', 'lc' + pid + '2.fits']) os.system('rm -f ' + arff) os.system('rm -f ' + psff) os.system('rm -f src' + pid + '*') os.system('rm -f bkg' + pid + '*') os.system('rm -f ev' + pid + '*') os.system('rm -f xspec_lc' + pid + '*') os.system('rm -f xspec' + pid + '*') os.system('rm -f rsp' + pid + '*') # os.system('rm -f lc1.fits') # os.system('rm -f lc2.fits') logf.close() if self.state == "running": self.state = "done" if self.state == "stop": self.state = "stopped"
def run(self,evfile,scfile,sra,sdec,rad,bra,bdec,brad, cube,tbin,irfs,tstart,tstop,emin, emax,enbin,outfile, dcostheta,thetamax,binsz,zmax, pl_index,index_free,logfile): ''' Given the LAT dat event file (evfile), source and background regions, Generates a full flux curve using xspec fits for every interval. Parameters: evfile - observation event file, create with gtmktime scfile - observation house keeping file sra - source RA sdec - source DEC rad - source RAD (degrees) bra - background RA bdec - background DEC brad - background region radius outfile [lc.fits] - output lightcurve FITS file tbin [86400] - final flux curve time binnig (sec). tstart [INDEF] - start time (MET sec). If INDEF the value is taken from the evfile. tstop [INDEF] - start time (MET sec). If INDEF the value is taken from the evfile. emin [100.0] - lower energy limit of the energy interval (MeV). emin [300000.0] - upper energy of the energy interval (MeV). enbin [20] - number of the energy bins to use in xspec fits. cube - the galactic cube file. If not given or does not exist - it will be calculated (takes a long time!!!). binsz [1.0], zmax [100.0] - corresponding gtltcube parameters if a cube is to be calculated. thetamax [60.0],dcostheta [0.05] - corresponding parameters for psf and response calculations. See gtpsf,gtrspgen help for details. pl_index [2.5] - starting value for the photon index of the power law fits to data. index_free [False] - if False the index is fixed at pl_index value ''' logf = open(logfile,"w") res_str = "" scf = pyfits.open(scfile) tstart_sc = float(scf[0].header['TSTART']) tstop_sc = float(scf[0].header['TSTOP']) if tstart == "INDEF": tstart = tstart_sc else: try: tstart = float(tstart) except: res_str += "Warning: Error converting tstart to float.\n" res_str += "Using start time from SC file." self.putlog("Warning: Error converting tstart to float.") self.putlog("Using start time from SC file.") if tstop == "INDEF": tstop = tstop_sc else: try: tstop = float(tstop) except: res_str += "Warning: Error converting tstop to float.\n" res_str += "Using stop time from SC file.\n" self.putlog("Warning: Error converting tstart to float.") logf.write("Using stop time from SC file.\n") try: tbin = float(tbin) except: res_str += "Warning: Error converting tbin to float.\n" self.putlog("Warning: Error converting tbin to float.") logf.close() return -1,res_str if tbin < 0.0: res_str += "Negative tbin. Exit!.\n" logf.write("Negative tbin. Exit!.\n") logf.close() self.putlog("Negative tbin. Exit!.") return -1,res_str if tstart > tstart_sc: tstart = tstart_sc if tstop > tstop_sc: tstop = tstop_sc expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(sdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(sdec)+"*#deg)*COS((RA-"+\ str(sra)+")*#deg))/#deg<"+str(rad) pid = str(os.getpid()) src_ef = 'ev'+pid+'_src.fits' bkg_ef = 'ev'+pid+'_bkg.fits' if self.state == "running": try: subprocess.call(["fselect",evfile,'!'+src_ef,expr]) except: res_str += "Error occured when running FSELECT for src.\n" self.putlog("Error occured when running FSELECT for src.") else: res_str += "Src events extraction OK.\n" # putlog("Src events extraction OK.") fh = pyfits.open(src_ef,mode='update') hdu = fh[1].header hdu['DSVAL2 '] = "CIRCLE("+str(sra)+","+str(sdec)+",25.0)" fh.close() expr = "ARCCOS(SIN(DEC*#deg)*SIN("+str(bdec)+\ "*#deg)+COS(DEC*#deg)*COS("+str(bdec)+"*#deg)*COS((RA-"+\ str(bra)+")*#deg))/#deg<"+str(brad) if self.state == "running": try: subprocess.call(["fselect",evfile,'!'+bkg_ef,expr]) except: res_str += "Error occured when running FSELECT for backgrnd.\n" self.putlog("Error occured when running FSELECT for backgrnd.") else: res_str += "Bkg extraction OK.\n" # putlog("Bkg extraction OK.") # ltcube if self.state == "running": cubecalc = False if not os.path.exists(cube): cubecalc = True if cubecalc: gtcube['evfile'] = src_ef gtcube['scfile'] = scfile gtcube['outfile'] = cube gtcube['dcostheta'] = dcostheta gtcube['binsz'] = binsz gtcube['zmax'] = zmax res_str += gtcube.command() out = gtcube.runWithOutput(print_command=False)[1] xxx = out.read() res_str += out.read() logf.write(xxx) t1 = tstart t2 = t1+tbin nsp = 0 # psf if self.state == "running": psff = 'psf'+pid+'.fits' gtpsf['expcube'] = cube gtpsf['dec'] = sdec gtpsf['ra'] = sra gtpsf['outfile'] = psff gtpsf['irfs'] = irfs gtpsf['emin'] = 100.0 gtpsf['emax'] = 300000.0 gtpsf['nenergies'] = 101 gtpsf['thetamax'] = thetamax gtpsf['ntheta'] = int(thetamax/dcostheta) gtpsf['chatter'] = 0 res_str += gtpsf.command() out = gtpsf.runWithOutput(print_command=False)[1] xxx = out.read() res_str += xxx logf.write(xxx) # openning xspec session try: os.system('rm -f xspec'+pid+'_lc.txt') os.system('touch xspec'+pid+'_lc.txt') except: pass arff = 'arf'+pid+'.arf' # response hdu0 = fh[0].header cflux = -9.0 # flexp = pyfits.open('gtbin.lc') # lcdata = flexp[1].data ind10 = int(0) ind25 = int(0) ind50 = int(0) ind75 = int(0) # self.putlog('Lightcurve thread: Sarting the main loop') # Main loop nbin = (tstop - tstart)/tbin while t1<tstop and self.state == "running": if (t1 - tstart)/tbin > 0.1*nbin and ind10 == 0: self.putlog("Progress: 10%") ind10 = 1 if (t1 - tstart)/tbin > 0.25*nbin and ind25 == 0: self.putlog("Progress: 25%") ind25 = 1 if (t1 - tstart)/tbin > 0.5*nbin and ind50 == 0: self.putlog("Progress: 50%") ind50 = 1 if (t1 - tstart)/tbin > 0.75*nbin and ind75 == 0: self.putlog("Progress: 75%") ind75 = 1 # self.putlog('Sarting loop '+str(nsp)) logf.write("Interval: "+str(nsp)+" Tstart = "+str(t1)+" Tstop = "+str(t2)+"\n") expr = "TIME>"+str(t1)+".AND.TIME<"+str(t2) sef1 = 'ev'+pid+'_src'+str(nsp)+'_1.fits' bef1 = 'ev'+pid+'_bkg'+str(nsp)+'_1.fits' try: subprocess.call(["fselect",src_ef,'!'+sef1,expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) try: subprocess.call(["fselect",bkg_ef,'!'+bef1,expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) expr = "START>"+str(t1)+".AND.STOP<"+str(t2) sef = 'ev'+pid+'_src'+str(nsp)+'.fits' bef = 'ev'+pid+'_bkg'+str(nsp)+'.fits' try: subprocess.call(["fselect",sef1+'+2','!'+sef,expr]) except: xxx = "Error occured when running FSELECT for src.\n" res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) try: subprocess.call(["fselect",bef1+'+2','!'+bef,expr]) except: xxx = "Error occured when running FSELECT for src.\n" self.putlog("Error occured when running FSELECT for src.") res_str += xxx # logf.write(xxx) else: xxx = "Src events extraction OK.\n" res_str += xxx # logf.write(xxx) srcf = 'src'+pid+str(nsp)+'.pha' evbin['algorithm'] = 'PHA1' evbin['ebinalg'] = 'LOG' evbin['evfile'] = sef evbin['scfile'] = scfile evbin['outfile'] = srcf evbin['tstart'] = t1 evbin['tstop'] = t2 evbin['emin'] = emin evbin['emax'] = emax evbin['enumbins'] = enbin evbin['chatter'] = '10' res = evbin.runWithOutput(print_command=False)[1] xxx = res.read() res_str += xxx # logf.write(xxx+"\n") bkgf = 'bkg'+pid+str(nsp)+'.pha' evbin['evfile'] = bef evbin['outfile'] = bkgf res = evbin.runWithOutput(print_command=False)[1] xxx = res.read() res_str += xxx # logf.write(xxx+"\n") # response if 1: # if nsp == 0: rspf = 'rsp'+pid+str(nsp)+'.rsp' gtrsp['respalg'] = "PS" gtrsp['specfile'] = srcf gtrsp['scfile'] = scfile gtrsp['thetacut'] = thetamax gtrsp['outfile'] = rspf gtrsp['irfs'] = irfs gtrsp['dcostheta'] = dcostheta gtrsp['emin'] = 100.0 gtrsp['emax'] = 300000.0 gtrsp['enumbins'] = 100 gtrsp['chatter'] = 0 xxx = gtrsp.command() res_str += xxx # logf.write(xxx+"\n") out = gtrsp.runWithOutput(print_command=False)[1] xxx = out.read() res_str += xxx # logf.write(xxx+"\n") if nsp == 0: arfcreate(arff,rad,rspf,psff) # Write keywords to source spectrum file sp.call(['fparkey',bkgf,srcf,'BACKFILE']) sp.call(['fparkey',rspf,srcf,'RESPFILE']) sp.call(['fparkey',arff,srcf,'ANCRFILE']) sp.call(['fparkey','1.0',srcf,'BACKSCAL']) sp.call(['fparkey',str((self.brad/self.srad)**2),bkgf,'BACKSCAL']) time.sleep(0.05) if not os.path.exists(srcf) or not os.path.exists(bkgf) or \ not os.path.exists(arff) or not os.path.exists(rspf): self.state = "stop" self.putlog("Lightcurve extractor: something wrong, files are missing. Stoping.") if self.state != "running": break xspecf = open('xspec'+pid+str(nsp)+'.xcm','w') xspecf.write('log xspec'+pid+str(nsp)+'.log\n') xspecf.write('query yes\n') xspecf.write('data 1 '+srcf+' \n') xspecf.write('notice 1:'+str(emin*1000.0)+'-'+str(emax*1000.0)+' \n') xspecf.write('ignore 1: **-'+str(emin*1000.0)+' '+str(emax*1000.0)+'-** \n') if index_free: xspecf.write("model cpflux*pow & "+str(emin*1000.0)+" -1 0 0 1e10 1e10 & "+\ str(emax*1000.0)+" -1 0 0 1e16 1e16 & {0} 0.01 & {1} 0.01 & 1.0 -1 & \n".\ format(cflux,pl_index)) else: xspecf.write("model cpflux*pow & "+str(emin*1000.0)+" -1 0 0 1e10 1e10 & "+\ str(emax*1000.0)+" -1 0 0 1e10 1e10 & {0} 0.01 & {1} -1 & 1.0 -1 & \n".\ format(cflux,pl_index)) xspecf.write('renorm\n') xspecf.write('fit 500\n') xspecf.write('tclout param 3\n') xspecf.write('set cf [lindex $xspec_tclout 0]\n') xspecf.write('tclout param 4\n') xspecf.write('set pl [lindex $xspec_tclout 0]\n') xspecf.write('error max 1000000.0 3\n') xspecf.write('tclout error 3\n') xspecf.write('set cferr [lrange $xspec_tclout 0 1]\n') if index_free: xspecf.write('error 4\n') xspecf.write('tclout error 4\n') xspecf.write('set plerr [lrange $xspec_tclout 0 1]\n') else: xspecf.write('set plerr "0.0 0.0"\n') # xspr.stdin.write('tclout statistic\n') # xspr.stdin.write('set chi $xspec_tclout\n') xspecf.write('catch {exec echo '+str(0.5*(t1+t2))+" "+str(0.5*(t2-t1))+' $cf $cferr $pl $plerr > xspec_lc'+pid+str(nsp)+'.txt } \n') xspecf.write('quit\n') xspecf.write('yes\n') xspecf.close() xspr = sp.Popen(['xspec','xspec'+pid+str(nsp)+'.xcm'],stdout=sp.PIPE,stdin=sp.PIPE,stderr=sp.STDOUT) # xspr = sp.call(['xspec','xspec'+str(nsp)+'.xcm']) out = xspr.communicate() os.system('cat xspec_lc'+pid+str(nsp)+'.txt >> xspec'+pid+'_lc.txt') nsp += 1 t1 += tbin t2 = min(tstop,t1+tbin) # End of the main loop # fh.close() if self.state == "running": flis = open('cols.lis','w') flis.write('TIME E\n') flis.write('TIMEDEL E\n') flis.write('FLUX E\n') flis.write('LOGFMIN E\n') flis.write('LOGFMAX E\n') flis.write('INDEX E\n') flis.write('INDMIN E\n') flis.write('INDMAX E\n') flis.close() fhead = open('head.lis','w') fhead.write('TELESCOP GLAST / name of telescope generating data\n') fhead.write('INSTRUME LAT / name of instrument generating data\n') fhead.write('CREATOR LATSPEC / Software creating file\n') fhead.write('EMIN '+str(emin)+' / Lower energy limit, Mev\n') fhead.write('EMAX '+str(emax)+' / Upper energy limit, Mev\n') fhead.close() sp.call(["rm",'-f','lc1.fits','lc2.fits']) pr1 = sp.Popen(["fcreate",'cols.lis','xspec'+pid+'_lc.txt','lc'+pid+'1.fits',"headfile=head.lis"]) pr1.wait() # time.sleep(0.01) # pr2.wait() # time.sleep(0.01) pr3 = sp.Popen(["fcalc",'lc'+pid+'1.fits','lc'+pid+'2.fits','ERROR','0.5*(LOGFMAX-LOGFMIN)']) # out = pr3.communicate() pr3.wait() os.system('rm -f '+outfile) pr2 = sp.Popen(["fcalc",'lc'+pid+'2.fits',outfile,'INDEXERR','0.5*(INDMAX-INDMIN)']) pr2.wait() # Clean up sp.call(["rm",'-f','lc'+pid+'1.fits','lc'+pid+'2.fits']) os.system('rm -f '+arff) os.system('rm -f '+psff) os.system('rm -f src'+pid+'*') os.system('rm -f bkg'+pid+'*') os.system('rm -f ev'+pid+'*') os.system('rm -f xspec_lc'+pid+'*') os.system('rm -f xspec'+pid+'*') os.system('rm -f rsp'+pid+'*') # os.system('rm -f lc1.fits') # os.system('rm -f lc2.fits') logf.close() if self.state == "running": self.state = "done" if self.state == "stop": self.state = "stopped"