27 #include "TVirtualFFT.h" 56 TGraph grInput(hinput);
57 Int_t fftLength = hinput->GetNbinsX();
59 TVirtualFFT::SetTransform(0);
60 hm = (TH1D*)hinput->FFT(hm,
"MAG");
61 hm->SetTitle(
"Magnitude of the 1st transform");
66 TVirtualFFT *fft = TVirtualFFT::GetCurrentTransform();
72 fft->GetPointsComplex(reFull.GetMatrixArray(),imFull.GetMatrixArray());
73 for (Int_t ipoint=1; ipoint<fftLength/2-1; ipoint++){
74 magFull[ipoint]=TMath::Sqrt(reFull[ipoint]*reFull[ipoint]+imFull[ipoint]*imFull[ipoint]);
75 phaseFull[ipoint]=TMath::ATan2(imFull[ipoint], reFull[ipoint]);
85 for (Int_t ipoint=0; ipoint<fftLength/2-1; ipoint++){
86 Int_t dedge=TMath::Min(ipoint, fftLength/2-ipoint-1);
87 Int_t window= TMath::Min(dedge, medianRange);
88 magMed[ipoint]=TMath::Median(1+2*window, &(magFull.GetMatrixArray()[ipoint-window]));
90 if (magMed[ipoint]>0){
91 vecDiff[ipoint]=(magFull[ipoint]-magMed[ipoint]);
94 for (Int_t ipoint=1; ipoint<fftLength/2-1; ipoint++){
95 vecDiff[ipoint]= (magFull[ipoint]-(magMed[ipoint-1]+magMed[ipoint+1])*0.5);
101 for (Int_t ipoint=0; ipoint<fftLength/2-1; ipoint++){
102 reMod[ipoint]=reFull[ipoint];
103 imMod[ipoint]=imFull[ipoint];
104 if (ipoint<lowBand)
continue;
105 if (ipoint>=fftLength/2-lowBand)
continue;
106 if (TMath::Abs(vecDiff[ipoint]-meanT)>rmsT*outlierCut){
107 reMod[ipoint]=magMed[ipoint]*TMath::Cos(phaseFull[ipoint]);
108 imMod[ipoint]=magMed[ipoint]*TMath::Sin(phaseFull[ipoint]);
112 for (Int_t ipoint=0; ipoint<fftLength/2-1; ipoint++){
113 reMod[ipoint]=reFull[ipoint];
114 imMod[ipoint]=imFull[ipoint];
115 if (ipoint<lowBand)
continue;
116 if (ipoint>=fftLength/2-lowBand)
continue;
118 Double_t sumM=0, sumW=0;
119 for (Int_t dpoint=-4.*smoothSigma; dpoint<4.*smoothSigma; dpoint++){
120 if (dpoint+ipoint<0)
continue;
121 if (dpoint+ipoint>fftLength/2-1)
continue;
122 if (TMath::Abs(vecDiff[ipoint+ipoint]-meanT)>rmsT*outlierCut){
125 Double_t w= TMath::Gaus(dpoint);
126 sumM+=magFull[ipoint+dpoint]*w;
130 reMod[ipoint]=sumM*TMath::Cos(phaseFull[ipoint]);
131 imMod[ipoint]=sumM*TMath::Sin(phaseFull[ipoint]);
137 TVirtualFFT *fft_back = TVirtualFFT::FFT(1, &fftLength,
"C2R M K");
138 fft_back->SetPointsComplex(reMod.GetMatrixArray(),imMod.GetMatrixArray());
139 fft_back->Transform();
141 hb = (TH1D*)(TH1::TransformHisto(fft_back,hb,
"Re"));
142 hb->SetTitle(
"The backward transform result");
143 hb->Scale(1./Double_t(fftLength));
144 TGraph *grOutput =
new TGraph(grInput);
145 for (Int_t i=0; i<fftLength; i++){
147 grOutput->GetY()[i]=hb->GetBinContent(i+1);
155 "grInput.="<<&grInput<<
156 "grOutput.="<<grOutput<<
158 "reFull.="<<&reFull<<
159 "imFull.="<<&imFull<<
163 "magFull.="<<&magFull<<
164 "magMed.="<<&magMed<<
165 "vecDiff.="<<&vecDiff<<
TTreeSRedirector * pcstream
TGraph * ReplaceOutlierFrequenciesMedian(TH1 *hinput, Double_t outlierCut, Int_t medianRange, Float_t smoothSigma, Int_t lowBand, TTreeSRedirector *pcstream)
class TVectorT< Double_t > TVectorD