Commit dbb6c308 authored by Wei Shoulin's avatar Wei Shoulin
Browse files

reconstruct

parent 7219ec67
...@@ -15,6 +15,7 @@ python setup.py install ...@@ -15,6 +15,7 @@ python setup.py install
## Configuration ## Configuration
enviroment variables enviroment variables
- CSST_DFS_API_MODE = local or cluster # defaulrt: cluster
- CSST_DFS_API_MODE = local or cluster # default: local
- CSST_LOCAL_FILE_ROOT = [a local file directory] # required if DFS_API_MODE = local, default: /opt/temp/csst - CSST_LOCAL_FILE_ROOT = [a local file directory] # required if DFS_API_MODE = local, default: /opt/temp/csst
- CSST_DFS_CONFIG_SERVER = [config server's address] # required if DFS_API_MODE = cluster, - CSST_DFS_CONFIG_SERVER = [config server's address] # required if DFS_API_MODE = cluster,
...@@ -36,3 +36,12 @@ class Delegate(object): ...@@ -36,3 +36,12 @@ class Delegate(object):
def load(self, sub_module): def load(self, sub_module):
return importlib.import_module(f"{API_MODULE_PREFIX}{self.mode}.{sub_module}") return importlib.import_module(f"{API_MODULE_PREFIX}{self.mode}.{sub_module}")
@classmethod
def root_dir(self):
mode = os.getenv("CSST_DFS_API_MODE",'local')
if mode == MODE_LOCAL:
return os.getenv("CSST_LOCAL_FILE_ROOT")
if mode == MODE_CLUSTER:
from csst_dfs_api_cluster.common import config
return config.filePrefix
from .fits import FitsApi from .fits import FitsApi
from .reffits import RefFitsApi from .reffits import RefFitsApi
from .result0 import Result0Api from .result0 import Result0Api
from .result1 import Result1Api
\ No newline at end of file
...@@ -2,32 +2,74 @@ ...@@ -2,32 +2,74 @@
from ..common.delegate import Delegate from ..common.delegate import Delegate
class FitsApi(object): class FitsApi(object):
"""
Raw Fits Operation Class of IFS
"""
def __init__(self, sub_system="ifs"): def __init__(self, sub_system="ifs"):
self.sub_system = sub_system self.sub_system = sub_system
self.module = Delegate().load(sub_module = "ifs") self.module = Delegate().load(sub_module = "ifs")
self.stub = getattr(self.module, "FitsApi")() self.stub = getattr(self.module, "FitsApi")()
self.file_prefix = self.stub.root_dir
def find(self, **kwargs): def find(self, **kwargs):
''' '''
parameter kwargs: parameter kwargs:
obs_time = [str] obs_time = [int],
file_name = [str],
exp_time = (start, end),
ccd_num = [int],
qc0_status = [int],
prc_status = [int]
return list of fits_id return list of raw records
''' '''
return self.stub.find(**kwargs) return self.stub.find(**kwargs)
def read(self, **kwargs): def get(self, **kwargs):
''' query database, return a record as dict
parameter kwargs:
fits_id = [int]
return dict or None
''' '''
return self.stub.get(**kwargs)
def read(self, **kwargs):
''' yield bytes of fits file
parameter kwargs: parameter kwargs:
fits_id = [str] fits_id = [int],
file_path = [str],
chunk_size = [int] default 20480
yield bytes of fits file yield bytes of fits file
''' '''
yield self.stub.read(**kwargs) return self.stub.read(**kwargs)
def update_status(self, **kwargs): def update_proc_status(self, **kwargs):
return self.stub.update_status(**kwargs) ''' update the status of reduction
def upload(self,**kwargs): parameter kwargs:
yield self.stub.upload(**kwargs) fits_id = [int],
status = [int]
'''
return self.stub.update_proc_status(**kwargs)
def update_qc0_status(self, **kwargs):
''' update the status of reduction
parameter kwargs:
fits_id = [int],
status = [int]
'''
return self.stub.update_qc0_status(**kwargs)
def write(self, **kwargs):
''' copy a local file to file storage, then reduce the header of fits file and insert a record into database
parameter kwargs:
file_path = [str]
'''
yield self.stub.write(**kwargs)
from ..common.delegate import Delegate
class RefFitsApi(object): class RefFitsApi(object):
def __init__(self, sub_system = "ifs"): """
Reference Fits Operation Class of IFS
"""
REF_FITS_BIAS = "bias"
REF_FITS_FLAT = "flat"
REF_FITS_DARK = "dark"
REF_FITS_SKY = "sky"
REF_FITS_ARC = "arc"
REF_FITS_TYPES = [REF_FITS_BIAS, REF_FITS_FLAT, REF_FITS_DARK, REF_FITS_SKY, REF_FITS_ARC]
def __init__(self, sub_system="ifs"):
self.sub_system = sub_system self.sub_system = sub_system
self.module = Delegate().load(sub_module = "ifs")
self.stub = getattr(self.module, "RefFitsApi")()
self.file_prefix = self.stub.root_dir
def find(self, **kwargs):
'''
parameter kwargs:
obs_time = [int],
file_name = [str],
exp_time = (start, end),
status = [int],
ref_type = [str]
return list of reference's files records
'''
return self.stub.find(**kwargs)
def get(self, **kwargs):
''' query database, return a record as dict
parameter kwargs:
fits_id = [int]
return dict or None
'''
return self.stub.get(**kwargs)
def read(self, **kwargs):
''' yield bytes of fits file
parameter kwargs:
fits_id = [int],
file_path = [str],
chunk_size = [int] default 20480
yield bytes of fits file
'''
return self.stub.read(**kwargs)
def update_status(self, **kwargs):
''' update the status of reduction
parameter kwargs:
fits_id = [int],
status = [int]
'''
return self.stub.update_status(**kwargs)
def write(self, **kwargs):
''' copy a local file to file storage, then reduce the header of fits file and insert a record into database
def fetch(self, **kwargs): parameter kwargs:
pass file_path = [str]
'''
yield self.stub.write(**kwargs)
from ..common.delegate import Delegate
class Result0Api(object): class Result0Api(object):
def __init__(self, sub_system = "ifs"): """
Level 0 Operation Class of IFS
"""
def __init__(self, sub_system="ifs"):
self.sub_system = sub_system self.sub_system = sub_system
self.module = Delegate().load(sub_module = "ifs")
self.stub = getattr(self.module, "Result0Api")()
self.file_prefix = self.stub.root_dir
def find(self, **kwargs):
'''
parameter kwargs:
raw_id = [int],
file_name = [str],
proc_type = [str]
return list of level 0 record
'''
return self.stub.find(**kwargs)
def get(self, **kwargs):
''' query database, return a record as dict
parameter kwargs:
fits_id = [int]
return dict or None
'''
return self.stub.get(**kwargs)
def read(self, **kwargs):
''' yield bytes of fits file
parameter kwargs:
fits_id = [int],
file_path = [str],
chunk_size = [int] default 20480
yield bytes of fits file
'''
return self.stub.read(**kwargs)
def write(self, **kwargs):
''' copy a local level 0 file to file storage, and insert a record into database
parameter kwargs:
raw_id = [int],
file_path = [str],
proc_type = [str]
'''
yield self.stub.write(**kwargs)
def upload(self, **kwargs):
pass
from ..common.delegate import Delegate
class Result1Api(object):
"""
Level 1 Operation Class of IFS
"""
def __init__(self, sub_system="ifs"):
self.sub_system = sub_system
self.module = Delegate().load(sub_module = "ifs")
self.stub = getattr(self.module, "Result1Api")()
self.file_prefix = self.stub.root_dir
def find(self, **kwargs):
'''
parameter kwargs:
file_name = [str],
proc_type = [str]
return list of level 1 record
'''
return self.stub.find(**kwargs)
def get(self, **kwargs):
''' query database, return a record as dict
parameter kwargs:
fits_id = [int]
return dict or None
'''
return self.stub.get(**kwargs)
def read(self, **kwargs):
''' yield bytes of fits file
parameter kwargs:
fits_id = [int],
file_path = [str],
chunk_size = [int] default 20480
yield bytes of fits file
'''
return self.stub.read(**kwargs)
def write(self, **kwargs):
''' copy a local level 1 file to file storage, and insert a record into database
parameter kwargs:
file_path = [str],
proc_type = [str],
result0_ids = [list]
'''
yield self.stub.write(**kwargs)
import os
import unittest import unittest
from astropy.io import fits
from csst_dfs_api.ifs import FitsApi from csst_dfs_api.ifs import FitsApi
from csst_dfs_api.common.delegate import Delegate
class IFSFitsTestCase(unittest.TestCase): class IFSFitsTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
self.api = FitsApi() self.api = FitsApi()
def test_find(self): def test_find(self):
files = self.api.find() recs = self.api.find(file_name='CCD1_ObsTime_300_ObsNum_7.fits')
print("find ", len(files)) print('find:', recs)
assert len(recs) == 1
recs = self.api.find()
print('find:', recs)
assert len(recs) > 1
def test_read(self):
recs = self.api.find(file_name='CCD1_ObsTime_300_ObsNum_7.fits')
print("The full path: ", os.path.join(self.api.file_prefix, recs[0]['file_path']))
file_segments = self.api.read(file_path=recs[0]['file_path'])
file_bytes = b''.join(file_segments)
hdul = fits.HDUList.fromstring(file_bytes)
print(hdul.info())
hdr = hdul[0].header
print(repr(hdr))
def test_update_proc_status(self):
recs = self.api.find(file_name='CCD1_ObsTime_300_ObsNum_7.fits')
self.api.update_proc_status(fits_id=recs[0]['id'],status=1)
rec = self.api.get(fits_id=recs[0]['id'])
assert rec['prc_status'] == 1
def test_update_qc0_status(self):
recs = self.api.find(file_name='CCD1_ObsTime_300_ObsNum_7.fits')
self.api.update_qc0_status(fits_id=recs[0]['id'],status=1)
rec = self.api.get(fits_id=recs[0]['id'])
assert rec['qc0_status'] == 1
def test_write(self):
recs = self.api.write(file_path='/opt/temp/csst_ifs/CCD2_ObsTime_1200_ObsNum_40.fits')
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
rec = self.api.get(fits_id=recs[0]['id'])
print(rec)
\ No newline at end of file
import os
import unittest
from astropy.io import fits
from csst_dfs_api.ifs import RefFitsApi
class IFSFitsTestCase(unittest.TestCase):
def setUp(self):
self.api = RefFitsApi()
def test_find(self):
recs = self.api.find(exp_time=('2021-03-19 13:42:22', '2021-03-19 15:28:00'), ref_type=RefFitsApi.REF_FITS_FLAT)
print('find:', recs)
assert len(recs) > 1
recs = self.api.find()
print('=' * 80)
print('find:', recs)
assert len(recs) > 1
def test_read(self):
recs = self.api.find(file_name='CCD2_Flat_img.fits')
print("The full path: ", os.path.join(self.api.file_prefix, recs[0]['file_path']))
file_segments = self.api.read(file_path=recs[0]['file_path'])
file_bytes = b''.join(file_segments)
hdul = fits.HDUList.fromstring(file_bytes)
print(hdul.info())
hdr = hdul[0].header
print(repr(hdr))
def test_update_status(self):
recs = self.api.find(file_name='CCD2_Flat_img.fits')
self.api.update_status(fits_id=recs[0]['id'],status=1)
rec = self.api.get(fits_id=recs[0]['id'])
assert rec['status'] == 1
def test_write(self):
recs = self.api.write(file_path='/opt/temp/csst_ifs/CCD3_Flat_img.fits')
recs = self.api.find(file_name='CCD3_Flat_img.fits')
rec = self.api.get(fits_id=recs[0]['id'])
print(rec)
import os
import unittest
from astropy.io import fits
from csst_dfs_api.ifs import Result0Api
class IFSResult0TestCase(unittest.TestCase):
def setUp(self):
self.api = Result0Api()
def test_find(self):
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print('find:', recs)
recs = self.api.find()
print('find:', recs)
def test_read(self):
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print("The full path: ", os.path.join(self.api.file_prefix, recs[0]['file_path']))
file_segments = self.api.read(file_path=recs[0]['file_path'])
file_bytes = b''.join(file_segments)
hdul = fits.HDUList.fromstring(file_bytes)
print(hdul.info())
hdr = hdul[0].header
print(repr(hdr))
def test_write(self):
self.api.write(raw_id = 1,
file_path='/opt/temp/csst_ifs/CCD2_ObsTime_1200_ObsNum_40.fits',
proc_type = 'default')
recs = self.api.find(raw_id=1)
print()
print(recs)
print("="*80)
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print(recs)
import os
import unittest
from astropy.io import fits
from csst_dfs_api.ifs import Result1Api
class IFSResult1TestCase(unittest.TestCase):
def setUp(self):
self.api = Result1Api()
def test_find(self):
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print('find:', recs)
recs = self.api.find()
print('find:', recs)
def test_read(self):
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print("The full path: ", os.path.join(self.api.file_prefix, recs[0]['file_path']))
rec, result0s = self.api.get(fits_id=recs[0]['id'])
print(result0s)
file_segments = self.api.read(file_path=rec['file_path'])
file_bytes = b''.join(file_segments)
hdul = fits.HDUList.fromstring(file_bytes)
print(hdul.info())
hdr = hdul[0].header
print(repr(hdr))
def test_write(self):
self.api.write(result0_ids = [1,2,3,4],
file_path='/opt/temp/csst_ifs/CCD2_ObsTime_1200_ObsNum_40.fits',
proc_type = 'default')
recs = self.api.find(raw_id=1)
print()
print(recs)
print("="*80)
recs = self.api.find(file_name='CCD2_ObsTime_1200_ObsNum_40.fits')
print(recs)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment