Diana Software
QMultiChannelDecorrelatorOF.cc
Go to the documentation of this file.
2 #include <sstream>
3 #include <algorithm>
4 using namespace Diana;
5 using namespace std;
6 
7 QMultiChannelDecorrelatorOF::QMultiChannelDecorrelatorOF(const int chan, const QChannelCovariance* cov, const Diana::QVector& averagePulse) : QMultiChannelDecorrelator(chan,cov,false)
8 {
9  fAveragePulses.push_back(averagePulse);
10  std::vector<int> empty;
11  SetSideChannels(empty);
12 }
13 
14 QMultiChannelDecorrelatorOF::QMultiChannelDecorrelatorOF(const std::vector<int>& channels, const QChannelCovariance* cov, const std::vector<Diana::QVector>& averagePulses) : QMultiChannelDecorrelator(channels,cov,false)
15 {
16  if(channels.size() != averagePulses.size()) {
18  std::stringstream msg;
19  msg<<"averagePulses.size() differs from channels.size(): "<<channels.size()<<" vs "<<averagePulses.size();
20  err.SetDescription(__FILE__,__LINE__,msg.str());
21  DianaThrow(err);
22  }
23  fAveragePulses = averagePulses;
24  std::vector<int> empty;
25  SetSideChannels(empty);
26 }
27 
28 const Diana::QVector& QMultiChannelDecorrelatorOF::GetAveragePulse(const int chan) const
29 {
30  std::vector<int>::const_iterator iter = std::find(fChannels.begin(),fChannels.end(),chan);
31  if(iter == fChannels.end()) {
33  std::stringstream msg;
34  msg<<"Channel "<<chan<<" not present in fChannels";
35  err.SetDescription(__FILE__,__LINE__,msg.str());
36  DianaThrow(err);
37  }
38  return fAveragePulses[*iter];
39 }
40 
41 void QMultiChannelDecorrelatorOF::Init(const std::vector<int>& allChannels)
42 {
43 
44  fOriginalPowerSpectrum = fCovarianceMatrix->GetCovariance(allChannels[0],allChannels[0]).GetModulus()*fScale*fScale;
45 
47  QChannelCovariance reducedCovarianceMatrix = (fCovarianceMatrix->GetSubMatrix(allChannels)).Inverse();
48  size_t size = reducedCovarianceMatrix.GetNFreq();
49 
50  vector<QVectorC> APFreq(fAveragePulses.size());
51  double max;
52  for(size_t i = 0; i < fAveragePulses.size(); i++) {
53  QVectorC SFreq;
54  QVector normAP = fAveragePulses[i];
55  int maxpos = normAP.GetMaxIndex();
56  QVector baseline(size);
57  size_t baseLength = 3*maxpos/4;
58  baseline.Initialize(normAP.Sum(baseLength,0)/baseLength);
59  normAP -= baseline;
60  if(i == 0) {
61  fShift = maxpos;
62  max = normAP.GetMax();
63  }
64  normAP /= normAP.GetMax();
65  fTransformer->TransformToFreq(normAP,SFreq);
66  SFreq[0].SetRe(0);
67  SFreq[0].SetIm(0);
68  APFreq[i] = SFreq;
69  }
70 
71 
72  for(size_t j = 0; j < allChannels.size(); j++) {
73  int chanJ = allChannels[j];
74  QVectorC W(size);
75  W.Initialize(0,0);
76  for(size_t i = 0; i < fAveragePulses.size(); i++) {
77  int chanI = fChannels[i];
78  W+=APFreq[i].Conj().Mult(reducedCovarianceMatrix.GetCovariance(chanJ,chanI));
79  }
80  W[0].SetRe(0);
81  W[0].SetIm(0);
82  fWeights.push_back(W);
83  }
84 
85  fNorm = 1.;
86  vector<const QVector*> inputs,sideInputs;
87  for(size_t i = 0; i < fAveragePulses.size(); i++) {
88  inputs.push_back(&fAveragePulses[i]);
89  }
90  QVector output;
91  Filter(inputs,sideInputs,output);
92  fNorm = max*fScale/output.GetMax();
93 
94  QVectorC deco(size);
95  deco.Initialize(0,0);
96  for(size_t i = 0; i < fAveragePulses.size(); i++) {
97  deco += fWeights[i].Mult(APFreq[i]);
98  }
101 }
102 
103 void QMultiChannelDecorrelatorOF::Filter(const std::vector<const Diana::QVector*>& inputs, const std::vector<const Diana::QVector*>& sideInputs, Diana::QVector& output) const
104 {
105  QVectorC tmp, outputFreq(fCovarianceMatrix->GetNFreq());
106  outputFreq.Initialize(0,0);
107  size_t i,j;
108  for(i =0; i < inputs.size(); i++) {
109  fTransformer->TransformToFreq(*inputs[i],tmp);
110  outputFreq += fWeights[i].Mult(tmp);
111  }
112  for(j =0; j < sideInputs.size(); j++) {
113  fTransformer->TransformToFreq(*sideInputs[j],tmp);
114  outputFreq += fWeights[i+j].Mult(tmp);
115  }
116  fTransformer->TransformFromFreq(outputFreq,output);
117  output *= fNorm*fScale;
118  output.Shift(fShift);
119 }
int maxpos
Definition: CheckOFShape.C:59
double max
Definition: CheckOF.C:53
err
Definition: CheckOF.C:114
#define DianaThrow(obj)
Definition: QDianaDebug.hh:26
@ QERR_OUT_OF_RANGE
Definition: QError.hh:28
Complex covariance matrix of an array of bolometers.
QChannelCovariance GetSubMatrix(const std::vector< int > &channels) const
Get sub matrix of channels.
size_t GetNFreq() const
get number of frequencies
Diana::QVectorC GetCovariance(int chI, int chJ) const
get covariance between channel I and J
error class with error type and description
Definition: QError.hh:115
void Init(const std::vector< int > &allChannels)
get expected resolution after filtering
const Diana::QVector & GetAveragePulse(const int chan) const
get average pulse
void Filter(const std::vector< const Diana::QVector * > &inputs, const std::vector< const Diana::QVector * > &sideInputs, Diana::QVector &output) const
filter, not implemented yet
QMultiChannelDecorrelatorOF(const std::vector< int > &channels, const QChannelCovariance *cov, const std::vector< Diana::QVector > &averagePulses)
ctor, by default all channels are used to decorrelate
std::vector< Diana::QVector > fAveragePulses
average pulses corresponding to fChannels
double fFilteredResolution
expected filtered resolution
double ComputeResolution(const Diana::QVector &powerSpectrum) const
compute resolution
Diana::QVector fOriginalPowerSpectrum
original power spectrum of this channel
std::vector< Diana::QVectorC > fWeights
coefficients used in decorrelation
Diana::QVector fDecorrelatedPowerSpectrum
decorrelated power spectrum of this channel
double fOriginalResolution
original resolution
std::vector< int > fChannels
number of this channel
void SetSideChannels(const std::vector< int > &channels)
chose subset of channels to use for decorrelation
const QChannelCovariance * fCovarianceMatrix
pointer to global covariance matrix
Diana::QRealComplexFFT * fTransformer
FFT engine.
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...