source: branches/trigger_burst_research/sketch.py@ 18290

Last change on this file since 18290 was 18289, checked in by dneise, 9 years ago
intial commit of a script, which tries to find out if a run was affected by those 27sec trigger bursts
File size: 3.4 KB
Line 
1# coding: utf-8
2from collections import namedtuple
3from sqlalchemy import create_engine
4import pandas as pd
5import numpy as np
6from astropy.io import fits
7import fact
8
9night_int = 20150721
10
11def create_DB_connection():
12 from ConfigParser import SafeConfigParser
13 config = SafeConfigParser()
14 config.optionxform = str # this make the parsing case sensitive
15 config.read('config.ini')
16
17 factdb = create_engine(
18 "mysql+mysqldb://{user}:{pw}@{host}/{db}".format(
19 user=config.get('database', 'user'),
20 pw=config.get('database', 'password'),
21 host=config.get('database', 'host'),
22 db=config.get('database', 'database'),
23 )
24 )
25
26 return factdb
27
28
29def get_data_runs_from_run_db(night_int, factdb):
30 keys = [
31 'fRunID',
32 'fNight',
33 'fRunStart',
34 'fRunStop',
35 ]
36
37 sql_query = """SELECT {comma_sep_keys}
38 FROM RunInfo WHERE fRunTypeKey=1 AND fNight={night:d};
39 """
40 sql_query = sql_query.format(
41 comma_sep_keys=', '.join(keys),
42 night=night_int,
43 )
44
45 data_runs = pd.read_sql_query(
46 sql_query,
47 factdb,
48 parse_dates=['fRunStart', 'fRunStop'],
49 )
50
51 return data_runs
52
53
54def get_trigger_rates(night_int, base_path='other_aux_data/'):
55 fits_file = fits.open(
56 base_path+'{0}.FTM_CONTROL_TRIGGER_RATES.fits'.format(night_int)
57 )
58 trigger_rates = fits_file[1].data
59 return trigger_rates
60
61
62def add_ratio_and_more_to_dataframe(data_runs, trigger_rates):
63
64 # create new columns and pre-assign some hopefully good NULL-like-values
65 data_runs['number_of_measurements'] = 0
66 data_runs['median_of_board_rates'] = np.nan
67 data_runs['std_dev_of_board_rates'] = np.nan
68 data_runs['fBoardTriggerRateRatioAboveThreshold'] = np.nan
69
70 for dataframe_index in data_runs.index:
71 this_run = data_runs.ix[dataframe_index]
72 mask = (
73 (trigger_rates['Time'] > fact.fjd(this_run['fRunStart'])) *
74 (trigger_rates['Time'] < fact.fjd(this_run['fRunStop']))
75 )
76 this_board_rates = trigger_rates['BoardRate'][mask]
77
78 N = this_board_rates.shape[0]
79 data_runs.ix[dataframe_index, 'number_of_measurements'] = N
80
81 left, med, right = np.percentile(
82 this_board_rates,
83 [50-20, 50, 50+20])
84 something_like_width = (right - left)/2.
85 # 40% of the area of the normal distrubution
86 # fall between -0.52*sigma and +0.52*sigma.
87 # The estimation of sigma in a distorted CDF
88 # is less affected near the median. (but of course less accurate as well.)
89 std_dev = something_like_width / 0.52
90
91 median_board_rates = np.median(this_board_rates, axis=1)
92 over = (median_board_rates > med+3*std_dev).sum()
93
94 data_runs.ix[dataframe_index, 'median_of_board_rates'] = med
95 data_runs.ix[dataframe_index, 'std_dev_of_board_rates'] = std_dev
96 data_runs.ix[dataframe_index, 'fBoardTriggerRateRatioAboveThreshold'] = float(over)/N
97
98def main(night_int):
99 factdb = create_DB_connection()
100 data_runs = get_data_runs_from_run_db(night_int, factdb)
101 trigger_rates = get_trigger_rates(night_int)
102 add_ratio_and_more_to_dataframe(data_runs, trigger_rates)
103 return data_runs
104
105if __name__ == '__main__':
106 data_runs = main(night_int)
107 data_runs.to_csv('foo.bar', index=False)
Note: See TracBrowser for help on using the repository browser.