compton_checker.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """There is a set of checkers for handling of correctness of the calibration database"""
  2. import logging
  3. from datetime import datetime
  4. import pandas as pd
  5. import numpy as np
  6. from compton_combiner import SEASONS
  7. from compton_combiner import RunsDBHandler, Combiner
  8. from compton_filter import SlowdbComptonHandler, CalibrdbHandler
  9. def check_season(season, parser):
  10. """Check correctness of the average calibrations.
  11. This function tests that all the points of the season are filled in the calibration database and
  12. this database has not duplicates.
  13. Parameters
  14. ----------
  15. season : str
  16. a season for checking (can be from `compton_combiner.SEASONS` enum)
  17. parser : Configparser
  18. configparser of the toml file with credentials
  19. """
  20. idx = SEASONS['name'].index(season)
  21. start_run, stop_run = SEASONS['start_run'][idx], SEASONS['start_run'][idx + 1]
  22. logging.info(f'Season {season}, runs from {start_run} to {stop_run}')
  23. rdb = RunsDBHandler(**parser['cmdruns'])
  24. rdb_df = rdb.load_tables((start_run, stop_run))
  25. trng = (rdb_df[0][-1][1], rdb_df[0][0][2])
  26. logging.info(f'Runs table has been loaded. \n\
  27. First row is {rdb_df[0][-1][0]} run (at {rdb_df[0][-1][1].strftime("%Y-%m-%d")}), \
  28. last row is {rdb_df[0][0][0]} run (at {rdb_df[0][0][1].strftime("%Y-%m-%d")}). \n\
  29. 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}' )
  30. rdb_df = pd.DataFrame(rdb_df[0], columns=rdb_df[1]).sort_values(by='run')
  31. rdb_df['eprev'] = rdb_df.energy.shift(1).fillna(-1)
  32. rdb_df['enext'] = rdb_df.energy.shift(-1).fillna(-1)
  33. # start_runs_df = rdb_df.drop_duplicates(subset=['energy'], keep='first')
  34. # end_runs_df = rdb_df.drop_duplicates(subset=['energy'], keep='last')
  35. good_mask = np.invert(np.isclose(rdb_df['energy'], rdb_df['eprev']) & np.isclose(rdb_df['energy'], rdb_df['enext']))
  36. rdb_df = rdb_df.loc[good_mask].drop(['eprev', 'enext'], axis=1)
  37. rdb_df = pd.concat([rdb_df.iloc[::2].reset_index(drop=True).rename({'run': 'firstrun'}, axis=1)[['energy', 'firstrun']],
  38. rdb_df.iloc[1::2].reset_index(drop=True).rename({'run': 'lastrun'}, axis=1)[['lastrun']]], axis=1).assign(goods=1)
  39. clbrdb = CalibrdbHandler(**parser['clbrDB'])
  40. # trng = (rdb_df.starttime.min(), rdb_df.stoptime.max())
  41. logging.info(f'Time range from {trng[0]} to {trng[1]}')
  42. # print(trng)
  43. res_clbrdb = clbrdb.load_table('Misc', 'RunHeader', 'Compton_run_avg', num_last_rows = None, timerange = trng)
  44. clbr_df = pd.DataFrame(res_clbrdb[0], columns=res_clbrdb[1]).drop(['cid', 'sid', 'createdby', 'parameters'], axis=1).sort_values(by='time')
  45. clbr_df = clbr_df.apply(
  46. lambda x: pd.Series([x['comment'], x['time'], x['data'][0], x['data'][1], x['data'][2], round(x['data'][3], 3)],
  47. index=['pname', 'time', 'energy', 'firstrun', 'lastrun', 'emeas']),
  48. axis=1).reset_index(drop=True)
  49. concat_df = pd.merge(clbr_df, rdb_df, on=['firstrun', 'lastrun'], how='outer')
  50. concat_df.loc[concat_df.isna().max(axis=1), 'goods'] = 0
  51. concat_df.goods = concat_df.goods.astype(int)
  52. nbads = sum(concat_df.goods==0)
  53. if nbads > 0:
  54. logging.warning(f'{sum(concat_df.goods==0)} bad rows are found')
  55. else:
  56. logging.info(f'bad rows are not found')
  57. return concat_df
  58. if __name__=="__main__":
  59. import argparse
  60. import sys
  61. from configparser import ConfigParser
  62. log_format = '[%(asctime)s] %(levelname)s: %(message)s'
  63. logging.basicConfig(stream=sys.stdout, format=log_format, level=logging.INFO) #"filename=compton_combiner.log"
  64. logging.info("compton_checker is started")
  65. parser = argparse.ArgumentParser(description = 'Checker of the energy measurement calibrations')
  66. parser.add_argument('-s', '--season', help = 'Name of the season')
  67. parser.add_argument('-c', '--config', help = 'Config file containing information for access to databases')
  68. args = parser.parse_args()
  69. logging.info(f"""Arguments: season {args.season}, config {args.config}""")
  70. parser = ConfigParser()
  71. parser.read(args.config);
  72. res_df = check_season(args.season, parser)
  73. with pd.option_context('display.max_rows', None,):
  74. print(res_df)