ingest.py 4.31 KB
Newer Older
Wei Shoulin's avatar
c3  
Wei Shoulin committed
1
2
3
4
5
6
7
8
import os, sys
import argparse
import logging
from astropy.io import fits
import datetime
import shutil

from csst_dfs_api_local.common.db import DBClient
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
9
10
from csst_dfs_commons.utils.fits import get_header_value

Wei Shoulin's avatar
c3  
Wei Shoulin committed
11
12
13
log = logging.getLogger('csst-dfs-api-local')

def ingest():
Wei Shoulin's avatar
Wei Shoulin committed
14
    
Wei Shoulin's avatar
c3  
Wei Shoulin committed
15
16
    parser = argparse.ArgumentParser(prog=f"{sys.argv[0]}", description="ingest the local files")
    parser.add_argument('-i','--infile', dest="infile", help="a file or a directory")
Wei Shoulin's avatar
Wei Shoulin committed
17
    parser.add_argument('-m', '--copyfiles', dest="copyfiles", action='store_true', default=False, help="whether copy files after import")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
18
    args = parser.parse_args(sys.argv[1:])
Wei Shoulin's avatar
Wei Shoulin committed
19

Wei Shoulin's avatar
c3  
Wei Shoulin committed
20
    import_root_dir = args.infile
Wei Shoulin's avatar
Wei Shoulin committed
21
22
23
    if import_root_dir is None or (not os.path.isfile(import_root_dir) and not os.path.isdir(import_root_dir)):
        parser.print_help()
        sys.exit(0)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
24

Wei Shoulin's avatar
Wei Shoulin committed
25
    db = DBClient()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
26
27
    if os.path.isfile(import_root_dir):
        log.info(f"prepare import {import_root_dir}")
Wei Shoulin's avatar
Wei Shoulin committed
28
        ingest_one(import_root_dir, db, args.copyfiles)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
29
30
31
32
33
34
    if os.path.isdir(import_root_dir):
        for (path, _, file_names) in os.walk(import_root_dir):
            for filename in file_names:
                if filename.find(".fits") > 0:
                    file_full_path = os.path.join(path, filename)
                    log.info(f"prepare import {file_full_path}")
Wei Shoulin's avatar
Wei Shoulin committed
35
36
37
38
39
                    try:
                        ingest_one(file_full_path, db, args.copyfiles)
                    except Exception as e:
                        print(f"{file_full_path} import error!!!")
                        log.error(e)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
40
41
42

    db.close()

Wei Shoulin's avatar
Wei Shoulin committed
43
def ingest_one(file_path, db, copyfiles):
Wei Shoulin's avatar
c3  
Wei Shoulin committed
44
45
46
47
    dest_root_dir = os.getenv("CSST_LOCAL_FILE_ROOT", "/opt/temp/csst")

    hdul = fits.open(file_path)
    header = hdul[0].header
Wei Shoulin's avatar
Wei Shoulin committed
48
    header1 = hdul[1].header
Wei Shoulin's avatar
c3  
Wei Shoulin committed
49
50

    obs_id = header["OBSID"]
Wei Shoulin's avatar
Wei Shoulin committed
51
    exp_start_time = f"{header['DATE-OBS']}"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
52
53
54
    exp_time = header['EXPTIME']
    
    module_id = header["INSTRUME"]
Wei Shoulin's avatar
Wei Shoulin committed
55
    obs_type = header["OBSTYPE"]
Wei Shoulin's avatar
Wei Shoulin committed
56
    object_name = header["OBJECT"]
Wei Shoulin's avatar
Wei Shoulin committed
57
58
    qc0_status = -1
    prc_status = -1
Wei Shoulin's avatar
c3  
Wei Shoulin committed
59
60
61
62
63
64
    time_now = datetime.datetime.now()
    create_time = time_now.strftime('%Y-%m-%d %H:%M:%S')

    facility_status_id = 0
    module_status_id = 0

Wei Shoulin's avatar
Wei Shoulin committed
65
    existed = db.exists("select * from t_observation where obs_id=?", (obs_id,))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
66
67
    if not existed:
        db.execute("insert into t_observation \
Wei Shoulin's avatar
Wei Shoulin committed
68
            (obs_id,obs_time,exp_time,module_id,obs_type,facility_status_id, module_status_id, qc0_status, prc_status,create_time) \
Wei Shoulin's avatar
c3  
Wei Shoulin committed
69
70
            values (?,?,?,?,?,?,?,?,?,?)",
        (obs_id,exp_start_time,exp_time,module_id,obs_type,facility_status_id,module_status_id,qc0_status, prc_status,create_time))
Wei Shoulin's avatar
Wei Shoulin committed
71
        db.end()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
72
    #level0
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
73
    detector = get_header_value("DETNAM", header1, "-")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
74
    filename = header["FILENAME"]
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
75
    version = get_header_value("IMG_VER", header, "-")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
76
77
    
    existed = db.exists(
Wei Shoulin's avatar
Wei Shoulin committed
78
            "select * from ifs_level0_data where filename=?",
Wei Shoulin's avatar
c3  
Wei Shoulin committed
79
80
81
82
83
84
85
86
87
88
89
90
            (filename,)
        )
    if existed:
        log.warning('%s has already been imported' %(file_path, ))
        db.end()
        return    

    detector_status_id = 0

    file_full_path = file_path

    if copyfiles:
Wei Shoulin's avatar
Wei Shoulin committed
91
        file_dir = f"{dest_root_dir}/{module_id}/{obs_type.upper()}/{header['EXPSTART']}/{obs_id}/MS"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
92
93
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)
Wei Shoulin's avatar
Wei Shoulin committed
94
95
96
        file_full_path = f"{file_dir}/{filename}.fits"

    level0_id = f"{obs_id}{detector}"  
Wei Shoulin's avatar
c3  
Wei Shoulin committed
97

Wei Shoulin's avatar
Wei Shoulin committed
98
    c = db.execute("insert into ifs_level0_data \
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
99
100
101
        (level0_id, obs_id, detector_no, obs_type, obs_time, exp_time,detector_status_id, filename, file_path,qc0_status, prc_status,create_time) \
        values (?,?,?,?,?,?,?,?,?,?,?,?)",
        (level0_id, obs_id, detector, obs_type, exp_start_time, exp_time, detector_status_id, filename, file_full_path, qc0_status, prc_status,create_time))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
102
    db.end()
Wei Shoulin's avatar
Wei Shoulin committed
103
    level0_id_id = db.last_row_id()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
104
    #level0-header
Wei Shoulin's avatar
Wei Shoulin committed
105
106
107
108
    ra_obj = header["OBJ_RA"]
    dec_obj = header["OBJ_DEC"]
    db.execute("delete from ifs_level0_header where id=?",(level0_id_id,))    
    db.execute("insert into ifs_level0_header \
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
109
110
111
        (id, ra, `dec`, object_name, version) \
        values (?,?,?,?,?)",
        (level0_id_id, ra_obj, dec_obj, object_name, version))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
112
113
114
115
116
117
118
119
120
121
122
    
    if copyfiles:
        #copy files
        shutil.copyfile(file_path, file_full_path)

    db.end()

    print(f"{file_path} imported")

if __name__ == "__main__":
    ingest()