Diana Software
MNoiseAvgPowerSpectrum.cc
Go to the documentation of this file.
2 #include "QEvent.hh"
3 #include "QRawEvent.hh"
4 #include "QVector.hh"
5 #include "QVectorC.hh"
6 #include "QRealComplexFFT.hh"
7 #include "QAverageNoiseHandle.hh"
8 #include "QAverageVector.hh"
9 #include "QBaseType.hh"
10 #include <iostream>
11 #include <math.h>
12 
13 using std::cout;
14 using std::endl;
15 
16 using namespace Diana;
18 
19 // Init method is called before event loop
21 {
22  // get parameters from config file
23 
24  fValidityKind = GetString("ValidityKind","dataset",false);
25  if(fValidityKind != "dataset" && fValidityKind != "run") {
26  Panic("ValidityKind must be set to dataset or run");
27  }
28 
29  fValidityStart = GetInt("ValidityStart",Q_INT_DEFAULT,false);
30  fValidityEnd = GetInt("ValidityEnd",Q_INT_DEFAULT,false);
31 
32  fProcessedFirstEvent = false;
33  fOutput = GetString("Output","avgnoise.root");
34  fWindow = GetString("WindowType","None");
35  fWindowType = QFFT::StrToWindowType(fWindow);
36  if(fWindowType == QFFT::WT_None) {
37  Warn("Window type not defined, using rectangular window");
38  fWindowType = QFFT::WT_Rect;
39  }
40  else Info("Window type: %d (%s)", fWindowType,fWindow.c_str());
41  if(fWindowType != QFFT::WT_Rect)
42  fCoherentGain = GetInt("WindowCoherentGain",2);
43  else fCoherentGain = false;
44 
45  fPulseLabel = GetString("PulseLabel","DAQ@Pulse",false);
46  fCurrentRun = -1;
47  fSRuns.clear();
48 
49  ev.Require<QHeader>("DAQ","Header");
50  ev.Require<QPulseInfo>("DAQ","PulseInfo");
51  ev.RequireByLabel<QPulse>(fPulseLabel);
52 }
53 
54 // Do method is called for each event, getting the event as argument
55 void MNoiseAvgPowerSpectrum::Do( Diana::QEvent& ev)
56 {
57  const QHeader& header = ev.Get<QHeader>("DAQ","Header");
58  const int run = header.GetRun();
59 
60 
61  // inspect first event to determine number of points in the acquired window
62  if (!fProcessedFirstEvent) {
63  // validity time interval for DB MV FIXME
64  fBeginValidity = header.GetTime().GetTimeSec();
65  fEndValidity = fBeginValidity + 1000;
66  fProcessedFirstEvent = true;
67  }
68 
69  // store run number into SourceRuns vector
70  if (run != fCurrentRun)
71  {
72  fCurrentRun = run;
73  fSRuns.push_back(fCurrentRun);
74  }
75 
76  int channel = ev.Get<QPulseInfo>("DAQ","PulseInfo").GetChannelId();
77 
78  const QVector& noisePulse = ev.GetByLabel<QPulse>(fPulseLabel).GetSamples();
79 
80  if( fNoiseAvgPowerSpectrum.find(channel) == fNoiseAvgPowerSpectrum.end()) {
81  fNumFreq = noisePulse.Size();
82  fNoiseAvgPowerSpectrum[channel].Resize(fNumFreq);
83  fNoiseAvgPowerSpectrum[channel].Initialize(0);
84  fCount[channel] = 0;
85  }
86 
87 
88  // bool noPulse = ev->GetCountPulses().GetNumberOfPulses() == 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;
94  QRealComplexFFT transformer(fNumFreq);
95 
96  transformer.SetWindowType(fWindowType, fCoherentGain);
97  QVectorC transformedPulse(fNumFreq);
98  // normal pulse
99  int err = transformer.TransformToFreq(zeroMeanPulse, transformedPulse);
100  if(err != 0) Error("QFFTRealComplex::TransformToFreq: pulse");
101  QVector realPart = transformedPulse.Re();
102  QVector imagPart = transformedPulse.Im();
103 
104  // build average
105  // sum for now; divide by counts in Done() method
106  for (int k = 1; k < fNumFreq; k++) {
107  double magSquared = realPart[k]*realPart[k] + imagPart[k]*imagPart[k];
108  fNoiseAvgPowerSpectrum[channel][k] += magSquared;
109  }
110  fNoiseAvgPowerSpectrum[channel][0]+=mean*mean;
111 
112  // increment count of number of noise samples
113  ++fCount[channel];
114  return ;
115 }
116 
117 // Done method is called after event loop
119 {
120  // average magnitude squared of noise frequency spectrum
121  std::map<int,QAverageVector>::const_iterator iter = fNoiseAvgPowerSpectrum.begin();
122  while (iter != fNoiseAvgPowerSpectrum.end() ) {
123  int channel = iter->first;
124 
125  if(iter != fNoiseAvgPowerSpectrum.begin()){
126  --iter;
127  int prevChan = (channel-1);
128  int prevEntry = (iter->first);
129  ++iter;
130  if(prevEntry != (prevChan)) {
131  Error("Missing channel %d - Could not build ANPS",(prevChan));}
132  }
133  if(iter != --fNoiseAvgPowerSpectrum.end()){
134  ++iter;
135  int nextChan = (channel+1);
136  int nextEntry = (iter->first);
137  --iter;
138  if(nextEntry != (nextChan)) {
139  Error("Missing channel %d - Could not build ANPS",(nextChan));}
140  }
141 
142  if (fCount[channel] != 0) {
143  fNoiseAvgPowerSpectrum[channel] /= fCount[channel];
144 
145  // set number of events and source runs of QAverageVector
146 
147  fNoiseAvgPowerSpectrum[channel].SetSourceRuns(fSRuns);
148  fNoiseAvgPowerSpectrum[channel].SetNumEvents(fCount[channel]);
149 
150  // Fill Output
151 
152  QAverageNoiseHandle npsHandle(channel);
153  if(fValidityKind=="dataset"){
154  GlobalHandle<QInt> dHandle("Dataset");
155  GlobalData().Get("",&dHandle,"");
156  int dataset = dHandle.Get();
157  npsHandle.SetDataset(dataset);
158  }
159  else if (fValidityKind=="run"){
160  if (fSRuns.size()==1){
161  npsHandle.SetRun(fSRuns[0]);
162  }
163  else Error("ValidityKind set to run is not permitted when reading multiple runs.");
164  }
165  else Error("ValidityKind can be set only to run or dataset. Check cfg.");
166 
167  npsHandle.Set(fNoiseAvgPowerSpectrum[channel]);
168  GlobalData().Set(&npsHandle,fOutput);
169 
170  }
171  else {
172  Error("Could not build average nps for channel %i: , 0 events passing the selection cuts",channel);
173  }
174  iter++;
175  }
176 }
177 
178 
err
Definition: CheckOF.C:114
const int channel
#define Q_INT_DEFAULT
Definition: QDiana.hh:26
#define REGISTER_MODULE(clazz)
Definition: QDriver.hh:133
Module to compute average power spectrum of noise.
virtual void Do(Diana::QEvent &ev)
global handle for average noise power spectra
diana event
Definition: QEvent.hh:46
static WindowType StrToWindowType(const std::string &winName)
Convert string to window type.
Definition: QFFT.cc:64
@ WT_Rect
Definition: QFFT.hh:33
@ WT_None
Definition: QFFT.hh:31
Raw event: basic information like run number and time.
Definition: QHeader.hh:16
const Diana::QTime & GetTime() const
get time
Definition: QHeader.hh:28
int GetRun() const
destructor
Definition: QHeader.hh:22
Raw event: bolometer channel, trigger positions and types.
Definition: QPulseInfo.hh:18
Raw event: sampled waveform.
Definition: QPulse.hh:22
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...