/** * @file TConvolution.hh * @brief . * * @author * * @date */ #ifndef TCONVOLUTION_HH #define TCONVOLUTION_HH #include class TH1; class TVirtualFFT; /** */ class TConvolution { public: enum BufStrat { None=0, Extend=1, Mirror=2, Flat=3 } ; TConvolution(Int_t Ndim = 1, Int_t NbinsX = 30, Int_t NbinsY = 30, TConvolution::BufStrat bs = TConvolution::Mirror, Double_t bufFracX = 0.1, Double_t bufFracY = 0.1, Option_t* opt = "EX"); TConvolution(const TH1* histoA, const TH1* histoB, TConvolution::BufStrat bs = TConvolution::Mirror, Double_t bufFracX = 0.1, Double_t bufFracY = 0.1, Option_t* opt = "EX"); TConvolution(const TConvolution& other); virtual ~TConvolution(); static std::string BufStratToString(BufStrat bs); static BufStrat StringToBufStrat(std::string sbs); static std::string CommaSeparatedListOfBufStrats(); void SetBufferStrategy(TConvolution::BufStrat bs); void SetBufferFraction(Double_t bufFracX = 0, Double_t bufFracY = 0); void SetShiftA(TH1* histo, Double_t shiftValX = 0, Double_t shiftValY = 0); void SetShiftB(TH1* histo, Double_t shiftValX = 0, Double_t shiftValY = 0); void SetHistoA(const TH1* histo); void SetHistoB(const TH1* histo); void Convolve(TH1* result); void DiagnosticPlot(std::string transform, std::string name); private: Int_t fDim; // FFT objects Option_t* fFFTOpt; TVirtualFFT* fFFTr2cA; TVirtualFFT* fFFTr2cB; TVirtualFFT* fFFTc2r; // handy holders Int_t* fIndex; // buffer parameters BufStrat fBufStrat; //< Buffer stategy Double_t* fBufFrac; //< Buffer fraction in x & y Int_t* fNbin; //< N bins within histo range in x & y Int_t* fNbuf; //< N buffer bins in x & y Int_t* fNtot; //< N total bins in x & y // shift parameters Int_t* fShiftBinA; //< x & y shift bin for histo A Int_t* fShiftBinB; //< x & y shift bin for histo B Double_t* fShiftValA; //< x & y shift value for histo A Double_t* fShiftValB; //< x & y shift value for histo B bool is2D() const; bool CheckConsistency(const TH1* histoA, const TH1* histoB); void CalcNumberOfBins(); void InitFFT(); void CalcShiftBins(const TH1* histo, const Double_t* ShiftVal, Int_t* zeroBin); void ScanHisto(const TH1* histo, Int_t* zeroBin, TVirtualFFT* fft); void MultiplyAndTransform(); void complexProduct(Double_t re1, Double_t im1, Double_t re2, Double_t im2, Double_t& re, Double_t& im); void ScanResult(TH1* histo) const; TH1 * GetTransformedHisto(const char* name, const char* title, TVirtualFFT* fft, Option_t* option); void debugFFT(const char* name, TVirtualFFT * fft, bool isComplex); ClassDef(TConvolution,1); }; std::ostream& operator<<(std::ostream& os, const TConvolution::BufStrat& sfo); #endif