def secondary_check(param, value, ipos, dat_dict, mchk): """ check the secondary condition for the violation input: param --- parameter name value --- value of the parameter ipos --- a position in the violation list which will correspond in the secondary list dat_dict--- current data dictionary output violation --- a list of viorations. each item has [related param name, condition] """ # #--- read the secondary condition list for the given parameter # vcondition = pr.showCondition(param) # #--- start reading the list; mainly checking whether other parameters need to be #--- required for this parameter # violation = [] if vcondition != 'NA': for entry in vcondition: if entry[0] == 'NA': continue try: test = dat_dict[entry[0]] except: test = None vcond = entry[1][ipos] if vcond == 'O': #--- no restriction continue elif vcond == 'C': #--- the condition is custom if ocf.null_value(test) or ocf.none_value(test): violation.append([entry[0], 'M']) #--- the parameter must have a value else: continue elif vcond == 'N': #--- the parameter should not have a value if ocf.null_value(test) or ocf.none_value(test): continue else: violation.append([entry[0], 'N']) else: #--- this is mostly 'M' case if mchk == 2: if ocf.null_value(test) or ocf.none_value(test): violation.append([entry[0], 'O']) else: violation.append([entry[0], 'M']) else: if ocf.null_value(test) or ocf.none_value(test): violation.append([entry[0], 'M']) else: violation.append([entry[0], 'O']) return violation
def checkValue(self, param, value): """ for a given parameter and numeric value, return whether the value is in the range this also include 'NULL' value """ vrange = self.showRange( param ) #--- a value or the list of possible values for the parameter v_list = re.split('\,', vrange) mchk = 0 #--- whether the value is in the vrange. if so 1. if 2, skip the secondary test. if vrange == 'MUST': if ocf.null_value(value) != True: mchk = 1 ipos = 0 elif vrange == 'OPEN' or vrange == 'NA': mchk = 1 ipos = 0 if ocf.null_value(value): mchk = 2 elif ocf.null_value(value): #--- value is "NULL" case if ocf.find_pattern('NULL', vrange): mchk = 1 ipos = 0 elif mcf.chkNumeric(value): #--- value is a numeric case for ipos in range(0, len(v_list)): if v_list[ipos] == 'OPEN': mchk = 1 break elif ocf.find_pattern('<>', v_list[ipos]): cond = re.split('<>', v_list[ipos]) vtest = float(value) lower = float(cond[0]) upper = float(cond[1]) if vtest >= lower and vtest <= upper: mchk = 1 break else: #--- value is a word case for ipos in range(0, len(v_list)): if value == v_list[ipos]: mchk = 1 break return [mchk, ipos]
def check_special_cases(dat_dict): """ check the cases which need more than standard condition checkings input: dat_idct --- current data dictionary output: warning --- a list of warnings """ warning = [] # #--- check time constraint changes and order of start and stop time # tval = int(float(dat_dict['time_ordr'])) if tval > 0: wchk = 0 for j in range(0, tval): k = j + 1 [tstart, ostart, nstart] = ocf.convert_back_time_form('tstart', k, dat_dict) [tstop, ostop, nstop] = ocf.convert_back_time_form('tstop', k, dat_dict) try: start = ocf.convert_time_in_axaf_time(nstart) except: start = 0 try: stop = ocf.convert_time_in_axaf_time(nstop) except: stop = 0 if start >= stop: line = 'The observation starting time is later than the observation ' line = line + 'ending time in rank ' + str(k) + ': ' line = line + 'tstart: ' + str(nstart) + ' / tstop: ' + str(nstop) warning.append(line) if (wchk == 0) and (ostart != nstart or ostop != nstop): line = 'Changes in window constraint impact constraints or preferences.' line = line + ' Verify you have indicated CDO approval in the comments.' warning.append(line) wchk = 1 # #--- check pha range # try: val = float(dat_dict['pha_range']) if val > 13: line = 'In many configurations, an Energy Range above 13 keV will risk telemetry saturation.' line = line + ' pha_range: ' + str(val) warning.append(line) except: pass # #--- check energy filter low # try: val = float(dat_dict['eventfilter_lower']) if (val > 0.5) and ocf.null_value(dat_dict['ordr']): line = 'If eventfilter_lower > 0.5, ACIS spatial window parameters must be filled.' warning.append(line) except: pass # #--- check ACIS window constrain: lower_threshold: # try: ordr = float(dat_dict['ordr']) ordr = int(ordr) except: ordr = 0 if ordr >= 1: val2 = dat_dict['eventfilter_lower'] for j in range(0, ordr): k = j + 1 pname = 'lower_threshold' + str(k) try: val1 = float(dat_dict[pname]) except: val1 = None if (ocf.null_value(val2) or ocf.none_value(val2)) and (val1 != None): line = 'ACIS window constraint lower_threshold has a value: ' line = line + 'eventfilter_lower must have a value smaller than lower_threshold.' warning.append(line) else: try: val2 = float(val2) if val1 > val2: line = 'ACIS window constraint lower_threshold must be ' line = line + 'larger than eventfilter_lower: ' + str(val2) warning.append(line) except: pass # #--- montioring and group observations # if dat_dict['monitor_flag'] == 'Y': if dat_dict['group_id'] !='' and dat_dict['group_id'] != 'None': #if dat_dict['group_id']: warning['group_id'] = 'Group_id is set. A monitor_flag must be NULL.' else: try: if ocf.null_value(dat_dict['pre_id']) or ocf.null_value(dat_dict['pre_min_lead']) \ or ocf.null_value(dat_dict['pre_max_lead']): if dat_dict['time_ordr'] == 0: line = 'If this is a montoring observation, ' line = line + ' you need to fill pre_id, pre_min_lead, and pre_max_lead.' warning.append(line) except: pass else: if dat_dict['group_id'] and not (dat_dict['group_id'] in non_list): if ocf.null_value(dat_dict['pre_id']) or ocf.null_value(dat_dict['pre_min_lead']) \ or ocf.null_value(dat_dict['pre_max_lead']): if dat_dict['time_ordr'] == 0: line = 'group_id is set. You need to fill pre_id, pre_min_lead and pre_max_lead.' warning.append(line) try: if dat_dict['pre_id'] and dat_dict['pre_id'] == dat_dict['obsid']: line = 'pre_id cannot be same as obsid: ' + str(db.newValue('obsid')) warning.append(line) except: pass try: val1 = float(dat_dict['pre_min_lead']) val2 = float(dat_dict['pre_max_lead']) except: val1 = val2 = 0 if val1 > val2: line = 'pre_min_lead should be smaller than pre_max_lead: ' + str(db.newValue('pre_max_lead')) warning.append(line) # #--- si mode change # change_list = [] if dat_dict['si_mode'] == 'New Value Requsted': for param in ['est_cnt_rate', 'forder_cnt_rate', 'raster_scan', \ 'grating', 'instrument', 'dither_flag']: oparam = 'org_' + param if dat_dict[oparam] != dat_dict[param]: change_list.append(param) clen = len(change_list) if clen == 1: line = 'SI Mode is reset to "New Value Requsted" because the parameter ' else: line = 'SI Mode is reset to "New Value Requsted" because the parameters ' for pname in change_list: line = line + ' "' + str(pname) + '", ' if clen == 1: line = line + ' is modified.' else: line = line + ' are modified.' warning.append(line) # #--- dither amplitude check. if amplitudes are too small (<0.1), poc could input them in degree. # if dat_dict['dither_flag'] == 'Y': y_amp = float(dat_dict['y_amp_asec']) z_amp = float(dat_dict['z_amp_asec']) y_frq = float(dat_dict['y_freq_asec']) z_frq = float(dat_dict['z_freq_asec']) if y_amp < 0.0001 or z_amp < 0.0001 or y_frq < 0.0001 or z_frq < 0.0001: line = 'Please check Dither Y/Z Amplitude. They must be in arc-sec.' warning.append(line) return warning
def check_param(param, value, dat_dict): """ check the parameter value satisfies the restriction input: param --- parameter name dat_dict --- current data dictionary output: violation/None --- if there is violations, return the condition. otherwise return None """ # #--- check whether this is ordered param #--- if so, remove the digit part from the param # test = str(param) if ocf.chkNumeric(test[-1]): param = test[:-1] # #---read a value or the list of possible values for the parameter # vrange = pr.showRange(param) v_list = re.split('\,', vrange) mchk = 0 # #---- first check the value is in the given vrange # if vrange == 'MUST': if ocf.null_value(value) != True: mchk = 1 ipos = 0 elif vrange == 'OPEN' or vrange == 'NA': mchk = 1 ipos = 0 if ocf.null_value(value): mchk = 2 elif ocf.null_value(value): # #--- for the case the "value" is not assigned # for test in non_list: if ocf.find_pattern(test, vrange): mchk = 2 ipos = 0 break elif ocf.chkNumeric(value): # #--- for the case the value is numeric # for ipos in range(0, len(v_list)): if v_list[ipos] == 'NULL': if ocf.null_value(value) or ocf.none_value(value): mchk = 1 break elif v_list[ipos] == 'OPEN': mchk = 1 break elif ocf.find_pattern('<>', v_list[ipos]): cond = re.split('<>', v_list[ipos]) vtest = float(value) lower = float(cond[0]) upper = float(cond[1]) if vtest >= lower and vtest <=upper: mchk = 1 break else: # #---- for the case the value is a word. "OPEN" is one of choice, accept all data # for ipos in range(0, len(v_list)): if value == v_list[ipos]: mchk = 1 break if v_list[ipos] == 'OPEN': mchk = 1 break if param.lower() == 'dither_flag': mchk = 1 if value == 'Y': ipos = 2 elif value == 'N': ipos = 1 else: ipso = 0 # #--- if the parameter value is in the correct range, check the extra restriction # if mchk > 0 : violation = secondary_check(param, value, ipos, dat_dict, mchk) # #--- return result # if mchk == 0: return vrange elif len(violation) > 0: return violation else: return None