This commit is contained in:
Roman Krivonos 2024-04-13 18:23:59 +03:00
parent bbdf6a3420
commit 3a14bfb46f
9 changed files with 505 additions and 4 deletions

BIN
data/polarmodel.fits Normal file

Binary file not shown.

View File

@ -43,3 +43,17 @@ sem_cut=98
""" Координаты Краба """ """ Координаты Краба """
crab_ra = 83.6287 crab_ra = 83.6287
crab_dec = 22.014 crab_dec = 22.014
bands={
'E02':'17.00 22.10',
'E03':'22.10 28.73',
'E04':'28.73 37.35',
'E05':'37.35 48.55',
'E06':'48.55 63.12',
'E07':'63.12 82.06',
'E08':'82.06 106.67',
'E09':'106.67 138.67',
'E10':'138.67 180.28',
'E11':'180.28 234.36',
'E12':'234.36 304.67',
}

95
scripts/03_grxe_flux.py Executable file
View File

@ -0,0 +1,95 @@
#!/usr/bin/env python
__author__ = "Roman Krivonos"
__copyright__ = "Space Research Institute (IKI)"
import numpy as np
import pandas as pd
from astropy.io import fits
from astropy.table import Table, Column
import matplotlib.pyplot as plt
import math, sys
import pickle
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import HuberRegressor
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import TheilSenRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
#from statsmodels.robust.scale import huber
from astropy.stats import sigma_clip
from astropy.stats import sigma_clipped_stats
from scipy.stats import norm
from scipy.stats import describe
from scipy.stats import sem
from numpy import absolute
from numpy import arange
from ridge.utils import *
from ridge.config import *
key="GAL"
enkey = sys.argv[1]
fn="detcnts.{}.{}.resid.fits".format(enkey,key)
d = fits.getdata(proddir+fn)
df=pd.DataFrame(np.array(d).byteswap().newbyteorder())
#print(df.columns)
#df = df.query('abs(LAT) < {} & abs(LON) < {}'.format(3,3))
sz=3
lon0=0.0
lat0=0.0
df = df.query('LON > {} & LON < {} & LAT > {} & LAT < {}'.format(lon0-sz,lon0+sz,lat0-sz,lat0+sz))
print("Number of ScWs: {}".format(df.shape[0]))
n_bins = 80
sigma=3
grxe = np.array(df['GRXE'])
mean = np.mean(grxe)
std = np.std(grxe)
print("\n*** Unfiltered:")
print("mean {:.2f} std {:.2f}".format(mean,std))
print("min {:.2f}".format(grxe.min()))
print("max {:.2f}".format(grxe.max()))
print("mean {:.2f}".format(grxe.mean()))
print("median {:.2f}".format(np.median(grxe)))
print("var {:.2f}".format(grxe.var()))
sstr = '%-14s mean = %6.4f, variance = %6.4f, skew = %6.4f, kurtosis = %6.4f'
n, (smin, smax), sm, sv, ss, sk = describe(grxe)
print(sstr % ('sample:', sm, sv, ss, sk))
print("\n***")
filtered_data = sigma_clip(grxe, sigma=sigma, maxiters=10, return_bounds=True)
filtered_grxe=filtered_data[0]
filtered_min=filtered_data[1]
filtered_max=filtered_data[2]
print("length orig: {} taken: {} filtered: {}".format(len(grxe),len(grxe[filtered_grxe.mask==False]),len(grxe[filtered_grxe.mask==True])))
sg_mean, sg_med, sg_std = sigma_clipped_stats(grxe, sigma=sigma, maxiters=10)
sg_sem = sem(grxe[filtered_grxe.mask==False])
print("Sigma clipping: mean {:.2f} med {:.2f} std {:.2f} sem {:.2f}".format(sg_mean, sg_med, sg_std, sg_sem))
k=1.2
plt.hist(grxe, bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.hist(grxe[filtered_grxe.mask], bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.axvline(sg_mean, color="black")
plt.axvline(sg_mean+sg_sem, color="black", linestyle="dashed")
plt.axvline(sg_mean-sg_sem, color="black", linestyle="dashed")
plt.axvline(sg_mean+sg_std, color="blue", linestyle="dashed")
plt.axvline(sg_mean-sg_std, color="blue", linestyle="dashed")
plt.xlabel("mCrab")
plt.show()

View File

@ -131,7 +131,7 @@ for i in range(sx):
# Calculate the percentiles across the x and y dimension # Calculate the percentiles across the x and y dimension
perc = np.percentile(sem_map, sem_cut, axis=(0, 1), keepdims=False) perc = np.percentile(sem_map, sem_cut, axis=(0, 1), keepdims=False)
print("{}: {}% cut of SEM map: {:.2f} mCrab".format(enkey,sem_cut,perc)) print("{} {}: {}% cut of SEM map: {:.2f} mCrab".format(key,enkey,sem_cut,perc))
idx=np.where(sem_map > perc) idx=np.where(sem_map > perc)
mean_map[idx]=0.0 mean_map[idx]=0.0

View File

@ -9,3 +9,28 @@
./03_grxe_map.py E10 ALL ./03_grxe_map.py E10 ALL
./03_grxe_map.py E11 ALL ./03_grxe_map.py E11 ALL
./03_grxe_map.py E12 ALL ./03_grxe_map.py E12 ALL
./03_grxe_map.py E02 GAL
./03_grxe_map.py E03 GAL
./03_grxe_map.py E04 GAL
./03_grxe_map.py E05 GAL
./03_grxe_map.py E06 GAL
./03_grxe_map.py E07 GAL
./03_grxe_map.py E08 GAL
./03_grxe_map.py E09 GAL
./03_grxe_map.py E10 GAL
./03_grxe_map.py E11 GAL
./03_grxe_map.py E12 GAL
./03_grxe_map.py E02 BKG
./03_grxe_map.py E03 BKG
./03_grxe_map.py E04 BKG
./03_grxe_map.py E05 BKG
./03_grxe_map.py E06 BKG
./03_grxe_map.py E07 BKG
./03_grxe_map.py E08 BKG
./03_grxe_map.py E09 BKG
./03_grxe_map.py E10 BKG
./03_grxe_map.py E11 BKG
./03_grxe_map.py E12 BKG

103
scripts/03_grxe_spec.py Executable file
View File

@ -0,0 +1,103 @@
#!/usr/bin/env python
__author__ = "Roman Krivonos"
__copyright__ = "Space Research Institute (IKI)"
import numpy as np
import pandas as pd
from astropy.io import fits
from astropy.table import Table, Column
import matplotlib.pyplot as plt
import math, sys
import pickle
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import HuberRegressor
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import TheilSenRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
#from statsmodels.robust.scale import huber
from astropy.stats import sigma_clip
from astropy.stats import sigma_clipped_stats
from scipy.stats import norm
from scipy.stats import describe
from scipy.stats import sem
from numpy import absolute
from numpy import arange
from ridge.utils import *
from ridge.config import *
key="GAL"
n_bins = 80
sigma=3
plotme=False
ebands0={#'E02':[0.0,0.0],
'E03':[0.0,0.0],
'E04':[0.0,0.0],
'E05':[0.0,0.0],
'E06':[0.0,0.0],
'E07':[0.0,0.0],
'E08':[0.0,0.0],
'E09':[0.0,0.0],
'E10':[0.0,0.0],
'E11':[0.0,0.0],
'E12':[0.0,0.0],}
sz=3
lon0=0.0
lat0=0.0
for enkey in ebands0.keys():
fn="detcnts.{}.{}.resid.fits".format(enkey,key)
d = fits.getdata(proddir+fn)
df=pd.DataFrame(np.array(d).byteswap().newbyteorder())
#print(df.columns)
df = df.query('LON > {} & LON < {} & LAT > {} & LAT < {}'.format(lon0-sz,lon0+sz,lat0-sz,lat0+sz))
#print("Number of ScWs: {}".format(df.shape[0]))
grxe = np.array(df['GRXE'])
filtered_data = sigma_clip(grxe, sigma=sigma, maxiters=10, return_bounds=True)
filtered_grxe = filtered_data[0]
filtered_min = filtered_data[1]
filtered_max = filtered_data[2]
#print("length orig: {} taken: {} filtered: {}".format(len(grxe),len(grxe[filtered_grxe.mask==False]),len(grxe[filtered_grxe.mask==True])))
sg_mean, sg_med, sg_std = sigma_clipped_stats(grxe, sigma=sigma, maxiters=10)
sg_sem = sem(grxe[filtered_grxe.mask==False])
print("{}: mean {:.2f} med {:.2f} std {:.2f} sem {:.2f}".format(enkey, sg_mean, sg_med, sg_std, sg_sem))
sg_sem*=1.5
if(sg_mean<0.0):
sg_mean=1e-9
sg_sem*=2
ebands0[enkey]=[sg_mean,sg_sem]
if(plotme):
k=1.2
plt.hist(grxe, bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.hist(grxe[filtered_grxe.mask], bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.axvline(sg_mean, color="black")
plt.axvline(sg_mean+sg_sem, color="black", linestyle="dashed")
plt.axvline(sg_mean-sg_sem, color="black", linestyle="dashed")
plt.axvline(sg_mean+sg_std, color="blue", linestyle="dashed")
plt.axvline(sg_mean-sg_std, color="blue", linestyle="dashed")
plt.xlabel("mCrab")
plt.show()
with open(proddir+"GRXE.spec", 'w') as fp:
for enkey in ebands0.keys():
fp.write("0 {} {:.2f} {:.2f} 0.0\n".format(bands[enkey],ebands0[enkey][0],ebands0[enkey][1]))

78
scripts/03_plot_bkg.py Executable file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env python
__author__ = "Roman Krivonos"
__copyright__ = "Space Research Institute (IKI)"
import numpy as np
import pandas as pd
from astropy.io import fits
from astropy.table import Table, Column
import matplotlib.pyplot as plt
import math, sys
import pickle
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import HuberRegressor
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import TheilSenRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedKFold
#from statsmodels.robust.scale import huber
from astropy.stats import sigma_clip
from astropy.stats import sigma_clipped_stats
from scipy.stats import norm
from scipy.stats import describe
from scipy.stats import sem
from numpy import absolute
from numpy import arange
from ridge.utils import *
from ridge.config import *
enkey = sys.argv[1]
key = "BKG"
fn='detcnts.{}.{}.resid.fits'.format(enkey,key)
n_bins = 80
minmax=[-1800,1800]
sigma=3
with fits.open(proddir+fn) as hdul:
data=hdul[1].data
grxe = np.array(data['GRXE'])
mean = np.mean(grxe)
std = np.std(grxe)
print("mean {:.2f} std {:.2f}".format(mean,std))
print("min {:.2f}".format(grxe.min()))
print("max {:.2f}".format(grxe.max()))
print("mean {:.2f}".format(grxe.mean()))
print("median {:.2f}".format(np.median(grxe)))
print("var {:.2f}".format(grxe.var()))
sstr = '%-14s mean = %6.4f, variance = %6.4f, skew = %6.4f, kurtosis = %6.4f'
n, (smin, smax), sm, sv, ss, sk = describe(grxe)
print(sstr % ('sample:', sm, sv, ss, sk))
#filtered_grxe = sigma_clip(grxe, sigma=sigma, maxiters=10)
filtered_data = sigma_clip(grxe, sigma=sigma, maxiters=10, return_bounds=True)
filtered_grxe = filtered_data[0]
filtered_min = filtered_data[1]
filtered_max = filtered_data[2]
sg_mean, sg_med, sg_std = sigma_clipped_stats(grxe, sigma=sigma, maxiters=10)
sg_sem = sem(grxe[filtered_grxe.mask==False])
print("Sigma clipping: mean {:.2f} med {:.2f} std {:.2f} sem {:.2f}".format(sg_mean, sg_med, sg_std, sg_sem))
k=1.2
plt.hist(grxe, bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.hist(grxe[filtered_grxe.mask], bins=n_bins, range=[filtered_min*k, filtered_max*k])
plt.axvline(sg_mean, color="black")
plt.axvline(sg_mean+sg_std, color="black", linestyle="dashed")
plt.axvline(sg_mean-sg_std, color="black", linestyle="dashed")
plt.xlabel("mCrab")
plt.show()

View File

@ -7,15 +7,15 @@ source <MY PATH>/venv/bin/activate.csh
### 01_bgdmodel.py / 01_bgdmodel.sh ### 01_bgdmodel.py / 01_bgdmodel.sh
Создает модель фона Создает модель фона.
### 01_crabmodel.py / 01_crabmodel.sh ### 01_crabmodel.py / 01_crabmodel.sh
Создает модель скорости счета Краба Создает модель скорости счета Краба.
### 02_grxe_resid.py / 01_grxe_resid.sh ### 02_grxe_resid.py / 01_grxe_resid.sh
Вычисляет остатки после вычитания модели из данных в единицах мКраб Вычисляет остатки после вычитания модели из данных в единицах мКраб.
### 02_grxe_map.py / 01_grxe_map.sh ### 02_grxe_map.py / 01_grxe_map.sh

186
scripts/do_pha_igr_v3_mCrab.pl Executable file
View File

@ -0,0 +1,186 @@
#! /usr/bin/perl
#require "utils.pl";
#require "getopts.pl";
#&Getopts('i:o:n:c:e');
#############################################
$alpha=2.1;
$norm=10;
$mean_rms=0.73;
$inp=$ARGV[0];
$out=$inp;
open INPP,">$inp.dat";
@spec=`cat $inp`;
chomp @spec;
$cnt1=0;
foreach $sp (@spec){
($null,$e1[$cnt1],$e2[$cnt1], $rate[$cnt1], $drate[$cnt1], $null)=split / +/,$sp;
$rate[$cnt1]=$rate[$cnt1]/1000;
$drate[$cnt1]=$drate[$cnt1]/1000;
$crrate[$cnt1]=1;
$dcrrate[$cnt1]=0.001;
print INPP "$cnt1 $rate[$cnt1] $drate[$cnt1]\n";
$cnt1++;
}
close(INPP);
$TFORM2=sprintf "%dE",$cnt1;
$rmff="$out.rmf";
open COLS,">cols1";
print COLS "ENERG_LO 1e keV
ENERG_HI 1e keV
N_GRP I
F_CHAN 1I
N_CHAN 1I
MATRIX $TFORM2
";
close COLS;
open COLS,">cols2";
print COLS "CHANNEL J
E_MIN E keV
E_MAX E keV
";
close COLS;
open FITS, "|fcreate cols1 datafile=\"-\" outfile=\"$rmff\" tbltype=\"binary\" extname=\"SPECRESP MATRIX\" clobber=yes";
$beta=1-$alpha;
for($i=0;$i<$cnt1;){
$ener=($e1[$i]+$e2[$i])/2;
$crfl[$i]=$norm*(exp($beta*log($e2[$i]))-exp($beta*log($e1[$i])))/$beta;
$rmf[$i]=$crrate[$i]/$crfl[$i];
print"$i $e1[$i] $e2[$i] $rmf[$i] $crfl[$i]\n";
$num=$i+1;
print FITS "$e1[$i] $e2[$i] 1 0 $cnt1";
for($j=0;$j<$cnt1;){
$koef=0;
if($i==$j){$koef=$rmf[$i];}
print FITS " $koef";
$j++;
}
print FITS "\n";
$i++;
}
close FITS;
open FITS, "|fcreate cols2 datafile=\"-\" outfile=\"temp.fits\" tbltype=\"binary\" extname=\"EBOUNDS\" clobber=yes";
for($i=0;$i<$cnt1;){
$num=$i+1;
print FITS "$i $e1[$i] $e2[$i]\n";
$i++;
}
close FITS;
system "fappend temp.fits[1] $rmff";
system "rm -f temp.fits";
system "fparkey OGIP $rmff\[1] HDUCLASS add=yes";
system "fparkey RESPONSE $rmff\[1] HDUCLAS1 add=yes";
system "fparkey RSP_MATRIX $rmff\[1] HDUCLAS2 add=yes";
system "fparkey $cnt1 $rmff\[1] DETCHANS add=yes";
system "fparkey PHA $rmff\[1] CHANTYPE add=yes";
system "fparkey 1.0 $rmff\[1] EFFAREA add=yes";
system "fparkey FULL_RES $rmff\[1] BINNING add=yes";
system "fparkey 1992a $rmff\[1] RMFVERSN add=yes";
system "fparkey INTEGRAL $rmff\[1] TELESCOP add=yes";
system "fparkey ISGRI $rmff\[1] INSTRUME add=yes";
system "fparkey DAL_TABLE $rmff\[1] BASETYPE add=yes";
system "fparkey 1 $rmff\[1] EXTVER add=yes";
system "fparkey 1 $rmff\[1] GRPID1 add=yes";
system "fparkey 8 $rmff\[1] TLMAX4 add=yes";
system "fparkey 0 $rmff\[1] TLMIN4 add=yes";
system "fparkey OGIP $rmff\[2] HDUCLASS add=yes";
system "fparkey RESPONSE $rmff\[2] HDUCLAS1 add=yes";
system "fparkey EBOUNDS $rmff\[2] HDUCLAS2 add=yes";
system "fparkey $cnt1 $rmff\[2] DETCHANS add=yes";
system "fparkey PHA $rmff\[2] CHANTYPE add=yes";
system "fparkey 1.0 $rmff\[2] EFFAREA add=yes";
system "fparkey DAL_TABLE $rmff\[2] BASETYPE add=yes";
system "fparkey 1992a $rmff\[2] RMFVERSN add=yes";
system "fparkey 1.3.0 $rmff\[2] HDUVERS add=yes";
system "fparkey 1.0.0 $rmff\[2] HDUVERS1 add=yes";
system "fparkey 1.3.0 $rmff\[2] HDUVERS2 add=yes";
system "fparkey 8 $rmff\[2] TLMAX1 add=yes";
system "fparkey 0 $rmff\[2] TLMIN1 add=yes";
system "fparkey 8 $rmff\[0] BITPIX add=yes";
#system "cphead crab_1.15.rmf $rmff";
#system "cphead crab_1.15.rmf\[1] $rmff\[1]";
#system "cphead crab_1.15.rmf\[2] $rmff\[2]";
#system "fparkey $cnt1 $rmff\[2] DETCHANS add=yes";
###### pha file #########
open(COLS,">cols");
print COLS "CHANNEL 1I\n";
print COLS "RATE 1D counts\n";
print COLS "STAT_ERR 1D counts\n";
close(COLS);
open(HEADER,">header");
print HEADER <<EOHEAD;
EXTNAME = 'SPECTRUM' / name of this binary table extension
HDUCLASS= 'OGIP ' / format conforms to OGIP/GSFC standards
HDUCLAS1= 'SPECTRUM' / Extension contains a Spectrum
HDUCLAS2= 'TOTAL ' / Extension contains a Spectrum
HDUCLAS3= 'COUNTS ' / Extension contains counts
HDUVERS1= '1.1.0 ' / Version number of the format
POISSERR= F / Are Poisson Distribution errors assumed.
SYS_ERR = 0 / No systematic error was specified
GROUPING= 0 / No grouping data has been specified
QUALITY = 0 / No data quality information specified
TELESCOP= 'INTEGRAL' / Telescope (mission) name
INSTRUME= 'ISGRI ' / Instrument name
FILTER = 'NONE ' / Instrument filter in use
EXPOSURE= 1.00000000000000E+00 / Exposure time
AREASCAL= 1.00000000E+00 / Nominal effective area
BACKSCAL= 1.00000000E+00 / Background scale factor
CORRSCAL= 0.00000000E+00 / Correlation scale factor
BACKFILE= 'NONE ' / Background FITS file for this object
CORRFILE= 'NONE ' / Correlation FITS file for this object
RESPFILE= '$rmff' / Redistribution matrix file (RMF)
ANCRFILE= 'NONE ' / Ancillary response file (ARF)
XFLT0001= 'NONE ' / XSPEC selection filter description
CHANTYPE= 'PHA ' / Channels assigned by detector electronics
LONGSTRN= 'OGIP 1.0' / The HEASARC Long String Convention may be used.
DETCHANS= $cnt1 / Number of channels in file
OBJECT = '${object}' / OBJECT from the FIRST input file
ROWID1 = 'XeCnt ' / Column Name processed
ORIGIN = 'NASA/GSFC' / origin of fits file
CREATOR = 'do_pha_igr version 2.0' / Program name that produced this file
DATE = '2008-12-05T13:58:43' / file creation date (YYYY-MM-DDThh:mm:ss UTC)
RA_OBJ = 0.0 / RA of First input object
DEC_OBJ = 0.0 / DEC of First input object
EQUINOX = 2000.00 / Equinox of the FIRST object
RADECSYS= 'FK5 ' / Co-ordinate frame used for equinox
FREQUEN= $fcentr / Central frequency of the range, Hz
ER_FREQ= $ef / the width of the frequency range, Hz
PHAVERSN= '1992a ' / OGIP memo number for file format
TIMESYS = 'TT ' / The time system is MJD
GAINAPP = T / Gain all ready subracted
COMMENT This file contents the spectrum of the source in the definite frequency range
EOHEAD
close(HEADER);
system "fcreate headfile=header cdfile=cols datafile=$inp.dat outfile=$out.pha clobber=yes";