ingest.py 4.23 KB
Newer Older
Wei Shoulin's avatar
c3  
Wei Shoulin committed
1
2
3
4
5
6
7
8
9
10
11
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
log = logging.getLogger('csst-dfs-api-local')

def ingest():
Wei Shoulin's avatar
Wei Shoulin committed
12
    
Wei Shoulin's avatar
c3  
Wei Shoulin committed
13
14
    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
15
    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
16
    args = parser.parse_args(sys.argv[1:])
Wei Shoulin's avatar
Wei Shoulin committed
17

Wei Shoulin's avatar
c3  
Wei Shoulin committed
18
    import_root_dir = args.infile
Wei Shoulin's avatar
Wei Shoulin committed
19
20
21
    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
22

Wei Shoulin's avatar
Wei Shoulin committed
23
    db = DBClient()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
24
25
    if os.path.isfile(import_root_dir):
        log.info(f"prepare import {import_root_dir}")
Wei Shoulin's avatar
Wei Shoulin committed
26
        ingest_one(import_root_dir, db, args.copyfiles)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
27
28
29
30
31
32
    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
33
34
35
36
37
                    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
38
39
40

    db.close()

Wei Shoulin's avatar
Wei Shoulin committed
41
def ingest_one(file_path, db, copyfiles):
Wei Shoulin's avatar
c3  
Wei Shoulin committed
42
43
44
45
    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
46
    header1 = hdul[1].header
Wei Shoulin's avatar
c3  
Wei Shoulin committed
47
48

    obs_id = header["OBSID"]
Wei Shoulin's avatar
Wei Shoulin committed
49
    exp_start_time = f"{header['DATE-OBS']}"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
50
51
52
    exp_time = header['EXPTIME']
    
    module_id = header["INSTRUME"]
Wei Shoulin's avatar
Wei Shoulin committed
53
    obs_type = header["OBSTYPE"]
Wei Shoulin's avatar
Wei Shoulin committed
54
    object_name = header["OBJECT"]
Wei Shoulin's avatar
Wei Shoulin committed
55
56
    qc0_status = -1
    prc_status = -1
Wei Shoulin's avatar
c3  
Wei Shoulin committed
57
58
59
60
61
62
    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
63
    existed = db.exists("select * from t_observation where obs_id=?", (obs_id,))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
64
65
    if not existed:
        db.execute("insert into t_observation \
Wei Shoulin's avatar
Wei Shoulin committed
66
            (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
67
68
            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
69
        db.end()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
70
    #level0
Wei Shoulin's avatar
Wei Shoulin committed
71
    detector = header1["DETNAM"]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
72
73
74
    filename = header["FILENAME"]
    
    existed = db.exists(
Wei Shoulin's avatar
Wei Shoulin committed
75
            "select * from ifs_level0_data where filename=?",
Wei Shoulin's avatar
c3  
Wei Shoulin committed
76
77
78
79
80
81
82
83
84
85
86
87
            (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
88
        file_dir = f"{dest_root_dir}/{module_id}/{obs_type.upper()}/{header['EXPSTART']}/{obs_id}/MS"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
89
90
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)
Wei Shoulin's avatar
Wei Shoulin committed
91
92
93
        file_full_path = f"{file_dir}/{filename}.fits"

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

Wei Shoulin's avatar
Wei Shoulin committed
95
    c = db.execute("insert into ifs_level0_data \
Wei Shoulin's avatar
Wei Shoulin committed
96
97
98
        (level0_id, obs_id, detector_no, object_name, obs_type, obs_time, exp_time,detector_status_id, filename, file_path,qc0_status, prc_status,create_time) \
        values (?,?,?,?,?,?,?,?,?,?,?,?,?)",
        (level0_id, obs_id, detector, object_name, 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
99
    db.end()
Wei Shoulin's avatar
Wei Shoulin committed
100
    level0_id_id = db.last_row_id()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
101
    #level0-header
Wei Shoulin's avatar
Wei Shoulin committed
102
103
104
105
    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
c3  
Wei Shoulin committed
106
107
        (id, obs_time, exp_time, ra, `dec`, create_time) \
        values (?,?,?,?,?,?)",
Wei Shoulin's avatar
Wei Shoulin committed
108
        (level0_id_id, exp_start_time, exp_time, ra_obj, dec_obj, create_time))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
109
110
111
112
113
114
115
116
117
118
119
    
    if copyfiles:
        #copy files
        shutil.copyfile(file_path, file_full_path)

    db.end()

    print(f"{file_path} imported")

if __name__ == "__main__":
    ingest()