forked from erosita/uds
		
	05_srctool added
This commit is contained in:
		
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -54,3 +54,12 @@ venv.bak/
 | 
			
		||||
*.ref
 | 
			
		||||
*.src
 | 
			
		||||
*.dat
 | 
			
		||||
*.xfm
 | 
			
		||||
*.log
 | 
			
		||||
*.tmp
 | 
			
		||||
*.attcorr
 | 
			
		||||
*.aspsol
 | 
			
		||||
*.txt
 | 
			
		||||
*.png
 | 
			
		||||
.*
 | 
			
		||||
!.gitignore
 | 
			
		||||
@@ -28,31 +28,31 @@ region="box({},{},4d,4d,0)".format(ra_cen,de_cen)
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
# TM1
 | 
			
		||||
do_evtool_esass(evlist=el+'tm1.txt', outfile=pr+'tm1_obs_1.fits',  gti='621296896. 621304128.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm1.txt', outfile=pr+'tm1_obs_1.fits',  gti='621296896. 621304128.', rmlock=True)
 | 
			
		||||
 | 
			
		||||
# TM5
 | 
			
		||||
do_evtool_esass(evlist=el+'tm5.txt', outfile=pr+'tm5_obs_1.fits',  gti='620606016. 620614848.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm5.txt', outfile=pr+'tm5_obs_2.fits',  gti='620676992. 620689792.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm5.txt', outfile=pr+'tm5_obs_1.fits',  gti='620606016. 620614848.', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm5.txt', outfile=pr+'tm5_obs_2.fits',  gti='620676992. 620689792.', rmlock=True)
 | 
			
		||||
 | 
			
		||||
# TM6
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_1.fits', gti='620174080. 620178002.620032')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_1.fits', gti='620178002.620032 620192246.62720')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_2.fits', gti='620192448. 620194624.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_2.fits', gti='620194666.606144 620208904.673408')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_3.fits', gti='620209162.670976 620211316.650304')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_3.fits', gti='620211328. 620225600.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_4.fits', gti='620225853.609024 620227974.68832')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_4.fits', gti='620227904. 620242176.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_1.fits',  gti='620242432. 620258368.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_1.fits', gti='620174080. 620178002.620032', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_1.fits', gti='620178002.620032 620192246.62720', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_2.fits', gti='620192448. 620194624.', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_2.fits', gti='620194666.606144 620208904.673408', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_3.fits', gti='620209162.670976 620211316.650304', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_3.fits', gti='620211328. 620225600.', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_park_4.fits', gti='620225853.609024 620227974.68832', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_scan_4.fits', gti='620227904. 620242176.', rmlock=True)
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_1.fits',  gti='620242432. 620258368.', rmlock=True)
 | 
			
		||||
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_2.fits',  gti='620607424. 620614656.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_2.fits',  gti='620607424. 620614656.', rmlock=True)
 | 
			
		||||
do_badpix_tm6(filename=pr+'tm6_obs_2.fits')
 | 
			
		||||
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_3.fits',  gti='620676992. 620690368.')
 | 
			
		||||
do_evtool_esass(evlist=el+'tm6.txt', outfile=pr+'tm6_obs_3.fits',  gti='620676992. 620690368.', rmlock=True)
 | 
			
		||||
do_badpix_tm6(filename=pr+'tm6_obs_3.fits')
 | 
			
		||||
"""
 | 
			
		||||
# TM7
 | 
			
		||||
do_evtool_esass(evlist=el+'tm7.txt', outfile=pr+'tm7_obs_1.fits',  gti='621043136. 621052416.', emin=0.2, emax=10.0, region=region, rmlock=True)
 | 
			
		||||
#do_evtool_esass(evlist=el+'tm7.txt', outfile=pr+'tm7_obs_2.fits',  gti='621110272. 621117952.', region=region)
 | 
			
		||||
#do_evtool_esass(evlist=el+'tm7.txt', outfile=pr+'tm7_obs_2.fits',  gti='621110272. 621117952.', region=region, rmlock=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,8 +22,12 @@ outkey="mosa_tm0"
 | 
			
		||||
""" find UDS root dir """
 | 
			
		||||
 | 
			
		||||
#root_path=dirname(dirname(dirname(inspect.getfile(uds))))
 | 
			
		||||
"""
 | 
			
		||||
ftools does not like long file path names, for this reason, we use relative path here
 | 
			
		||||
"""
 | 
			
		||||
root_path='..'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
print("UDS root path: {}".format(root_path))
 | 
			
		||||
 | 
			
		||||
infile_dir=root_path+'/data/processed'
 | 
			
		||||
@@ -33,18 +37,22 @@ create_folder(outfile_dir)
 | 
			
		||||
 | 
			
		||||
index=5 # select energy band
 | 
			
		||||
 | 
			
		||||
do_init         = True
 | 
			
		||||
do_init         = False
 | 
			
		||||
do_merge        = True
 | 
			
		||||
do_rate         = False 
 | 
			
		||||
do_adapt        = False # requires CIAO
 | 
			
		||||
#do_rate         = True 
 | 
			
		||||
 | 
			
		||||
vign=True
 | 
			
		||||
vignetting = 'vign' if (vign==True) else 'novign'
 | 
			
		||||
 | 
			
		||||
events=[]
 | 
			
		||||
expmaps=[]
 | 
			
		||||
bkgmaps=[]
 | 
			
		||||
for tmkey in keylist_tm.keys():
 | 
			
		||||
    print("TM{} in work... init events".format(tmkey))
 | 
			
		||||
    for datakey in keylist_tm[tmkey]:
 | 
			
		||||
        #if not ("scan" in datakey):
 | 
			
		||||
        #    continue
 | 
			
		||||
        print("--> {}".format(datakey))
 | 
			
		||||
        """ Подготавливаем списки событий индивидуальных наблюдений """
 | 
			
		||||
        outfile_evtool,outfile_expmap=init_events(key=datakey, eband_index=eband[index],
 | 
			
		||||
@@ -61,26 +69,27 @@ for tmkey in keylist_tm.keys():
 | 
			
		||||
                                                  emax_kev=emax_kev[index])
 | 
			
		||||
        events.append(outfile_evtool)
 | 
			
		||||
        expmaps.append(outfile_expmap)
 | 
			
		||||
        bkgmaps.append("{}_BackMap3_en{}.fits".format(os.path.join(outfile_dir,datakey), eband[0]))
 | 
			
		||||
   
 | 
			
		||||
""" Собираем общий список событий """    
 | 
			
		||||
outfile_evtool="{}_EventList_en{}.fits".format(os.path.join(outfile_dir,outkey), eband[index])
 | 
			
		||||
 | 
			
		||||
if (vign==True):
 | 
			
		||||
    outfile_expmap="{}_ExposureMap_en{}.vign.fits".format(os.path.join(outfile_dir,outkey), eband[index])
 | 
			
		||||
else:
 | 
			
		||||
    outfile_expmap="{}_ExposureMap_en{}.novign.fits".format(os.path.join(outfile_dir,outkey), eband[index])
 | 
			
		||||
outfile_expmap="{}_ExposureMap_en{}.{}.fits".format(os.path.join(outfile_dir,outkey), eband[index], vignetting)
 | 
			
		||||
outfile_bkgmap="{}_BackMap_en{}.{}.fits".format(os.path.join(outfile_dir,outkey), eband[index], vignetting)
 | 
			
		||||
 | 
			
		||||
if(do_merge==True):
 | 
			
		||||
    do_evtool_esass(events=events, outfile=outfile_evtool)
 | 
			
		||||
    do_expmap_ftools(expmaps=expmaps, outfile=outfile_expmap)
 | 
			
		||||
    do_fimgmerge_ftools(maps=expmaps, outfile=outfile_expmap)
 | 
			
		||||
    do_fimgmerge_ftools(maps=bkgmaps, outfile=outfile_bkgmap)
 | 
			
		||||
 | 
			
		||||
outfile_rate="{}_RateMap_en{}.{}.fits".format(os.path.join(outfile_dir,outkey), eband[index], vignetting)
 | 
			
		||||
if(do_rate==True):
 | 
			
		||||
    make_rate_map(cntmap=outfile_evtool, expmap=outfile_expmap, outfile=outfile_rate)
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
function='gaussian'
 | 
			
		||||
outfile_adapt="{}_ImageAdapt_en{}.{}.fits".format(os.path.join(outfile_dir,outkey), eband[index], function)
 | 
			
		||||
outfile_adapt="{}_ImageAdapt_en{}.{}.{}.fits".format(os.path.join(outfile_dir,outkey), eband[index], function, vignetting)
 | 
			
		||||
if(do_adapt==True):
 | 
			
		||||
    do_adapt_ciao(infile=outfile_evtool, outfile=outfile_adapt, expmap=outfile_expmap, function=function, expcut=100)
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
outfile_rate="{}_RateAdapt_en{}.fits".format(os.path.join(outfile_dir,outkey), eband[index])
 | 
			
		||||
if(do_rate==True):
 | 
			
		||||
    make_rate_map(cntmap=outfile_adapt, expmap=outfile_expmap, outfile=outfile_rate)
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,39 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
"""Подготавливает списки событий в разных энергетических диапазонах.
 | 
			
		||||
   Производит списки источников в наждом наблюдении и делает астрокоррекцию с помощью wcs_match
 | 
			
		||||
"""
 | 
			
		||||
НАЗВАНИЕ:
 | 
			
		||||
 | 
			
		||||
 01_init_obs.py
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
НАЗНАЧЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Подготавливает списки событий в разных энергетических диапазонах.
 | 
			
		||||
   Производит списки источников в наждом наблюдении и делает астрокоррекцию с помощью wcs_match/wcs_update
 | 
			
		||||
 
 | 
			
		||||
ВЫЗОВ:
 | 
			
		||||
 | 
			
		||||
   conda activate ciao-4.15
 | 
			
		||||
   esass
 | 
			
		||||
   ./01_init_obs.py
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
УПРАВЛЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Запуск отдельных команд управляется переменными, например: do_init = True
 | 
			
		||||
   Выбранные энергетические диапазоны управляется массивом eband_selected
 | 
			
		||||
 
 | 
			
		||||
ПАРАМЕТРЫ:
 | 
			
		||||
   eband_selected : Выбранные энергетические диапазоны
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ВЫВОД:
 | 
			
		||||
 
 | 
			
		||||
   Выходные файлы записываются в директорию outfile_dir
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
ИСТОРИЯ:
 | 
			
		||||
   Роман Кривонос, ИКИ РАН, krivonos@cosmos.ru
 | 
			
		||||
   Март 2023
 | 
			
		||||
   
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
@@ -26,25 +59,28 @@ infile_dir=root_path+'/data/processed'
 | 
			
		||||
outfile_dir=root_path+'/products'
 | 
			
		||||
create_folder(outfile_dir)
 | 
			
		||||
 | 
			
		||||
do_init         = False
 | 
			
		||||
do_ermask       = False
 | 
			
		||||
do_init         = True
 | 
			
		||||
do_ermask       = True
 | 
			
		||||
 | 
			
		||||
do_erbox1       = False # local mode
 | 
			
		||||
do_erbackmap1   = False # 
 | 
			
		||||
do_erbox2       = False # map mode, with background map
 | 
			
		||||
do_erbackmap2   = False # 
 | 
			
		||||
do_erbox3       = False # map mode, with background map
 | 
			
		||||
do_erbackmap3   = False # 
 | 
			
		||||
do_erbox1       = True # local mode
 | 
			
		||||
do_erbackmap1   = True # 
 | 
			
		||||
do_erbox2       = True # map mode, with background map
 | 
			
		||||
do_erbackmap2   = True # 
 | 
			
		||||
do_erbox3       = True # map mode, with background map
 | 
			
		||||
do_erbackmap3   = True # 
 | 
			
		||||
 | 
			
		||||
do_ermldet      = False
 | 
			
		||||
do_catprep      = False
 | 
			
		||||
do_cross_match  = True
 | 
			
		||||
do_ermldet      = True
 | 
			
		||||
do_catprep      = True
 | 
			
		||||
do_cross_match  = False
 | 
			
		||||
 | 
			
		||||
do_wcs_match    = False # Chandra task
 | 
			
		||||
do_wcs_update   = False # Chandra task
 | 
			
		||||
do_wcs_match    = True # Chandra task
 | 
			
		||||
do_wcs_update   = True # Chandra task
 | 
			
		||||
 | 
			
		||||
eband_selected=[0,1,2,3,4]
 | 
			
		||||
 | 
			
		||||
vign=True
 | 
			
		||||
vignetting = 'vign' if (vign==True) else 'novign'
 | 
			
		||||
 | 
			
		||||
eband_selected=[0]
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
def runme(datakey):
 | 
			
		||||
    """ runs datakey over energy bands """
 | 
			
		||||
@@ -71,11 +107,17 @@ def runme(datakey):
 | 
			
		||||
                                                     do_center=True,
 | 
			
		||||
                                                     do_evtool=True,
 | 
			
		||||
                                                     do_expmap=True,
 | 
			
		||||
                                                     vign=vign,
 | 
			
		||||
                                                     ra_cen=ra_cen, de_cen=de_cen,
 | 
			
		||||
                                                     emin_kev=emin_kev[index],
 | 
			
		||||
                                                     emax_kev=emax_kev[index])
 | 
			
		||||
    events.append(outfile_evtool)
 | 
			
		||||
    expmaps.append(outfile_expmap)
 | 
			
		||||
        expmaps.append(outfile_expmap)
 | 
			
		||||
        events.append(outfile_evtool)
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    After astrometry-corrected files (*.attcorr.fits) are obtained, one can take them as original, in order to check the full chain:
 | 
			
		||||
    events.append(outfile_evtool.replace(".fits", ".attcorr.fits"))
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    """ Detmask """
 | 
			
		||||
    
 | 
			
		||||
@@ -305,6 +347,7 @@ def runme(datakey):
 | 
			
		||||
            #save_ermldet_ds9reg(mllist,scale=60*60)
 | 
			
		||||
 | 
			
		||||
        catprep="{}_SourceCatalog_en{}{}".format(os.path.join(outfile_dir,datakey), eband[index], outfile_post)
 | 
			
		||||
        catprep_en0="{}_SourceCatalog_en{}{}".format(os.path.join(outfile_dir,datakey), eband[0], outfile_post)
 | 
			
		||||
        if(do_catprep==True):
 | 
			
		||||
            cmd=["catprep",
 | 
			
		||||
                 "infile={}".format(mllist),
 | 
			
		||||
@@ -315,60 +358,27 @@ def runme(datakey):
 | 
			
		||||
            save_catprep_ds9reg(catprep,scale=60*60)
 | 
			
		||||
 | 
			
		||||
        if(do_cross_match==True):
 | 
			
		||||
            #hdulist = fits.open(detmask)
 | 
			
		||||
            #w = WCS(hdulist[0].header)
 | 
			
		||||
            #w.wcs.crval=wcslist[datakey]
 | 
			
		||||
            crossmatch_shu2019(catprep,dlmin=10,refimage=events[ii],crval=wcslist[datakey],
 | 
			
		||||
                               catalog=root_path+"/data/Gaia_unWISE/Gaia_unWISE_UDS.fits.catalog")
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        if(do_att_corr==True):
 | 
			
		||||
            attcorr(mllist,events=outfile_evtool[ii])
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
        xfm=mllist.replace(".fits", ".xfm")
 | 
			
		||||
        if(do_wcs_match==True):
 | 
			
		||||
            src_list=mllist.replace(".fits", ".src")
 | 
			
		||||
            if not (os.path.isfile(src_list)==True):
 | 
			
		||||
                print("Not found {}".format(src_list))
 | 
			
		||||
                sys.exit()
 | 
			
		||||
 | 
			
		||||
            ref_list=mllist.replace(".fits", ".ref")
 | 
			
		||||
            if not (os.path.isfile(ref_list)==True):
 | 
			
		||||
                print("Not found {}".format(ref_list))
 | 
			
		||||
                sys.exit()
 | 
			
		||||
 | 
			
		||||
            #xfm=mllist.replace(".fits", ".xfm")
 | 
			
		||||
            log=mllist.replace(".fits", ".xfm.log")
 | 
			
		||||
 | 
			
		||||
            cmd=["wcs_match",
 | 
			
		||||
                 "infile={}".format(src_list),
 | 
			
		||||
                 "refsrcfile={}".format(ref_list),
 | 
			
		||||
                 "outfile={}".format(xfm),
 | 
			
		||||
                 "wcsfile={}".format(src_list),
 | 
			
		||||
                 "logfile={}".format(log),
 | 
			
		||||
                 "radius=7",
 | 
			
		||||
                 "residlim=1", 
 | 
			
		||||
                 "verbose=1",
 | 
			
		||||
                 "method=trans",
 | 
			
		||||
                 #"method=rst",
 | 
			
		||||
                 "clobber=yes",
 | 
			
		||||
             ]
 | 
			
		||||
            os.system((" ").join(cmd))
 | 
			
		||||
            print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if(do_wcs_match==True and eband[index]==0):
 | 
			
		||||
            """ run wcs_match for 0.3-2.3 keV only """
 | 
			
		||||
            wcs_match_ciao(catprep, method='rst',radius=12,residlim=5)
 | 
			
		||||
        
 | 
			
		||||
        if(do_wcs_update==True):
 | 
			
		||||
            wcs_update(outfile_evtool[ii],crval=wcslist[key],transformfile=xfm)
 | 
			
		||||
        """
 | 
			
		||||
            """ use 0.3-2.3 keV transform matrix for all other bands """ 
 | 
			
		||||
            attcorr=wcs_update_ciao(events[ii],crval=wcslist[datakey],transformfile=catprep_en0.replace(".fits", ".xfm"),clean=False)
 | 
			
		||||
            do_evtool_esass(evfile=attcorr,outfile=attcorr,rmlock=False, do_center=True, ra_cen=ra_cen, de_cen=de_cen)
 | 
			
		||||
 | 
			
		||||
runme("tm7_obs_1")
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
testing
 | 
			
		||||
runme("tm7_obs_1")
 | 
			
		||||
runme("tm5_obs_1")
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
for tmkey in keylist_tm.keys():
 | 
			
		||||
    print("TM{} in work... init events".format(tmkey))
 | 
			
		||||
    for datakey in keylist_tm[tmkey]:
 | 
			
		||||
        print("--> {}".format(datakey))
 | 
			
		||||
        runme(datakey)     
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										308
									
								
								scripts/04_mosaics.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										308
									
								
								scripts/04_mosaics.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,308 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
"""
 | 
			
		||||
НАЗВАНИЕ:
 | 
			
		||||
 | 
			
		||||
 04_mosaics.py
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
НАЗНАЧЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Собирает мозайки в разных энергетических диапазонах.
 | 
			
		||||
 
 | 
			
		||||
ВЫЗОВ:
 | 
			
		||||
 | 
			
		||||
   esass
 | 
			
		||||
   ./01_mosaics.py
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
УПРАВЛЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Запуск отдельных команд управляется переменными, например: do_init = True
 | 
			
		||||
   Выбранный энергетический диапазон управляется переменной index
 | 
			
		||||
 
 | 
			
		||||
ПАРАМЕТРЫ:
 | 
			
		||||
 | 
			
		||||
   index : Выбранный энергетический диапазон
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ВЫВОД:
 | 
			
		||||
 
 | 
			
		||||
   Выходные файлы записываются в директорию outfile_dir
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
ИСТОРИЯ:
 | 
			
		||||
 | 
			
		||||
   Роман Кривонос, ИКИ РАН, krivonos@cosmos.ru
 | 
			
		||||
   Март 2023
 | 
			
		||||
   
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from astropy.wcs import WCS
 | 
			
		||||
from astropy.io import fits
 | 
			
		||||
import sys, os, os.path, time, subprocess
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import numpy as np
 | 
			
		||||
import glob
 | 
			
		||||
from os.path import dirname
 | 
			
		||||
import inspect
 | 
			
		||||
import uds
 | 
			
		||||
 | 
			
		||||
from uds.utils import *
 | 
			
		||||
from uds.config import *
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
""" find UDS root dir """
 | 
			
		||||
#root_path=dirname(dirname(dirname(inspect.getfile(uds))))
 | 
			
		||||
"""
 | 
			
		||||
ftools does not like long file path names,
 | 
			
		||||
for this reason, we use relative path here
 | 
			
		||||
"""
 | 
			
		||||
root_path='..'
 | 
			
		||||
print("UDS root path: {}".format(root_path))
 | 
			
		||||
 | 
			
		||||
infile_dir=root_path+'/data/processed'
 | 
			
		||||
outfile_dir=root_path+'/products'
 | 
			
		||||
create_folder(outfile_dir)
 | 
			
		||||
 | 
			
		||||
outkey="tm0"
 | 
			
		||||
 | 
			
		||||
do_init         = False
 | 
			
		||||
do_merge        = False
 | 
			
		||||
do_detmask      = False 
 | 
			
		||||
do_expmap       = False 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
do_erbox1       = False # local mode
 | 
			
		||||
do_erbackmap1   = False # 
 | 
			
		||||
do_erbox2       = False # map mode, with background map
 | 
			
		||||
do_erbackmap2   = False # 
 | 
			
		||||
do_erbox3       = False # map mode, with background map
 | 
			
		||||
do_erbackmap3   = False # 
 | 
			
		||||
 | 
			
		||||
do_ersensmap       = False
 | 
			
		||||
do_ermldet         = True
 | 
			
		||||
do_catprep         = True
 | 
			
		||||
do_filter_catalog  = True
 | 
			
		||||
 | 
			
		||||
#do_ermldet      = False
 | 
			
		||||
#do_cross_match  = False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
index=4
 | 
			
		||||
 | 
			
		||||
vign=True
 | 
			
		||||
vignetting = 'vign' if (vign==True) else 'novign'
 | 
			
		||||
 | 
			
		||||
events=[]
 | 
			
		||||
expmaps=[]
 | 
			
		||||
bkgmaps=[]
 | 
			
		||||
for tmkey in keylist_tm.keys():
 | 
			
		||||
    print("TM{} in work... init events".format(tmkey))
 | 
			
		||||
    for datakey in keylist_tm[tmkey]:
 | 
			
		||||
        print("--> {}".format(datakey))
 | 
			
		||||
        """ Подготавливаем списки событий индивидуальных наблюдений """
 | 
			
		||||
        outfile_evtool,outfile_expmap=init_events(key=datakey,
 | 
			
		||||
                                                  eband_index=eband[index],
 | 
			
		||||
                                                  infile_dir=infile_dir,
 | 
			
		||||
                                                  outfile_dir=outfile_dir,
 | 
			
		||||
                                                  do_init=do_init,
 | 
			
		||||
                                                  do_obsmode=False,
 | 
			
		||||
                                                  do_center=False,
 | 
			
		||||
                                                  do_evtool=False,
 | 
			
		||||
                                                  do_expmap=False,
 | 
			
		||||
                                                  vign=vign,
 | 
			
		||||
                                                  ra_cen=ra_cen, de_cen=de_cen,
 | 
			
		||||
                                                  emin_kev=emin_kev[index],
 | 
			
		||||
                                                  emax_kev=emax_kev[index])
 | 
			
		||||
        events.append(outfile_evtool)
 | 
			
		||||
        expmaps.append(outfile_expmap)
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
""" Собираем общий список событий """    
 | 
			
		||||
outfile_evtool="{}_EventList_en{}.fits".format(os.path.join(outfile_dir,outkey),
 | 
			
		||||
                                               eband[index])
 | 
			
		||||
 | 
			
		||||
if(do_merge==True):
 | 
			
		||||
    do_evtool_esass(events=events, outfile=outfile_evtool)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
""" makes detmask from TM exposures """
 | 
			
		||||
detmask="{}/{}_DetectorMask_en{}{}".format(outfile_dir,
 | 
			
		||||
                                           outkey,
 | 
			
		||||
                                           eband[index],
 | 
			
		||||
                                           outfile_post)
 | 
			
		||||
if(do_detmask==True):
 | 
			
		||||
   create_detmask_merged(expmaps,detmask,minval=100)
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
Собираем общую карту экспозиции, обратите внимание на коэффициент 7.
 | 
			
		||||
Экспозиция рассчитывается на 7 телескопов.
 | 
			
		||||
"""    
 | 
			
		||||
outfile_expmap="{}_ExposureMap_en{}{}".format(os.path.join(outfile_dir,outkey),
 | 
			
		||||
                                              eband[index],
 | 
			
		||||
                                              outfile_post)
 | 
			
		||||
if(do_expmap==True):
 | 
			
		||||
   create_expmap_merged(expmaps,outfile_expmap,scale=7.0)
 | 
			
		||||
 | 
			
		||||
outfile_boxlist1="{}/{}_BoxList1_en{}{}".format(outfile_dir,outkey, eband[index], outfile_post)
 | 
			
		||||
if(do_erbox1==True):
 | 
			
		||||
   cmd=["erbox",
 | 
			
		||||
        "images=\'{}\'".format(outfile_evtool),
 | 
			
		||||
        "boxlist=%s" %(outfile_boxlist1),
 | 
			
		||||
        "expimages=\'{}\'".format(outfile_expmap),
 | 
			
		||||
        "detmasks=\'{}\'".format(detmask),
 | 
			
		||||
        "emin=\'{}\'".format(emin_ev[index]),
 | 
			
		||||
        "emax=\'{}\'".format(emax_ev[index]),
 | 
			
		||||
        "ecf=\'{}\'".format(ecf[index]),
 | 
			
		||||
        "nruns=2",
 | 
			
		||||
        "likemin=6.0",
 | 
			
		||||
        "boxsize=4",
 | 
			
		||||
        "compress_flag=N",
 | 
			
		||||
        "bkgima_flag=N",
 | 
			
		||||
        "expima_flag=Y",
 | 
			
		||||
        "detmask_flag=Y"
 | 
			
		||||
        ]
 | 
			
		||||
   remove_file(outfile_boxlist1)
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
   save_ds9reg(outfile_boxlist1)
 | 
			
		||||
 | 
			
		||||
""" Background map 1 """
 | 
			
		||||
outfile_backmap1="{}_BackMap1_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
cheese_mask="{}_CheeseMask1_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
if(do_erbackmap1==True):
 | 
			
		||||
   do_erbackmap_esass(outfile_evtool,outfile_expmap,outfile_boxlist1,detmask,emin_ev[index],emax_ev[index],
 | 
			
		||||
                      outfile_backmap1,cheese_mask)
 | 
			
		||||
 | 
			
		||||
outfile_boxlist2="{}/{}_BoxList2_en{}{}".format(outfile_dir,outkey, eband[index], outfile_post)
 | 
			
		||||
if(do_erbox2==True):
 | 
			
		||||
   cmd=["erbox",
 | 
			
		||||
        "images=\'{}\'".format(outfile_evtool),
 | 
			
		||||
        "boxlist=%s" %(outfile_boxlist2),
 | 
			
		||||
        "expimages=\'{}\'".format(outfile_expmap),
 | 
			
		||||
        "detmasks=\'{}\'".format(detmask),
 | 
			
		||||
        "emin=\'{}\'".format(emin_ev[index]),
 | 
			
		||||
        "emax=\'{}\'".format(emax_ev[index]),
 | 
			
		||||
        "ecf=\'{}\'".format(ecf[index]),
 | 
			
		||||
        "nruns=2",
 | 
			
		||||
        "likemin=6.0",
 | 
			
		||||
        "boxsize=4",
 | 
			
		||||
        "compress_flag=N",
 | 
			
		||||
        "bkgima_flag=Y",
 | 
			
		||||
        "bkgimages={}".format(outfile_backmap1),
 | 
			
		||||
        "expima_flag=Y",
 | 
			
		||||
        "detmask_flag=Y"
 | 
			
		||||
        ]
 | 
			
		||||
   remove_file(outfile_boxlist2)
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
   save_ds9reg(outfile_boxlist2)
 | 
			
		||||
 | 
			
		||||
""" Background map 2 """
 | 
			
		||||
outfile_backmap2="{}_BackMap2_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
cheese_mask="{}_CheeseMask2_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
if(do_erbackmap2==True):
 | 
			
		||||
   do_erbackmap_esass(outfile_evtool,outfile_expmap,outfile_boxlist2,detmask,emin_ev[index],emax_ev[index],
 | 
			
		||||
                      outfile_backmap2,cheese_mask)
 | 
			
		||||
 | 
			
		||||
outfile_boxlist3="{}/{}_BoxList3_en{}{}".format(outfile_dir,outkey, eband[index], outfile_post)
 | 
			
		||||
if(do_erbox3==True):
 | 
			
		||||
   cmd=["erbox",
 | 
			
		||||
        "images=\'{}\'".format(outfile_evtool),
 | 
			
		||||
        "boxlist=%s" %(outfile_boxlist3),
 | 
			
		||||
        "expimages=\'{}\'".format(outfile_expmap),
 | 
			
		||||
        "detmasks=\'{}\'".format(detmask),
 | 
			
		||||
        "emin=\'{}\'".format(emin_ev[index]),
 | 
			
		||||
        "emax=\'{}\'".format(emax_ev[index]),
 | 
			
		||||
        "ecf=\'{}\'".format(ecf[index]),
 | 
			
		||||
        "nruns=2",
 | 
			
		||||
        "likemin=6.0",
 | 
			
		||||
        "boxsize=4",
 | 
			
		||||
        "compress_flag=N",
 | 
			
		||||
        "bkgima_flag=Y",
 | 
			
		||||
        "bkgimages={}".format(outfile_backmap2),
 | 
			
		||||
        "expima_flag=Y",
 | 
			
		||||
        "detmask_flag=Y"
 | 
			
		||||
        ]
 | 
			
		||||
   remove_file(outfile_boxlist3)
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
   save_ds9reg(outfile_boxlist3)
 | 
			
		||||
 | 
			
		||||
""" Background map 3 """
 | 
			
		||||
outfile_backmap3="{}_BackMap3_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
cheese_mask="{}_CheeseMask3_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
if(do_erbackmap3==True):
 | 
			
		||||
   do_erbackmap_esass(outfile_evtool,outfile_expmap,outfile_boxlist3,detmask,emin_ev[index],emax_ev[index],
 | 
			
		||||
                      outfile_backmap3,cheese_mask)
 | 
			
		||||
 | 
			
		||||
mllist="{}_MaxLikSourceList_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
srcmap="{}_SourceMap_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
cmd=["ermldet",
 | 
			
		||||
     "mllist=%s" %(mllist),
 | 
			
		||||
     "boxlist=%s" %(outfile_boxlist3),
 | 
			
		||||
     "images=\'{}\'".format(outfile_evtool),
 | 
			
		||||
     "expimages=\'{}\'".format(outfile_expmap),
 | 
			
		||||
     "detmasks=\'{}\'".format(detmask),
 | 
			
		||||
     "bkgimages=\'{}\'".format(outfile_backmap3),
 | 
			
		||||
     "emin=\'{}\'".format(emin_ev[index]),
 | 
			
		||||
     "emax=\'{}\'".format(emax_ev[index]),
 | 
			
		||||
     "ecf=\'{}\'".format(ecf[index]),
 | 
			
		||||
     "hrdef=",
 | 
			
		||||
     "likemin=5.",
 | 
			
		||||
     "extlikemin=6.",
 | 
			
		||||
     "compress_flag=N",
 | 
			
		||||
     "cutrad=10.", # was 15
 | 
			
		||||
     "multrad=20.", 
 | 
			
		||||
     "extmin=2.0",
 | 
			
		||||
     "extmax=15.0",
 | 
			
		||||
     #"bkgima_flag=Y", looks outdated
 | 
			
		||||
     "expima_flag=Y",
 | 
			
		||||
     "detmask_flag=Y",
 | 
			
		||||
     "shapelet_flag=yes",
 | 
			
		||||
     "photon_flag=yes",
 | 
			
		||||
     "extentmodel=beta",
 | 
			
		||||
     "thres_flag=N",
 | 
			
		||||
     "thres_col=like",
 | 
			
		||||
     "thres_val=30.",
 | 
			
		||||
     "nmaxfit=4",
 | 
			
		||||
     "nmulsou=2",
 | 
			
		||||
     "fitext_flag=yes",
 | 
			
		||||
     "srcima_flag=yes",
 | 
			
		||||
     "srcimages=\'{}\'".format(srcmap)
 | 
			
		||||
     ]
 | 
			
		||||
 | 
			
		||||
sensmap="{}_SensitivityMap_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
area="{}_AreaTable_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
if(do_ersensmap==True):
 | 
			
		||||
   detlike=10
 | 
			
		||||
   create_sensmap(sensmap="{}_SensitivityMap_dl{}_en{}{}".format(os.path.join(outfile_dir,outkey), detlike,
 | 
			
		||||
                                                                 eband[index], outfile_post),
 | 
			
		||||
                  areatab="{}_AreaTable_dl{}_en{}{}".format(os.path.join(outfile_dir,outkey),
 | 
			
		||||
                                                            detlike, eband[index], outfile_post),
 | 
			
		||||
                  expmap=outfile_expmap, backmap=outfile_backmap3,detlike=detlike,
 | 
			
		||||
                  detmask=detmask, emin=emin_ev[index], emax=emax_ev[index],ecf=ecf[index])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if(do_ermldet==True):
 | 
			
		||||
   remove_file(mllist)
 | 
			
		||||
   remove_file(srcmap)
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
catprep="{}_SourceCatalog_en{}{}".format(os.path.join(outfile_dir,outkey), eband[index], outfile_post)
 | 
			
		||||
if(do_catprep==True):
 | 
			
		||||
   cmd=["catprep",
 | 
			
		||||
        "infile={}".format(mllist),
 | 
			
		||||
        "outfile={}".format(catprep),]
 | 
			
		||||
   remove_file(catprep)
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
if(do_filter_catalog==True):
 | 
			
		||||
    #filter_mllist(mllist,expcut=5000.0,dlcut=10.0,dlmin=10,dlmax=10000)
 | 
			
		||||
    """ works the same """
 | 
			
		||||
    filter_catprep(catprep,expcut=5000.0,dlmin=10,dlmax=10000,outkey='bright')
 | 
			
		||||
    filter_catprep(catprep,expcut=5000.0,dlmin=6,dlmax=10,outkey='faint')
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										150
									
								
								scripts/05_srctool.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										150
									
								
								scripts/05_srctool.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,150 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
"""
 | 
			
		||||
НАЗВАНИЕ:
 | 
			
		||||
 | 
			
		||||
 04_mosaics.py
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
НАЗНАЧЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Собирает мозайки в разных энергетических диапазонах.
 | 
			
		||||
 
 | 
			
		||||
ВЫЗОВ:
 | 
			
		||||
 | 
			
		||||
   esass
 | 
			
		||||
   ./01_mosaics.py
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
УПРАВЛЕНИЕ:
 | 
			
		||||
 | 
			
		||||
   Запуск отдельных команд управляется переменными, например: do_init = True
 | 
			
		||||
   Выбранный энергетический диапазон управляется переменной index
 | 
			
		||||
 
 | 
			
		||||
ПАРАМЕТРЫ:
 | 
			
		||||
 | 
			
		||||
   index : Выбранный энергетический диапазон
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ВЫВОД:
 | 
			
		||||
 
 | 
			
		||||
   Выходные файлы записываются в директорию outfile_dir
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
ИСТОРИЯ:
 | 
			
		||||
 | 
			
		||||
   Роман Кривонос, ИКИ РАН, krivonos@cosmos.ru
 | 
			
		||||
   Март 2023
 | 
			
		||||
   
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
from astropy.wcs import WCS
 | 
			
		||||
from astropy.io import fits
 | 
			
		||||
import sys, os, os.path, time, subprocess
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
import numpy as np
 | 
			
		||||
import glob
 | 
			
		||||
from os.path import dirname
 | 
			
		||||
import inspect
 | 
			
		||||
import uds
 | 
			
		||||
 | 
			
		||||
from uds.utils import *
 | 
			
		||||
from uds.config import *
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
""" find UDS root dir """
 | 
			
		||||
#root_path=dirname(dirname(dirname(inspect.getfile(uds))))
 | 
			
		||||
"""
 | 
			
		||||
ftools does not like long file path names,
 | 
			
		||||
for this reason, we use relative path here
 | 
			
		||||
"""
 | 
			
		||||
root_path='..'
 | 
			
		||||
print("UDS root path: {}".format(root_path))
 | 
			
		||||
 | 
			
		||||
infile_dir=root_path+'/data/processed'
 | 
			
		||||
outfile_dir=root_path+'/products'
 | 
			
		||||
create_folder(outfile_dir)
 | 
			
		||||
 | 
			
		||||
srctool_dir="{}/{}".format(outfile_dir,"srctool-products")
 | 
			
		||||
create_folder(srctool_dir)
 | 
			
		||||
 | 
			
		||||
outkey="tm0"
 | 
			
		||||
 | 
			
		||||
outfile_srctool="{}_SrcTool_".format(outkey)
 | 
			
		||||
 | 
			
		||||
do_init         = False
 | 
			
		||||
do_merge        = False
 | 
			
		||||
do_srctool      = True 
 | 
			
		||||
do_grppha       = True 
 | 
			
		||||
 | 
			
		||||
index=4
 | 
			
		||||
""" работаем именно в этом диапазоне, чтобы спектры покрывали все энергии """
 | 
			
		||||
 | 
			
		||||
vign=True
 | 
			
		||||
vignetting = 'vign' if (vign==True) else 'novign'
 | 
			
		||||
 | 
			
		||||
events=[]
 | 
			
		||||
expmaps=[]
 | 
			
		||||
bkgmaps=[]
 | 
			
		||||
for tmkey in keylist_tm.keys():
 | 
			
		||||
    print("TM{} in work... init events".format(tmkey))
 | 
			
		||||
    for datakey in keylist_tm[tmkey]:
 | 
			
		||||
        print("--> {}".format(datakey))
 | 
			
		||||
        """ Подготавливаем списки событий индивидуальных наблюдений """
 | 
			
		||||
        outfile_evtool,outfile_expmap=init_events(key=datakey,
 | 
			
		||||
                                                  eband_index=eband[index],
 | 
			
		||||
                                                  infile_dir=infile_dir,
 | 
			
		||||
                                                  outfile_dir=outfile_dir,
 | 
			
		||||
                                                  do_init=do_init,
 | 
			
		||||
                                                  do_obsmode=False,
 | 
			
		||||
                                                  do_center=False,
 | 
			
		||||
                                                  do_evtool=False,
 | 
			
		||||
                                                  do_expmap=False,
 | 
			
		||||
                                                  vign=vign,
 | 
			
		||||
                                                  ra_cen=ra_cen, de_cen=de_cen,
 | 
			
		||||
                                                  emin_kev=emin_kev[index],
 | 
			
		||||
                                                  emax_kev=emax_kev[index])
 | 
			
		||||
        events.append(outfile_evtool)
 | 
			
		||||
        expmaps.append(outfile_expmap)
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
""" Собираем общий список событий """    
 | 
			
		||||
outfile_evtool="{}_EventList_en{}.fits".format(os.path.join(outfile_dir,outkey),
 | 
			
		||||
                                               eband[index])
 | 
			
		||||
 | 
			
		||||
if(do_merge==True):
 | 
			
		||||
    do_evtool_esass(events=events, outfile=outfile_evtool)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
suffix_srctool=".fits"
 | 
			
		||||
""" Output filename suffix - all output filenames appended with this string.
 | 
			
		||||
If suffix contains no filename extension (does not contain a "."), then ".fits"
 | 
			
		||||
is also appended to the filename. """
 | 
			
		||||
 | 
			
		||||
catprep="{}_SourceCatalog_en{}{}".format(os.path.join(outfile_dir,outkey), eband[0], outfile_post)
 | 
			
		||||
""" take source catalog from 0.3-2.3 keV band """
 | 
			
		||||
if not (os.path.isfile(catprep)==True):
 | 
			
		||||
    print("{} not found, run 04_mosaics.py?".format(catprep))
 | 
			
		||||
    sys.exit()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if(do_srctool==True):
 | 
			
		||||
    test_exe('srctool')
 | 
			
		||||
    cmd=['srctool',
 | 
			
		||||
         "insts=\'1 5 6 7\'",
 | 
			
		||||
         "eventfiles={}".format(outfile_evtool),
 | 
			
		||||
         "prefix=\'{}\'".format(os.path.join(srctool_dir,outfile_srctool)),
 | 
			
		||||
         "suffix=\'{}\'".format(suffix_srctool),
 | 
			
		||||
         "srccoord={}".format(catprep),
 | 
			
		||||
         #"srcreg=\'fk5;circle * * 60s\'",
 | 
			
		||||
         #"backreg=\'fk5;annulus * * 90s 120s\'",
 | 
			
		||||
         "srcreg=AUTO",
 | 
			
		||||
         "backreg=AUTO",
 | 
			
		||||
         "clobber=yes",]
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
    
 | 
			
		||||
if(do_grppha==True):
 | 
			
		||||
    group_spectra("{}/*_SourceSpec_*.fits".format(srctool_dir))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -25,9 +25,12 @@ source <MY PATH>/eSASS4EDR/bin/esass-init.csh
 | 
			
		||||
 | 
			
		||||
### 03_init_obs.py
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1) Подготавливает списки событий в разных энергетических диапазонах.
 | 
			
		||||
2) Запускает ```erbox``` в три этапа, чтобы получить рабочий список источников для ```ermldet```.
 | 
			
		||||
3) Запускает ```ermldet```
 | 
			
		||||
4) Делает кросс-корреляцию с каталогом Gaia-unWISE ```do_cross_match=True```, которая создает три файла: ```.cross``` -- все пересечения, и ```.ref``` / ```.src``` -- входные каталоги для последующей команды ```wcs_match```
 | 
			
		||||
5) Делает матрицу преобразования координат и корректирует списки событий. Для запуска команд```wcs_match/wcs_update``` требуется запустить окружение ```ciao``` (см. выше)
 | 
			
		||||
 | 
			
		||||
### 04_mosaics.py
 | 
			
		||||
 | 
			
		||||
Создает сборные изображения (мозайки) в разных энергетических диапазонах.
 | 
			
		||||
@@ -43,14 +43,15 @@ wcslist={'tm1_obs_1':[34.7279760,-5.0680267],
 | 
			
		||||
         'tm6_scan_3':[34.5405596,-4.8088748],
 | 
			
		||||
         'tm6_scan_4':[34.5405596,-4.8088748]}
 | 
			
		||||
 | 
			
		||||
""" Диапазоны энергий. """
 | 
			
		||||
emin_ev=[300, 300, 600, 2300, 200,300]
 | 
			
		||||
emax_ev=[2300, 600, 2300, 5000,10000,8000]
 | 
			
		||||
emin_kev=[0.3, 0.3, 0.6, 2.3, 0.2, 0.3]
 | 
			
		||||
emax_kev=[2.3, 0.6, 2.3, 5.0, 10.0, 8.0]
 | 
			
		||||
ecf=[1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
 | 
			
		||||
 | 
			
		||||
""" Это просто индекс диапазона для выходных файлов. """
 | 
			
		||||
eband=["0", "1", "2", "3", "4", "5"]
 | 
			
		||||
eband=[   "0", "1",  "2",  "3",   "4", "5"]
 | 
			
		||||
""" Диапазоны энергий. """
 | 
			
		||||
emin_ev=[ 300, 300,  600, 2300,   200, 300]
 | 
			
		||||
emax_ev=[2300, 600, 2300, 5000, 10000,8000]
 | 
			
		||||
 | 
			
		||||
emin_kev=[0.3, 0.3,  0.6,  2.3,   0.2, 0.3]
 | 
			
		||||
emax_kev=[2.3, 0.6,  2.3,  5.0,  10.0, 8.0]
 | 
			
		||||
ecf = [   1.0, 1.0,  1.0,  1.0,  1.0,  1.0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
outfile_post='.fits'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										435
									
								
								uds/uds/utils.py
									
									
									
									
									
								
							
							
						
						
									
										435
									
								
								uds/uds/utils.py
									
									
									
									
									
								
							@@ -47,17 +47,35 @@ def remove_file(filename):
 | 
			
		||||
    if(os.path.isfile(filename)==True):
 | 
			
		||||
        os.remove(filename)            
 | 
			
		||||
 | 
			
		||||
def do_evtool_esass(events=None,outfile=None,evlist=None,gti=None,region=None,emin=None,emax=None, rmlock=False):
 | 
			
		||||
def do_evtool_esass(evfile=None,events=None,outfile=None,evlist=None,
 | 
			
		||||
                    gti=None,region=None,emin=None,emax=None, rmlock=False,
 | 
			
		||||
                    do_center=False, ra_cen=None, de_cen=None):
 | 
			
		||||
 | 
			
		||||
    eventfiles=None
 | 
			
		||||
    if(events):
 | 
			
		||||
        eventfiles="eventfiles=\'{}\'".format((" ").join(events))
 | 
			
		||||
    if(evlist):
 | 
			
		||||
        eventfiles="eventfiles=@{}".format(evlist)
 | 
			
		||||
    if(evfile):
 | 
			
		||||
        eventfiles="eventfiles={}".format(evfile)
 | 
			
		||||
 | 
			
		||||
    if not (eventfiles):
 | 
			
		||||
        print("ERROR: Event files not provided")
 | 
			
		||||
 | 
			
		||||
    if(do_center==True and evfile):
 | 
			
		||||
        """ re-center event file """
 | 
			
		||||
        if not (ra_cen and de_cen):
 | 
			
		||||
            print("Please provide center coordinates")
 | 
			
		||||
            sys.exit()
 | 
			
		||||
        test_exe('radec2xy')
 | 
			
		||||
        cmd=["radec2xy", 
 | 
			
		||||
             "{}".format(evfile), 
 | 
			
		||||
             "{}".format(ra_cen), 
 | 
			
		||||
             "{}".format(de_cen)]
 | 
			
		||||
        print((" ").join(cmd))
 | 
			
		||||
        os.system((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
    emin="emin={}".format(emin) if(emin) else ''
 | 
			
		||||
    emax="emax={}".format(emax) if(emax) else ''
 | 
			
		||||
    gti="gti=\'{}\'".format(gti) if(gti) else ''
 | 
			
		||||
@@ -83,6 +101,7 @@ def do_evtool_esass(events=None,outfile=None,evlist=None,gti=None,region=None,em
 | 
			
		||||
            if(os.path.isfile(filename)==True):
 | 
			
		||||
                os.remove(filename)    
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
def set_bit(value, bit):
 | 
			
		||||
    return value | (1<<bit)
 | 
			
		||||
@@ -279,20 +298,21 @@ def do_expmap_esass(expmaps=None,outfile=None,emin_kev=None,emax_kev=None,refima
 | 
			
		||||
    test_exe('expmap')
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
def do_expmap_ftools(expmaps=None,outfile=None):
 | 
			
		||||
   """ takes first exposure as reference and merges the rest """
 | 
			
		||||
   tmp="expmaps.txt"
 | 
			
		||||
def do_fimgmerge_ftools(maps=None,outfile=None):
 | 
			
		||||
   """ takes first map as reference and merges the rest """
 | 
			
		||||
   tmp="maps.txt"
 | 
			
		||||
   f = open(tmp, "w")
 | 
			
		||||
   for jj in range(1,len(expmaps)):
 | 
			
		||||
      f.write("{},0,0\n".format(expmaps[jj]))
 | 
			
		||||
   for jj in range(1,len(maps)):
 | 
			
		||||
      f.write("{},0,0\n".format(maps[jj]))
 | 
			
		||||
   f.close()
 | 
			
		||||
   cmd=["fimgmerge",
 | 
			
		||||
        "infile={}".format(expmaps[0]),
 | 
			
		||||
        "infile={}".format(maps[0]),
 | 
			
		||||
        "list=@{}".format(tmp),
 | 
			
		||||
        "outfile={}".format(outfile),
 | 
			
		||||
        "clobber=yes",
 | 
			
		||||
        ]
 | 
			
		||||
   print((" ").join(cmd))
 | 
			
		||||
   test_exe('fimgmerge')
 | 
			
		||||
   os.system((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
def test_exe(program):
 | 
			
		||||
@@ -547,10 +567,10 @@ def do_adapt_ciao(infile=None,outfile=None,expmap=None,function='tophat',expcut=
 | 
			
		||||
    if (expcut):
 | 
			
		||||
        cntmap_data, cntmap_hdr = fits.getdata(outfile, ext=0, header=True)
 | 
			
		||||
        expmap_data, expmap_hdr = fits.getdata(expmap, ext=0, header=True)
 | 
			
		||||
        index = np.where(expmap_data > expcut)
 | 
			
		||||
        index = np.where(expmap_data < expcut)
 | 
			
		||||
        cntmap_data[index]=0.0
 | 
			
		||||
        fits.writeto(outfile, cntmap_data, cntmap_hdr, overwrite=True)
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
"""
 | 
			
		||||
dmimgadapt artmap_ait.fits adapt.fits tophat 1 30 30 log 30 radfile=map.scale.fits sumfile=sum.fits clobber=yes
 | 
			
		||||
@@ -588,3 +608,400 @@ def make_rate_map(cntmap=None, expmap=None, outfile=None):
 | 
			
		||||
    fits.writeto(outfile, rate, overwrite=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def wcs_match_ciao(catalog=None, method='trans',radius=15,residlim=7):
 | 
			
		||||
 | 
			
		||||
    xfm=catalog.replace(".fits", ".xfm")
 | 
			
		||||
        
 | 
			
		||||
    src_list=catalog.replace(".fits", ".shu2019.src.fits")
 | 
			
		||||
    if not (os.path.isfile(src_list)==True):
 | 
			
		||||
        print("Not found {}".format(src_list))
 | 
			
		||||
        print("Did you run cross-match?")
 | 
			
		||||
        sys.exit()
 | 
			
		||||
 | 
			
		||||
    ref_list=catalog.replace(".fits", ".shu2019.ref.fits")
 | 
			
		||||
    if not (os.path.isfile(ref_list)==True):
 | 
			
		||||
        print("Not found {}".format(ref_list))
 | 
			
		||||
        print("Did you run cross-match?")
 | 
			
		||||
        sys.exit()
 | 
			
		||||
 | 
			
		||||
    log=catalog.replace(".fits", ".xfm.log")
 | 
			
		||||
 | 
			
		||||
    cmd=["wcs_match",
 | 
			
		||||
         "infile={}".format(src_list),
 | 
			
		||||
         "refsrcfile={}".format(ref_list),
 | 
			
		||||
         "outfile={}".format(xfm),
 | 
			
		||||
         "wcsfile={}".format(src_list),
 | 
			
		||||
         "logfile={}".format(log),
 | 
			
		||||
         "radius={}".format(radius),
 | 
			
		||||
         "residlim={}".format(residlim), 
 | 
			
		||||
         "verbose=1",
 | 
			
		||||
         "method={}".format(method),
 | 
			
		||||
         "clobber=yes",
 | 
			
		||||
         ]
 | 
			
		||||
    test_exe('wcs_match')
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
def wcs_update_ciao(events,ext=2,crval=None,transformfile=None,clean=True):
 | 
			
		||||
    """ Prepares eRosita attitude file for Chandra's wcs_update command """
 | 
			
		||||
 | 
			
		||||
    if not (transformfile):
 | 
			
		||||
        print("ERROR: Please provide transformfile")
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if not (os.path.isfile(transformfile)==True):
 | 
			
		||||
        print("Not found {}".format(transformfile))
 | 
			
		||||
        print("Did you run wcs_update_ciao?")
 | 
			
		||||
        sys.exit()
 | 
			
		||||
    
 | 
			
		||||
    fnaspsol=events.replace(".fits", ".aspsol")
 | 
			
		||||
    fntmp=events.replace(".fits", ".tmp")
 | 
			
		||||
    fnattcor=events.replace(".fits", ".attcorr.fits")
 | 
			
		||||
    hdul = fits.open(events,mode='readonly')
 | 
			
		||||
    corratt=hdul[ext]
 | 
			
		||||
    naxis1=corratt.header['NAXIS1']
 | 
			
		||||
    naxis2=corratt.header['NAXIS2']
 | 
			
		||||
    corratt_extname=corratt.header['EXTNAME']
 | 
			
		||||
 | 
			
		||||
    """ create new empty Q_ATT column """
 | 
			
		||||
    q_att=np.zeros((naxis2,4))
 | 
			
		||||
    cols = [] 
 | 
			
		||||
    cols.append(fits.Column(name='q_att', format='4D', array=q_att))
 | 
			
		||||
 | 
			
		||||
    orig_cols = corratt.columns
 | 
			
		||||
    new_cols = fits.ColDefs(cols)
 | 
			
		||||
 | 
			
		||||
    hdu0 = fits.PrimaryHDU()
 | 
			
		||||
    
 | 
			
		||||
    hdu0.header['EXTNAME'] = ('ASPSOL', 'Name of this binary table extension')
 | 
			
		||||
    hdu0.header['HDUNAME'] = ('ASPSOL', 'ASCDM block name')
 | 
			
		||||
 | 
			
		||||
    if(crval):
 | 
			
		||||
        hdu0.header['RA_NOM']=(crval[0], '[deg] Pointing RA')
 | 
			
		||||
        hdu0.header['DEC_NOM']=(crval[1], '[deg] Pointing Dec')
 | 
			
		||||
        hdu0.header['ROLL_NOM']=(0.0 , '[deg] Pointing Roll')
 | 
			
		||||
    
 | 
			
		||||
        hdu0.header['RA_PNT']=(crval[0], '[deg] Nominal RA')
 | 
			
		||||
        hdu0.header['DEC_PNT']=(crval[1], '[deg] Nominal Dec')
 | 
			
		||||
        hdu0.header['ROLL_PNT']=(0.0 , '[deg] Nominal Roll')
 | 
			
		||||
 | 
			
		||||
    hdu = fits.BinTableHDU.from_columns(orig_cols + new_cols, header=hdu0.header)
 | 
			
		||||
    hdu.writeto(fnaspsol, overwrite=True)
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    First, update attitude information in ASPSOL (Chandra notation),
 | 
			
		||||
    which corresponds to CORRATT (eRosita notation)
 | 
			
		||||
    """
 | 
			
		||||
    cmd=["wcs_update",
 | 
			
		||||
         "infile={}".format(fnaspsol),
 | 
			
		||||
         "outfile={}".format(fntmp),
 | 
			
		||||
         "transformfile={}".format(transformfile),
 | 
			
		||||
         "clobber=yes",
 | 
			
		||||
         ]
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    Replace attitude extension
 | 
			
		||||
    """
 | 
			
		||||
    shutil.copyfile(events, fnattcor)
 | 
			
		||||
    data, hdr = getdata(fntmp, 1, header=True)
 | 
			
		||||
    hdr['EXTNAME']=corratt_extname
 | 
			
		||||
    update(fnattcor, data, ext, header=hdr)
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    Second, calculate new RA/Dec for events using updated attitude, using evatt from eSASS
 | 
			
		||||
    """
 | 
			
		||||
    cmd=["evatt",
 | 
			
		||||
         "EVENTFILE={}".format(fnattcor),
 | 
			
		||||
         "ATTFILE={}".format(fnattcor),
 | 
			
		||||
         "GTIFILE={}".format(fnattcor),
 | 
			
		||||
    ]
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
    if(clean==True):
 | 
			
		||||
        remove_file(fnaspsol)
 | 
			
		||||
        remove_file(fntmp)
 | 
			
		||||
    return fnattcor
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_detmask_merged(expmaps,outfile,minval=None):
 | 
			
		||||
    """
 | 
			
		||||
    creates mask from each exposure and then stacks each masks.
 | 
			
		||||
    Header is taken from first exposure file.
 | 
			
		||||
    """
 | 
			
		||||
    tmlist={}
 | 
			
		||||
    for expmap in expmaps:
 | 
			
		||||
        
 | 
			
		||||
        hdul = fits.open(expmap)
 | 
			
		||||
        emap = hdul[0].data
 | 
			
		||||
        ehdr = hdul[0].header
 | 
			
		||||
        instrume = ehdr['INSTRUME']
 | 
			
		||||
        threshold = minval if(minval) else 0
 | 
			
		||||
        mask = np.where(emap > threshold, 1, 0)
 | 
			
		||||
 | 
			
		||||
        print("--- detmask {} -- {}".format(expmap,instrume))
 | 
			
		||||
        if not (instrume in tmlist.keys()):
 | 
			
		||||
            tmlist[instrume]=1
 | 
			
		||||
        else:
 | 
			
		||||
            pass
 | 
			
		||||
        
 | 
			
		||||
        if 'merged_mask' in locals():
 | 
			
		||||
            merged_mask = np.add(merged_mask, mask)
 | 
			
		||||
        else:
 | 
			
		||||
            merged_mask = mask
 | 
			
		||||
            merged_hdr = ehdr
 | 
			
		||||
 | 
			
		||||
    if 'merged_hdr' in locals():
 | 
			
		||||
        index=1
 | 
			
		||||
        for tm in tmlist.keys():
 | 
			
		||||
            merged_hdr["INSTRUM{}".format(index)]=tm
 | 
			
		||||
            index=index+1
 | 
			
		||||
    merged_hdr['INSTRUME']='merged'
 | 
			
		||||
    merged_hdr['NINST']=len(tmlist)
 | 
			
		||||
    merged_hdr['OBS_MODE']='        '
 | 
			
		||||
    if 'merged_mask' in locals() and 'merged_hdr' in locals():
 | 
			
		||||
        fits.writeto(outfile, np.where(merged_mask > 0, 1, 0), header=merged_hdr, overwrite=True)
 | 
			
		||||
 | 
			
		||||
def create_expmap_merged(expmaps,outfile,scale=7.0):
 | 
			
		||||
    """
 | 
			
		||||
    Adds exposure from TMs. Header is taken from first exposure file.
 | 
			
		||||
    """
 | 
			
		||||
    tmlist={}
 | 
			
		||||
    for expmap in expmaps:
 | 
			
		||||
        
 | 
			
		||||
        hdul = fits.open(expmap)
 | 
			
		||||
        emap = np.divide(hdul[0].data, scale)
 | 
			
		||||
        ehdr = hdul[0].header
 | 
			
		||||
        instrume = ehdr['INSTRUME']
 | 
			
		||||
 | 
			
		||||
        print("--- expmap {} -- {}".format(expmap,instrume))
 | 
			
		||||
        if not (instrume in tmlist.keys()):
 | 
			
		||||
            tmlist[instrume]=1
 | 
			
		||||
        else:
 | 
			
		||||
            pass
 | 
			
		||||
        
 | 
			
		||||
        if 'merged_map' in locals():
 | 
			
		||||
            merged_map = np.add(merged_map, emap)
 | 
			
		||||
        else:
 | 
			
		||||
            merged_map = emap
 | 
			
		||||
            merged_hdr = ehdr
 | 
			
		||||
 | 
			
		||||
    if 'merged_hdr' in locals():
 | 
			
		||||
        index=1
 | 
			
		||||
        for tm in tmlist.keys():
 | 
			
		||||
            merged_hdr["INSTRUM{}".format(index)]=tm
 | 
			
		||||
            index=index+1
 | 
			
		||||
    merged_hdr['INSTRUME']='merged'
 | 
			
		||||
    merged_hdr['NINST']=len(tmlist)
 | 
			
		||||
    merged_hdr['OBS_MODE']='        '
 | 
			
		||||
    if 'merged_map' in locals() and 'merged_hdr' in locals():
 | 
			
		||||
        fits.writeto(outfile, merged_map, header=merged_hdr, overwrite=True)
 | 
			
		||||
 | 
			
		||||
def do_erbackmap_esass(image,expimage,boxlist,detmask,emin,emax,outfile_backmap,cheese_mask):
 | 
			
		||||
    test_exe('erbackmap')
 | 
			
		||||
    cmd=["erbackmap",
 | 
			
		||||
         "image=%s" %(image),
 | 
			
		||||
         "expimage=%s" %(expimage),
 | 
			
		||||
         "boxlist={}".format(boxlist),
 | 
			
		||||
         "detmask=%s" %(detmask),
 | 
			
		||||
         "emin=%s" %(emin),
 | 
			
		||||
         "emax=%s" %(emax),
 | 
			
		||||
         "bkgimage=%s" %(outfile_backmap),
 | 
			
		||||
         "cheesemask=%s" %(cheese_mask),
 | 
			
		||||
         "idband=1",
 | 
			
		||||
         "scut=0.001",
 | 
			
		||||
         "mlmin=6",
 | 
			
		||||
         "maxcut=0.5",
 | 
			
		||||
         "fitmethod=smooth smoothval=15",
 | 
			
		||||
         "snr=40.",
 | 
			
		||||
         ]
 | 
			
		||||
 | 
			
		||||
    remove_file(cheese_mask)
 | 
			
		||||
    remove_file(outfile_backmap)
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
    
 | 
			
		||||
def filter_catprep(filename, expcut=100,dlmin=6.0,dlmax=10,scale=60*60,ext_like=0.0,outkey='main'):
 | 
			
		||||
    if(os.path.isfile(filename)==False):
 | 
			
		||||
        print("File not found {}".format(filename))
 | 
			
		||||
    print("Filter catprep {}".format(filename))
 | 
			
		||||
    fout_selected=filename.replace(".fits", ".{}.selected.reg".format(outkey))
 | 
			
		||||
    fout_skip=filename.replace(".fits", ".{}.skip.reg".format(outkey))
 | 
			
		||||
    fout_extended=filename.replace(".fits", ".extended.reg")
 | 
			
		||||
 | 
			
		||||
    hdul = fits.open(filename)
 | 
			
		||||
    tbdata = hdul[1].data
 | 
			
		||||
 | 
			
		||||
    catsel=[]
 | 
			
		||||
    catskip=[]
 | 
			
		||||
    catext=[]
 | 
			
		||||
    skip_count=0
 | 
			
		||||
    selected_count=0
 | 
			
		||||
    keepalive_count=0
 | 
			
		||||
    for rec in tbdata:
 | 
			
		||||
        if (rec['ext_like'] > ext_like):
 | 
			
		||||
            catext.append({'ra':rec['ra'],'dec':rec['dec'],'radec_err':rec['radec_err'],
 | 
			
		||||
                           'det_like':rec['det_like_0'],'ext_like':rec['ext_like'],
 | 
			
		||||
                           'ext':rec['ext'],'ext_err':rec['ext_err'],
 | 
			
		||||
                           'src_id':rec['id_src']})
 | 
			
		||||
        if ((rec['det_like_0'] > dlmin and rec['det_like_0'] < dlmax)):
 | 
			
		||||
            catsel.append({'ra':rec['ra'],'dec':rec['dec'],'radec_err':rec['radec_err'],'det_like':rec['det_like_0'],
 | 
			
		||||
                           'src_id':rec['id_src']})
 | 
			
		||||
            selected_count=selected_count + 1
 | 
			
		||||
        else:
 | 
			
		||||
            catskip.append({'ra':rec['ra'],'dec':rec['dec'],'radec_err':rec['radec_err'],'det_like':rec['det_like_0'],
 | 
			
		||||
                            'src_id':rec['id_src']})
 | 
			
		||||
            skip_count = skip_count+1
 | 
			
		||||
        
 | 
			
		||||
    print("total={} skip_count={} selected={}".format(len(tbdata),skip_count,selected_count))
 | 
			
		||||
    with open(fout_selected, 'w') as writer:
 | 
			
		||||
        for rec in catsel:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=white text={{{} {:.2f}}}\n".format(rec['ra'],rec['dec'],rec['radec_err']/scale,
 | 
			
		||||
                                                                                            rec['src_id'],rec['det_like']))
 | 
			
		||||
 | 
			
		||||
    with open(fout_skip, 'w') as writer:
 | 
			
		||||
        for rec in catskip:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=red text={{{} {:.2f}}}\n".format(rec['ra'],rec['dec'],rec['radec_err']/scale,
 | 
			
		||||
                                                                                          rec['src_id'],rec['det_like']))
 | 
			
		||||
 | 
			
		||||
    with open(fout_extended, 'w') as writer:
 | 
			
		||||
        for rec in catext:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=magenta text={{{} {:.2f} {:.2f}}}\n".format(rec['ra'],
 | 
			
		||||
                                                                                                     rec['dec'],
 | 
			
		||||
                                                                                                     rec['ext']/scale,
 | 
			
		||||
                                                                                                     rec['src_id'],
 | 
			
		||||
                                                                                                     rec['det_like'],
 | 
			
		||||
                                                                                                     rec['ext_like']))
 | 
			
		||||
def filter_mllist(filename, expcut=100,dlcut=6.0,dlmin=6.0,dlmax=10,scale=60*60,ext_like=0.0):
 | 
			
		||||
    if(os.path.isfile(filename)==False):
 | 
			
		||||
        print("File not found {}".format(filename))
 | 
			
		||||
    print("Filter mllist {}".format(filename))
 | 
			
		||||
    fout_selected=filename.replace(".fits", ".selected.reg")
 | 
			
		||||
    fout_skip=filename.replace(".fits", ".skip.reg")
 | 
			
		||||
    fout_extended=filename.replace(".fits", ".extended.reg")
 | 
			
		||||
    
 | 
			
		||||
    hdul = fits.open(filename)
 | 
			
		||||
    tbdata = hdul[1].data
 | 
			
		||||
 | 
			
		||||
    """ create list of unique source IDs """
 | 
			
		||||
    id_src_set = set(tbdata['id_src'])
 | 
			
		||||
    src_id_list = list(id_src_set)
 | 
			
		||||
    catsel=[]
 | 
			
		||||
    catskip=[]
 | 
			
		||||
    catext=[]
 | 
			
		||||
    skip_count=0
 | 
			
		||||
    selected_count=0
 | 
			
		||||
    keepalive_count=0
 | 
			
		||||
    for src_id in src_id_list:
 | 
			
		||||
        
 | 
			
		||||
        tab_tm0=tbdata[(tbdata['id_src'] == src_id) & (tbdata['id_inst'] == 0) & (tbdata['id_band'] == 0)]
 | 
			
		||||
        """ averaged over all instruments and bands """
 | 
			
		||||
 | 
			
		||||
        ext_tm0=tbdata[(tbdata['id_src'] == src_id) & (tbdata['id_inst'] == 0) & (tbdata['id_band'] == 0) & (tbdata['ext_like'] > ext_like)]
 | 
			
		||||
        """ averaged over all instruments and bands """
 | 
			
		||||
        if(len(ext_tm0)>0):
 | 
			
		||||
            catext.append({'ra':ext_tm0['ra'][0],'dec':ext_tm0['dec'][0],'radec_err':ext_tm0['radec_err'][0],
 | 
			
		||||
                           'det_like':ext_tm0['det_like'][0],'ext_like':ext_tm0['ext_like'][0],
 | 
			
		||||
                           'ext':ext_tm0['ext'][0],'ext_err':ext_tm0['ext_err'][0],
 | 
			
		||||
                           'src_id':ext_tm0['id_src'][0]})
 | 
			
		||||
            
 | 
			
		||||
        mask_src_id = (tbdata['id_src'] == src_id) & (tbdata['id_inst'] == 0)
 | 
			
		||||
        """ get all source records except merged one """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        tab_src=tbdata[(tbdata['id_src'] == src_id) & (tbdata['id_inst'] != 0) & (tbdata['id_band'] == 1) & (tbdata['ml_exp'] > expcut)]
 | 
			
		||||
        """ only individual instruments, and only first energy band is selected here """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        keepalive=False
 | 
			
		||||
        mask = tab_src['det_like'] > dlcut
 | 
			
		||||
        if (any(mask) and tab_tm0['det_like'] < dlmin):
 | 
			
		||||
            keepalive=True
 | 
			
		||||
            keepalive_count=keepalive_count+1
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        if(keepalive):
 | 
			
		||||
            tab_src=tbdata[(tbdata['id_src'] == src_id) & (tbdata['id_inst'] != 0) & (tbdata['id_band'] == 1)]
 | 
			
		||||
            print("KEEP ALIVE ID={} DL={:.2f} | radec: {:.4f} {:.4f} DL0={:.2f} TEXP={:.1f}".format(src_id, tab_tm0['det_like'][0], tab_tm0['ra'][0], tab_tm0['dec'][0],
 | 
			
		||||
                                                                                   tab_src['det_like'][0],tab_src['ml_exp'][0]))
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
    
 | 
			
		||||
            
 | 
			
		||||
        if ((tab_tm0['det_like'] > dlmin and tab_tm0['det_like'] < dlmax) or keepalive):
 | 
			
		||||
            catsel.append({'ra':tab_tm0['ra'][0],'dec':tab_tm0['dec'][0],'radec_err':tab_tm0['radec_err'][0],'det_like':tab_tm0['det_like'][0],
 | 
			
		||||
                           'src_id':tab_tm0['id_src'][0]})
 | 
			
		||||
            selected_count=selected_count + 1
 | 
			
		||||
        else:
 | 
			
		||||
            catskip.append({'ra':tab_tm0['ra'][0],'dec':tab_tm0['dec'][0],'radec_err':tab_tm0['radec_err'][0],'det_like':tab_tm0['det_like'][0],
 | 
			
		||||
                            'src_id':tab_tm0['id_src'][0]})
 | 
			
		||||
            skip_count = skip_count+1
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    print("total={} skip_count={} keepalive_count={} selected={}".format(len(src_id_list),skip_count,keepalive_count,selected_count))
 | 
			
		||||
    with open(fout_selected, 'w') as writer:
 | 
			
		||||
        for rec in catsel:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=white text={{{} {:.2f}}}\n".format(rec['ra'],rec['dec'],rec['radec_err']/scale,
 | 
			
		||||
                                                                                            rec['src_id'],rec['det_like']))
 | 
			
		||||
 | 
			
		||||
    with open(fout_skip, 'w') as writer:
 | 
			
		||||
        for rec in catskip:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=red text={{{} {:.2f}}}\n".format(rec['ra'],rec['dec'],rec['radec_err']/scale,
 | 
			
		||||
                                                                                          rec['src_id'],rec['det_like']))
 | 
			
		||||
 | 
			
		||||
    with open(fout_extended, 'w') as writer:
 | 
			
		||||
        for rec in catext:
 | 
			
		||||
            writer.write("fk5;circle({}, {}, {}) # color=magenta text={{{} {:.2f} {:.2f}}}\n".format(rec['ra'],rec['dec'],rec['ext']/scale,
 | 
			
		||||
                                                                                                     rec['src_id'],rec['det_like'],rec['ext_like']))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def create_sensmap(sensmap=None,expmap=None,backmap=None,detmask=None,areatab=None,
 | 
			
		||||
                   emin=None,emax=None,ecf=None, detlike=10):
 | 
			
		||||
    test_exe('ersensmap')
 | 
			
		||||
    cmd=['ersensmap',
 | 
			
		||||
        "expimages=\'{}\'".format(expmap),
 | 
			
		||||
        "bkgimages=\'{}\'".format(backmap),
 | 
			
		||||
        "detmasks=\'{}\'".format(detmask),
 | 
			
		||||
        "sensimage={}".format(sensmap),
 | 
			
		||||
        "emin=\'{}\'".format(emin),
 | 
			
		||||
        "emax=\'{}\'".format(emax),
 | 
			
		||||
        "ecf=\'{}\'".format(ecf),
 | 
			
		||||
        "area_table={}".format(areatab),
 | 
			
		||||
        "method=APER",
 | 
			
		||||
        "aper_type=BOX",
 | 
			
		||||
        "aper_size=4.5",
 | 
			
		||||
        "likemin={}".format(detlike),
 | 
			
		||||
        "extlikemin=6.0",
 | 
			
		||||
        "ext=6.0",
 | 
			
		||||
        "extentmodel=beta",
 | 
			
		||||
        "detmask_flag=yes",
 | 
			
		||||
        "shapelet_flag=no",
 | 
			
		||||
        "photon_flag=no",
 | 
			
		||||
        "ext_flag=no",
 | 
			
		||||
        "extlike_flag=no",
 | 
			
		||||
        "compress_flag=no",
 | 
			
		||||
        "area_flag=no",]
 | 
			
		||||
    remove_file(sensmap)
 | 
			
		||||
    remove_file(areatab)
 | 
			
		||||
    os.system((" ").join(cmd))
 | 
			
		||||
    print((" ").join(cmd))
 | 
			
		||||
 | 
			
		||||
def group_spectra(path,group_min=25):
 | 
			
		||||
    test_exe('grppha')
 | 
			
		||||
    flist=glob.glob(path)
 | 
			
		||||
    for f in flist:
 | 
			
		||||
        fout=f.replace(".fits", ".fits.grp")
 | 
			
		||||
        print(f)
 | 
			
		||||
        cmd=["grppha",
 | 
			
		||||
             "infile={}".format(f), 
 | 
			
		||||
             "outfile={}".format(fout), 
 | 
			
		||||
             "comm=\'GROUP MIN {}\'".format(group_min),
 | 
			
		||||
             "tempc=EXIT",
 | 
			
		||||
             "clobber=yes",
 | 
			
		||||
             "chatter=0", # with chatter <= 5 being very  quite and chatter >= 20 very verbose.
 | 
			
		||||
             ]
 | 
			
		||||
        print((" ").join(cmd))
 | 
			
		||||
        os.system((" ").join(cmd))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user