from pydiana import *
import plotly.graph_objects as go
from plotly.subplots import make_subplots
ROOT.gInterpreter.ProcessLine(f"#include \"{diana_install}/pkg/triggers/QTriggerFactory.hh\"")
[docs]
def list2stdvector(stream:list):
ds = ROOT.std.vector(ROOT.double)(len(stream))
for i in range(len(stream)):
ds[i] = stream[i]
return ds
[docs]
def main(trigger:str,stream:list,params:list,channel:int,SamplingFrequency:float,Window:float=0.2,Debounce:float=0.1):
if Debounce >=1:
print("Please insert a debounce value smaller than 1")
exit(-1)
Trigger = Diana.QTriggerFactory(trigger)
Trigger.SetSamplingFrequency(SamplingFrequency)
Trigger.SetWindow(int(Window*SamplingFrequency))
Trigger.SetDebounce(int(Window*SamplingFrequency*Debounce))
Trigger.SetChannel(channel)
Trigger.SetCFGParameters(*params)
print("Trigger Algo: ", Trigger.GetTriggerAlgo())
print("Trigger Params: \n\t", "\n\t ".join(Trigger.GetParameters(True).split("\n")))
Trigger.TriggerStream(list2stdvector(stream))
trigs = Trigger.GetTriggers()
filt_stream = Trigger.GetFilteredStream()
from array import array
import numpy as np
filt_stream2 = np.array(array("d",filt_stream))
rms=-1
rms_new=-1
#rms_eval
step = SamplingFrequency//10
if 4*step>len(filt_stream2):
step = (windowsize*SamplingFrequency)//5
step = int(step)
rmsss=[]
for i in range(0,len(filt_stream2),step):
if rms_new==-1:
rms_new = np.std(filt_stream2[i:i+step])
rms = rms_new+1;
else:
rms_new = np.std(filt_stream2[i:i+step])
if(rms_new<=rms and rms_new>0):
rms=rms_new
rmsss.append(rms_new)
print("Number of triggers found: ",trigs.size())
print("RMS: ",rms)
print("RMSSS: ",np.mean(rmsss),np.median(rmsss),np.std(rmsss))
print("Trigger Heights: ", Trigger.GetTriggerHeights())
fig=make_subplots(specs=[[{"secondary_y": True}]])#go.Figure()
fig.add_trace(go.Scatter(y = stream,name="Data"),secondary_y=False)
fig.add_trace(go.Scatter(y = [filt_stream[i] for i in range(filt_stream.size())],name='Filtered Stream'),secondary_y=True)
fig.add_trace(go.Scatter(x = [trigs[i] for i in range(trigs.size())],
y = [filt_stream[trigs[i]] for i in range(trigs.size())],name="Triggers (Filtered)",mode='markers'),secondary_y=True)
fig.add_trace(go.Scatter(x = [trigs[i] for i in range(trigs.size())],
y = [stream[trigs[i]] for i in range(trigs.size())],name="Triggers (Original)",mode='markers'),secondary_y=False)
fig.update_xaxes(title="Samples")
fig.update_yaxes(title_text="Amplitude [ADC]", secondary_y=False)
fig.update_yaxes(title_text="Filtered Amplitude [ADC]", secondary_y=True)
fig.update_layout(title=f"Channel {channel} triggered with {trigger}<br>Total triggers found: {trigs.size()}")
return fig