merge_dinods_algorithm.py 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import pymongo
  2. import datetime
  3. from config_info.config import *
  4. from preparing_to_merge import prepare_to_merge_12d, prepare_to_merge_7d
  5. db_client = pymongo.MongoClient(DB_URL)
  6. prisma_db = db_client["prisma-32_db"]
  7. def merge_dinods(data_din_12, data_din_7):
  8. """Процесс сшивки событий 12-го динода с событиями 7-го динода, лежащими внутри временных ворот.
  9. Временные ворота - 90 мс <<90e6>>. Временные ворота установлены временно. ТО ЕСТЬ ПОМЕНЯЙ ИХ, КОГДА ДОДЕЛАЕШЬ!!
  10. Можно модифицировать алгоритм, чтобы раз в месяц или в год, менялись временные ворота."""
  11. merge_dict = {}
  12. amp_cols = ['amp_1', 'amp_2', 'amp_3', 'amp_4', 'amp_5', 'amp_6',
  13. 'amp_7', 'amp_8', 'amp_9', 'amp_10', 'amp_11', 'amp_12', 'amp_13', 'amp_14',
  14. 'amp_15', 'amp_16']
  15. for i in range(len(data_din_12['time_ns'])):
  16. add_7d = data_din_7[(data_din_7['time_ns'] >= (data_din_12['time_ns'][i] - 90e6)) & (
  17. data_din_7['time_ns'] <= (data_din_12['time_ns'][i] + 90e6))][
  18. ['_id', 'time_ns'] + amp_cols].reset_index(drop=True)
  19. # Тут идет рассмотрение возможности, когда на одно событие 12-го динода идут два события 7-го.
  20. if len(add_7d) == 1:
  21. merge_dict[data_din_12['_id'][i]] = add_7d['_id'][0]
  22. elif len(add_7d) > 1:
  23. """Костыль на случай, что событий 7-го динода внутри временных ворот несколько.
  24. В таком случае программа отбирает, то событие 7-го с максимальной амплитудой на том детекторе,
  25. на котором максимальная амплитуда на 12-м диноде.
  26. Костыль требует доработки, так как не учитывает события, где все детекторы на 12-м под 511 код. АЦП"""
  27. main_col_12 = list({k: v for k, v in sorted(
  28. data_din_12[data_din_12["time_ns"] == data_din_12['time_ns'][i]][amp_cols].max().items(),
  29. key=lambda item: item[1], reverse=True)}.keys())[0]
  30. merge_dict[data_din_12['_id'][i]] = \
  31. add_7d[add_7d[main_col_12] == add_7d[[main_col_12]].max()[0]].reset_index(drop=True).head(1)['_id'][0]
  32. return merge_dict
  33. def update_with_add_cluster_id(date_):
  34. collection_prisma_12d = prisma_db[f'{str(date_)}_12d']
  35. collection_prisma_7d = prisma_db[f'{str(date_)}_7d']
  36. data_cl_1_12d = prepare_to_merge_12d(date_, cluster=1, a_crit=11, fr=4)
  37. data_cl_2_12d = prepare_to_merge_12d(date_, cluster=2, a_crit=11, fr=4)
  38. data_cl_1_7d = prepare_to_merge_7d(date_, cluster=1)
  39. data_cl_2_7d = prepare_to_merge_7d(date_, cluster=2)
  40. merge_din_cl_1 = merge_dinods(data_cl_1_12d, data_cl_1_7d)
  41. merge_din_cl_2 = merge_dinods(data_cl_2_12d, data_cl_2_7d)
  42. for key in merge_din_cl_1:
  43. upd_id_result_12d_cl_1 = collection_prisma_12d.update_one({'_id': key, 'cluster': 1},
  44. {"$set": {'event_id_7d': merge_din_cl_1[key]}})
  45. upd_id_result_7d_cl_1 = collection_prisma_7d.update_one({'_id': merge_din_cl_1[key], 'cluster': 1},
  46. {"$set": {'event_id_12d': key}})
  47. print(f'Added event_id_1 - {key} - {upd_id_result_12d_cl_1.raw_result}')
  48. print(f'Added event_id_2 - {merge_din_cl_1[key]} - {upd_id_result_7d_cl_1.raw_result}')
  49. for key in merge_din_cl_2:
  50. upd_id_result_12d_cl_2 = collection_prisma_12d.update_one({'_id': key, 'cluster': 2},
  51. {"$set": {'event_id_7d': merge_din_cl_2[key]}})
  52. upd_id_result_7d_cl_2 = collection_prisma_7d.update_one({'_id': merge_din_cl_2[key], 'cluster': 2},
  53. {"$set": {'event_id_12d': key}})
  54. print(f'Added event_id_1 - {key} - {upd_id_result_12d_cl_2.raw_result}')
  55. print(f'Added event_id_2 - {merge_din_cl_2[key]} - {upd_id_result_7d_cl_2.raw_result}')
  56. if __name__ == '__main__':
  57. date_time_start = datetime.date(2021, 12, 1) # посмотреть почему не собирается конец дня 2018-04-22
  58. date_time_stop = datetime.date(2021, 12, 31)
  59. LIST_OF_DATES = [(date_time_start + datetime.timedelta(days=i)) for i in
  60. range((date_time_stop - date_time_start).days + 1)]
  61. for date in LIST_OF_DATES:
  62. update_with_add_cluster_id(date)
  63. print('test')