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