// @(#)root/spectrum:$Id$
// Author: Miroslav Morhac   25/09/06

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#ifndef ROOT_TSpectrum2Transform
#define ROOT_TSpectrum2Transform

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSpectrum2Transform                                                  //
//                                                                      //
// Class to carry out transforms of 2D spectra, its filtering and       //
// enhancement. It allows to calculate classic Fourier, Cosine, Sin,    //
// Hartley, Walsh, Haar transforms as well as mixed transforms (Fourier-//
// Walsh, Fourier-Haar, Walsh-Haar, Cosine-Walsh, Cosine-Haar, Sin-Walsh//
// and Sin-Haar). All the transforms are fast.                          //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif

class TSpectrum2Transform : public TObject {
protected:
   Int_t     fSizeX;                      //x length of transformed data
   Int_t     fSizeY;                      //y length of transformed data
   Int_t     fTransformType;              //type of transformation (Haar, Walsh, Cosine, Sine, Fourier, Hartley, Fourier-Walsh, Fourier-Haar, Walsh-Haar, Cosine-Walsh, Cosine-Haar, Sine-Walsh, Sine-Haar)
   Int_t     fDegree;                     //degree of mixed transform, applies only for Fourier-Walsh, Fourier-Haar, Walsh-Haar, Cosine-Walsh, Cosine-Haar, Sine-Walsh, Sine-Haar transforms
   Int_t     fDirection;                  //forward or inverse transform
   Int_t     fXmin;                       //first channel x of filtered or enhanced region
   Int_t     fXmax;                       //last channel x of filtered or enhanced region
   Int_t     fYmin;                       //first channel y of filtered or enhanced region
   Int_t     fYmax;                       //last channel y of filtered or enhanced region
   Double_t   fFilterCoeff;                //value set in the filtered region
   Double_t   fEnhanceCoeff;               //multiplication coefficient applied in enhanced region;
public:
   enum {
       kTransformHaar =0,
       kTransformWalsh =1,
       kTransformCos =2,
       kTransformSin =3,
       kTransformFourier =4,
       kTransformHartley =5,
       kTransformFourierWalsh =6,
       kTransformFourierHaar =7,
       kTransformWalshHaar =8,
       kTransformCosWalsh =9,
       kTransformCosHaar =10,
       kTransformSinWalsh =11,
       kTransformSinHaar =12,
       kTransformForward =0,
       kTransformInverse =1
   };
   TSpectrum2Transform();
   TSpectrum2Transform(Int_t sizeX, Int_t sizeY);
   virtual ~TSpectrum2Transform();

protected:
   void                BitReverse(Double_t *working_space,Int_t num);
   void                BitReverseHaar(Double_t *working_space,Int_t shift,Int_t num,Int_t start);
   void                FourCos2(Double_t **working_matrix,Double_t *working_vector,Int_t numx,Int_t numy,Int_t direction,Int_t type);
   void                Fourier(Double_t *working_space,Int_t num,Int_t hartley,Int_t direction,Int_t zt_clear);
   void                General2(Double_t **working_matrix,Double_t *working_vector,Int_t numx,Int_t numy,Int_t direction,Int_t type,Int_t degree);
   Int_t               GeneralExe(Double_t *working_space,Int_t zt_clear,Int_t num,Int_t degree,Int_t type);
   Int_t               GeneralInv(Double_t *working_space,Int_t num,Int_t degree,Int_t type);
   void                Haar(Double_t *working_space,Int_t num,Int_t direction);
   void                HaarWalsh2(Double_t **working_matrix,Double_t *working_vector,Int_t numx,Int_t numy,Int_t direction,Int_t type);
   void                Walsh(Double_t *working_space,Int_t num);

public:
   void                Enhance(const Double_t **fSource, Double_t **fDest);
   void                FilterZonal(const Double_t **fSource, Double_t **fDest);
   void                SetDirection(Int_t direction);
   void                SetEnhanceCoeff(Double_t enhanceCoeff);
   void                SetFilterCoeff(Double_t filterCoeff);
   void                SetRegion(Int_t xmin, Int_t xmax, Int_t ymin, Int_t ymax);
   void                SetTransformType(Int_t transType, Int_t degree);
   void                Transform(const Double_t **fSource, Double_t **fDest);

   ClassDef(TSpectrum2Transform,1)  //Spectrum2 Transformer, it calculates classic orthogonal 2D transforms
};

#endif
 TSpectrum2Transform.h:1
 TSpectrum2Transform.h:2
 TSpectrum2Transform.h:3
 TSpectrum2Transform.h:4
 TSpectrum2Transform.h:5
 TSpectrum2Transform.h:6
 TSpectrum2Transform.h:7
 TSpectrum2Transform.h:8
 TSpectrum2Transform.h:9
 TSpectrum2Transform.h:10
 TSpectrum2Transform.h:11
 TSpectrum2Transform.h:12
 TSpectrum2Transform.h:13
 TSpectrum2Transform.h:14
 TSpectrum2Transform.h:15
 TSpectrum2Transform.h:16
 TSpectrum2Transform.h:17
 TSpectrum2Transform.h:18
 TSpectrum2Transform.h:19
 TSpectrum2Transform.h:20
 TSpectrum2Transform.h:21
 TSpectrum2Transform.h:22
 TSpectrum2Transform.h:23
 TSpectrum2Transform.h:24
 TSpectrum2Transform.h:25
 TSpectrum2Transform.h:26
 TSpectrum2Transform.h:27
 TSpectrum2Transform.h:28
 TSpectrum2Transform.h:29
 TSpectrum2Transform.h:30
 TSpectrum2Transform.h:31
 TSpectrum2Transform.h:32
 TSpectrum2Transform.h:33
 TSpectrum2Transform.h:34
 TSpectrum2Transform.h:35
 TSpectrum2Transform.h:36
 TSpectrum2Transform.h:37
 TSpectrum2Transform.h:38
 TSpectrum2Transform.h:39
 TSpectrum2Transform.h:40
 TSpectrum2Transform.h:41
 TSpectrum2Transform.h:42
 TSpectrum2Transform.h:43
 TSpectrum2Transform.h:44
 TSpectrum2Transform.h:45
 TSpectrum2Transform.h:46
 TSpectrum2Transform.h:47
 TSpectrum2Transform.h:48
 TSpectrum2Transform.h:49
 TSpectrum2Transform.h:50
 TSpectrum2Transform.h:51
 TSpectrum2Transform.h:52
 TSpectrum2Transform.h:53
 TSpectrum2Transform.h:54
 TSpectrum2Transform.h:55
 TSpectrum2Transform.h:56
 TSpectrum2Transform.h:57
 TSpectrum2Transform.h:58
 TSpectrum2Transform.h:59
 TSpectrum2Transform.h:60
 TSpectrum2Transform.h:61
 TSpectrum2Transform.h:62
 TSpectrum2Transform.h:63
 TSpectrum2Transform.h:64
 TSpectrum2Transform.h:65
 TSpectrum2Transform.h:66
 TSpectrum2Transform.h:67
 TSpectrum2Transform.h:68
 TSpectrum2Transform.h:69
 TSpectrum2Transform.h:70
 TSpectrum2Transform.h:71
 TSpectrum2Transform.h:72
 TSpectrum2Transform.h:73
 TSpectrum2Transform.h:74
 TSpectrum2Transform.h:75
 TSpectrum2Transform.h:76
 TSpectrum2Transform.h:77
 TSpectrum2Transform.h:78
 TSpectrum2Transform.h:79
 TSpectrum2Transform.h:80
 TSpectrum2Transform.h:81
 TSpectrum2Transform.h:82
 TSpectrum2Transform.h:83
 TSpectrum2Transform.h:84
 TSpectrum2Transform.h:85
 TSpectrum2Transform.h:86
 TSpectrum2Transform.h:87
 TSpectrum2Transform.h:88
 TSpectrum2Transform.h:89
 TSpectrum2Transform.h:90