level0.py 9.23 KB
Newer Older
Wei Shoulin's avatar
c3  
Wei Shoulin committed
1
2
3
4
5
6
7
8
import os
import logging
import time, datetime
import shutil

from ..common.db import DBClient
from ..common.utils import *
from csst_dfs_commons.models import Result
Wei Shoulin's avatar
Wei Shoulin committed
9
from csst_dfs_commons.models.msc import Level0Record
Wei Shoulin's avatar
c3  
Wei Shoulin committed
10
11
12
13
14
from csst_dfs_commons.models.common import from_dict_list

log = logging.getLogger('csst')

class Level0DataApi(object):
Wei Shoulin's avatar
Wei Shoulin committed
15
16
    def __init__(self, sub_system = "msc"):
        self.sub_system = sub_system
Wei Shoulin's avatar
c3  
Wei Shoulin committed
17
18
19
20
21
22
23
        self.root_dir = os.getenv("CSST_LOCAL_FILE_ROOT", "/opt/temp/csst")
        self.db = DBClient()

    def find(self, **kwargs):
        ''' retrieve level0 records from database

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
24
            obs_id: [str]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
25
26
27
28
29
            detector_no: [str]
            obs_type: [str]
            obs_time : (start, end),
            qc0_status : [int],
            prc_status : [int],
Wei Shoulin's avatar
Wei Shoulin committed
30
            file_name: [str],
31
32
33
            ra_obj: [float],
            dec_obj: [float],
            radius: [float],
Wei Shoulin's avatar
Wei Shoulin committed
34
            limit: limits returns the number of records,default 0:no-limit
35
            
Wei Shoulin's avatar
c3  
Wei Shoulin committed
36
37
38
39
40
41
42
43
44
45
46
47
        return: csst_dfs_common.models.Result
        '''
        try:
            obs_id = get_parameter(kwargs, "obs_id")
            detector_no = get_parameter(kwargs, "detector_no")
            obs_type = get_parameter(kwargs, "obs_type")
            exp_time_start = get_parameter(kwargs, "obs_time", [None, None])[0]
            exp_time_end = get_parameter(kwargs, "obs_time", [None, None])[1]
            qc0_status = get_parameter(kwargs, "qc0_status")
            prc_status = get_parameter(kwargs, "prc_status")
            file_name = get_parameter(kwargs, "file_name")
            limit = get_parameter(kwargs, "limit", 0)
48
49
50
51
52
53
            ra_obj = get_parameter(kwargs, "ra_obj", None)
            dec_obj = get_parameter(kwargs, "dec_obj", None)
            radius = get_parameter(kwargs, "radius", 0)
            
            sql_count = "select count(*) as c from msc_level0_data d left join msc_level0_header h on d.id=h.id where 1=1"
            sql_data = f"select * from msc_level0_data d left join msc_level0_header h on d.id=h.id where 1=1"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
54
55

            sql_condition = "" 
Wei Shoulin's avatar
Wei Shoulin committed
56
            if obs_id:
57
                sql_condition = f"{sql_condition} and d.obs_id='{obs_id}'"              
Wei Shoulin's avatar
c3  
Wei Shoulin committed
58
            if detector_no:
59
                sql_condition = f"{sql_condition} and d.detector_no='{detector_no}'"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
60
            if obs_type:
61
                sql_condition = f"{sql_condition} and d.obs_type='{obs_type}'"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
62
            if exp_time_start:
63
                sql_condition = f"{sql_condition} and d.obs_time >='{exp_time_start}'"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
64
            if exp_time_end:
65
                sql_condition = f"{sql_condition} and d.obs_time <='{exp_time_end}'"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
66
            if qc0_status:
67
                sql_condition = f"{sql_condition} and d.qc0_status={qc0_status}"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
68
            if prc_status:
69
70
                sql_condition = f"{sql_condition} and d.prc_status={prc_status}"
            if ra_obj:
Wei Shoulin's avatar
Wei Shoulin committed
71
                sql_condition = f"{sql_condition} and (h.ra_obj <={ra_obj + 2*radius} and h.ra_obj >={ra_obj - 2*radius}"
72
            if dec_obj:
Wei Shoulin's avatar
Wei Shoulin committed
73
                sql_condition = f"{sql_condition} and (h.dec_obj <={dec_obj+2*radius} and h.dec_obj >={dec_obj- 2*radius}"
74

Wei Shoulin's avatar
c3  
Wei Shoulin committed
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
            if file_name:
                sql_condition = f" and filename='{file_name}'"  

            sql_count = f"{sql_count} {sql_condition}"
            sql_data = f"{sql_data} {sql_condition}"

            if limit > 0:
                sql_data = f"{sql_data} limit {limit}"   

            totalCount = self.db.select_one(sql_count)
            _, records = self.db.select_many(sql_data)

            return Result.ok_data(data=from_dict_list(Level0Record, records)).append("totalCount", totalCount['c'])

        except Exception as e:
            return Result.error(message=str(e))

    def get(self, **kwargs):
        '''  fetch a record from database

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
96
97
            id : [int],
            level0_id : [str]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
98
99
100

        return csst_dfs_common.models.Result
        '''
Wei Shoulin's avatar
Wei Shoulin committed
101
102
103
104
105
106
107
108
109
110
111
112
        id = get_parameter(kwargs, "id", 0)
        level0_id = get_parameter(kwargs, "level0_id", "")

        if id == 0 and level0_id == "":
            return Result.error(message="at least define id or level0_id") 

        if id != 0: 
            return self.get_by_id(id)
        if level0_id != "": 
            return self.get_by_level0_id(level0_id)

    def get_by_id(self, id: int):
Wei Shoulin's avatar
c3  
Wei Shoulin committed
113
114
        try:
            r = self.db.select_one(
Wei Shoulin's avatar
Wei Shoulin committed
115
                "select * from msc_level0_data where id=?", (id,))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
116
            if r:
Wei Shoulin's avatar
Wei Shoulin committed
117
118
119
                data = Level0Record().from_dict(r)
                data.header = self.db.select_one("select * from msc_level0_header where id=?", (id,))
                return Result.ok_data(data = data)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
120
            else:
Wei Shoulin's avatar
Wei Shoulin committed
121
                return Result.error(message=f"id:{id} not found")
Wei Shoulin's avatar
c3  
Wei Shoulin committed
122
123
        except Exception as e:
            log.error(e)
Wei Shoulin's avatar
Wei Shoulin committed
124
125
126
127
128
            return Result.error(message=str(e))  

    def get_by_level0_id(self, level0_id: str):
        try:
            r = self.db.select_one(
Wei Shoulin's avatar
Wei Shoulin committed
129
                "select * from msc_level0_data where level0_id=?", (level0_id,))
Wei Shoulin's avatar
Wei Shoulin committed
130
            if r:
Wei Shoulin's avatar
Wei Shoulin committed
131
132
133
                data = Level0Record().from_dict(r)
                data.header = self.db.select_one("select * from msc_level0_header where id=?", (data.id,))                
                return Result.ok_data(data = data)
Wei Shoulin's avatar
Wei Shoulin committed
134
135
136
137
138
            else:
                return Result.error(message=f"level0_id:{level0_id} not found")  
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))  
Wei Shoulin's avatar
c3  
Wei Shoulin committed
139
140
141
142
143

    def update_proc_status(self, **kwargs):
        ''' update the status of reduction

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
144
145
            id : [int],
            level0_id : [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
146
147
148
149
            status : [int]

        return csst_dfs_common.models.Result
        '''
Wei Shoulin's avatar
Wei Shoulin committed
150
151
152
153
154
155
156
157
        id = get_parameter(kwargs, "id")
        level0_id = get_parameter(kwargs, "level0_id")
        result = self.get(id = id, level0_id = level0_id)

        if not result.success:
            return Result.error(message="not found")

        id = result.data.id
Wei Shoulin's avatar
c3  
Wei Shoulin committed
158
159
160
        status = get_parameter(kwargs, "status")
        try:
            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
161
                'update msc_level0_data set prc_status=?, prc_time=? where id=?',
Wei Shoulin's avatar
Wei Shoulin committed
162
                (status, format_time_ms(time.time()), id)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
163
164
165
166
167
168
169
170
171
172
173
174
            )  
            self.db.end() 
            return Result.ok_data()
           
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))

    def update_qc0_status(self, **kwargs):
        ''' update the status of QC0
        
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
175
176
            id : [int],
            level0_id : [str],
Wei Shoulin's avatar
c3  
Wei Shoulin committed
177
178
            status : [int]
        '''        
Wei Shoulin's avatar
Wei Shoulin committed
179
180
181
182
183
184
185
186
        id = get_parameter(kwargs, "id")
        level0_id = get_parameter(kwargs, "level0_id")
        result = self.get(id = id, level0_id = level0_id)

        if not result.success:
            return Result.error(message="not found")

        id = result.data.id
Wei Shoulin's avatar
c3  
Wei Shoulin committed
187
188
189
        status = get_parameter(kwargs, "status")
        try:
            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
190
                'update msc_level0_data set qc0_status=?, qc0_time=? where id=?',
Wei Shoulin's avatar
Wei Shoulin committed
191
                (status, format_time_ms(time.time()), id)
Wei Shoulin's avatar
c3  
Wei Shoulin committed
192
193
194
195
196
197
198
199
200
201
202
203
            )  
            self.db.end() 
            return Result.ok_data()
           
        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))

    def write(self, **kwargs):
        ''' insert a level0 data record into database
 
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
204
            obs_id = [str]
Wei Shoulin's avatar
c3  
Wei Shoulin committed
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
            detector_no = [str]
            obs_type = [str]        
            obs_time = [str]
            exp_time = [int]
            detector_status_id = [int]
            filename = [str]
            file_path = [str]
        return: csst_dfs_common.models.Result
        '''          
        rec = Level0Record(
            obs_id = get_parameter(kwargs, "obs_id"),
            detector_no = get_parameter(kwargs, "detector_no"),
            obs_type = get_parameter(kwargs, "obs_type"),
            obs_time = get_parameter(kwargs, "obs_time"),
            exp_time = get_parameter(kwargs, "exp_time"),
            detector_status_id = get_parameter(kwargs, "detector_status_id"),
            filename = get_parameter(kwargs, "filename"),
            file_path = get_parameter(kwargs, "file_path")
        )
Wei Shoulin's avatar
Wei Shoulin committed
224
        rec.level0_id = f"{rec.obs_id}{rec.detector_no}"
Wei Shoulin's avatar
c3  
Wei Shoulin committed
225
226
        try:
            existed = self.db.exists(
Wei Shoulin's avatar
Wei Shoulin committed
227
                    "select * from msc_level0_data where filename=?",
Wei Shoulin's avatar
c3  
Wei Shoulin committed
228
229
230
231
232
233
234
                    (rec.filename,)
                )
            if existed:
                log.warning('%s existed' %(rec.filename, ))
                return Result.error(message ='%s existed' %(rec.filename, ))

            self.db.execute(
Wei Shoulin's avatar
Wei Shoulin committed
235
                'INSERT INTO msc_level0_data (level0_id, obs_id, detector_no, obs_type, obs_time, exp_time,detector_status_id, filename, file_path,qc0_status, prc_status,create_time) \
Wei Shoulin's avatar
Wei Shoulin committed
236
237
                    VALUES(?,?,?,?,?,?,?,?,?,?,?,?)',
                (rec.level0_id, rec.obs_id, rec.detector_no, rec.obs_type, rec.obs_time, rec.exp_time, rec.detector_status_id, rec.filename, rec.file_path,-1,-1,format_time_ms(time.time()))
Wei Shoulin's avatar
c3  
Wei Shoulin committed
238
239
240
241
242
243
244
245
246
247
248
            )
            self.db.end()
            rec.id = self.db.last_row_id()

            return Result.ok_data(data=rec)

        except Exception as e:
            log.error(e)
            return Result.error(message=str(e))