ingest.py 4.79 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
from csst_dfs_commons.utils.fits import get_header_value
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
10
from csst_dfs_commons.models.ifs import Level0Record
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
11

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

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

Wei Shoulin's avatar
c3  
Wei Shoulin committed
21
    import_root_dir = args.infile
Wei Shoulin's avatar
Wei Shoulin committed
22
23
24
    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
25

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

    db.close()

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

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

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

Wei Shoulin's avatar
Wei Shoulin committed
100
    c = db.execute("insert into ifs_level0_data \
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
101
102
103
        (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
104
    db.end()
Wei Shoulin's avatar
Wei Shoulin committed
105
    level0_id_id = db.last_row_id()
Wei Shoulin's avatar
c3  
Wei Shoulin committed
106
    #level0-header
Wei Shoulin's avatar
Wei Shoulin committed
107
108
109
110
    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
111
112
113
        (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
114
115
116
117
118
119
120
    
    if copyfiles:
        #copy files
        shutil.copyfile(file_path, file_full_path)

    db.end()

Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
121
122
123
124
125
126
127
128
129
130
131
132
133
    rec = Level0Record(
        id = level0_id_id,
        level0_id = level0_id,
        obs_id = obs_id,
        detector_no = detector,
        obs_type = obs_type,
        obs_time = exp_start_time,
        exp_time = exp_time,
        detector_status_id = detector_status_id,
        filename = filename,
        file_path = file_full_path
    )

Wei Shoulin's avatar
c3  
Wei Shoulin committed
134
    print(f"{file_path} imported")
Wei Shoulin's avatar
ifs ver    
Wei Shoulin committed
135
    return rec
Wei Shoulin's avatar
c3  
Wei Shoulin committed
136
137
138

if __name__ == "__main__":
    ingest()