18 using namespace Diana;
29 std::string window = GetString(
"WindowType",
"welch");
32 Warn(
"Window type not defined, using rectangular window");
36 Info(
"Window type: %d (%s)", fWindowType,window.c_str());
39 fCoherentGain = GetInt(
"WindowCoherentGain",2);
40 else fCoherentGain = 2;
41 fUseMainEvent = GetBool(
"UseMainEvent",
false);
42 fValidityKind = GetString(
"ValidityKind",
"dataset",
false);
43 if(fValidityKind !=
"dataset" && fValidityKind !=
"run") {
44 Panic(
"ValidityKind must be set to dataset or run");
50 std::vector<std::string> pulseLabels;
52 pulseLabels.push_back(
"DAQ@Pulse");
53 fPulseLabels = GetVectorString(
"PulseLabels",pulseLabels,
false);
54 if(fPulseLabels.empty()) Panic(
"PulseLabels is empty");
56 ev.Require<
QHeader>(
"DAQ",
"Header");
58 for(
size_t i = 0; i < fPulseLabels.size(); i++) {
59 ev.RequireByLabel<
QPulse>(fPulseLabels[i]);
72 if(fUseMainEvent) allchans.
Push(&ev);
73 for(
size_t ch = 0; ch < neighbours.
Size(); ch++) {
74 allchans.
Push(&neighbours[ch]);
76 int run = ev.
Get<
QHeader>(
"DAQ",
"Header").GetRun();
77 if (run != fCurrentRun) {
79 fSRuns.push_back(fCurrentRun);
83 if(fTimeLength == 0) {
86 fTransformer->SetWindowType(fWindowType, fCoherentGain);
87 fCov.SetNFreq(fTimeLength);
90 QVectorC TransformedPulseI(fTimeLength);
91 QVectorC TransformedPulseJ(fTimeLength);
92 QVector zeroMeanPulse(fTimeLength), meanPulse(fTimeLength);
93 for(
size_t i = 0; i < allchans.
Size(); i++) {
94 int chanI = allchans[i].Get<
QPulseInfo>(
"DAQ",
"PulseInfo").GetChannelId();
95 for(
size_t li = 0; li < fPulseLabels.size(); li++) {
96 if(li>0) chanI += 1000;
97 const QVector& samplesI = allchans[i].GetByLabel<
QPulse>(fPulseLabels[li]).GetSamples();
98 double mean = samplesI.Sum(samplesI.Size())/samplesI.Size();
99 meanPulse.Initialize(mean);
100 zeroMeanPulse = samplesI;
101 zeroMeanPulse -= meanPulse;
102 int err = fTransformer->TransformToFreq(zeroMeanPulse, TransformedPulseI);
104 Error(
"QFFTRealComplex::TransformToFreq: pulse I");
107 TransformedPulseI[0].SetRe(0);
108 TransformedPulseI[0].SetIm(0);
109 for(
size_t j = i ; j < allchans.
Size(); j++) {
110 int chanJ = allchans[j].Get<
QPulseInfo>(
"DAQ",
"PulseInfo").GetChannelId();
111 for(
size_t lj = 0; lj < fPulseLabels.size(); lj++) {
112 if(lj>0) chanJ += 1000;
113 const QVector& samplesJ = allchans[j].GetByLabel<
QPulse>(fPulseLabels[lj]).GetSamples();
114 mean = samplesJ.Sum(samplesJ.Size())/samplesJ.Size();
115 meanPulse.Initialize(mean);
116 zeroMeanPulse = samplesJ;
117 zeroMeanPulse -= meanPulse;
119 int err = fTransformer->TransformToFreq(zeroMeanPulse, TransformedPulseJ);
121 Error(
"QFFTRealComplex::TransformToFreq: pulse J");
124 TransformedPulseJ[0].SetRe(0);
125 TransformedPulseJ[0].SetIm(0);
133 fChannelList.push_back(chanJ);
142 QVectorC element = TransformedPulseI.Mult(TransformedPulseJ.Conj());
157 std::stringstream str;
158 str<<
"Channel List: ";
159 for(
size_t i=0;i<fChannelList.size();i++) {
160 str<<fChannelList[i]<<
" ";
163 Debug(str.str().c_str());
165 fCov.SetChannels(fChannelList);
168 std::map<int,std::map<int,ChannelInfo> >::const_iterator iterI = fRosetta.begin();
169 while(iterI != fRosetta.end() ) {
170 std::map<int,ChannelInfo>::const_iterator iterJ = iterI->second.begin();
171 while(iterJ != iterI->second.end() ) {
172 int chI =iterI->first;
173 int chJ =iterJ->first;
176 fCov.SetCovariance(chI,chJ,
vec);
178 fCov.SetNEvents(chI,chJ,chInfo.
fNevents/2);
180 fCov.SetNEvents(chI,chJ,chInfo.
fNevents);
187 GlobalHandle<QChannelCovariance> CovSaver(
"Covariance");
189 GlobalHandle<QStdVector<std::string> > LabelsSaver(
"PulseLabels");
190 LabelsSaver.Set(fPulseLabels);
191 GlobalHandle<QInt> StepSaver(
"PulseStep");
193 if(fValidityKind==
"dataset"){
194 GlobalHandle<QInt> dHandle(
"Dataset");
195 GlobalData().Get(
"",&dHandle,
"");
196 int dataset = dHandle.Get();
197 CovSaver.SetDataset(dataset);
198 LabelsSaver.SetDataset(dataset);
199 StepSaver.SetDataset(dataset);
201 else if (fValidityKind==
"run"){
202 if (fSRuns.size()==1){
203 CovSaver.SetRun(fSRuns[0]);
204 CovSaver.SetRun(fSRuns[0]);
205 LabelsSaver.SetRun(fSRuns[0]);
206 StepSaver.SetRun(fSRuns[0]);
208 else Error(
"ValidityKind set to run is not permitted when reading multiple runs.");
210 else Error(
"ValidityKind can be set only to run or dataset. Check cfg.");
215 GlobalData().Set(&CovSaver,fOutput);
216 GlobalData().Set(&StepSaver,fOutput);
217 GlobalData().Set(&LabelsSaver,fOutput);
218 if(fTransformer != 0)
delete fTransformer;
#define REGISTER_MODULE(clazz)
Diana::QVectorC fCovariance
compute cross correlated noise power spectrum on different channels. * This module needs side pulses ...
void Do(Diana::QEvent &ev, const Diana::QEventList &neighbours)
Do method.
list of references to const QEvent (s)
void Push(const QEvent *obj)
add a QEvent
size_t Size() const
number of QEvent (s)
const Q & GetByLabel(const QEventLabel &label) const
Get a QObject in read mode by label.
void Get(const char *owner, ReadHandle< Q > &handle) const
Get a QObject Handle in read mode.
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.
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...