32 ClassImp(TSpectrumTransform);
 
   37 TSpectrumTransform::TSpectrumTransform()
 
   40    fTransformType=kTransformCos;
 
   42    fDirection=kTransformForward;
 
   53 TSpectrumTransform::TSpectrumTransform(Int_t size):TNamed(
"SpectrumTransform", 
"Miroslav Morhac transformer")
 
   57       Error (
"TSpectrumTransform",
"Invalid length, must be > than 0");
 
   67       Error (
"TSpectrumTransform",
"Invalid length, must be power of 2");
 
   71    fTransformType=kTransformCos;
 
   73    fDirection=kTransformForward;
 
   84 TSpectrumTransform::~TSpectrumTransform()
 
   95 void TSpectrumTransform::Haar(Double_t *working_space, 
int num, 
int direction)
 
   97    int i, ii, li, l2, l3, j, jj, jj1, lj, iter, m, jmin, jmax;
 
   98    Double_t a, b, c, wlk;
 
  100    for (i = 0; i < num; i++)
 
  101       working_space[i + num] = 0;
 
  108    if (direction == kTransformForward) {
 
  109       for (m = 1; m <= iter; m++) {
 
  111          l2 = (Int_t) TMath::Power(2, li - 1);
 
  112          for (i = 0; i < (2 * l2); i++) {
 
  113             working_space[num + i] = working_space[i];
 
  115          for (j = 0; j < l2; j++) {
 
  118             val = working_space[jj + num] + working_space[jj + 1 + num];
 
  119             working_space[j] = val;
 
  120             val = working_space[jj + num] - working_space[jj + 1 + num];
 
  121             working_space[l3] = val;
 
  125    val = working_space[0];
 
  126    val = val / TMath::Sqrt(TMath::Power(2, iter));
 
  127    working_space[0] = val;
 
  128    val = working_space[1];
 
  129    val = val / TMath::Sqrt(TMath::Power(2, iter));
 
  130    working_space[1] = val;
 
  131    for (ii = 2; ii <= iter; ii++) {
 
  133       wlk = 1 / TMath::Sqrt(TMath::Power(2, iter - i));
 
  134       jmin = (Int_t) TMath::Power(2, i);
 
  135       jmax = (Int_t) TMath::Power(2, ii) - 1;
 
  136       for (j = jmin; j <= jmax; j++) {
 
  137          val = working_space[j];
 
  141          working_space[j] = val;
 
  144    if (direction == kTransformInverse) {
 
  145       for (m = 1; m <= iter; m++) {
 
  148          c = TMath::Power(a, b);
 
  150          for (i = 0; i < (2 * li); i++) {
 
  151             working_space[i + num] = working_space[i];
 
  153          for (j = 0; j < li; j++) {
 
  155             jj = 2 * (j + 1) - 1;
 
  157             val = working_space[j + num] - working_space[lj + num];
 
  158             working_space[jj] = val;
 
  159             val = working_space[j + num] + working_space[lj + num];
 
  160             working_space[jj1] = val;
 
  173 void TSpectrumTransform::Walsh(Double_t *working_space, 
int num)
 
  175    int i, m, nump = 1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter;
 
  178    for (i = 0; i < num; i++)
 
  179       working_space[i + num] = 0;
 
  186    for (m = 1; m <= iter; m++) {
 
  194       for (mp = 0; mp < nump; mp++) {
 
  196          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  197             mnum21 = mnum2 + mp2 + ib;
 
  199             val1 = working_space[iba];
 
  200             val2 = working_space[mnum21];
 
  201             working_space[iba + num] = val1 + val2;
 
  202             working_space[mnum21 + num] = val1 - val2;
 
  205       for (i = 0; i < num; i++) {
 
  206          working_space[i] = working_space[i + num];
 
  212    for (i = 0; i < num; i++) {
 
  213       val1 = working_space[i];
 
  215       working_space[i] = val1;
 
  226 void TSpectrumTransform::BitReverse(Double_t *working_space, 
int num)
 
  229    int i, ib, il, ibd, ip, ifac, i1;
 
  230    for (i = 0; i < num; i++) {
 
  231       working_space[i + num] = working_space[i];
 
  233    for (i = 1; i <= num; i++) {
 
  247       for (i1 = 1; i1 <= il; i1++) {
 
  249          ip = ip + ifac * ipower[i1 - 1];
 
  251       working_space[ip - 1] = working_space[i - 1 + num];
 
  264 void TSpectrumTransform::Fourier(Double_t *working_space, 
int num, 
int hartley,
 
  265                           int direction, 
int zt_clear)
 
  267    int nxp2, nxp, i, j, k, m, iter, mxp, j1, j2, n1, n2, it;
 
  268    Double_t a, b, c, d, sign, wpwr, arg, wr, wi, tr, ti, pi =
 
  269        3.14159265358979323846;
 
  270    Double_t val1, val2, val3, val4;
 
  271    if (direction == kTransformForward && zt_clear == 0) {
 
  272       for (i = 0; i < num; i++)
 
  273          working_space[i + num] = 0;
 
  282    if (direction == kTransformInverse)
 
  285    for (it = 1; it <= iter; it++) {
 
  290       for (m = 1; m <= nxp2; m++) {
 
  293          wr = TMath::Cos(arg);
 
  294          wi = sign * TMath::Sin(arg);
 
  295          for (mxp = nxp; mxp <= num; mxp += nxp) {
 
  298             val1 = working_space[j1 - 1];
 
  299             val2 = working_space[j2 - 1];
 
  300             val3 = working_space[j1 - 1 + num];
 
  301             val4 = working_space[j2 - 1 + num];
 
  310             working_space[j1 - 1] = val1;
 
  313             working_space[j1 - 1 + num] = val1;
 
  314             a = tr * wr - ti * wi;
 
  316             working_space[j2 - 1] = val1;
 
  317             a = ti * wr + tr * wi;
 
  319             working_space[j2 - 1 + num] = val1;
 
  326    for (i = 1; i <= n1; i++) {
 
  329       val1 = working_space[j - 1];
 
  330       val2 = working_space[j - 1 + num];
 
  331       val3 = working_space[i - 1];
 
  332       working_space[j - 1] = val3;
 
  333       working_space[j - 1 + num] = working_space[i - 1 + num];
 
  334       working_space[i - 1] = val1;
 
  335       working_space[i - 1 + num] = val2;
 
  337       lab60: 
if (k >= j) 
goto lab65;
 
  345    for (i = 0; i < num; i++) {
 
  347          val1 = working_space[i];
 
  351          working_space[i] = val1;
 
  352          b = working_space[i + num];
 
  354          working_space[i + num] = b;
 
  358          b = working_space[i];
 
  359          c = working_space[i + num];
 
  361          working_space[i] = b;
 
  362          working_space[i + num] = 0;
 
  365    if (hartley == 1 && direction == kTransformInverse) {
 
  366       for (i = 1; i < num; i++)
 
  367          working_space[num - i + num] = working_space[i];
 
  368       working_space[0 + num] = working_space[0];
 
  369       for (i = 0; i < num; i++) {
 
  370          working_space[i] = working_space[i + num];
 
  371          working_space[i + num] = 0;
 
  385 void TSpectrumTransform::BitReverseHaar(Double_t *working_space, 
int shift, 
int num,
 
  389    int i, ib, il, ibd, ip, ifac, i1;
 
  390    for (i = 0; i < num; i++) {
 
  391       working_space[i + shift + start] = working_space[i + start];
 
  392       working_space[i + shift + start + 2 * shift] =
 
  393           working_space[i + start + 2 * shift];
 
  395    for (i = 1; i <= num; i++) {
 
  409       for (i1 = 1; i1 <= il; i1++) {
 
  411          ip = ip + ifac * ipower[i1 - 1];
 
  413       working_space[ip - 1 + start] =
 
  414       working_space[i - 1 + shift + start];
 
  415       working_space[ip - 1 + start + 2 * shift] =
 
  416       working_space[i - 1 + shift + start + 2 * shift];
 
  430 int TSpectrumTransform::GeneralExe(Double_t *working_space, 
int zt_clear, 
int num,
 
  431                             int degree, 
int type)
 
  433    int i, j, k, m, nump, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter,
 
  434        mp2step, mppom, ring;
 
  435    Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
 
  436        3.14159265358979323846;
 
  437    Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
 
  439       for (i = 0; i < num; i++)
 
  440          working_space[i + 2 * num] = 0;
 
  453    for (i = 0; i < iter - degree; i++)
 
  455    for (m = 1; m <= iter; m++) {
 
  460            && (type == kTransformFourierHaar
 
  461                || type == kTransformWalshHaar
 
  462                || type == kTransformCosHaar
 
  463                || type == kTransformSinHaar))
 
  467       for (mp = 0; mp < nump; mp++) {
 
  468          if (type != kTransformWalshHaar) {
 
  470             mppom = mppom % ring;
 
  474             for (i = 0; i < (iter - 1); i++) {
 
  475                if ((mppom & j) != 0)
 
  481             wr = TMath::Cos(arg);
 
  482             wi = TMath::Sin(arg);
 
  490          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  491             mnum21 = mnum2 + mp2 + ib;
 
  493             if (mp2 % mp2step == 0) {
 
  496                a0r = 1 / TMath::Sqrt(2.0);
 
  497                b0r = 1 / TMath::Sqrt(2.0);
 
  504             val1 = working_space[iba];
 
  505             val2 = working_space[mnum21];
 
  506             val3 = working_space[iba + 2 * num];
 
  507             val4 = working_space[mnum21 + 2 * num];
 
  512             tr = a * a0r + b * b0r;
 
  514             working_space[num + iba] = val1;
 
  515             ti = c * a0r + d * b0r;
 
  517             working_space[num + iba + 2 * num] = val1;
 
  519                 a * b0r * wr - c * b0r * wi - b * a0r * wr + d * a0r * wi;
 
  521             working_space[num + mnum21] = val1;
 
  523                 c * b0r * wr + a * b0r * wi - d * a0r * wr - b * a0r * wi;
 
  525             working_space[num + mnum21 + 2 * num] = val1;
 
  528       for (i = 0; i < num; i++) {
 
  529          val1 = working_space[num + i];
 
  530          working_space[i] = val1;
 
  531          val1 = working_space[num + i + 2 * num];
 
  532          working_space[i + 2 * num] = val1;
 
  546 int TSpectrumTransform::GeneralInv(Double_t *working_space, 
int num, 
int degree,
 
  549    int i, j, k, m, nump =
 
  550        1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter, mp2step, mppom,
 
  552    Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
 
  553        3.14159265358979323846;
 
  554    Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
 
  564    if (type == kTransformFourierHaar || type == kTransformWalshHaar
 
  565         || type == kTransformCosHaar || type == kTransformSinHaar) {
 
  566       for (i = 0; i < iter - degree; i++)
 
  570    for (m = 1; m <= iter; m++) {
 
  578       if (m > iter - degree + 1)
 
  580       for (mp = nump - 1; mp >= 0; mp--) {
 
  581          if (type != kTransformWalshHaar) {
 
  583             mppom = mppom % ring;
 
  587             for (i = 0; i < (iter - 1); i++) {
 
  588                if ((mppom & j) != 0)
 
  594             wr = TMath::Cos(arg);
 
  595             wi = TMath::Sin(arg);
 
  603          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  604             mnum21 = mnum2 + mp2 + ib;
 
  606             if (mp2 % mp2step == 0) {
 
  609                a0r = 1 / TMath::Sqrt(2.0);
 
  610                b0r = 1 / TMath::Sqrt(2.0);
 
  617             val1 = working_space[iba];
 
  618             val2 = working_space[mnum21];
 
  619             val3 = working_space[iba + 2 * num];
 
  620             val4 = working_space[mnum21 + 2 * num];
 
  625             tr = a * a0r + b * wr * b0r + d * wi * b0r;
 
  627             working_space[num + iba] = val1;
 
  628             ti = c * a0r + d * wr * b0r - b * wi * b0r;
 
  630             working_space[num + iba + 2 * num] = val1;
 
  631             tr = a * b0r - b * wr * a0r - d * wi * a0r;
 
  633             working_space[num + mnum21] = val1;
 
  634             ti = c * b0r - d * wr * a0r + b * wi * a0r;
 
  636             working_space[num + mnum21 + 2 * num] = val1;
 
  639       if (m <= iter - degree
 
  640            && (type == kTransformFourierHaar
 
  641                || type == kTransformWalshHaar
 
  642                || type == kTransformCosHaar
 
  643                || type == kTransformSinHaar))
 
  645       for (i = 0; i < num; i++) {
 
  646          val1 = working_space[num + i];
 
  647          working_space[i] = val1;
 
  648          val1 = working_space[num + i + 2 * num];
 
  649          working_space[i + 2 * num] = val1;
 
  740 void TSpectrumTransform::Transform(
const Double_t *source, Double_t *destVector)
 
  742    int i, j=0, k = 1, m, l;
 
  744    Double_t a, b, pi = 3.14159265358979323846;
 
  745    Double_t *working_space = 0;
 
  746    if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
 
  747       if (fTransformType >= kTransformCosWalsh)
 
  749       k = (Int_t) TMath::Power(2, fDegree);
 
  752    switch (fTransformType) {
 
  754    case kTransformWalsh:
 
  755       working_space = 
new Double_t[2 * fSize];
 
  759    case kTransformFourier:
 
  760    case kTransformHartley:
 
  761    case kTransformFourierWalsh:
 
  762    case kTransformFourierHaar:
 
  763    case kTransformWalshHaar:
 
  764       working_space = 
new Double_t[4 * fSize];
 
  766    case kTransformCosWalsh:
 
  767    case kTransformCosHaar:
 
  768    case kTransformSinWalsh:
 
  769    case kTransformSinHaar:
 
  770       working_space = 
new Double_t[8 * fSize];
 
  773    if (fDirection == kTransformForward) {
 
  774       switch (fTransformType) {
 
  776          for (i = 0; i < fSize; i++) {
 
  777             working_space[i] = source[i];
 
  779          Haar(working_space, fSize, fDirection);
 
  780          for (i = 0; i < fSize; i++) {
 
  781             destVector[i] = working_space[i];
 
  784       case kTransformWalsh:
 
  785          for (i = 0; i < fSize; i++) {
 
  786             working_space[i] = source[i];
 
  788          Walsh(working_space, fSize);
 
  789          BitReverse(working_space, fSize);
 
  790          for (i = 0; i < fSize; i++) {
 
  791             destVector[i] = working_space[i];
 
  796          for (i = 1; i <= (fSize / 2); i++) {
 
  798             working_space[i - 1] = val;
 
  799             working_space[fSize - i] = val;
 
  801          Fourier(working_space, fSize, 0, kTransformForward, 0);
 
  802          for (i = 0; i < fSize / 2; i++) {
 
  803             a = pi * (Double_t) i / (Double_t) fSize;
 
  805             b = working_space[i];
 
  807             working_space[i] = a;
 
  808             working_space[i + fSize] = 0;
 
  809          } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
 
  810          for (i = 0; i < fSize / 2; i++) {
 
  811             destVector[i] = working_space[i];
 
  816          for (i = 1; i <= (fSize / 2); i++) {
 
  818             working_space[i - 1] = val;
 
  819             working_space[fSize - i] = -val;
 
  821          Fourier(working_space, fSize, 0, kTransformForward, 0);
 
  822          for (i = 0; i < fSize / 2; i++) {
 
  823             a = pi * (Double_t) i / (Double_t) fSize;
 
  825             b = working_space[i];
 
  828             working_space[i - 1] = a;
 
  829             working_space[i + fSize] = 0;
 
  831          working_space[fSize / 2 - 1] =
 
  832              working_space[fSize / 2] / TMath::Sqrt(2.0);
 
  833          for (i = 0; i < fSize / 2; i++) {
 
  834             destVector[i] = working_space[i];
 
  837       case kTransformFourier:
 
  838          for (i = 0; i < fSize; i++) {
 
  839             working_space[i] = source[i];
 
  841          Fourier(working_space, fSize, 0, kTransformForward, 0);
 
  842          for (i = 0; i < 2 * fSize; i++) {
 
  843             destVector[i] = working_space[i];
 
  846       case kTransformHartley:
 
  847          for (i = 0; i < fSize; i++) {
 
  848             working_space[i] = source[i];
 
  850          Fourier(working_space, fSize, 1, kTransformForward, 0);
 
  851          for (i = 0; i < fSize; i++) {
 
  852             destVector[i] = working_space[i];
 
  855       case kTransformFourierWalsh:
 
  856       case kTransformFourierHaar:
 
  857       case kTransformWalshHaar:
 
  858       case kTransformCosWalsh:
 
  859       case kTransformCosHaar:
 
  860       case kTransformSinWalsh:
 
  861       case kTransformSinHaar:
 
  862          for (i = 0; i < fSize; i++) {
 
  864             if (fTransformType == kTransformCosWalsh
 
  865                  || fTransformType == kTransformCosHaar) {
 
  866                j = (Int_t) TMath::Power(2, fDegree) / 2;
 
  869                working_space[k + i % j] = val;
 
  870                working_space[k + 2 * j - 1 - i % j] = val;
 
  873             else if (fTransformType == kTransformSinWalsh
 
  874                      || fTransformType == kTransformSinHaar) {
 
  875                j = (Int_t) TMath::Power(2, fDegree) / 2;
 
  878                working_space[k + i % j] = val;
 
  879                working_space[k + 2 * j - 1 - i % j] = -val;
 
  883                working_space[i] = val;
 
  885          if (fTransformType == kTransformFourierWalsh
 
  886               || fTransformType == kTransformFourierHaar
 
  887               || fTransformType == kTransformWalshHaar) {
 
  888             for (i = 0; i < j; i++)
 
  889                BitReverseHaar(working_space, fSize, k, i * k);
 
  890             GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
 
  893          else if (fTransformType == kTransformCosWalsh
 
  894                   || fTransformType == kTransformCosHaar) {
 
  895             m = (Int_t) TMath::Power(2, fDegree);
 
  897             for (i = 0; i < l; i++)
 
  898                BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
  899             GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
  900             for (i = 0; i < fSize; i++) {
 
  903                a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
  905                b = working_space[k + i % j];
 
  907                   a = b / TMath::Sqrt(2.0);
 
  911                working_space[i] = a;
 
  912                working_space[i + 2 * fSize] = 0;
 
  916          else if (fTransformType == kTransformSinWalsh
 
  917                   || fTransformType == kTransformSinHaar) {
 
  918             m = (Int_t) TMath::Power(2, fDegree);
 
  920             for (i = 0; i < l; i++)
 
  921                BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
  922             GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
  923             for (i = 0; i < fSize; i++) {
 
  926                a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
  928                b = working_space[j + k + i % j];
 
  930                   a = b / TMath::Sqrt(2.0);
 
  934                working_space[j + k / 2 - i % j - 1] = a;
 
  935                working_space[i + 2 * fSize] = 0;
 
  938          if (fTransformType > kTransformWalshHaar)
 
  939             k = (Int_t) TMath::Power(2, fDegree - 1);
 
  942             k = (Int_t) TMath::Power(2, fDegree);
 
  944          for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
  945             working_space[fSize + i] = working_space[l + i / j];
 
  946             working_space[fSize + i + 2 * fSize] =
 
  947                 working_space[l + i / j + 2 * fSize];
 
  949          for (i = 0; i < fSize; i++) {
 
  950             working_space[i] = working_space[fSize + i];
 
  951             working_space[i + 2 * fSize] =
 
  952                 working_space[fSize + i + 2 * fSize];
 
  954          for (i = 0; i < fSize; i++) {
 
  955             destVector[i] = working_space[i];
 
  957          if (fTransformType == kTransformFourierWalsh
 
  958               || fTransformType == kTransformFourierHaar) {
 
  959             for (i = 0; i < fSize; i++) {
 
  960                destVector[fSize + i] = working_space[i + 2 * fSize];
 
  967    else if (fDirection == kTransformInverse) {
 
  968       switch (fTransformType) {
 
  970          for (i = 0; i < fSize; i++) {
 
  971             working_space[i] = source[i];
 
  973          Haar(working_space, fSize, fDirection);
 
  974          for (i = 0; i < fSize; i++) {
 
  975             destVector[i] = working_space[i];
 
  978       case kTransformWalsh:
 
  979          for (i = 0; i < fSize; i++) {
 
  980             working_space[i] = source[i];
 
  982          BitReverse(working_space, fSize);
 
  983          Walsh(working_space, fSize);
 
  984          for (i = 0; i < fSize; i++) {
 
  985             destVector[i] = working_space[i];
 
  989          for (i = 0; i < fSize; i++) {
 
  990             working_space[i] = source[i];
 
  993          working_space[0] = working_space[0] * TMath::Sqrt(2.0);
 
  994          for (i = 0; i < fSize / 2; i++) {
 
  995             a = pi * (Double_t) i / (Double_t) fSize;
 
  998             working_space[i + fSize] = (Double_t) working_space[i] * b;
 
  999             working_space[i] = (Double_t) working_space[i] * a;
 
 1000          } for (i = 2; i <= (fSize / 2); i++) {
 
 1001             working_space[fSize - i + 1] = working_space[i - 1];
 
 1002             working_space[fSize - i + 1 + fSize] =
 
 1003                 -working_space[i - 1 + fSize];
 
 1005          working_space[fSize / 2] = 0;
 
 1006          working_space[fSize / 2 + fSize] = 0;
 
 1007          Fourier(working_space, fSize, 0, kTransformInverse, 1);
 
 1008          for (i = 0; i < fSize / 2; i++) {
 
 1009             destVector[i] = working_space[i];
 
 1013          for (i = 0; i < fSize; i++) {
 
 1014             working_space[i] = source[i];
 
 1017          working_space[fSize / 2] =
 
 1018              working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
 
 1019          for (i = fSize / 2 - 1; i > 0; i--) {
 
 1020             a = pi * (Double_t) i / (Double_t) fSize;
 
 1021             working_space[i + fSize] =
 
 1022                 -(Double_t) working_space[i - 1] * TMath::Cos(a);
 
 1024                 (Double_t) working_space[i - 1] * TMath::Sin(a);
 
 1025          } for (i = 2; i <= (fSize / 2); i++) {
 
 1026             working_space[fSize - i + 1] = working_space[i - 1];
 
 1027             working_space[fSize - i + 1 + fSize] =
 
 1028                 -working_space[i - 1 + fSize];
 
 1030          working_space[0] = 0;
 
 1031          working_space[fSize] = 0;
 
 1032          working_space[fSize / 2 + fSize] = 0;
 
 1033          Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 1034          for (i = 0; i < fSize / 2; i++) {
 
 1035             destVector[i] = working_space[i];
 
 1038       case kTransformFourier:
 
 1039          for (i = 0; i < 2 * fSize; i++) {
 
 1040             working_space[i] = source[i];
 
 1042          Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 1043          for (i = 0; i < fSize; i++) {
 
 1044             destVector[i] = working_space[i];
 
 1047       case kTransformHartley:
 
 1048          for (i = 0; i < fSize; i++) {
 
 1049             working_space[i] = source[i];
 
 1051          Fourier(working_space, fSize, 1, kTransformInverse, 0);
 
 1052          for (i = 0; i < fSize; i++) {
 
 1053             destVector[i] = working_space[i];
 
 1056       case kTransformFourierWalsh:
 
 1057       case kTransformFourierHaar:
 
 1058       case kTransformWalshHaar:
 
 1059       case kTransformCosWalsh:
 
 1060       case kTransformCosHaar:
 
 1061       case kTransformSinWalsh:
 
 1062       case kTransformSinHaar:
 
 1063          for (i = 0; i < fSize; i++) {
 
 1064             working_space[i] = source[i];
 
 1066          if (fTransformType == kTransformFourierWalsh
 
 1067               || fTransformType == kTransformFourierHaar) {
 
 1068             for (i = 0; i < fSize; i++) {
 
 1069                working_space[i + 2 * fSize] = source[fSize + i];
 
 1072          if (fTransformType > kTransformWalshHaar)
 
 1073             k = (Int_t) TMath::Power(2, fDegree - 1);
 
 1076             k = (Int_t) TMath::Power(2, fDegree);
 
 1078          for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
 1079             working_space[fSize + l + i / j] = working_space[i];
 
 1080             working_space[fSize + l + i / j + 2 * fSize] =
 
 1081                 working_space[i + 2 * fSize];
 
 1083          for (i = 0; i < fSize; i++) {
 
 1084             working_space[i] = working_space[fSize + i];
 
 1085             working_space[i + 2 * fSize] =
 
 1086                 working_space[fSize + i + 2 * fSize];
 
 1088          if (fTransformType == kTransformFourierWalsh
 
 1089               || fTransformType == kTransformFourierHaar
 
 1090               || fTransformType == kTransformWalshHaar) {
 
 1091             GeneralInv(working_space, fSize, fDegree, fTransformType);
 
 1092             for (i = 0; i < j; i++)
 
 1093                BitReverseHaar(working_space, fSize, k, i * k);
 
 1096          else if (fTransformType == kTransformCosWalsh
 
 1097                   || fTransformType == kTransformCosHaar) {
 
 1098             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1099             m = (Int_t) TMath::Power(2, fDegree);
 
 1101             for (i = 0; i < fSize; i++) {
 
 1104                a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1106                   working_space[2 * fSize + k + i % j] =
 
 1107                       working_space[i] * TMath::Sqrt(2.0);
 
 1108                   working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
 
 1114                   working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 1115                       -(Double_t) working_space[i] * b;
 
 1116                   working_space[2 * fSize + k + i % j] =
 
 1117                       (Double_t) working_space[i] * a;
 
 1118             } } 
for (i = 0; i < fSize; i++) {
 
 1122                   working_space[2 * fSize + k + j] = 0;
 
 1123                   working_space[4 * fSize + 2 * fSize + k + j] = 0;
 
 1127                   working_space[2 * fSize + k + 2 * j - i % j] =
 
 1128                       working_space[2 * fSize + k + i % j];
 
 1129                   working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
 
 1130                       -working_space[4 * fSize + 2 * fSize + k + i % j];
 
 1133             for (i = 0; i < 2 * fSize; i++) {
 
 1134                working_space[i] = working_space[2 * fSize + i];
 
 1135                working_space[4 * fSize + i] =
 
 1136                    working_space[4 * fSize + 2 * fSize + i];
 
 1138             GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 1139             m = (Int_t) TMath::Power(2, fDegree);
 
 1141             for (i = 0; i < l; i++)
 
 1142                BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1145          else if (fTransformType == kTransformSinWalsh
 
 1146                   || fTransformType == kTransformSinHaar) {
 
 1147             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1148             m = (Int_t) TMath::Power(2, fDegree);
 
 1150             for (i = 0; i < fSize; i++) {
 
 1153                a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1155                   working_space[2 * fSize + k + j + i % j] =
 
 1156                       working_space[j + k / 2 - i % j -
 
 1157                                     1] * TMath::Sqrt(2.0);
 
 1158                   working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
 
 1164                   working_space[4 * fSize + 2 * fSize + k + j + i % j] =
 
 1165                       -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
 
 1166                   working_space[2 * fSize + k + j + i % j] =
 
 1167                       (Double_t) working_space[j + k / 2 - i % j - 1] * a;
 
 1168             } } 
for (i = 0; i < fSize; i++) {
 
 1172                   working_space[2 * fSize + k] = 0;
 
 1173                   working_space[4 * fSize + 2 * fSize + k] = 0;
 
 1177                   working_space[2 * fSize + k + i % j] =
 
 1178                       working_space[2 * fSize + k + 2 * j - i % j];
 
 1179                   working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 1180                       -working_space[4 * fSize + 2 * fSize + k + 2 * j -
 
 1184             for (i = 0; i < 2 * fSize; i++) {
 
 1185                working_space[i] = working_space[2 * fSize + i];
 
 1186                working_space[4 * fSize + i] =
 
 1187                    working_space[4 * fSize + 2 * fSize + i];
 
 1189             GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 1190             for (i = 0; i < l; i++)
 
 1191                BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1193          for (i = 0; i < fSize; i++) {
 
 1194             if (fTransformType >= kTransformCosWalsh) {
 
 1197                val = working_space[k + i % j];
 
 1201                val = working_space[i];
 
 1202             destVector[i] = val;
 
 1207    delete[]working_space;
 
 1268 void TSpectrumTransform::FilterZonal(
const Double_t *source, Double_t *destVector)
 
 1270    int i, j=0, k = 1, m, l;
 
 1272    Double_t *working_space = 0;
 
 1273    Double_t a, b, pi = 3.14159265358979323846, old_area, new_area;
 
 1274    if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
 
 1275       if (fTransformType >= kTransformCosWalsh)
 
 1277       k = (Int_t) TMath::Power(2, fDegree);
 
 1280    switch (fTransformType) {
 
 1281    case kTransformHaar:
 
 1282    case kTransformWalsh:
 
 1283       working_space = 
new Double_t[2 * fSize];
 
 1287    case kTransformFourier:
 
 1288    case kTransformHartley:
 
 1289    case kTransformFourierWalsh:
 
 1290    case kTransformFourierHaar:
 
 1291    case kTransformWalshHaar:
 
 1292       working_space = 
new Double_t[4 * fSize];
 
 1294    case kTransformCosWalsh:
 
 1295    case kTransformCosHaar:
 
 1296    case kTransformSinWalsh:
 
 1297    case kTransformSinHaar:
 
 1298       working_space = 
new Double_t[8 * fSize];
 
 1301    switch (fTransformType) {
 
 1302    case kTransformHaar:
 
 1303       for (i = 0; i < fSize; i++) {
 
 1304          working_space[i] = source[i];
 
 1306       Haar(working_space, fSize, kTransformForward);
 
 1308    case kTransformWalsh:
 
 1309       for (i = 0; i < fSize; i++) {
 
 1310          working_space[i] = source[i];
 
 1312       Walsh(working_space, fSize);
 
 1313       BitReverse(working_space, fSize);
 
 1317       for (i = 1; i <= (fSize / 2); i++) {
 
 1318          val = source[i - 1];
 
 1319          working_space[i - 1] = val;
 
 1320          working_space[fSize - i] = val;
 
 1322       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1323       for (i = 0; i < fSize / 2; i++) {
 
 1324          a = pi * (Double_t) i / (Double_t) fSize;
 
 1326          b = working_space[i];
 
 1328          working_space[i] = a;
 
 1329          working_space[i + fSize] = 0;
 
 1330       } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
 
 1335       for (i = 1; i <= (fSize / 2); i++) {
 
 1336          val = source[i - 1];
 
 1337          working_space[i - 1] = val;
 
 1338          working_space[fSize - i] = -val;
 
 1340       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1341       for (i = 0; i < fSize / 2; i++) {
 
 1342          a = pi * (Double_t) i / (Double_t) fSize;
 
 1344          b = working_space[i];
 
 1347          working_space[i - 1] = a;
 
 1348          working_space[i + fSize] = 0;
 
 1350       working_space[fSize / 2 - 1] =
 
 1351           working_space[fSize / 2] / TMath::Sqrt(2.0);
 
 1354    case kTransformFourier:
 
 1355       for (i = 0; i < fSize; i++) {
 
 1356          working_space[i] = source[i];
 
 1358       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1360    case kTransformHartley:
 
 1361       for (i = 0; i < fSize; i++) {
 
 1362          working_space[i] = source[i];
 
 1364       Fourier(working_space, fSize, 1, kTransformForward, 0);
 
 1366    case kTransformFourierWalsh:
 
 1367    case kTransformFourierHaar:
 
 1368    case kTransformWalshHaar:
 
 1369    case kTransformCosWalsh:
 
 1370    case kTransformCosHaar:
 
 1371    case kTransformSinWalsh:
 
 1372    case kTransformSinHaar:
 
 1373       for (i = 0; i < fSize; i++) {
 
 1375          if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 1376             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1379             working_space[k + i % j] = val;
 
 1380             working_space[k + 2 * j - 1 - i % j] = val;
 
 1383          else if (fTransformType == kTransformSinWalsh
 
 1384                   || fTransformType == kTransformSinHaar) {
 
 1385             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1388             working_space[k + i % j] = val;
 
 1389             working_space[k + 2 * j - 1 - i % j] = -val;
 
 1393             working_space[i] = val;
 
 1395       if (fTransformType == kTransformFourierWalsh
 
 1396            || fTransformType == kTransformFourierHaar
 
 1397            || fTransformType == kTransformWalshHaar) {
 
 1398          for (i = 0; i < j; i++)
 
 1399             BitReverseHaar(working_space, fSize, k, i * k);
 
 1400          GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
 
 1403       else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 1404          m = (Int_t) TMath::Power(2, fDegree);
 
 1406          for (i = 0; i < l; i++)
 
 1407             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1408          GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
 1409          for (i = 0; i < fSize; i++) {
 
 1412             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1414             b = working_space[k + i % j];
 
 1416                a = b / TMath::Sqrt(2.0);
 
 1420             working_space[i] = a;
 
 1421             working_space[i + 2 * fSize] = 0;
 
 1425       else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
 
 1426          m = (Int_t) TMath::Power(2, fDegree);
 
 1428          for (i = 0; i < l; i++)
 
 1429             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1430          GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
 1431          for (i = 0; i < fSize; i++) {
 
 1434             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1436             b = working_space[j + k + i % j];
 
 1438                a = b / TMath::Sqrt(2.0);
 
 1442             working_space[j + k / 2 - i % j - 1] = a;
 
 1443             working_space[i + 2 * fSize] = 0;
 
 1446       if (fTransformType > kTransformWalshHaar)
 
 1447          k = (Int_t) TMath::Power(2, fDegree - 1);
 
 1450          k = (Int_t) TMath::Power(2, fDegree);
 
 1452       for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
 1453          working_space[fSize + i] = working_space[l + i / j];
 
 1454          working_space[fSize + i + 2 * fSize] =
 
 1455              working_space[l + i / j + 2 * fSize];
 
 1457       for (i = 0; i < fSize; i++) {
 
 1458          working_space[i] = working_space[fSize + i];
 
 1459          working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
 
 1463    if (!working_space) 
return;
 
 1464    for (i = 0, old_area = 0; i < fSize; i++) {
 
 1465       old_area += working_space[i];
 
 1467    for (i = 0, new_area = 0; i < fSize; i++) {
 
 1468       if (i >= fXmin && i <= fXmax)
 
 1469          working_space[i] = fFilterCoeff;
 
 1470       new_area += working_space[i];
 
 1472    if (new_area != 0) {
 
 1473       a = old_area / new_area;
 
 1474       for (i = 0; i < fSize; i++) {
 
 1475          working_space[i] *= a;
 
 1478    if (fTransformType == kTransformFourier) {
 
 1479       for (i = 0, old_area = 0; i < fSize; i++) {
 
 1480          old_area += working_space[i + fSize];
 
 1482       for (i = 0, new_area = 0; i < fSize; i++) {
 
 1483          if (i >= fXmin && i <= fXmax)
 
 1484             working_space[i + fSize] = fFilterCoeff;
 
 1485          new_area += working_space[i + fSize];
 
 1487       if (new_area != 0) {
 
 1488          a = old_area / new_area;
 
 1489          for (i = 0; i < fSize; i++) {
 
 1490             working_space[i + fSize] *= a;
 
 1495    else if (fTransformType == kTransformFourierWalsh
 
 1496             || fTransformType == kTransformFourierHaar) {
 
 1497       for (i = 0, old_area = 0; i < fSize; i++) {
 
 1498          old_area += working_space[i + 2 * fSize];
 
 1500       for (i = 0, new_area = 0; i < fSize; i++) {
 
 1501          if (i >= fXmin && i <= fXmax)
 
 1502             working_space[i + 2 * fSize] = fFilterCoeff;
 
 1503          new_area += working_space[i + 2 * fSize];
 
 1505       if (new_area != 0) {
 
 1506          a = old_area / new_area;
 
 1507          for (i = 0; i < fSize; i++) {
 
 1508             working_space[i + 2 * fSize] *= a;
 
 1512    switch (fTransformType) {
 
 1513    case kTransformHaar:
 
 1514       Haar(working_space, fSize, kTransformInverse);
 
 1515       for (i = 0; i < fSize; i++) {
 
 1516          destVector[i] = working_space[i];
 
 1519    case kTransformWalsh:
 
 1520       BitReverse(working_space, fSize);
 
 1521       Walsh(working_space, fSize);
 
 1522       for (i = 0; i < fSize; i++) {
 
 1523          destVector[i] = working_space[i];
 
 1528       working_space[0] = working_space[0] * TMath::Sqrt(2.0);
 
 1529       for (i = 0; i < fSize / 2; i++) {
 
 1530          a = pi * (Double_t) i / (Double_t) fSize;
 
 1533          working_space[i + fSize] = (Double_t) working_space[i] * b;
 
 1534          working_space[i] = (Double_t) working_space[i] * a;
 
 1535       } for (i = 2; i <= (fSize / 2); i++) {
 
 1536          working_space[fSize - i + 1] = working_space[i - 1];
 
 1537          working_space[fSize - i + 1 + fSize] =
 
 1538              -working_space[i - 1 + fSize];
 
 1540       working_space[fSize / 2] = 0;
 
 1541       working_space[fSize / 2 + fSize] = 0;
 
 1542       Fourier(working_space, fSize, 0, kTransformInverse, 1);
 
 1543       for (i = 0; i < fSize / 2; i++) {
 
 1544          destVector[i] = working_space[i];
 
 1549       working_space[fSize / 2] =
 
 1550           working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
 
 1551       for (i = fSize / 2 - 1; i > 0; i--) {
 
 1552          a = pi * (Double_t) i / (Double_t) fSize;
 
 1553          working_space[i + fSize] =
 
 1554              -(Double_t) working_space[i - 1] * TMath::Cos(a);
 
 1555          working_space[i] = (Double_t) working_space[i - 1] * TMath::Sin(a);
 
 1556       } for (i = 2; i <= (fSize / 2); i++) {
 
 1557          working_space[fSize - i + 1] = working_space[i - 1];
 
 1558          working_space[fSize - i + 1 + fSize] =
 
 1559              -working_space[i - 1 + fSize];
 
 1561       working_space[0] = 0;
 
 1562       working_space[fSize] = 0;
 
 1563       working_space[fSize / 2 + fSize] = 0;
 
 1564       Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 1565       for (i = 0; i < fSize / 2; i++) {
 
 1566          destVector[i] = working_space[i];
 
 1569    case kTransformFourier:
 
 1570       Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 1571       for (i = 0; i < fSize; i++) {
 
 1572          destVector[i] = working_space[i];
 
 1575    case kTransformHartley:
 
 1576       Fourier(working_space, fSize, 1, kTransformInverse, 0);
 
 1577       for (i = 0; i < fSize; i++) {
 
 1578          destVector[i] = working_space[i];
 
 1581    case kTransformFourierWalsh:
 
 1582    case kTransformFourierHaar:
 
 1583    case kTransformWalshHaar:
 
 1584    case kTransformCosWalsh:
 
 1585    case kTransformCosHaar:
 
 1586    case kTransformSinWalsh:
 
 1587    case kTransformSinHaar:
 
 1588       if (fTransformType > kTransformWalshHaar)
 
 1589          k = (Int_t) TMath::Power(2, fDegree - 1);
 
 1592          k = (Int_t) TMath::Power(2, fDegree);
 
 1594       for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
 1595          working_space[fSize + l + i / j] = working_space[i];
 
 1596          working_space[fSize + l + i / j + 2 * fSize] =
 
 1597              working_space[i + 2 * fSize];
 
 1599       for (i = 0; i < fSize; i++) {
 
 1600          working_space[i] = working_space[fSize + i];
 
 1601          working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
 
 1603       if (fTransformType == kTransformFourierWalsh
 
 1604            || fTransformType == kTransformFourierHaar
 
 1605            || fTransformType == kTransformWalshHaar) {
 
 1606          GeneralInv(working_space, fSize, fDegree, fTransformType);
 
 1607          for (i = 0; i < j; i++)
 
 1608             BitReverseHaar(working_space, fSize, k, i * k);
 
 1611       else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 1612          j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1613          m = (Int_t) TMath::Power(2, fDegree);
 
 1615          for (i = 0; i < fSize; i++) {
 
 1618             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1620                working_space[2 * fSize + k + i % j] =
 
 1621                    working_space[i] * TMath::Sqrt(2.0);
 
 1622                working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
 
 1628                working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 1629                    -(Double_t) working_space[i] * b;
 
 1630                working_space[2 * fSize + k + i % j] =
 
 1631                    (Double_t) working_space[i] * a;
 
 1632          } } 
for (i = 0; i < fSize; i++) {
 
 1636                working_space[2 * fSize + k + j] = 0;
 
 1637                working_space[4 * fSize + 2 * fSize + k + j] = 0;
 
 1641                working_space[2 * fSize + k + 2 * j - i % j] =
 
 1642                    working_space[2 * fSize + k + i % j];
 
 1643                working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
 
 1644                    -working_space[4 * fSize + 2 * fSize + k + i % j];
 
 1647          for (i = 0; i < 2 * fSize; i++) {
 
 1648             working_space[i] = working_space[2 * fSize + i];
 
 1649             working_space[4 * fSize + i] =
 
 1650                 working_space[4 * fSize + 2 * fSize + i];
 
 1652          GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 1653          m = (Int_t) TMath::Power(2, fDegree);
 
 1655          for (i = 0; i < l; i++)
 
 1656             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1659       else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
 
 1660          j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1661          m = (Int_t) TMath::Power(2, fDegree);
 
 1663          for (i = 0; i < fSize; i++) {
 
 1666             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1668                working_space[2 * fSize + k + j + i % j] =
 
 1669                    working_space[j + k / 2 - i % j - 1] * TMath::Sqrt(2.0);
 
 1670                working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
 
 1676                working_space[4 * fSize + 2 * fSize + k + j + i % j] =
 
 1677                    -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
 
 1678                working_space[2 * fSize + k + j + i % j] =
 
 1679                    (Double_t) working_space[j + k / 2 - i % j - 1] * a;
 
 1680          } } 
for (i = 0; i < fSize; i++) {
 
 1684                working_space[2 * fSize + k] = 0;
 
 1685                working_space[4 * fSize + 2 * fSize + k] = 0;
 
 1689                working_space[2 * fSize + k + i % j] =
 
 1690                    working_space[2 * fSize + k + 2 * j - i % j];
 
 1691                working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 1692                    -working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j];
 
 1695          for (i = 0; i < 2 * fSize; i++) {
 
 1696             working_space[i] = working_space[2 * fSize + i];
 
 1697             working_space[4 * fSize + i] =
 
 1698                 working_space[4 * fSize + 2 * fSize + i];
 
 1700          GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 1701          for (i = 0; i < l; i++)
 
 1702             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1704       for (i = 0; i < fSize; i++) {
 
 1705          if (fTransformType >= kTransformCosWalsh) {
 
 1708             val = working_space[k + i % j];
 
 1712             val = working_space[i];
 
 1713          destVector[i] = val;
 
 1717    delete[]working_space;
 
 1778 void TSpectrumTransform::Enhance(
const Double_t *source, Double_t *destVector)
 
 1780    int i, j=0, k = 1, m, l;
 
 1782    Double_t *working_space = 0;
 
 1783    Double_t a, b, pi = 3.14159265358979323846, old_area, new_area;
 
 1784    if (fTransformType >= kTransformFourierWalsh && fTransformType <= kTransformSinHaar) {
 
 1785       if (fTransformType >= kTransformCosWalsh)
 
 1787       k = (Int_t) TMath::Power(2, fDegree);
 
 1790    switch (fTransformType) {
 
 1791    case kTransformHaar:
 
 1792    case kTransformWalsh:
 
 1793       working_space = 
new Double_t[2 * fSize];
 
 1797    case kTransformFourier:
 
 1798    case kTransformHartley:
 
 1799    case kTransformFourierWalsh:
 
 1800    case kTransformFourierHaar:
 
 1801    case kTransformWalshHaar:
 
 1802       working_space = 
new Double_t[4 * fSize];
 
 1804    case kTransformCosWalsh:
 
 1805    case kTransformCosHaar:
 
 1806    case kTransformSinWalsh:
 
 1807    case kTransformSinHaar:
 
 1808       working_space = 
new Double_t[8 * fSize];
 
 1811    switch (fTransformType) {
 
 1812    case kTransformHaar:
 
 1813       for (i = 0; i < fSize; i++) {
 
 1814          working_space[i] = source[i];
 
 1816       Haar(working_space, fSize, kTransformForward);
 
 1818    case kTransformWalsh:
 
 1819       for (i = 0; i < fSize; i++) {
 
 1820          working_space[i] = source[i];
 
 1822       Walsh(working_space, fSize);
 
 1823       BitReverse(working_space, fSize);
 
 1827       for (i = 1; i <= (fSize / 2); i++) {
 
 1828          val = source[i - 1];
 
 1829          working_space[i - 1] = val;
 
 1830          working_space[fSize - i] = val;
 
 1832       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1833       for (i = 0; i < fSize / 2; i++) {
 
 1834          a = pi * (Double_t) i / (Double_t) fSize;
 
 1836          b = working_space[i];
 
 1838          working_space[i] = a;
 
 1839          working_space[i + fSize] = 0;
 
 1840       } working_space[0] = working_space[0] / TMath::Sqrt(2.0);
 
 1845       for (i = 1; i <= (fSize / 2); i++) {
 
 1846          val = source[i - 1];
 
 1847          working_space[i - 1] = val;
 
 1848          working_space[fSize - i] = -val;
 
 1850       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1851       for (i = 0; i < fSize / 2; i++) {
 
 1852          a = pi * (Double_t) i / (Double_t) fSize;
 
 1854          b = working_space[i];
 
 1857          working_space[i - 1] = a;
 
 1858          working_space[i + fSize] = 0;
 
 1860       working_space[fSize / 2 - 1] =
 
 1861           working_space[fSize / 2] / TMath::Sqrt(2.0);
 
 1864    case kTransformFourier:
 
 1865       for (i = 0; i < fSize; i++) {
 
 1866          working_space[i] = source[i];
 
 1868       Fourier(working_space, fSize, 0, kTransformForward, 0);
 
 1870    case kTransformHartley:
 
 1871       for (i = 0; i < fSize; i++) {
 
 1872          working_space[i] = source[i];
 
 1874       Fourier(working_space, fSize, 1, kTransformForward, 0);
 
 1876    case kTransformFourierWalsh:
 
 1877    case kTransformFourierHaar:
 
 1878    case kTransformWalshHaar:
 
 1879    case kTransformCosWalsh:
 
 1880    case kTransformCosHaar:
 
 1881    case kTransformSinWalsh:
 
 1882    case kTransformSinHaar:
 
 1883       for (i = 0; i < fSize; i++) {
 
 1885          if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 1886             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1889             working_space[k + i % j] = val;
 
 1890             working_space[k + 2 * j - 1 - i % j] = val;
 
 1893          else if (fTransformType == kTransformSinWalsh
 
 1894                   || fTransformType == kTransformSinHaar) {
 
 1895             j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 1898             working_space[k + i % j] = val;
 
 1899             working_space[k + 2 * j - 1 - i % j] = -val;
 
 1903             working_space[i] = val;
 
 1905       if (fTransformType == kTransformFourierWalsh
 
 1906            || fTransformType == kTransformFourierHaar
 
 1907            || fTransformType == kTransformWalshHaar) {
 
 1908          for (i = 0; i < j; i++)
 
 1909             BitReverseHaar(working_space, fSize, k, i * k);
 
 1910          GeneralExe(working_space, 0, fSize, fDegree, fTransformType);
 
 1913       else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 1914          m = (Int_t) TMath::Power(2, fDegree);
 
 1916          for (i = 0; i < l; i++)
 
 1917             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1918          GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
 1919          for (i = 0; i < fSize; i++) {
 
 1922             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1924             b = working_space[k + i % j];
 
 1926                a = b / TMath::Sqrt(2.0);
 
 1930             working_space[i] = a;
 
 1931             working_space[i + 2 * fSize] = 0;
 
 1935       else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
 
 1936          m = (Int_t) TMath::Power(2, fDegree);
 
 1938          for (i = 0; i < l; i++)
 
 1939             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 1940          GeneralExe(working_space, 0, 2 * fSize, fDegree, fTransformType);
 
 1941          for (i = 0; i < fSize; i++) {
 
 1944             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 1946             b = working_space[j + k + i % j];
 
 1948                a = b / TMath::Sqrt(2.0);
 
 1952             working_space[j + k / 2 - i % j - 1] = a;
 
 1953             working_space[i + 2 * fSize] = 0;
 
 1956       if (fTransformType > kTransformWalshHaar)
 
 1957          k = (Int_t) TMath::Power(2, fDegree - 1);
 
 1960          k = (Int_t) TMath::Power(2, fDegree);
 
 1962       for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
 1963          working_space[fSize + i] = working_space[l + i / j];
 
 1964          working_space[fSize + i + 2 * fSize] =
 
 1965              working_space[l + i / j + 2 * fSize];
 
 1967       for (i = 0; i < fSize; i++) {
 
 1968          working_space[i] = working_space[fSize + i];
 
 1969          working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
 
 1973    if (!working_space) 
return;
 
 1974    for (i = 0, old_area = 0; i < fSize; i++) {
 
 1975       old_area += working_space[i];
 
 1977    for (i = 0, new_area = 0; i < fSize; i++) {
 
 1978       if (i >= fXmin && i <= fXmax)
 
 1979          working_space[i] *= fEnhanceCoeff;
 
 1980       new_area += working_space[i];
 
 1982    if (new_area != 0) {
 
 1983       a = old_area / new_area;
 
 1984       for (i = 0; i < fSize; i++) {
 
 1985          working_space[i] *= a;
 
 1988    if (fTransformType == kTransformFourier) {
 
 1989       for (i = 0, old_area = 0; i < fSize; i++) {
 
 1990          old_area += working_space[i + fSize];
 
 1992       for (i = 0, new_area = 0; i < fSize; i++) {
 
 1993          if (i >= fXmin && i <= fXmax)
 
 1994             working_space[i + fSize] *= fEnhanceCoeff;
 
 1995          new_area += working_space[i + fSize];
 
 1997       if (new_area != 0) {
 
 1998          a = old_area / new_area;
 
 1999          for (i = 0; i < fSize; i++) {
 
 2000             working_space[i + fSize] *= a;
 
 2005    else if (fTransformType == kTransformFourierWalsh
 
 2006             || fTransformType == kTransformFourierHaar) {
 
 2007       for (i = 0, old_area = 0; i < fSize; i++) {
 
 2008          old_area += working_space[i + 2 * fSize];
 
 2010       for (i = 0, new_area = 0; i < fSize; i++) {
 
 2011          if (i >= fXmin && i <= fXmax)
 
 2012             working_space[i + 2 * fSize] *= fEnhanceCoeff;
 
 2013          new_area += working_space[i + 2 * fSize];
 
 2015       if (new_area != 0) {
 
 2016          a = old_area / new_area;
 
 2017          for (i = 0; i < fSize; i++) {
 
 2018             working_space[i + 2 * fSize] *= a;
 
 2022    switch (fTransformType) {
 
 2023    case kTransformHaar:
 
 2024       Haar(working_space, fSize, kTransformInverse);
 
 2025       for (i = 0; i < fSize; i++) {
 
 2026          destVector[i] = working_space[i];
 
 2029    case kTransformWalsh:
 
 2030       BitReverse(working_space, fSize);
 
 2031       Walsh(working_space, fSize);
 
 2032       for (i = 0; i < fSize; i++) {
 
 2033          destVector[i] = working_space[i];
 
 2038       working_space[0] = working_space[0] * TMath::Sqrt(2.0);
 
 2039       for (i = 0; i < fSize / 2; i++) {
 
 2040          a = pi * (Double_t) i / (Double_t) fSize;
 
 2043          working_space[i + fSize] = (Double_t) working_space[i] * b;
 
 2044          working_space[i] = (Double_t) working_space[i] * a;
 
 2045       } for (i = 2; i <= (fSize / 2); i++) {
 
 2046          working_space[fSize - i + 1] = working_space[i - 1];
 
 2047          working_space[fSize - i + 1 + fSize] =
 
 2048              -working_space[i - 1 + fSize];
 
 2050       working_space[fSize / 2] = 0;
 
 2051       working_space[fSize / 2 + fSize] = 0;
 
 2052       Fourier(working_space, fSize, 0, kTransformInverse, 1);
 
 2053       for (i = 0; i < fSize / 2; i++) {
 
 2054          destVector[i] = working_space[i];
 
 2059       working_space[fSize / 2] =
 
 2060           working_space[fSize / 2 - 1] * TMath::Sqrt(2.0);
 
 2061       for (i = fSize / 2 - 1; i > 0; i--) {
 
 2062          a = pi * (Double_t) i / (Double_t) fSize;
 
 2063          working_space[i + fSize] =
 
 2064              -(Double_t) working_space[i - 1] * TMath::Cos(a);
 
 2065          working_space[i] = (Double_t) working_space[i - 1] * TMath::Sin(a);
 
 2066       } for (i = 2; i <= (fSize / 2); i++) {
 
 2067          working_space[fSize - i + 1] = working_space[i - 1];
 
 2068          working_space[fSize - i + 1 + fSize] =
 
 2069              -working_space[i - 1 + fSize];
 
 2071       working_space[0] = 0;
 
 2072       working_space[fSize] = 0;
 
 2073       working_space[fSize / 2 + fSize] = 0;
 
 2074       Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 2075       for (i = 0; i < fSize / 2; i++) {
 
 2076          destVector[i] = working_space[i];
 
 2079    case kTransformFourier:
 
 2080       Fourier(working_space, fSize, 0, kTransformInverse, 0);
 
 2081       for (i = 0; i < fSize; i++) {
 
 2082          destVector[i] = working_space[i];
 
 2085    case kTransformHartley:
 
 2086       Fourier(working_space, fSize, 1, kTransformInverse, 0);
 
 2087       for (i = 0; i < fSize; i++) {
 
 2088          destVector[i] = working_space[i];
 
 2091    case kTransformFourierWalsh:
 
 2092    case kTransformFourierHaar:
 
 2093    case kTransformWalshHaar:
 
 2094    case kTransformCosWalsh:
 
 2095    case kTransformCosHaar:
 
 2096    case kTransformSinWalsh:
 
 2097    case kTransformSinHaar:
 
 2098       if (fTransformType > kTransformWalshHaar)
 
 2099          k = (Int_t) TMath::Power(2, fDegree - 1);
 
 2102          k = (Int_t) TMath::Power(2, fDegree);
 
 2104       for (i = 0, l = 0; i < fSize; i++, l = (l + k) % fSize) {
 
 2105          working_space[fSize + l + i / j] = working_space[i];
 
 2106          working_space[fSize + l + i / j + 2 * fSize] =
 
 2107              working_space[i + 2 * fSize];
 
 2109       for (i = 0; i < fSize; i++) {
 
 2110          working_space[i] = working_space[fSize + i];
 
 2111          working_space[i + 2 * fSize] = working_space[fSize + i + 2 * fSize];
 
 2113       if (fTransformType == kTransformFourierWalsh
 
 2114            || fTransformType == kTransformFourierHaar
 
 2115            || fTransformType == kTransformWalshHaar) {
 
 2116          GeneralInv(working_space, fSize, fDegree, fTransformType);
 
 2117          for (i = 0; i < j; i++)
 
 2118             BitReverseHaar(working_space, fSize, k, i * k);
 
 2121       else if (fTransformType == kTransformCosWalsh || fTransformType == kTransformCosHaar) {
 
 2122          j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 2123          m = (Int_t) TMath::Power(2, fDegree);
 
 2125          for (i = 0; i < fSize; i++) {
 
 2128             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 2130                working_space[2 * fSize + k + i % j] =
 
 2131                    working_space[i] * TMath::Sqrt(2.0);
 
 2132                working_space[4 * fSize + 2 * fSize + k + i % j] = 0;
 
 2138                working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 2139                    -(Double_t) working_space[i] * b;
 
 2140                working_space[2 * fSize + k + i % j] =
 
 2141                    (Double_t) working_space[i] * a;
 
 2142          } } 
for (i = 0; i < fSize; i++) {
 
 2146                working_space[2 * fSize + k + j] = 0;
 
 2147                working_space[4 * fSize + 2 * fSize + k + j] = 0;
 
 2151                working_space[2 * fSize + k + 2 * j - i % j] =
 
 2152                    working_space[2 * fSize + k + i % j];
 
 2153                working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j] =
 
 2154                    -working_space[4 * fSize + 2 * fSize + k + i % j];
 
 2157          for (i = 0; i < 2 * fSize; i++) {
 
 2158             working_space[i] = working_space[2 * fSize + i];
 
 2159             working_space[4 * fSize + i] =
 
 2160                 working_space[4 * fSize + 2 * fSize + i];
 
 2162          GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 2163          m = (Int_t) TMath::Power(2, fDegree);
 
 2165          for (i = 0; i < l; i++)
 
 2166             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 2169       else if (fTransformType == kTransformSinWalsh || fTransformType == kTransformSinHaar) {
 
 2170          j = (Int_t) TMath::Power(2, fDegree) / 2;
 
 2171          m = (Int_t) TMath::Power(2, fDegree);
 
 2173          for (i = 0; i < fSize; i++) {
 
 2176             a = pi * (Double_t) (i % j) / (Double_t) (2 * j);
 
 2178                working_space[2 * fSize + k + j + i % j] =
 
 2179                    working_space[j + k / 2 - i % j - 1] * TMath::Sqrt(2.0);
 
 2180                working_space[4 * fSize + 2 * fSize + k + j + i % j] = 0;
 
 2186                working_space[4 * fSize + 2 * fSize + k + j + i % j] =
 
 2187                    -(Double_t) working_space[j + k / 2 - i % j - 1] * b;
 
 2188                working_space[2 * fSize + k + j + i % j] =
 
 2189                    (Double_t) working_space[j + k / 2 - i % j - 1] * a;
 
 2190          } } 
for (i = 0; i < fSize; i++) {
 
 2194                working_space[2 * fSize + k] = 0;
 
 2195                working_space[4 * fSize + 2 * fSize + k] = 0;
 
 2199                working_space[2 * fSize + k + i % j] =
 
 2200                    working_space[2 * fSize + k + 2 * j - i % j];
 
 2201                working_space[4 * fSize + 2 * fSize + k + i % j] =
 
 2202                    -working_space[4 * fSize + 2 * fSize + k + 2 * j - i % j];
 
 2205          for (i = 0; i < 2 * fSize; i++) {
 
 2206             working_space[i] = working_space[2 * fSize + i];
 
 2207             working_space[4 * fSize + i] =
 
 2208                 working_space[4 * fSize + 2 * fSize + i];
 
 2210          GeneralInv(working_space, 2 * fSize, fDegree, fTransformType);
 
 2211          for (i = 0; i < l; i++)
 
 2212             BitReverseHaar(working_space, 2 * fSize, m, i * m);
 
 2214       for (i = 0; i < fSize; i++) {
 
 2215          if (fTransformType >= kTransformCosWalsh) {
 
 2218             val = working_space[k + i % j];
 
 2222             val = working_space[i];
 
 2223          destVector[i] = val;
 
 2227    delete[]working_space;
 
 2236 void TSpectrumTransform::SetTransformType(Int_t transType, Int_t degree)
 
 2241    for (; n < fSize;) {
 
 2245    if (transType < kTransformHaar || transType > kTransformSinHaar){
 
 2246       Error (
"TSpectrumTransform",
"Invalid type of transform");
 
 2249    if (transType >= kTransformFourierWalsh && transType <= kTransformSinHaar) {
 
 2250       if (degree > j || degree < 1){
 
 2251          Error (
"TSpectrumTransform",
"Invalid degree of mixed transform");
 
 2255    fTransformType=transType;
 
 2263 void TSpectrumTransform::SetRegion(Int_t xmin, Int_t xmax)
 
 2265    if(xmin<0 || xmax < xmin || xmax >= fSize){
 
 2266       Error(
"TSpectrumTransform", 
"Wrong range");
 
 2277 void TSpectrumTransform::SetDirection(Int_t direction)
 
 2279    if(direction != kTransformForward && direction != kTransformInverse){
 
 2280       Error(
"TSpectrumTransform", 
"Wrong direction");
 
 2283    fDirection = direction;
 
 2290 void TSpectrumTransform::SetFilterCoeff(Double_t filterCoeff)
 
 2292    fFilterCoeff = filterCoeff;
 
 2299 void TSpectrumTransform::SetEnhanceCoeff(Double_t enhanceCoeff)
 
 2301    fEnhanceCoeff = enhanceCoeff;