123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- import datetime
- import time
- import warnings
- from matplotlib import pyplot as plt
- import pandas as pd
- from docx import Document
- from docx.enum.text import WD_BREAK
- from drawing_graphs import GraphsDrawing
- from processing_for_report import ProccessingPrismaCl
- from word_addition import *
- t1 = time.time()
- warnings.filterwarnings(action='ignore')
- # Следующее должно быть передающимися переменными
- start_date = datetime.date(2021, 1, 1)
- end_date = datetime.date(2021, 1, 31)
- days_amount = len(pd.date_range(start_date, end_date))
- process_1 = ProccessingPrismaCl(1, start_date=start_date, end_date=end_date,
- path_to_files='D:\\PRISMA20\\P1')
- process_2 = ProccessingPrismaCl(2, start_date=start_date, end_date=end_date,
- path_to_files='D:\\PRISMA20\\P2')
- graphs = GraphsDrawing(start_date=start_date, end_date=end_date,
- path_to_pic='C:\\Users\\pad_z\\OneDrive\\Рабочий стол\\PrismaPassport')
- worktime_1, breaks_1, n_vs_zero_tr_1, event_counter_fr_4_1, amp_5_fr_2_frame_1, amp_10_fr_1_frame_1, count_rate_amp_5_fr_2_1, count_rate_amp_10_fr_1_1 = process_1.day_proccessing()
- worktime_frame_1 = pd.DataFrame(worktime_1)
- n_vs_zero_tr_frame_1 = pd.DataFrame(n_vs_zero_tr_1)
- breaks_frame_1 = pd.DataFrame(breaks_1)
- event_counter_fr_4_1 = pd.DataFrame(event_counter_fr_4_1)
- count_rate_amp_5_fr_2_1 = pd.DataFrame(count_rate_amp_5_fr_2_1)
- count_rate_amp_10_fr_1_1 = pd.DataFrame(count_rate_amp_10_fr_1_1)
- worktime_2, breaks_2, n_vs_zero_tr_2, event_counter_fr_4_2, amp_5_fr_2_frame_2, amp_10_fr_1_frame_2, count_rate_amp_5_fr_2_2, count_rate_amp_10_fr_1_2 = process_2.day_proccessing()
- worktime_frame_2 = pd.DataFrame(worktime_2)
- n_vs_zero_tr_frame_2 = pd.DataFrame(n_vs_zero_tr_2)
- breaks_frame_2 = pd.DataFrame(breaks_2)
- event_counter_fr_4_2 = pd.DataFrame(event_counter_fr_4_2)
- count_rate_amp_5_fr_2_2 = pd.DataFrame(count_rate_amp_5_fr_2_2)
- count_rate_amp_10_fr_1_2 = pd.DataFrame(count_rate_amp_10_fr_1_2)
- brake_both_cl_time = 0
- for i in range(len(breaks_frame_1.index)):
- for j in range(len(breaks_frame_2.index)):
- if breaks_frame_1['Date'][i] == breaks_frame_2['Date'][j]:
- if breaks_frame_1['StartMinutes'][i] <= breaks_frame_2['StartMinutes'][j] < breaks_frame_1['EndMinutes'][i]:
- brake_both_cl_time += min(breaks_frame_2['EndMinutes'][j], breaks_frame_1['EndMinutes'][i]) - max(
- breaks_frame_2['StartMinutes'][j], breaks_frame_1['StartMinutes'][i])
- elif breaks_frame_2['StartMinutes'][j] <= breaks_frame_1['StartMinutes'][i] < breaks_frame_2['EndMinutes'][
- j]:
- brake_both_cl_time += min(breaks_frame_2['EndMinutes'][j], breaks_frame_1['EndMinutes'][i]) - max(
- breaks_frame_2['StartMinutes'][j], breaks_frame_1['StartMinutes'][i])
- real_worktime = worktime_frame_2['Worktime'].sum() - 24 * days_amount + worktime_frame_1[
- 'Worktime'].sum() + brake_both_cl_time / 60
- print(brake_both_cl_time)
- graphs.change_design()
- worktime_pic_path_1 = graphs.worktime_graph(cluster=1, worktime_frame=worktime_frame_1)
- worktime_pic_path_2 = graphs.worktime_graph(cluster=2, worktime_frame=worktime_frame_2)
- n_vs_zero_tr_pic_path_1 = graphs.neutron_to_0_tr_graph(cluster=1, neutron_num_0_tr_frame=n_vs_zero_tr_frame_1)
- n_vs_zero_tr_pic_path_2 = graphs.neutron_to_0_tr_graph(cluster=2, neutron_num_0_tr_frame=n_vs_zero_tr_frame_2)
- event_counter_fr_4_pic_path = graphs.amp_5_fr_4_graph(amp_5_fr_4_frame=event_counter_fr_4_1,
- amp_5_fr_4_frame_2=event_counter_fr_4_2,
- worktime_frame=worktime_frame_1,
- worktime_frame_2=worktime_frame_2)
- amp_distribution_pic_path_1 = graphs.amp_distribution_graph(cluster=1, amp_distribution_frame=amp_5_fr_2_frame_1,
- a_crit=6, freq=2)
- amp_distribution_pic_path_2 = graphs.amp_distribution_graph(cluster=2, amp_distribution_frame=amp_5_fr_2_frame_2,
- a_crit=6, freq=2)
- count_rate_amp_5_fr_2_pic_path_1 = graphs.count_rate_graph(cluster=1, count_rate_frame=count_rate_amp_5_fr_2_1,
- working_frame=worktime_frame_1,
- a_crit=5, freq=2)
- count_rate_amp_5_fr_2_pic_path_2 = graphs.count_rate_graph(cluster=2, count_rate_frame=count_rate_amp_5_fr_2_2,
- working_frame=worktime_frame_2,
- a_crit=5, freq=2)
- count_rate_amp_10_fr_1_pic_path_1 = graphs.count_rate_graph(cluster=1, count_rate_frame=count_rate_amp_10_fr_1_1,
- working_frame=worktime_frame_1,
- a_crit=10, freq=1)
- count_rate_amp_10_fr_1_pic_path_2 = graphs.count_rate_graph(cluster=2, count_rate_frame=count_rate_amp_10_fr_1_2,
- working_frame=worktime_frame_2,
- a_crit=10, freq=1)
- doc = Document()
- section_choice(doc)
- add_new_styles(doc)
- head = doc.add_paragraph(
- f'Справка о работе установки ПРИЗМА-32 в период с {start_date} по {end_date} ', style='Head-style')
- head.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- table_title = doc.add_paragraph('Таблица 1: Время работы установки ПРИЗМА-32.', style='PItalic')
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- worktime_table = doc.add_table(4, 4, doc.styles['Table Grid'])
- worktime_table.cell(0, 0).text = '№ кластера'
- worktime_table.cell(0, 1).text = 'Экспозиции, ч.'
- worktime_table.cell(0, 2).text = 'Календарное время, ч.'
- worktime_table.cell(0, 3).text = 'Экспозиция, %'
- worktime_table.cell(1, 0).text = '1'
- worktime_table.cell(1, 1).text = str(round(worktime_frame_1['Worktime'].sum(), 2))
- worktime_table.cell(1, 2).text = str(24 * days_amount)
- worktime_table.cell(1, 3).text = str(
- round(worktime_frame_1['Worktime'].sum() / (24 * days_amount) * 100, 3)) + '%'
- worktime_table.cell(2, 0).text = '2'
- worktime_table.cell(2, 1).text = str(round(worktime_frame_2['Worktime'].sum(), 2))
- worktime_table.cell(2, 2).text = str(24 * days_amount)
- worktime_table.cell(2, 3).text = str(
- round(worktime_frame_2['Worktime'].sum() / (24 * days_amount) * 100, 3)) + '%'
- worktime_table.cell(3, 0).text = '1&2'
- worktime_table.cell(3, 1).text = str(round(real_worktime, 2))
- worktime_table.cell(3, 2).text = str(24 * days_amount)
- worktime_table.cell(3, 3).text = str(round(real_worktime / (24 * days_amount) * 100, 3)) + '%'
- make_table_bold(worktime_table, cols=4, rows=4)
- doc.add_paragraph()
- # В РАЗРАБОТКЕ
- fail_str_begin_1, fail_str_end_1, lost_minutes_1, break_1 = time_breaks_counter(brake_frame=breaks_frame_1)
- fail_str_begin_2, fail_str_end_2, lost_minutes_2, break_2 = time_breaks_counter(brake_frame=breaks_frame_2)
- brake_table_title = doc.add_paragraph('Таблица 2: Сводная таблица остановок и работ установки ПРИЗМА-32.', style='PItalic')
- brake_table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- brake_table = doc.add_table(len(fail_str_begin_1) + len(fail_str_begin_2) + 2, 5, doc.styles['Table Grid'])
- brake_table.alignment = WD_TABLE_ALIGNMENT.CENTER
- brake_table.cell(0, 0).text = '№ кластера'
- brake_table.cell(0, 0).merge(brake_table.cell(1, 0))
- brake_table.cell(0, 1).text = 'Время простоя'
- brake_table.cell(1, 1).text = 'c'
- brake_table.cell(1, 2).text = 'по'
- brake_table.cell(0, 1).merge(brake_table.cell(0, 2))
- brake_table.cell(0, 3).text = 'Кол-во потерянных минут (период)'
- brake_table.cell(0, 3).merge(brake_table.cell(1, 3))
- brake_table.cell(0, 4).text = 'Примечание'
- brake_table.cell(0, 4).merge(brake_table.cell(1, 4))
- for i in range(2, len(fail_str_begin_1) + 2):
- brake_table.cell(i, 0).text = '1'
- brake_table.cell(i, 1).text = str(fail_str_begin_1[i - 2])
- brake_table.cell(i, 2).text = str(fail_str_end_1[i - 2])
- brake_table.cell(i, 3).text = str(lost_minutes_1[i - 2])
- brake_table.cell(i, 4).text = ' '
- for i in range(2 + len(fail_str_begin_1), len(fail_str_begin_2) + 2 + len(fail_str_begin_1)):
- brake_table.cell(i, 0).text = '2'
- brake_table.cell(i, 1).text = str(fail_str_begin_2[i - 2 - len(fail_str_begin_1)])
- brake_table.cell(i, 2).text = str(fail_str_end_2[i - 2 - len(fail_str_begin_1)])
- brake_table.cell(i, 3).text = str(lost_minutes_2[i - 2 - len(fail_str_begin_1)])
- brake_table.cell(i, 4).text = ' '
- make_table_bold(brake_table, cols=5, rows=len(fail_str_begin_1) + len(fail_str_begin_2)+2)
- doc.add_paragraph()
- table_title = doc.add_paragraph(
- 'Таблица 3: Сводная таблица темпов счета событий и сигналов, отобранных как нейтрон кластеров установки ПРИЗМА-32.',
- style='PItalic')
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- neut_stat_info_1, neut_stat_info_2 = statistical_table(n_vs_zero_tr_frame_1, n_vs_zero_tr_frame_2, dimension='100/соб')
- neutron_table = doc.add_table(3, 3, doc.styles['Table Grid'])
- neutron_table.cell(0, 0).text = 'Счет/кластер'
- neutron_table.cell(0, 1).text = 'Кл1'
- neutron_table.cell(0, 2).text = 'Кл2'
- neutron_table.cell(1, 0).text = 'События (Fr ≥ 4, A ≥ 5), N соб./ч.'
- neutron_table.cell(1, 1).text = str(round((event_counter_fr_4_1['Events'] / worktime_frame_1['Worktime']).mean(), 2))
- neutron_table.cell(1, 2).text = str(round((event_counter_fr_4_2['Events'] / worktime_frame_2['Worktime']).mean(), 2))
- neutron_table.cell(2, 0).text = 'Нейтроны, (Nn)/соб.'
- neutron_table.cell(2, 1).text = str(round(neut_stat_info_1.iloc[0].sum(), 2))
- neutron_table.cell(2, 2).text = str(round(neut_stat_info_2.iloc[0].sum(), 2))
- make_table_bold(neutron_table, cols=3, rows=3)
- change_cell_size(neutron_table, column_num=3, size_arr=[2.5, 0.5, 0.5])
- doc.add_paragraph()
- notes = doc.add_paragraph('')
- notes.add_run('Примечание:').bold = True
- notes_description = doc.add_paragraph(
- ' В таблице 4 представлена сводная информация о неисправностях в работе детекторов кластера.')
- table_title = doc.add_paragraph('Таблица 4: Неисправности.', style='PItalic')
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- notes_table = doc.add_table(3, 5, doc.styles['Table Grid'])
- notes_table.cell(0, 0).text = '№'
- notes_table.cell(0, 1).text = 'Кластер'
- notes_table.cell(0, 2).text = '№ Детектора'
- notes_table.cell(0, 3).text = 'Период'
- notes_table.cell(0, 4).text = 'Примечание'
- notes_table.cell(1, 0).text = '1'
- notes_table.cell(2, 0).text = '2'
- change_cell_size(notes_table, column_num=5, size_arr=[0.3, 0.8, 1.2, 1, 4.2])
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- graphic_header = doc.add_paragraph('Продолжительность работы кластеров установки ПРИЗМА-32.', style='Head-graphic')
- graphic_header.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- adding_graphic(doc, title='Рис. 1 - Продолжительность работы 1-го кластера в сутки', width=6,
- picture_path=worktime_pic_path_1)
- adding_graphic(doc, title='Рис. 2 - Продолжительность работы 2-го кластера в сутки', width=6,
- picture_path=worktime_pic_path_2)
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- graphic_header = doc.add_paragraph('Скорость счета событий установки ПРИЗМА-32.', style='Head-graphic')
- graphic_header.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- adding_graphic(doc, title='Рис. 3 - Скорость счета событий Fr ≥ 4, A ≥ 5', width=7,
- picture_path=event_counter_fr_4_pic_path)
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- adding_graphic(doc, title='Рис. 4 - Число импульсов в событии, отобранных как нейтрон, при самозапуске кластер 1',
- width=6, picture_path=n_vs_zero_tr_pic_path_1)
- adding_graphic(doc, title='Рис. 5 - Число импульсов в событии, отобранных как нейтрон, при самозапуске кластер 2',
- width=6, picture_path=n_vs_zero_tr_pic_path_2)
- table_title = doc.add_paragraph(
- 'Таблица 5: Среднее число нейтронов (Nn) для детекторов установки ПРИЗМА-32 за месяц работы, нормированное на количество событий (Ns).(при самозапуске), ',
- style='PItalic')
- table_title.add_run('(100/соб)').bold = True
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- neutron_stat_table = doc.add_table(neut_stat_info_1.shape[0] + neut_stat_info_2.shape[0] + 2,
- neut_stat_info_1.shape[1] + 2,
- doc.styles['Table Grid'])
- draw_stat_table(neutron_stat_table, neut_stat_info_1, neut_stat_info_2)
- make_stat_table_bold(neutron_stat_table, cols=18, rows=6)
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- # Переделать, чтобы амплитуда и кратность были переменными.
- adding_graphic(doc, title='Рис. 6 - Скорость счета детекторов в 1-м кластере Fr ≥ 2, A > 5',
- width=6, picture_path=count_rate_amp_5_fr_2_pic_path_1)
- adding_graphic(doc, title='Рис. 7 - Скорость счета детекторов в 2-м кластере Fr ≥ 2, A > 5',
- width=6, picture_path=count_rate_amp_5_fr_2_pic_path_2)
- table_title = doc.add_paragraph(
- 'Таблица 6: Среднемесячные число срабатываний детекторов установки ПРИЗМА-32, cоб./час.',
- style='PItalic')
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- # print(f'{count_rate_amp_5_fr_2_1=}')
- # print(f'{count_rate_amp_5_fr_2_2=}')
- count_rate_stat_info_1, count_rate_stat_info_2 = statistical_table(count_rate_amp_5_fr_2_1, count_rate_amp_5_fr_2_2,
- dimension='cоб./ч.')
- count_stat_table = doc.add_table(count_rate_stat_info_1.shape[0] + count_rate_stat_info_2.shape[0] + 2,
- count_rate_stat_info_1.shape[1] + 2, doc.styles['Table Grid'])
- draw_stat_table(count_stat_table, count_rate_stat_info_1, count_rate_stat_info_2)
- make_stat_table_bold(count_stat_table, cols=18, rows=6)
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- adding_graphic(doc, title='Рис. 8 - Скорость счета детекторов в 1-м кластере Fr ≥ 1, A > 10',
- width=6, picture_path=count_rate_amp_10_fr_1_pic_path_1)
- adding_graphic(doc, title='Рис. 9 - Скорость счета детекторов в 2-м кластере Fr ≥ 1, A > 10',
- width=6, picture_path=count_rate_amp_10_fr_1_pic_path_2)
- table_title = doc.add_paragraph(
- 'Таблица 7: Среднемесячные число срабатываний детекторов установки ПРИЗМА-32, cоб./час.',
- style='PItalic')
- table_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- count_rate_stat_info_1, count_rate_stat_info_2 = statistical_table(count_rate_amp_10_fr_1_1, count_rate_amp_10_fr_1_2,
- dimension='cоб./ч.')
- count_stat_table_2 = doc.add_table(count_rate_stat_info_1.shape[0] + count_rate_stat_info_2.shape[0] + 2,
- count_rate_stat_info_1.shape[1] + 2, doc.styles['Table Grid'])
- draw_stat_table(count_stat_table_2, count_rate_stat_info_1, count_rate_stat_info_2)
- make_stat_table_bold(count_stat_table_2, cols=18, rows=6)
- run = doc.add_paragraph().add_run()
- run.add_break(WD_BREAK.PAGE)
- graphic_header = doc.add_paragraph('На рисунке 8, 9 представлено число сигналов с А>5 кодов АЦП в час для 16 детекторов.',
- style='Head-graphic')
- graphic_header.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
- adding_graphic(doc, title='Рис. 10 - Амплитудное распределение сигналов от детекторов, кластер 1 (Fr ≥ 2 и А > 5)',
- width=6, picture_path=amp_distribution_pic_path_1)
- adding_graphic(doc, title='Рис. 11 - Амплитудное распределение сигналов от детекторов, кластер 2 (Fr ≥ 2 и А > 5)',
- width=6, picture_path=amp_distribution_pic_path_2)
- add_page_number(doc.sections[0].footer.paragraphs[0])
- doc.save(f'C:\\Users\\pad_z\\OneDrive\\Рабочий стол\\PrismaPassport\\2021\\{start_date}-{end_date}.docx')
- plt.close('all')
- print(time.time() - t1)
|