16 using namespace Diana;
24 fValidityKind = GetString(
"ValidityKind",
"dataset",
false);
25 if(fValidityKind !=
"dataset" && fValidityKind !=
"run") {
26 Panic(
"ValidityKind must be set to dataset or run");
32 fProcessedFirstEvent =
false;
33 fOutput = GetString(
"Output",
"avgnoise.root");
34 fWindow = GetString(
"WindowType",
"None");
37 Warn(
"Window type not defined, using rectangular window");
40 else Info(
"Window type: %d (%s)", fWindowType,fWindow.c_str());
42 fCoherentGain = GetInt(
"WindowCoherentGain",2);
43 else fCoherentGain =
false;
45 fPulseLabel = GetString(
"PulseLabel",
"DAQ@Pulse",
false);
49 ev.Require<
QHeader>(
"DAQ",
"Header");
51 ev.RequireByLabel<
QPulse>(fPulseLabel);
58 const int run = header.
GetRun();
62 if (!fProcessedFirstEvent) {
64 fBeginValidity = header.
GetTime().GetTimeSec();
65 fEndValidity = fBeginValidity + 1000;
66 fProcessedFirstEvent =
true;
70 if (run != fCurrentRun)
73 fSRuns.push_back(fCurrentRun);
78 const QVector& noisePulse = ev.GetByLabel<
QPulse>(fPulseLabel).GetSamples();
80 if( fNoiseAvgPowerSpectrum.find(
channel) == fNoiseAvgPowerSpectrum.end()) {
81 fNumFreq = noisePulse.Size();
82 fNoiseAvgPowerSpectrum[
channel].Resize(fNumFreq);
83 fNoiseAvgPowerSpectrum[
channel].Initialize(0);
89 fNumFreq = noisePulse.Size();
90 double mean = noisePulse.Sum(fNumFreq)/fNumFreq;
91 QVector zeroMeanPulse = noisePulse;
92 QVector meanPulse(fNumFreq); meanPulse.Initialize(mean);
93 zeroMeanPulse -= meanPulse;
97 QVectorC transformedPulse(fNumFreq);
100 if(
err != 0) Error(
"QFFTRealComplex::TransformToFreq: pulse");
101 QVector realPart = transformedPulse.Re();
102 QVector imagPart = transformedPulse.Im();
106 for (
int k = 1; k < fNumFreq; k++) {
107 double magSquared = realPart[k]*realPart[k] + imagPart[k]*imagPart[k];
108 fNoiseAvgPowerSpectrum[
channel][k] += magSquared;
110 fNoiseAvgPowerSpectrum[
channel][0]+=mean*mean;
121 std::map<int,QAverageVector>::const_iterator iter = fNoiseAvgPowerSpectrum.begin();
122 while (iter != fNoiseAvgPowerSpectrum.end() ) {
125 if(iter != fNoiseAvgPowerSpectrum.begin()){
128 int prevEntry = (iter->first);
130 if(prevEntry != (prevChan)) {
131 Error(
"Missing channel %d - Could not build ANPS",(prevChan));}
133 if(iter != --fNoiseAvgPowerSpectrum.end()){
136 int nextEntry = (iter->first);
138 if(nextEntry != (nextChan)) {
139 Error(
"Missing channel %d - Could not build ANPS",(nextChan));}
147 fNoiseAvgPowerSpectrum[
channel].SetSourceRuns(fSRuns);
153 if(fValidityKind==
"dataset"){
154 GlobalHandle<QInt> dHandle(
"Dataset");
155 GlobalData().Get(
"",&dHandle,
"");
156 int dataset = dHandle.Get();
157 npsHandle.SetDataset(dataset);
159 else if (fValidityKind==
"run"){
160 if (fSRuns.size()==1){
161 npsHandle.SetRun(fSRuns[0]);
163 else Error(
"ValidityKind set to run is not permitted when reading multiple runs.");
165 else Error(
"ValidityKind can be set only to run or dataset. Check cfg.");
167 npsHandle.Set(fNoiseAvgPowerSpectrum[
channel]);
168 GlobalData().Set(&npsHandle,fOutput);
172 Error(
"Could not build average nps for channel %i: , 0 events passing the selection cuts",
channel);
#define REGISTER_MODULE(clazz)
Module to compute average power spectrum of noise.
virtual void Do(Diana::QEvent &ev)
global handle for average noise power spectra
static WindowType StrToWindowType(const std::string &winName)
Convert string to window type.
Raw event: bolometer channel, trigger positions and types.
Raw event: sampled waveform.
Wrapper for a specific QRealComplexFFT algorithm class.
virtual void SetWindowType(WindowType wt, int coherent=0)
resize working table and space
virtual int TransformToFreq(const QVector &data, QVectorC &FFT, bool compress=false)
transform from the times to the frequencies
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...