|
@@ -0,0 +1,95 @@
|
|
|
+"""There is a set of checkers for handling of correctness of the calibration database"""
|
|
|
+
|
|
|
+import logging
|
|
|
+from datetime import datetime
|
|
|
+import pandas as pd
|
|
|
+import numpy as np
|
|
|
+from compton_combiner import SEASONS
|
|
|
+from compton_combiner import RunsDBHandler, Combiner
|
|
|
+from compton_filter import SlowdbComptonHandler, CalibrdbHandler
|
|
|
+
|
|
|
+def check_season(season, parser):
|
|
|
+ """Check correctness of the average calibrations.
|
|
|
+ This function tests that all the points of the season are filled in the calibration database and
|
|
|
+ this database has not duplicates.
|
|
|
+
|
|
|
+ Parameters
|
|
|
+ ----------
|
|
|
+ season : str
|
|
|
+ a season for checking (can be from `compton_combiner.SEASONS` enum)
|
|
|
+ parser : Configparser
|
|
|
+ configparser of the toml file with credentials
|
|
|
+ """
|
|
|
+
|
|
|
+ idx = SEASONS['name'].index(season)
|
|
|
+ start_run, stop_run = SEASONS['start_run'][idx], SEASONS['start_run'][idx + 1]
|
|
|
+ logging.info(f'Season {season}, runs from {start_run} to {stop_run}')
|
|
|
+
|
|
|
+ rdb = RunsDBHandler(**parser['cmdruns'])
|
|
|
+ rdb_df = rdb.load_tables((start_run, stop_run))
|
|
|
+ trng = (rdb_df[0][-1][1], rdb_df[0][0][2])
|
|
|
+ logging.info(f'Runs table has been loaded. \n\
|
|
|
+First row is {rdb_df[0][-1][0]} run (at {rdb_df[0][-1][1].strftime("%Y-%m-%d")}), \
|
|
|
+last row is {rdb_df[0][0][0]} run (at {rdb_df[0][0][1].strftime("%Y-%m-%d")}). \n\
|
|
|
+Total rows {len(rdb_df[0])}, unique energies {sum(map(lambda x: x[0][3]!=x[1][3], zip(rdb_df[0][1:], rdb_df[0][:-1]))) + 1}' )
|
|
|
+
|
|
|
+ rdb_df = pd.DataFrame(rdb_df[0], columns=rdb_df[1]).sort_values(by='run')
|
|
|
+ rdb_df['eprev'] = rdb_df.energy.shift(1).fillna(-1)
|
|
|
+ rdb_df['enext'] = rdb_df.energy.shift(-1).fillna(-1)
|
|
|
+
|
|
|
+ # start_runs_df = rdb_df.drop_duplicates(subset=['energy'], keep='first')
|
|
|
+ # end_runs_df = rdb_df.drop_duplicates(subset=['energy'], keep='last')
|
|
|
+
|
|
|
+ good_mask = np.invert(np.isclose(rdb_df['energy'], rdb_df['eprev']) & np.isclose(rdb_df['energy'], rdb_df['enext']))
|
|
|
+ rdb_df = rdb_df.loc[good_mask].drop(['eprev', 'enext'], axis=1)
|
|
|
+ rdb_df = pd.concat([rdb_df.iloc[::2].reset_index(drop=True).rename({'run': 'firstrun'}, axis=1)[['energy', 'firstrun']],
|
|
|
+ rdb_df.iloc[1::2].reset_index(drop=True).rename({'run': 'lastrun'}, axis=1)[['lastrun']]], axis=1).assign(goods=1)
|
|
|
+
|
|
|
+ clbrdb = CalibrdbHandler(**parser['clbrDB'])
|
|
|
+ # trng = (rdb_df.starttime.min(), rdb_df.stoptime.max())
|
|
|
+ logging.info(f'Time range from {trng[0]} to {trng[1]}')
|
|
|
+ # print(trng)
|
|
|
+ res_clbrdb = clbrdb.load_table('Misc', 'RunHeader', 'Compton_run_avg', num_last_rows = None, timerange = trng)
|
|
|
+ clbr_df = pd.DataFrame(res_clbrdb[0], columns=res_clbrdb[1]).drop(['cid', 'sid', 'createdby', 'parameters'], axis=1).sort_values(by='time')
|
|
|
+ clbr_df = clbr_df.apply(
|
|
|
+ lambda x: pd.Series([x['comment'], x['time'], x['data'][0], x['data'][1], x['data'][2], round(x['data'][3], 3)],
|
|
|
+ index=['pname', 'time', 'energy', 'firstrun', 'lastrun', 'emeas']),
|
|
|
+ axis=1).reset_index(drop=True)
|
|
|
+
|
|
|
+ concat_df = pd.merge(clbr_df, rdb_df, on=['firstrun', 'lastrun'], how='outer')
|
|
|
+ concat_df.loc[concat_df.isna().max(axis=1), 'goods'] = 0
|
|
|
+ concat_df.goods = concat_df.goods.astype(int)
|
|
|
+
|
|
|
+ nbads = sum(concat_df.goods==0)
|
|
|
+ if nbads > 0:
|
|
|
+ logging.warning(f'{sum(concat_df.goods==0)} bad rows are found')
|
|
|
+ else:
|
|
|
+ logging.info(f'bad rows are not found')
|
|
|
+
|
|
|
+
|
|
|
+ return concat_df
|
|
|
+
|
|
|
+if __name__=="__main__":
|
|
|
+ import argparse
|
|
|
+ import sys
|
|
|
+ from configparser import ConfigParser
|
|
|
+
|
|
|
+ log_format = '[%(asctime)s] %(levelname)s: %(message)s'
|
|
|
+ logging.basicConfig(stream=sys.stdout, format=log_format, level=logging.INFO) #"filename=compton_combiner.log"
|
|
|
+ logging.info("compton_checker is started")
|
|
|
+
|
|
|
+ parser = argparse.ArgumentParser(description = 'Checker of the energy measurement calibrations')
|
|
|
+ parser.add_argument('-s', '--season', help = 'Name of the season')
|
|
|
+ parser.add_argument('-c', '--config', help = 'Config file containing information for access to databases')
|
|
|
+
|
|
|
+ args = parser.parse_args()
|
|
|
+ logging.info(f"""Arguments: season {args.season}, config {args.config}""")
|
|
|
+
|
|
|
+ parser = ConfigParser()
|
|
|
+ parser.read(args.config);
|
|
|
+
|
|
|
+ res_df = check_season(args.season, parser)
|
|
|
+
|
|
|
+ with pd.option_context('display.max_rows', None,):
|
|
|
+ print(res_df)
|
|
|
+
|