processing_data_prisma.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. # import datetime
  2. from collections import defaultdict
  3. import pandas as pd
  4. class ProccessingPrismaCl:
  5. def __init__(self, start_date, end_date):
  6. self.start_date = start_date
  7. self.end_date = end_date
  8. def day_proccessing(self, n_file, p_file):
  9. """Функция, в которую помещается полная дневная обработка"""
  10. worktime_dict = defaultdict(list)
  11. n_vs_zero_tr_dict = defaultdict(list)
  12. event_counter_fr_4 = defaultdict(list)
  13. breaks_dict = defaultdict(list)
  14. count_rate_amp_5_fr_2 = defaultdict(list)
  15. count_rate_amp_10_fr_1 = defaultdict(list)
  16. amp_5_fr_2_frame = pd.DataFrame(columns=[f'amp{i}' for i in range(1, 17)])
  17. amp_10_fr_1_frame = pd.DataFrame(columns=[f'amp{i}' for i in range(1, 17)])
  18. for single_date in pd.date_range(self.start_date, self.end_date):
  19. worktime_dict['Date'].append(single_date)
  20. n_vs_zero_tr_dict['Date'].append(single_date)
  21. count_rate_amp_5_fr_2['Date'].append(single_date)
  22. count_rate_amp_10_fr_1['Date'].append(single_date)
  23. event_counter_fr_4['Date'].append(single_date)
  24. if type(p_file) != str:
  25. worktime_dict['Worktime'].append(round(len(p_file.index) * 5 / 60, 2))
  26. break_time_dict = self.counting_break_time(p_file)
  27. if break_time_dict:
  28. breaks_dict['Date'].append(single_date)
  29. breaks_dict['StartMinutes'].extend(break_time_dict['StartMinutes'])
  30. breaks_dict['EndMinutes'].extend(break_time_dict['EndMinutes'])
  31. else:
  32. worktime_dict['Worktime'].append(0.00)
  33. if type(n_file) != str:
  34. neutron_to_zero_trigger = self.neutron_to_zero_trigger(n_file['Date'])
  35. for i in range(16):
  36. n_vs_zero_tr_dict[f'n{i + 1}'].append(neutron_to_zero_trigger[i])
  37. count_rate_amp_5_fr_2[f'amp{i + 1}'].append(
  38. self.set_event_counter(n_file, a_crit=6, freq=2)['count_rate'][i + 1])
  39. count_rate_amp_10_fr_1[f'amp{i + 1}'].append(
  40. self.set_event_counter(n_file, a_crit=11, freq=1)['count_rate'][i + 1])
  41. event_counter_fr_4['Events'].append(self.set_event_counter(n_file, a_crit=6, freq=4)['sum_events'])
  42. set_event_counter_frame_1 = self.set_event_counter(n_file, a_crit=6, freq=2)['DataFrame']
  43. set_event_counter_frame_2 = self.set_event_counter(n_file, a_crit=11, freq=1)['DataFrame']
  44. amp_5_fr_2_frame = pd.concat(
  45. [amp_5_fr_2_frame, set_event_counter_frame_1],
  46. ignore_index=True)
  47. amp_10_fr_1_frame = pd.concat(
  48. [amp_10_fr_1_frame, set_event_counter_frame_2],
  49. ignore_index=True)
  50. else:
  51. for i in range(16):
  52. n_vs_zero_tr_dict[f'n{i + 1}'].append(0.00)
  53. count_rate_amp_5_fr_2[f'amp{i + 1}'].append(0.00)
  54. count_rate_amp_10_fr_1[f'amp{i + 1}'].append(0.00)
  55. event_counter_fr_4['Events'].append(0.00)
  56. worktime_frame = pd.DataFrame(worktime_dict)
  57. n_vs_zero_tr_frame = pd.DataFrame(n_vs_zero_tr_dict)
  58. breaks_frame = pd.DataFrame(breaks_dict)
  59. event_counter_fr_4 = pd.DataFrame(event_counter_fr_4)
  60. count_rate_amp_5_fr_2 = pd.DataFrame(count_rate_amp_5_fr_2)
  61. count_rate_amp_10_fr_1 = pd.DataFrame(count_rate_amp_10_fr_1)
  62. for column in [f'amp{i}' for i in range(1,17)]:
  63. count_rate_amp_5_fr_2[column] = count_rate_amp_5_fr_2[column]/worktime_frame['Worktime']
  64. count_rate_amp_10_fr_1[column] = count_rate_amp_10_fr_1[column]/worktime_frame['Worktime']
  65. return worktime_frame, breaks_frame, n_vs_zero_tr_frame, event_counter_fr_4, amp_5_fr_2_frame, amp_10_fr_1_frame, count_rate_amp_5_fr_2, count_rate_amp_10_fr_1
  66. @staticmethod
  67. def counting_break_time(p_file):
  68. """Метод, выявляющий в p-file 5-минутки, когда кластер не работал, возвращает начальное время остановки и
  69. конечное время остановки"""
  70. index = p_file['time'].tolist()
  71. daily_breaks_dict = defaultdict(list)
  72. if max(index) < 287:
  73. start_minutes = max(index) * 5
  74. end_minutes = 1435
  75. daily_breaks_dict['StartMinutes'].append(start_minutes)
  76. daily_breaks_dict['EndMinutes'].append(end_minutes)
  77. if min(index) != 0:
  78. start_minutes = 0
  79. end_minutes = min(index) * 5
  80. daily_breaks_dict['StartMinutes'].append(start_minutes)
  81. daily_breaks_dict['EndMinutes'].append(end_minutes)
  82. for i in range(1, len(index)):
  83. if index[i] - index[i - 1] > 1:
  84. start_minutes = index[i - 1] * 5
  85. end_minutes = index[i] * 5
  86. daily_breaks_dict['StartMinutes'].append(start_minutes)
  87. daily_breaks_dict['EndMinutes'].append(end_minutes)
  88. if daily_breaks_dict:
  89. return daily_breaks_dict
  90. else:
  91. return None
  92. @staticmethod
  93. def neutron_to_zero_trigger(n_file):
  94. """Метод, обрабатывающий данные n-файлов ПРИЗМА-32, дающий на выходе нормированное число в событии,
  95. отобранных как нейтрон, при самозапуске"""
  96. counter_zero_tr = len(n_file[n_file['tr'] == 0].index)
  97. zero_tr_frame = n_file[n_file['tr'] == 0]
  98. return [round(zero_tr_frame[f'n{i}'].sum() / counter_zero_tr, 3) for i in range(1, 17)]
  99. # except ZeroDivisionError: Нужно дописать, если допустим нет нулевых триггеров
  100. @staticmethod
  101. def set_event_counter(n_file, a_crit, freq):
  102. """Метод, обрабатывающий данные n-файлов ПРИЗМА-32, на вход подаются определенная амплитуда и количество
  103. детекторов, на которых амплитуда превышает заданную, на выходе метод возвращает словарь с параметрами:
  104. 1) суммарное число событий на кластере, подходящих под заданные условия;
  105. 2) датафрейм с амплитудами детекторов для каждого события, подходящего под заданные условия;
  106. 3) количество превышений заданной амплитуды у детектора в событиях, подходящих под заданные условия; """
  107. cluster_count_rate = {}
  108. amp_frame = n_file[[f'amp{i}' for i in range(1, 17)]]
  109. amp_frame['fr_sum'] = amp_frame.isin(range(a_crit, 520)).sum(axis=1, skipna=True) # noqa
  110. amp_frame = amp_frame[amp_frame['fr_sum'] >= freq].reset_index(drop=True)
  111. for i in range(1, 17):
  112. cluster_count_rate[i] = len(amp_frame[amp_frame[f'amp{i}'] >= a_crit])
  113. return {'sum_events': len(amp_frame.index),
  114. 'DataFrame': amp_frame[[f'amp{i}' for i in range(1, 17)]],
  115. 'count_rate': cluster_count_rate}