From d29c07d576bc884485cb897e8e55e7b8d1db9ad8 Mon Sep 17 00:00:00 2001 From: Andrey Mukhin Date: Thu, 2 Mar 2023 17:42:51 +0300 Subject: [PATCH] alpha test commit --- MANIFEST.in | 4 +- README.md | 61 +++--- nuwavdet/__init__.py | 1 + nuwavdet/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 177 bytes nuwavdet/__pycache__/nuwavdet.cpython-39.pyc | Bin 0 -> 19421 bytes .../__pycache__/nuwavsource.cpython-39.pyc | Bin 0 -> 18911 bytes .../badpix_headers/nuAuserbadpixDET0.txt | 0 .../badpix_headers/nuAuserbadpixDET1.txt | 0 .../badpix_headers/nuAuserbadpixDET2.txt | 0 .../badpix_headers/nuAuserbadpixDET3.txt | 0 .../badpix_headers/nuAuserbadpix_main.txt | 0 .../badpix_headers/nuBuserbadpixDET0.txt | 0 .../badpix_headers/nuBuserbadpixDET1.txt | 0 .../badpix_headers/nuBuserbadpixDET2.txt | 0 .../badpix_headers/nuBuserbadpixDET3.txt | 0 .../badpix_headers/nuBuserbadpix_main.txt | 0 .../nuwavsource.py => nuwavdet/nuwavdet.py | 194 +++++++++++------- .../pixpos/nuApixpos20100101v007.fits | 0 .../pixpos/nuBpixpos20100101v007.fits | 0 .../pixpos/ref_pixA0.npy | Bin .../pixpos/ref_pixA1.npy | Bin .../pixpos/ref_pixA2.npy | Bin .../pixpos/ref_pixA3.npy | Bin .../pixpos/ref_pixB0.npy | Bin .../pixpos/ref_pixB1.npy | Bin .../pixpos/ref_pixB2.npy | Bin .../pixpos/ref_pixB3.npy | Bin nuwavsource/__init__.py | 1 - .../__pycache__/__init__.cpython-39.pyc | Bin 183 -> 0 bytes .../__pycache__/nuwavsource.cpython-39.pyc | Bin 15566 -> 0 bytes setup.py | 6 +- 31 files changed, 160 insertions(+), 107 deletions(-) create mode 100644 nuwavdet/__init__.py create mode 100644 nuwavdet/__pycache__/__init__.cpython-39.pyc create mode 100644 nuwavdet/__pycache__/nuwavdet.cpython-39.pyc create mode 100644 nuwavdet/__pycache__/nuwavsource.cpython-39.pyc rename {nuwavsource => nuwavdet}/badpix_headers/nuAuserbadpixDET0.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuAuserbadpixDET1.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuAuserbadpixDET2.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuAuserbadpixDET3.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuAuserbadpix_main.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuBuserbadpixDET0.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuBuserbadpixDET1.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuBuserbadpixDET2.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuBuserbadpixDET3.txt (100%) rename {nuwavsource => nuwavdet}/badpix_headers/nuBuserbadpix_main.txt (100%) rename nuwavsource/nuwavsource.py => nuwavdet/nuwavdet.py (77%) rename {nuwavsource => nuwavdet}/pixpos/nuApixpos20100101v007.fits (100%) rename {nuwavsource => nuwavdet}/pixpos/nuBpixpos20100101v007.fits (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixA0.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixA1.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixA2.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixA3.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixB0.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixB1.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixB2.npy (100%) rename {nuwavsource => nuwavdet}/pixpos/ref_pixB3.npy (100%) delete mode 100644 nuwavsource/__init__.py delete mode 100644 nuwavsource/__pycache__/__init__.cpython-39.pyc delete mode 100644 nuwavsource/__pycache__/nuwavsource.cpython-39.pyc diff --git a/MANIFEST.in b/MANIFEST.in index b8aee1d..f985af5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,2 @@ -include nuwavsource/pixpos/* -include nuwavsource/badpix_headers/* \ No newline at end of file +include nuwavdet/pixpos/* +include nuwavdet/badpix_headers/* diff --git a/README.md b/README.md index 53fb863..dd31db5 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,37 @@ -# nuwavsource +# nuwavdet -This package is supposed to be used to detect the sources in NuStar observations and generate a mask excluding the signal from the sources of any kind. +This pacakge is used to generate region masks separating any focused X-ray flux from background signal in NuSTAR observations. -Additionaly, it generates a table containing: +## Installation +This package is to be used with Python 3.x.x +```python +pip install git+https://github.com/andrey-rrousan/nuwavdet +``` -Useful data about the observation: +## Main use + +To use the package in your project, import it in by writing + +```python +from nuwavdet import nuwavdet as nw +``` + +The main functionality of the pacakge is presented with a single function +```python +process(obs_path, thresh) +``` +Inputs are string with path to the _cl.evt file to use and a tuple of thresholds, e.g. +```python +process('D:\\Data\\obs_cl.evt', (3, 2)) +``` + +Outputs of the function are: +1. dictionary with some metadata and properties of the observation after mask generation procedure. +2. region array with mask in DET1 coordinate frame. Note that this mask is for numpy mask application so 1 corresponds to masked pixel and 0 otherwise. +3. custom bad pixel table with flagged pixels in RAW coordinates. It can be exported as fits file or each separate table can be acessed directly. +4. array with the sum of wavelet planes used in the processing. + +Metadata about the observation file: 1. OBS_ID 2. Detector @@ -14,32 +41,16 @@ Useful data about the observation: Useful algorythm-related data: -6. Average count rate on unmasked area -7. Portion of unmasked area -8. Specific statistical metric[1] before and after masking the detected sources -9. Root-mean-square of counts in unmasked area +6. Average count rate of unmasked area +7. Fraction of unmasked area +8. Modified Cash-statistic per bin before and after masking the detected sources -## Installation -This package is to be used with Python 3.x.x - -To install tha package write - -```bash -pip install nuwavsource -``` - -## Usage - -To use the package in your project, import it in by writing - -```python -from nuwavsource import nuwavsource -``` +## Other uses You can process the cl.evt file by creating an Observation class object: ```python -obs = nuwavsource.Observation(path_to_evt_file) +obs = nw.Observation(path_to_evt_file) ``` Additionally, the energy band in KeV to get events from can be passed as an argument. The default value is [3,20]. diff --git a/nuwavdet/__init__.py b/nuwavdet/__init__.py new file mode 100644 index 0000000..ef24ac7 --- /dev/null +++ b/nuwavdet/__init__.py @@ -0,0 +1 @@ +name = 'nuwavdet' \ No newline at end of file diff --git a/nuwavdet/__pycache__/__init__.cpython-39.pyc b/nuwavdet/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c99b5dd5c47882a21833ad455d54a9b85aec70 GIT binary patch literal 177 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/nuwavdet/__pycache__/nuwavsource.cpython-39.pyc b/nuwavdet/__pycache__/nuwavsource.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85db807587237a368a52644666485683a56c20bc GIT binary patch literal 18911 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 ZU4_hWZa6nSSS;rI|BCfU=JkyGe*y2AnZW=6 literal 0 HcmV?d00001 diff --git a/nuwavsource/badpix_headers/nuAuserbadpixDET0.txt b/nuwavdet/badpix_headers/nuAuserbadpixDET0.txt similarity index 100% rename from nuwavsource/badpix_headers/nuAuserbadpixDET0.txt rename to nuwavdet/badpix_headers/nuAuserbadpixDET0.txt diff --git a/nuwavsource/badpix_headers/nuAuserbadpixDET1.txt b/nuwavdet/badpix_headers/nuAuserbadpixDET1.txt similarity index 100% rename from nuwavsource/badpix_headers/nuAuserbadpixDET1.txt rename to nuwavdet/badpix_headers/nuAuserbadpixDET1.txt diff --git a/nuwavsource/badpix_headers/nuAuserbadpixDET2.txt b/nuwavdet/badpix_headers/nuAuserbadpixDET2.txt similarity index 100% rename from nuwavsource/badpix_headers/nuAuserbadpixDET2.txt rename to nuwavdet/badpix_headers/nuAuserbadpixDET2.txt diff --git a/nuwavsource/badpix_headers/nuAuserbadpixDET3.txt b/nuwavdet/badpix_headers/nuAuserbadpixDET3.txt similarity index 100% rename from nuwavsource/badpix_headers/nuAuserbadpixDET3.txt rename to nuwavdet/badpix_headers/nuAuserbadpixDET3.txt diff --git a/nuwavsource/badpix_headers/nuAuserbadpix_main.txt b/nuwavdet/badpix_headers/nuAuserbadpix_main.txt similarity index 100% rename from nuwavsource/badpix_headers/nuAuserbadpix_main.txt rename to nuwavdet/badpix_headers/nuAuserbadpix_main.txt diff --git a/nuwavsource/badpix_headers/nuBuserbadpixDET0.txt b/nuwavdet/badpix_headers/nuBuserbadpixDET0.txt similarity index 100% rename from nuwavsource/badpix_headers/nuBuserbadpixDET0.txt rename to nuwavdet/badpix_headers/nuBuserbadpixDET0.txt diff --git a/nuwavsource/badpix_headers/nuBuserbadpixDET1.txt b/nuwavdet/badpix_headers/nuBuserbadpixDET1.txt similarity index 100% rename from nuwavsource/badpix_headers/nuBuserbadpixDET1.txt rename to nuwavdet/badpix_headers/nuBuserbadpixDET1.txt diff --git a/nuwavsource/badpix_headers/nuBuserbadpixDET2.txt b/nuwavdet/badpix_headers/nuBuserbadpixDET2.txt similarity index 100% rename from nuwavsource/badpix_headers/nuBuserbadpixDET2.txt rename to nuwavdet/badpix_headers/nuBuserbadpixDET2.txt diff --git a/nuwavsource/badpix_headers/nuBuserbadpixDET3.txt b/nuwavdet/badpix_headers/nuBuserbadpixDET3.txt similarity index 100% rename from nuwavsource/badpix_headers/nuBuserbadpixDET3.txt rename to nuwavdet/badpix_headers/nuBuserbadpixDET3.txt diff --git a/nuwavsource/badpix_headers/nuBuserbadpix_main.txt b/nuwavdet/badpix_headers/nuBuserbadpix_main.txt similarity index 100% rename from nuwavsource/badpix_headers/nuBuserbadpix_main.txt rename to nuwavdet/badpix_headers/nuBuserbadpix_main.txt diff --git a/nuwavsource/nuwavsource.py b/nuwavdet/nuwavdet.py similarity index 77% rename from nuwavsource/nuwavsource.py rename to nuwavdet/nuwavdet.py index 45c0e0b..7f4a59f 100644 --- a/nuwavsource/nuwavsource.py +++ b/nuwavdet/nuwavdet.py @@ -1,17 +1,18 @@ -# %% -import numpy as np import itertools +import numpy as np +import os + from pandas import DataFrame, read_csv +from scipy.signal import fftconvolve + +from astropy import units as u from astropy.table import Table from astropy.coordinates import SkyCoord -from astropy import units as u -from multiprocessing import get_context, cpu_count -from time import perf_counter -from os import stat, makedirs -from os.path import dirname -from scipy.signal import fftconvolve, convolve2d from astropy.io import fits from astropy.wcs import WCS + +from time import perf_counter +from multiprocessing import get_context, cpu_count from glob import glob from warnings import filterwarnings filterwarnings('ignore') @@ -21,9 +22,9 @@ def get_link_list(folder: str, sort_list: bool = True) -> list[str]: """ Returns array of paths to all *_cl.evt files in the directory recursively. """ - links = glob(f'{folder}\\**\\*_cl.evt', recursive=True) + links = glob(os.path.join(folder, '**', '*_cl.evt'), recursive=True) if sort_list: - sorted_list = sorted(links, key=lambda x: stat(x).st_size) + sorted_list = sorted(links, key=lambda x: os.stat(x).st_size) return np.array(sorted_list) else: return np.array(links) @@ -152,7 +153,7 @@ def add_borders(array, middle=True): return mask -def fill_poisson(array, size_input=32): +def fill_poisson(array, size_input=15): """ Fills all masked elements of an array with poisson signal with local expected value. """ @@ -162,14 +163,17 @@ def fill_poisson(array, size_input=32): size = size_input output = array.data.copy() mask = array.mask.copy() + mask_full = np.ones(mask.shape) while mask.sum() > 1: kernel = np.ones((size, size))/size**2 - coeff = fftconvolve(np.logical_not(mask), kernel, mode='same') + coeff_full = fftconvolve(mask_full, kernel, mode='same') + coeff = fftconvolve(np.logical_not(mask), kernel, mode='same') / coeff_full mean = fftconvolve(output, kernel, mode='same') - idx = np.where(np.logical_and(mask, coeff > 0.1)) + idx = np.where(np.logical_and(mask, coeff > 0.7)) output[idx] = np.random.poisson(np.abs(mean[idx]/coeff[idx])) mask[idx] = False - size *= 2 + size += size_input + size += (1 - size % 2) return output @@ -253,12 +257,12 @@ class Observation: """ Creates a mask for observation based on badpix tables. """ - current_dir = dirname(__file__) + current_dir = os.path.dirname(__file__) output = np.ones((360, 360)) for det_id in range(4): badpix = file[3 + det_id].data badpix_exp = (badpix['TIME_STOP'] - badpix['TIME'])/self.exposure - pixpos = np.load(f'{current_dir}\\pixpos\\ref_pix{self.det}{det_id}.npy', allow_pickle=True).item() + pixpos = np.load(os.path.join(current_dir, 'pixpos', f'ref_pix{self.det}{det_id}.npy'), allow_pickle=True).item() for raw_x, raw_y, exp in zip(badpix['RAWX'], badpix['RAWY'], badpix_exp): y, x = pixpos[(raw_x, raw_y)] output[x-3:x+11, y-3:y+11] -= exp @@ -301,10 +305,7 @@ class Observation: temp_out = data-conv # ERRORMAP CALCULATION if thresh_max != 0: - if mode == 'gauss': - sig = ((wavelet(i)**2).sum())**0.5 - if mode == 'atrous': - sig = atrous_sig(i) + sig = atrous_sig(i) bkg = fftconvolve(data, wavelet(i), mode='same') bkg[bkg < 0] = 0 err = (1+np.sqrt(bkg+0.75))*sig @@ -332,16 +333,16 @@ class Observation: x_region, y_region = np.where(region) hdus = [] for i in range(4): - current_dir = dirname(__file__) - pixpos = Table(fits.getdata(f'{current_dir}\\pixpos\\nu{self.det}pixpos20100101v007.fits', i+1)) + current_dir = os.path.dirname(__file__) + pixpos = Table(fits.getdata(os.path.join(current_dir, 'pixpos', f'nu{self.det}pixpos20100101v007.fits'), i+1)) pixpos = pixpos[pixpos['REF_DET1X'] != -1] - test = np.zeros(len(pixpos['REF_DET1X']), dtype=bool) + ref_condition = np.zeros(len(pixpos['REF_DET1X']), dtype=bool) for idx, (x, y) in enumerate(zip(pixpos['REF_DET1X'], pixpos['REF_DET1Y'])): - test[idx] = np.logical_and(np.equal(x, x_region), np.equal(y, y_region)).any() + ref_condition[idx] = np.logical_and(np.equal(x, x_region), np.equal(y, y_region)).any() - positions = np.array((pixpos['RAWX'][test], pixpos['RAWY'][test])) - if sum(test) != 0: + positions = np.array((pixpos['RAWX'][ref_condition], pixpos['RAWY'][ref_condition])) + if sum(ref_condition) != 0: positions = np.unique(positions, axis=1) rawx, rawy = positions[0], positions[1] @@ -357,13 +358,13 @@ class Observation: hdu = fits.BinTableHDU.from_columns(columns) naxis1, naxis2 = hdu.header['NAXIS1'], hdu.header['NAXIS2'] - hdu.header = fits.Header.fromtextfile(f'{current_dir}\\badpix_headers\\nu{self.det}userbadpixDET{i}.txt') + hdu.header = fits.Header.fromtextfile(os.path.join(current_dir, 'badpix_headers', f'nu{self.det}userbadpixDET{i}.txt')) hdu.header['NAXIS1'] = naxis1 hdu.header['NAXIS2'] = naxis2 hdus.append(hdu) primary_hdu = fits.PrimaryHDU() - primary_hdu.header = fits.Header.fromtextfile(f'{current_dir}\\badpix_headers\\nu{self.det}userbadpix_main.txt') + primary_hdu.header = fits.Header.fromtextfile(os.path.join(current_dir, 'badpix_headers', f'nu{self.det}userbadpix_main.txt')) hdu_list = fits.HDUList([ primary_hdu, *hdus @@ -371,16 +372,38 @@ class Observation: return hdu_list -def process(args): +def save_region(region, path, overwrite=False): """ - Creates a mask using wavelet decomposition and produces some statistical and metadata about the passed observation. - args must contain two arguments: path to the file of interest and threshold, e.g. ('D:\Data\obs_cl.evt',(5,2)) + Converts region from numpy mask notation (1 for masked, 0 otherwise) + to standart notation (0 for masked, 1 otherwise). + Saves the region as fits file according to given path. + """ + fits.writeto(f'{path}', + np.logical_not(region).astype(int), + overwrite=overwrite) + + +def process(obs_path, thresh): + """ + Creates a mask using wavelet decomposition and produces some stats + and metadata about the passed observation. + Arguments: path to the file of interest and threshold, + e.g. process('D:\\Data\\obs_cl.evt', (3, 2)) """ - obs_path, thresh = args bin_num = 6 + + table = { + 'obs_id': [], 'detector': [], 'ra': [], 'dec': [], + 'lon': [], 'lat': [], 't_start': [], 'exposure': [], + 'count_rate': [], 'remaining_area': [], 'cash_stat': [], + 'cash_stat_full': [] + } + try: obs = Observation(obs_path) - sky_coord = SkyCoord(ra=obs.ra*u.deg, dec=obs.dec*u.deg, frame='fk5').transform_to('galactic') + sky_coord = SkyCoord(ra=obs.ra*u.deg, + dec=obs.dec*u.deg, + frame='fk5').transform_to('galactic') lon, lat = sky_coord.l.value, sky_coord.b.value rem_signal, rem_area, poiss_comp, rms = np.zeros((4, 2**bin_num)) region = np.zeros(obs.data.shape, dtype=bool) @@ -391,6 +414,7 @@ def process(args): good_idx = 0 if obs.exposure > 1000: wav_obs = obs.wavdecomp('atrous', thresh, occ_coeff=True) + wav_sum = wav_obs[2:-1].sum(0) occ_coeff = obs.get_coeff() binary_arr = binary_array(bin_num) @@ -400,10 +424,12 @@ def process(args): except ValueError: region = np.zeros(obs.data.shape, dtype=bool) - masked_obs = np.ma.masked_array(obs.data, mask=region)*occ_coeff - rem_region = np.logical_and(region, np.logical_not(obs.data.mask)) + masked_obs = np.ma.masked_array(obs.data, + mask=region) * occ_coeff + rem_region = np.logical_and(region, + np.logical_not(obs.data.mask)) rem_signal[idx] = 1-obs.data[region].sum()/obs.data.sum() - rem_area[idx] = 1 - rem_region.sum()/np.logical_not(obs.data.mask).sum() + rem_area[idx] = 1 - rem_region.sum() / np.logical_not(obs.data.mask).sum() poiss_comp[idx] = cstat(masked_obs.mean(), masked_obs) rms[idx] = np.sqrt(((masked_obs-masked_obs.mean())**2).mean()) @@ -418,12 +444,13 @@ def process(args): try: region = wav_obs[2:-1][good_lvl].sum(0) > 0 - if region.sum() > 0: - region_raw = obs.region_to_raw(region.astype(int)) + region_raw = obs.region_to_raw(region.astype(int)) except ValueError: region = np.zeros(obs.data.shape, dtype=bool) + region_raw = obs.region_to_raw(region.astype(int)) masked_obs = np.ma.masked_array(obs.data, mask=region) rem_region = np.logical_and(region, np.logical_not(obs.data.mask)) + to_table = [obs.obs_id, obs.det, obs.ra, @@ -436,9 +463,10 @@ def process(args): 1 - rem_region.sum()/np.logical_not(obs.data.mask).sum(), # rem_area poiss_comp[good_idx], poiss_comp[0], - rms[good_idx] ] + else: + wav_sum = np.zeros((360, 360)) to_table = [obs.obs_id, obs.det, obs.ra, @@ -452,16 +480,24 @@ def process(args): -1, # rem_area -1, -1, - -1 ] - return to_table, region.astype(int), region_raw + + for key, value in zip(table.keys(), to_table): + table[key] = [value] + return table, region.astype(int), region_raw, wav_sum except TypeError: - return obs_path, -1, -1 + return obs_path, -1, -1, -1 -def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thresh=None): +def _process_multi(args): + return process(*args) + + +def process_folder(input_folder=None, start_new_file=None, fits_folder=None, + thresh=None): """ - Generates a fits-table of parameters, folder with mask images in DET1 and BADPIX tables in RAW for all observations in given folder. + Generates a fits-table of parameters, folder with mask images in DET1 and + BADPIX tables in RAW for all observations in given folder. Note that observations with exposure < 1000 sec a skipped. start_new_file can be either 'y' or 'n'. thresh must be a tuple, e.g. (5,2). @@ -481,10 +517,13 @@ def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thr print('Cannot interprete input, closing script') raise SystemExit(0) if not (fits_folder): - print(f'Enter path to the output folder') + print('Enter path to the output folder') fits_folder = input() - region_folder = f'{fits_folder}\\Region' - region_raw_folder = f'{fits_folder}\\Region_raw' + + region_folder = os.path.join(fits_folder, 'Region') + region_raw_folder = os.path.join(fits_folder, 'Region_raw') + wav_sum_folder = os.path.join(fits_folder, 'Wav_sum') + if not thresh: print('Enter threshold values for wavelet decomposition:') print('General threshold:') @@ -496,31 +535,29 @@ def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thr obs_list = get_link_list(input_folder, sort_list=True) start = perf_counter() group_size = 50 - makedirs(region_folder, exist_ok=True) - makedirs(region_raw_folder, exist_ok=True) + os.makedirs(region_folder, exist_ok=True) + os.makedirs(region_raw_folder, exist_ok=True) + os.makedirs(wav_sum_folder, exist_ok=True) # FILTERING BY THE FILE SIZE print(f'Finished scanning folders. Found {len(obs_list)} observations.') table = { 'obs_id': [], 'detector': [], 'ra': [], 'dec': [], 'lon': [], 'lat': [], 't_start': [], 'exposure': [], - 'count_rate': [], 'remaining_area': [], 'poisson_stat': [], - 'poisson_stat_full': [], 'rms': [] + 'count_rate': [], 'remaining_area': [], 'cash_stat': [], + 'cash_stat_full': [] } if start_new: out_table = DataFrame(table) - out_table.to_csv(f'{fits_folder}\\test.csv') - out_table.to_csv(f'{fits_folder}\\test_skipped.csv') + out_table.to_csv(os.path.join(fits_folder, 'overview.csv')) + out_table.to_csv(os.path.join(fits_folder, 'overview_skipped.csv')) # FILTERING OUT PROCESSED OBSERVATIONS already_processed_list = read_csv( - f'{fits_folder}\\test.csv', - index_col=0, - dtype={'obs_id': str} + os.path.join(fits_folder, 'overview.csv'), index_col=0, dtype={'obs_id': str} ) already_skipped_list = read_csv( - f'{fits_folder}\\test_skipped.csv', - index_col=0, - dtype={'obs_id': str} + os.path.join(fits_folder, 'overview_skipped.csv'), index_col=0, dtype={'obs_id': str} ) + already_processed = ( already_processed_list['obs_id'].astype(str) + already_processed_list['detector'] @@ -529,6 +566,7 @@ def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thr already_skipped_list['obs_id'].astype(str) + already_skipped_list['detector'] ).values + obs_list_names = [ curr[curr.index('nu')+2:curr.index('_cl.evt')-2] for curr in obs_list @@ -541,8 +579,10 @@ def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thr (curr not in already_skipped) for curr in obs_list_names ]) + obs_list = obs_list[np.logical_and(not_processed, not_skipped)] - print(f'Removed already processed observations. {len(obs_list)} observations remain.') + print('Removed already processed observations.', + f'{len(obs_list)} observations remain.') # START PROCESSING print('Started processing...') num = 0 @@ -550,35 +590,37 @@ def process_folder(input_folder=None, start_new_file=None, fits_folder=None, thr print(f'Started group {group_idx}') group_list = obs_list[group_size*group_idx:min(group_size*(group_idx+1), len(obs_list))] max_size = np.array([ - stat(file).st_size/2**20 + os.stat(file).st_size/2**20 for file in group_list ]).max() process_num = (cpu_count() if max_size < 50 else (cpu_count()//2 if max_size < 200 else (cpu_count()//4 if max_size < 1000 else 1))) print(f"Max file size in group is {max_size:.2f}Mb, create {process_num} processes") with get_context('spawn').Pool(processes=process_num) as pool: packed_args = map(lambda _: (_, thresh), group_list) - for result, region, region_raw in pool.imap(process, packed_args): + for result, region, region_raw, wav_sum in pool.imap(_process_multi, packed_args): if type(result) is np.str_: obs_id = result[result.index('nu'):result.index('_cl.evt')] print(f'{num:>3} is skipped. File {obs_id}') num += 1 continue - for key, value in zip(table.keys(), result): - table[key] = [value] - if table['exposure'][0] < 1000: - print(f'{num:>3} {str(result[0])+result[1]} is skipped. Exposure < 1000') - DataFrame(table).to_csv(f'{fits_folder}\\test_skipped.csv', mode='a', header=False) - num +=1 + + obs_name = str(result['obs_id'][0])+result['detector'][0] + if result['exposure'][0] < 1000: + print(f'{num:>3} {obs_name} is skipped. Exposure < 1000') + DataFrame(result).to_csv(os.path.join(fits_folder, 'overview_skipped.csv'), mode='a', header=False) + num += 1 continue - DataFrame(table).to_csv(f'{fits_folder}\\test.csv', mode='a', header=False) - fits.writeto(f'{region_folder}\\{str(result[0])+result[1]}_region.fits', region, overwrite=True) - if region_raw != -1: - region_raw.writeto(f'{region_raw_folder}\\{str(result[0])+result[1]}_reg_raw.fits', overwrite=True) - print(f'{num:>3} {str(result[0])+result[1]} is written.') - num +=1 + + DataFrame(result).to_csv(os.path.join(fits_folder, 'overview.csv'), mode='a', header=False) + save_region(region, os.path.join(region_folder, f'{obs_name}_region.fits'), overwrite=True) + region_raw.writeto(os.path.join(region_raw_folder, f'{obs_name}_reg_raw.fits'), overwrite=True) + fits.writeto(os.path.join(wav_sum_folder, f'{obs_name}_wav_sum.fits'), wav_sum, overwrite=True) + + print(f'{num:>3} {obs_name} is written.') + num += 1 print('Converting generated csv to fits file...') print(f'Current time in: {(perf_counter()-start):.2f}') print(f'Processed {num/len(obs_list)*100:.2f} percent') - csv_file = read_csv(f'{fits_folder}\\test.csv', index_col=0, dtype={'obs_id': str}) - Table.from_pandas(csv_file).write(f'{fits_folder}\\test.fits', overwrite=True) + csv_file = read_csv(os.path.join(fits_folder, 'overview.csv'), index_col=0, dtype={'obs_id': str}) + Table.from_pandas(csv_file).write(os.path.join(fits_folder, 'overview.fits'), overwrite=True) print(f'Finished writing: {perf_counter()-start}') diff --git a/nuwavsource/pixpos/nuApixpos20100101v007.fits b/nuwavdet/pixpos/nuApixpos20100101v007.fits similarity index 100% rename from nuwavsource/pixpos/nuApixpos20100101v007.fits rename to nuwavdet/pixpos/nuApixpos20100101v007.fits diff --git a/nuwavsource/pixpos/nuBpixpos20100101v007.fits b/nuwavdet/pixpos/nuBpixpos20100101v007.fits similarity index 100% rename from nuwavsource/pixpos/nuBpixpos20100101v007.fits rename to nuwavdet/pixpos/nuBpixpos20100101v007.fits diff --git a/nuwavsource/pixpos/ref_pixA0.npy b/nuwavdet/pixpos/ref_pixA0.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixA0.npy rename to nuwavdet/pixpos/ref_pixA0.npy diff --git a/nuwavsource/pixpos/ref_pixA1.npy b/nuwavdet/pixpos/ref_pixA1.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixA1.npy rename to nuwavdet/pixpos/ref_pixA1.npy diff --git a/nuwavsource/pixpos/ref_pixA2.npy b/nuwavdet/pixpos/ref_pixA2.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixA2.npy rename to nuwavdet/pixpos/ref_pixA2.npy diff --git a/nuwavsource/pixpos/ref_pixA3.npy b/nuwavdet/pixpos/ref_pixA3.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixA3.npy rename to nuwavdet/pixpos/ref_pixA3.npy diff --git a/nuwavsource/pixpos/ref_pixB0.npy b/nuwavdet/pixpos/ref_pixB0.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixB0.npy rename to nuwavdet/pixpos/ref_pixB0.npy diff --git a/nuwavsource/pixpos/ref_pixB1.npy b/nuwavdet/pixpos/ref_pixB1.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixB1.npy rename to nuwavdet/pixpos/ref_pixB1.npy diff --git a/nuwavsource/pixpos/ref_pixB2.npy b/nuwavdet/pixpos/ref_pixB2.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixB2.npy rename to nuwavdet/pixpos/ref_pixB2.npy diff --git a/nuwavsource/pixpos/ref_pixB3.npy b/nuwavdet/pixpos/ref_pixB3.npy similarity index 100% rename from nuwavsource/pixpos/ref_pixB3.npy rename to nuwavdet/pixpos/ref_pixB3.npy diff --git a/nuwavsource/__init__.py b/nuwavsource/__init__.py deleted file mode 100644 index f4d95e1..0000000 --- a/nuwavsource/__init__.py +++ /dev/null @@ -1 +0,0 @@ -name = 'nuwavsource' \ No newline at end of file diff --git a/nuwavsource/__pycache__/__init__.cpython-39.pyc b/nuwavsource/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 89f05d8a5ed2d5a15d9e9fc631517192d2dad81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 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 AUjP6A diff --git a/setup.py b/setup.py index 2f13ce6..75fb40b 100644 --- a/setup.py +++ b/setup.py @@ -4,14 +4,14 @@ with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( - name="nuwavsource", - version="0.0.8", + name="nuwavdet", + version="0.1.0", author="Andrey Mukhin", author_email="amukhin@phystech.edu", description="A package for source exclusion in NuStar observation data using wavelet decomposition", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/Andreyousan/nuwavsource", + url="https://github.com/andrey-rrousan/nuwavdet", packages=setuptools.find_packages(), include_package_data=True, classifiers=(