1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- """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)
-
|