ingest.py 3.82 KB
Newer Older
Wei Shoulin's avatar
c3  
Wei Shoulin committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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():
    db = DBClient()
    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="copy files after import")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    args = parser.parse_args(sys.argv[1:])
    
    import_root_dir = args.infile

    if os.path.isfile(import_root_dir):
        log.info(f"prepare import {import_root_dir}")
        ingesst_one(import_root_dir, db, args.copyfiles)
    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}")
                    ingesst_one(file_full_path, db, args.copyfiles)

    db.close()

def ingesst_one(file_path, db, copyfiles):
    dest_root_dir = os.getenv("CSST_LOCAL_FILE_ROOT", "/opt/temp/csst")

    hdul = fits.open(file_path)
    header = hdul[0].header

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

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

    c = db.execute("insert into t_level0_data \
Wei Shoulin's avatar
Wei Shoulin committed
86
87
88
        (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
89
    db.end()
Wei Shoulin's avatar
Wei Shoulin committed
90
    level0_id_id = db.last_row_id()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
91
92
93
    #level0-header
    ra_obj = header["RA_OBJ"]
    dec_obj = header["DEC_OBJ"]
Wei Shoulin's avatar
Wei Shoulin committed
94
    db.execute("delete from t_level0_header where id=?",(level0_id_id,))    
Wei Shoulin's avatar
Wei Shoulin committed
95
    db.execute("insert into t_level0_header \
Wei Shoulin's avatar
c3  
Wei Shoulin committed
96
97
        (id, obs_time, exp_time, ra, `dec`, create_time) \
        values (?,?,?,?,?,?)",
Wei Shoulin's avatar
Wei Shoulin committed
98
        (level0_id_id, exp_start_time, exp_time, ra_obj, dec_obj, create_time))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
99
100
101
102
103
104
105
106
107
108
109
    
    if copyfiles:
        #copy files
        shutil.copyfile(file_path, file_full_path)

    db.end()

    print(f"{file_path} imported")

if __name__ == "__main__":
    ingest()