Source code for pydiana.pat.compare_noise

from pydiana.shell.plotly_theme import *
from pydiana.tools import pydianaIO
import uproot
import plotly.graph_objects as go
import numpy as np
import matplotlib.pyplot as plt
"""
    Input Formatting:
    inputs={8030:{
            810643:{
                    'Channels':{36,37,53,54},
                    'Variables':{'CalibratedPhase','CalibratedMagnitude'},
                    'File':'average_noise_power_spectra_run810643.root',
                    'Folder':'/home/giorgio/Bin/diana/diana_output/analysis/avg/ds8030/',
                    'Operations':[()],
                   }
             }
       }
"""    
[docs] def GetPSGraph( PS, f_s, conv): n_bin = int(len(PS)/2+1) res = f_s/len(PS) x_ax=[] y_ax=[] for f in range(1,n_bin): x = f*res x_ax.append(x) y = PS[f]*conv*conv/(len(PS)*len(PS)*res)*2 y_ax.append(y) return x_ax,y_ax
[docs] def CompareNoise(inputs,final_ops:list=[],showplot=False,draw='matplotlib'): plots = {} for dataset in inputs: for run in inputs[dataset]: ifile = inputs[dataset][run]['Folder']+inputs[dataset][run]['File'] aninput = uproot.open(ifile) rundata =pydianaIO.get_run_data(ifile,run) for v in inputs[dataset][run]['Variables']: var = 'NoiseAvgPowerSpectrum' if v!='': var +='_'+v if draw=='plotly': plots[var]= go.Figure() elif draw=='matplotlib': fig=plt.figure() ax = fig.add_subplot(111) plots[var]=(fig,ax) var += f'@NoiseAvgPS_ds{dataset:04d}_chan' for chan in inputs[dataset][run]['Channels']: chrundata = rundata.GetChannelsRunData()[chan] varlabel = var+f"{chan:04d}" data = aninput['Global'][varlabel].all_members an = GetPSGraph(data['fData'],chrundata.fSamplingFrequency,chrundata.fADC2mV) for func,params in inputs[dataset][run]['Operations']: an = func(an, params, {'filename':ifile, 'content':aninput, 'var':var, 'varlabel':varlabel, 'rundata':rundata, 'chrundata':chrundata, 'dataset':dataset, 'run':run, 'chan':chan, 'input':input} ) if draw=='plotly': plots[var.split('@')[0]].add_trace(go.Scatter(x=an[0],y=an[1],name=f"ds{dataset:04d}_chan{chan:04d}")) elif draw=='matplotlib': plots[var.split('@')[0]][-1].plot(an[0],an[1],label=f"ds{dataset:04d}_chan{chan:04d}") for v in plots: if draw=='plotly': plots[v].update_layout(title=v) plots[v].update_yaxes(type='log',title="mV²/Hz") plots[v].update_xaxes(type='log',title='Frequency [Hz]') for func in final_ops: plots[v] = func(plots[v],v,draw) if showplot: plots[v].show() elif draw=='matplotlib': plots[v][-1].set_title(v) plots[v][-1].set_ylabel("mV²/Hz") plots[v][-1].set_yscale("log") plots[v][-1].set_xlabel("Frequency [Hz]") plots[v][-1].set_xscale("log") plots[v][-1].legend() for func in final_ops: plots[v] = func(plots[v],v,draw) if showplot and draw=='matplotlib': plt.show() return plots