34 ClassImp(TSpectrum2Transform);
 
   39 TSpectrum2Transform::TSpectrum2Transform()
 
   41    fSizeX = 0, fSizeY = 0;
 
   42    fTransformType = kTransformCos;
 
   44    fDirection = kTransformForward;
 
   57 TSpectrum2Transform::TSpectrum2Transform(Int_t sizeX, Int_t sizeY) :TObject()
 
   60    if (sizeX <= 0 || sizeY <= 0){
 
   61       Error (
"TSpectrumTransform",
"Invalid length, must be > than 0");
 
   71       Error (
"TSpectrumTransform",
"Invalid length, must be power of 2");
 
   81       Error (
"TSpectrumTransform",
"Invalid length, must be power of 2");
 
   84    fSizeX = sizeX, fSizeY = sizeY;
 
   85    fTransformType = kTransformCos;
 
   87    fDirection = kTransformForward;
 
   99 TSpectrum2Transform::~TSpectrum2Transform()
 
  111 void TSpectrum2Transform::Haar(Double_t *working_space, Int_t num, Int_t direction)
 
  113    Int_t i, ii, li, l2, l3, j, jj, jj1, lj, iter, m, jmin, jmax;
 
  114    Double_t a, b, c, wlk;
 
  116    for (i = 0; i < num; i++)
 
  117       working_space[i + num] = 0;
 
  124    if (direction == kTransformForward) {
 
  125       for (m = 1; m <= iter; m++) {
 
  127          l2 = (Int_t) TMath::Power(2, li - 1);
 
  128          for (i = 0; i < (2 * l2); i++) {
 
  129             working_space[num + i] = working_space[i];
 
  131          for (j = 0; j < l2; j++) {
 
  134             val = working_space[jj + num] + working_space[jj + 1 + num];
 
  135             working_space[j] = val;
 
  136             val = working_space[jj + num] - working_space[jj + 1 + num];
 
  137             working_space[l3] = val;
 
  141    val = working_space[0];
 
  142    val = val / TMath::Sqrt(TMath::Power(2, iter));
 
  143    working_space[0] = val;
 
  144    val = working_space[1];
 
  145    val = val / TMath::Sqrt(TMath::Power(2, iter));
 
  146    working_space[1] = val;
 
  147    for (ii = 2; ii <= iter; ii++) {
 
  149       wlk = 1 / TMath::Sqrt(TMath::Power(2, iter - i));
 
  150       jmin = (Int_t) TMath::Power(2, i);
 
  151       jmax = (Int_t) TMath::Power(2, ii) - 1;
 
  152       for (j = jmin; j <= jmax; j++) {
 
  153          val = working_space[j];
 
  157          working_space[j] = val;
 
  160    if (direction == kTransformInverse) {
 
  161       for (m = 1; m <= iter; m++) {
 
  164          c = TMath::Power(a, b);
 
  166          for (i = 0; i < (2 * li); i++) {
 
  167             working_space[i + num] = working_space[i];
 
  169          for (j = 0; j < li; j++) {
 
  171             jj = 2 * (j + 1) - 1;
 
  173             val = working_space[j + num] - working_space[lj + num];
 
  174             working_space[jj] = val;
 
  175             val = working_space[j + num] + working_space[lj + num];
 
  176             working_space[jj1] = val;
 
  190 void TSpectrum2Transform::Walsh(Double_t *working_space, Int_t num)
 
  192    Int_t i, m, nump = 1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter;
 
  195    for (i = 0; i < num; i++)
 
  196       working_space[i + num] = 0;
 
  203    for (m = 1; m <= iter; m++) {
 
  211       for (mp = 0; mp < nump; mp++) {
 
  213          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  214             mnum21 = mnum2 + mp2 + ib;
 
  216             val1 = working_space[iba];
 
  217             val2 = working_space[mnum21];
 
  218             working_space[iba + num] = val1 + val2;
 
  219             working_space[mnum21 + num] = val1 - val2;
 
  222       for (i = 0; i < num; i++) {
 
  223          working_space[i] = working_space[i + num];
 
  229    for (i = 0; i < num; i++) {
 
  230       val1 = working_space[i];
 
  232       working_space[i] = val1;
 
  244 void TSpectrum2Transform::BitReverse(Double_t *working_space, Int_t num)
 
  247    Int_t i, ib, il, ibd, ip, ifac, i1;
 
  248    for (i = 0; i < num; i++) {
 
  249       working_space[i + num] = working_space[i];
 
  251    for (i = 1; i <= num; i++) {
 
  265       for (i1 = 1; i1 <= il; i1++) {
 
  267          ip = ip + ifac * ipower[i1 - 1];
 
  269       working_space[ip - 1] = working_space[i - 1 + num];
 
  283 void TSpectrum2Transform::Fourier(Double_t *working_space, Int_t num, Int_t hartley,
 
  284                            Int_t direction, Int_t zt_clear)
 
  286    Int_t nxp2, nxp, i, j, k, m, iter, mxp, j1, j2, n1, n2, it;
 
  287    Double_t a, b, c, d, sign, wpwr, arg, wr, wi, tr, ti, pi =
 
  288        3.14159265358979323846;
 
  289    Double_t val1, val2, val3, val4;
 
  290    if (direction == kTransformForward && zt_clear == 0) {
 
  291       for (i = 0; i < num; i++)
 
  292          working_space[i + num] = 0;
 
  301    if (direction == kTransformInverse)
 
  304    for (it = 1; it <= iter; it++) {
 
  309       for (m = 1; m <= nxp2; m++) {
 
  312          wr = TMath::Cos(arg);
 
  313          wi = sign * TMath::Sin(arg);
 
  314          for (mxp = nxp; mxp <= num; mxp += nxp) {
 
  317             val1 = working_space[j1 - 1];
 
  318             val2 = working_space[j2 - 1];
 
  319             val3 = working_space[j1 - 1 + num];
 
  320             val4 = working_space[j2 - 1 + num];
 
  329             working_space[j1 - 1] = val1;
 
  332             working_space[j1 - 1 + num] = val1;
 
  333             a = tr * wr - ti * wi;
 
  335             working_space[j2 - 1] = val1;
 
  336             a = ti * wr + tr * wi;
 
  338             working_space[j2 - 1 + num] = val1;
 
  345    for (i = 1; i <= n1; i++) {
 
  348       val1 = working_space[j - 1];
 
  349       val2 = working_space[j - 1 + num];
 
  350       val3 = working_space[i - 1];
 
  351       working_space[j - 1] = val3;
 
  352       working_space[j - 1 + num] = working_space[i - 1 + num];
 
  353       working_space[i - 1] = val1;
 
  354       working_space[i - 1 + num] = val2;
 
  356       lab60: 
if (k >= j) 
goto lab65;
 
  364    for (i = 0; i < num; i++) {
 
  366          val1 = working_space[i];
 
  370          working_space[i] = val1;
 
  371          b = working_space[i + num];
 
  373          working_space[i + num] = b;
 
  377          b = working_space[i];
 
  378          c = working_space[i + num];
 
  380          working_space[i] = b;
 
  381          working_space[i + num] = 0;
 
  384    if (hartley == 1 && direction == kTransformInverse) {
 
  385       for (i = 1; i < num; i++)
 
  386          working_space[num - i + num] = working_space[i];
 
  387       working_space[0 + num] = working_space[0];
 
  388       for (i = 0; i < num; i++) {
 
  389          working_space[i] = working_space[i + num];
 
  390          working_space[i + num] = 0;
 
  405 void TSpectrum2Transform::BitReverseHaar(Double_t *working_space, Int_t shift, Int_t num,
 
  409    Int_t i, ib, il, ibd, ip, ifac, i1;
 
  410    for (i = 0; i < num; i++) {
 
  411       working_space[i + shift + start] = working_space[i + start];
 
  412       working_space[i + shift + start + 2 * shift] =
 
  413           working_space[i + start + 2 * shift];
 
  415    for (i = 1; i <= num; i++) {
 
  429       for (i1 = 1; i1 <= il; i1++) {
 
  431          ip = ip + ifac * ipower[i1 - 1];
 
  433       working_space[ip - 1 + start] =
 
  434           working_space[i - 1 + shift + start];
 
  435       working_space[ip - 1 + start + 2 * shift] =
 
  436           working_space[i - 1 + shift + start + 2 * shift];
 
  451 Int_t TSpectrum2Transform::GeneralExe(Double_t *working_space, Int_t zt_clear, Int_t num,
 
  452                              Int_t degree, Int_t type)
 
  454    Int_t i, j, k, m, nump, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter,
 
  455        mp2step, mppom, ring;
 
  456    Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
 
  457        3.14159265358979323846;
 
  458    Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
 
  460       for (i = 0; i < num; i++)
 
  461          working_space[i + 2 * num] = 0;
 
  474    for (i = 0; i < iter - degree; i++)
 
  476    for (m = 1; m <= iter; m++) {
 
  481            && (type == kTransformFourierHaar
 
  482                || type == kTransformWalshHaar
 
  483                || type == kTransformCosHaar
 
  484                || type == kTransformSinHaar))
 
  488       for (mp = 0; mp < nump; mp++) {
 
  489          if (type != kTransformWalshHaar) {
 
  491             mppom = mppom % ring;
 
  495             for (i = 0; i < (iter - 1); i++) {
 
  496                if ((mppom & j) != 0)
 
  502             wr = TMath::Cos(arg);
 
  503             wi = TMath::Sin(arg);
 
  511          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  512             mnum21 = mnum2 + mp2 + ib;
 
  514             if (mp2 % mp2step == 0) {
 
  517                a0r = 1 / TMath::Sqrt(2.0);
 
  518                b0r = 1 / TMath::Sqrt(2.0);
 
  525             val1 = working_space[iba];
 
  526             val2 = working_space[mnum21];
 
  527             val3 = working_space[iba + 2 * num];
 
  528             val4 = working_space[mnum21 + 2 * num];
 
  533             tr = a * a0r + b * b0r;
 
  535             working_space[num + iba] = val1;
 
  536             ti = c * a0r + d * b0r;
 
  538             working_space[num + iba + 2 * num] = val1;
 
  540                 a * b0r * wr - c * b0r * wi - b * a0r * wr + d * a0r * wi;
 
  542             working_space[num + mnum21] = val1;
 
  544                 c * b0r * wr + a * b0r * wi - d * a0r * wr - b * a0r * wi;
 
  546             working_space[num + mnum21 + 2 * num] = val1;
 
  549       for (i = 0; i < num; i++) {
 
  550          val1 = working_space[num + i];
 
  551          working_space[i] = val1;
 
  552          val1 = working_space[num + i + 2 * num];
 
  553          working_space[i + 2 * num] = val1;
 
  568 Int_t TSpectrum2Transform::GeneralInv(Double_t *working_space, Int_t num, Int_t degree,
 
  571    Int_t i, j, k, m, nump =
 
  572        1, mnum, mnum2, mp, ib, mp2, mnum21, iba, iter, mp2step, mppom,
 
  574    Double_t a, b, c, d, wpwr, arg, wr, wi, tr, ti, pi =
 
  575        3.14159265358979323846;
 
  576    Double_t val1, val2, val3, val4, a0oldr = 0, b0oldr = 0, a0r, b0r;
 
  586    if (type == kTransformFourierHaar || type == kTransformWalshHaar
 
  587         || type == kTransformCosHaar || type == kTransformSinHaar) {
 
  588       for (i = 0; i < iter - degree; i++)
 
  592    for (m = 1; m <= iter; m++) {
 
  600       if (m > iter - degree + 1)
 
  602       for (mp = nump - 1; mp >= 0; mp--) {
 
  603          if (type != kTransformWalshHaar) {
 
  605             mppom = mppom % ring;
 
  609             for (i = 0; i < (iter - 1); i++) {
 
  610                if ((mppom & j) != 0)
 
  616             wr = TMath::Cos(arg);
 
  617             wi = TMath::Sin(arg);
 
  625          for (mp2 = 0; mp2 < mnum2; mp2++) {
 
  626             mnum21 = mnum2 + mp2 + ib;
 
  628             if (mp2 % mp2step == 0) {
 
  631                a0r = 1 / TMath::Sqrt(2.0);
 
  632                b0r = 1 / TMath::Sqrt(2.0);
 
  639             val1 = working_space[iba];
 
  640             val2 = working_space[mnum21];
 
  641             val3 = working_space[iba + 2 * num];
 
  642             val4 = working_space[mnum21 + 2 * num];
 
  647             tr = a * a0r + b * wr * b0r + d * wi * b0r;
 
  649             working_space[num + iba] = val1;
 
  650             ti = c * a0r + d * wr * b0r - b * wi * b0r;
 
  652             working_space[num + iba + 2 * num] = val1;
 
  653             tr = a * b0r - b * wr * a0r - d * wi * a0r;
 
  655             working_space[num + mnum21] = val1;
 
  656             ti = c * b0r - d * wr * a0r + b * wi * a0r;
 
  658             working_space[num + mnum21 + 2 * num] = val1;
 
  661       if (m <= iter - degree
 
  662            && (type == kTransformFourierHaar
 
  663                || type == kTransformWalshHaar
 
  664                || type == kTransformCosHaar
 
  665                || type == kTransformSinHaar))
 
  667       for (i = 0; i < num; i++) {
 
  668          val1 = working_space[num + i];
 
  669          working_space[i] = val1;
 
  670          val1 = working_space[num + i + 2 * num];
 
  671          working_space[i + 2 * num] = val1;
 
  687 void TSpectrum2Transform::HaarWalsh2(Double_t **working_matrix,
 
  688                               Double_t *working_vector, Int_t numx, Int_t numy,
 
  689                               Int_t direction, Int_t type)
 
  692    if (direction == kTransformForward) {
 
  693       for (j = 0; j < numy; j++) {
 
  694          for (i = 0; i < numx; i++) {
 
  695             working_vector[i] = working_matrix[i][j];
 
  699             Haar(working_vector, numx, kTransformForward);
 
  701          case kTransformWalsh:
 
  702             Walsh(working_vector, numx);
 
  703             BitReverse(working_vector, numx);
 
  706          for (i = 0; i < numx; i++) {
 
  707             working_matrix[i][j] = working_vector[i];
 
  710       for (i = 0; i < numx; i++) {
 
  711          for (j = 0; j < numy; j++) {
 
  712             working_vector[j] = working_matrix[i][j];
 
  716             Haar(working_vector, numy, kTransformForward);
 
  718          case kTransformWalsh:
 
  719             Walsh(working_vector, numy);
 
  720             BitReverse(working_vector, numy);
 
  723          for (j = 0; j < numy; j++) {
 
  724             working_matrix[i][j] = working_vector[j];
 
  729    else if (direction == kTransformInverse) {
 
  730       for (i = 0; i < numx; i++) {
 
  731          for (j = 0; j < numy; j++) {
 
  732             working_vector[j] = working_matrix[i][j];
 
  736             Haar(working_vector, numy, kTransformInverse);
 
  738          case kTransformWalsh:
 
  739             BitReverse(working_vector, numy);
 
  740             Walsh(working_vector, numy);
 
  743          for (j = 0; j < numy; j++) {
 
  744             working_matrix[i][j] = working_vector[j];
 
  747       for (j = 0; j < numy; j++) {
 
  748          for (i = 0; i < numx; i++) {
 
  749             working_vector[i] = working_matrix[i][j];
 
  753             Haar(working_vector, numx, kTransformInverse);
 
  755          case kTransformWalsh:
 
  756             BitReverse(working_vector, numx);
 
  757             Walsh(working_vector, numx);
 
  760          for (i = 0; i < numx; i++) {
 
  761             working_matrix[i][j] = working_vector[i];
 
  778 void TSpectrum2Transform::FourCos2(Double_t **working_matrix, Double_t *working_vector,
 
  779                             Int_t numx, Int_t numy, Int_t direction, Int_t type)
 
  781    Int_t i, j, iterx, itery, n, size;
 
  782    Double_t pi = 3.14159265358979323846;
 
  810    if (direction == kTransformForward) {
 
  811       for (j = 0; j < numy; j++) {
 
  812          for (i = 0; i < numx; i++) {
 
  813             working_vector[i] = working_matrix[i][j];
 
  817             for (i = 1; i <= numx; i++) {
 
  818                working_vector[2 * numx - i] = working_vector[i - 1];
 
  820             Fourier(working_vector, 2 * numx, 0, kTransformForward, 0);
 
  821             for (i = 0; i < numx; i++) {
 
  823                    working_vector[i] / TMath::Cos(pi * i / (2 * numx));
 
  825             working_vector[0] = working_vector[0] / TMath::Sqrt(2.);
 
  828             for (i = 1; i <= numx; i++) {
 
  829                working_vector[2 * numx - i] = -working_vector[i - 1];
 
  831             Fourier(working_vector, 2 * numx, 0, kTransformForward, 0);
 
  832             for (i = 1; i < numx; i++) {
 
  833                working_vector[i - 1] =
 
  834                    working_vector[i] / TMath::Sin(pi * i / (2 * numx));
 
  836             working_vector[numx - 1] =
 
  837                 working_vector[numx] / TMath::Sqrt(2.);
 
  839          case kTransformFourier:
 
  840             Fourier(working_vector, numx, 0, kTransformForward, 0);
 
  842          case kTransformHartley:
 
  843             Fourier(working_vector, numx, 1, kTransformForward, 0);
 
  846          for (i = 0; i < numx; i++) {
 
  847             working_matrix[i][j] = working_vector[i];
 
  848             if (type == kTransformFourier)
 
  849                working_matrix[i][j + numy] = working_vector[i + numx];
 
  852                working_matrix[i][j + numy] = working_vector[i + 2 * numx];
 
  855       for (i = 0; i < numx; i++) {
 
  856          for (j = 0; j < numy; j++) {
 
  857             working_vector[j] = working_matrix[i][j];
 
  858             if (type == kTransformFourier)
 
  859                working_vector[j + numy] = working_matrix[i][j + numy];
 
  862                working_vector[j + 2 * numy] = working_matrix[i][j + numy];
 
  866             for (j = 1; j <= numy; j++) {
 
  867                working_vector[2 * numy - j] = working_vector[j - 1];
 
  869             Fourier(working_vector, 2 * numy, 0, kTransformForward, 0);
 
  870             for (j = 0; j < numy; j++) {
 
  872                    working_vector[j] / TMath::Cos(pi * j / (2 * numy));
 
  873                working_vector[j + 2 * numy] = 0;
 
  875             working_vector[0] = working_vector[0] / TMath::Sqrt(2.);
 
  878             for (j = 1; j <= numy; j++) {
 
  879                working_vector[2 * numy - j] = -working_vector[j - 1];
 
  881             Fourier(working_vector, 2 * numy, 0, kTransformForward, 0);
 
  882             for (j = 1; j < numy; j++) {
 
  883                working_vector[j - 1] =
 
  884                    working_vector[j] / TMath::Sin(pi * j / (2 * numy));
 
  885                working_vector[j + numy] = 0;
 
  887             working_vector[numy - 1] =
 
  888                 working_vector[numy] / TMath::Sqrt(2.);
 
  889             working_vector[numy] = 0;
 
  891          case kTransformFourier:
 
  892             Fourier(working_vector, numy, 0, kTransformForward, 1);
 
  894          case kTransformHartley:
 
  895             Fourier(working_vector, numy, 1, kTransformForward, 0);
 
  898          for (j = 0; j < numy; j++) {
 
  899             working_matrix[i][j] = working_vector[j];
 
  900             if (type == kTransformFourier)
 
  901                working_matrix[i][j + numy] = working_vector[j + numy];
 
  904                working_matrix[i][j + numy] = working_vector[j + 2 * numy];
 
  909    else if (direction == kTransformInverse) {
 
  910       for (i = 0; i < numx; i++) {
 
  911          for (j = 0; j < numy; j++) {
 
  912             working_vector[j] = working_matrix[i][j];
 
  913             if (type == kTransformFourier)
 
  914                working_vector[j + numy] = working_matrix[i][j + numy];
 
  917                working_vector[j + 2 * numy] = working_matrix[i][j + numy];
 
  921             working_vector[0] = working_vector[0] * TMath::Sqrt(2.);
 
  922             for (j = 0; j < numy; j++) {
 
  923                working_vector[j + 2 * numy] =
 
  924                    working_vector[j] * TMath::Sin(pi * j / (2 * numy));
 
  926                    working_vector[j] * TMath::Cos(pi * j / (2 * numy));
 
  928             for (j = 1; j < numy; j++) {
 
  929                working_vector[2 * numy - j] = working_vector[j];
 
  930                working_vector[2 * numy - j + 2 * numy] =
 
  931                    -working_vector[j + 2 * numy];
 
  933             working_vector[numy] = 0;
 
  934             working_vector[numy + 2 * numy] = 0;
 
  935             Fourier(working_vector, 2 * numy, 0, kTransformInverse, 1);
 
  938             working_vector[numy] =
 
  939                 working_vector[numy - 1] * TMath::Sqrt(2.);
 
  940             for (j = numy - 1; j > 0; j--) {
 
  941                working_vector[j + 2 * numy] =
 
  943                                    1] * TMath::Cos(pi * j / (2 * numy));
 
  945                    working_vector[j - 1] * TMath::Sin(pi * j / (2 * numy));
 
  947             for (j = 1; j < numy; j++) {
 
  948                working_vector[2 * numy - j] = working_vector[j];
 
  949                working_vector[2 * numy - j + 2 * numy] =
 
  950                    -working_vector[j + 2 * numy];
 
  952             working_vector[0] = 0;
 
  953             working_vector[0 + 2 * numy] = 0;
 
  954             working_vector[numy + 2 * numy] = 0;
 
  955             Fourier(working_vector, 2 * numy, 0, kTransformInverse, 1);
 
  957          case kTransformFourier:
 
  958             Fourier(working_vector, numy, 0, kTransformInverse, 1);
 
  960          case kTransformHartley:
 
  961             Fourier(working_vector, numy, 1, kTransformInverse, 1);
 
  964          for (j = 0; j < numy; j++) {
 
  965             working_matrix[i][j] = working_vector[j];
 
  966             if (type == kTransformFourier)
 
  967                working_matrix[i][j + numy] = working_vector[j + numy];
 
  970                working_matrix[i][j + numy] = working_vector[j + 2 * numy];
 
  973       for (j = 0; j < numy; j++) {
 
  974          for (i = 0; i < numx; i++) {
 
  975             working_vector[i] = working_matrix[i][j];
 
  976             if (type == kTransformFourier)
 
  977                working_vector[i + numx] = working_matrix[i][j + numy];
 
  980                working_vector[i + 2 * numx] = working_matrix[i][j + numy];
 
  984             working_vector[0] = working_vector[0] * TMath::Sqrt(2.);
 
  985             for (i = 0; i < numx; i++) {
 
  986                working_vector[i + 2 * numx] =
 
  987                    working_vector[i] * TMath::Sin(pi * i / (2 * numx));
 
  989                    working_vector[i] * TMath::Cos(pi * i / (2 * numx));
 
  991             for (i = 1; i < numx; i++) {
 
  992                working_vector[2 * numx - i] = working_vector[i];
 
  993                working_vector[2 * numx - i + 2 * numx] =
 
  994                    -working_vector[i + 2 * numx];
 
  996             working_vector[numx] = 0;
 
  997             working_vector[numx + 2 * numx] = 0;
 
  998             Fourier(working_vector, 2 * numx, 0, kTransformInverse, 1);
 
 1001             working_vector[numx] =
 
 1002                 working_vector[numx - 1] * TMath::Sqrt(2.);
 
 1003             for (i = numx - 1; i > 0; i--) {
 
 1004                working_vector[i + 2 * numx] =
 
 1006                                    1] * TMath::Cos(pi * i / (2 * numx));
 
 1008                    working_vector[i - 1] * TMath::Sin(pi * i / (2 * numx));
 
 1010             for (i = 1; i < numx; i++) {
 
 1011                working_vector[2 * numx - i] = working_vector[i];
 
 1012                working_vector[2 * numx - i + 2 * numx] =
 
 1013                    -working_vector[i + 2 * numx];
 
 1015             working_vector[0] = 0;
 
 1016             working_vector[0 + 2 * numx] = 0;
 
 1017             working_vector[numx + 2 * numx] = 0;
 
 1018             Fourier(working_vector, 2 * numx, 0, kTransformInverse, 1);
 
 1020          case kTransformFourier:
 
 1021             Fourier(working_vector, numx, 0, kTransformInverse, 1);
 
 1023          case kTransformHartley:
 
 1024             Fourier(working_vector, numx, 1, kTransformInverse, 1);
 
 1027          for (i = 0; i < numx; i++) {
 
 1028             working_matrix[i][j] = working_vector[i];
 
 1046 void TSpectrum2Transform::General2(Double_t **working_matrix, Double_t *working_vector,
 
 1047                             Int_t numx, Int_t numy, Int_t direction, Int_t type,
 
 1050    Int_t i, j, jstup, kstup, l, m;
 
 1051    Double_t val, valx, valz;
 
 1052    Double_t a, b, pi = 3.14159265358979323846;
 
 1053    if (direction == kTransformForward) {
 
 1054       for (j = 0; j < numy; j++) {
 
 1055          kstup = (Int_t) TMath::Power(2, degree);
 
 1056          jstup = numx / kstup;
 
 1057          for (i = 0; i < numx; i++) {
 
 1058             val = working_matrix[i][j];
 
 1059             if (type == kTransformCosWalsh
 
 1060                  || type == kTransformCosHaar) {
 
 1061                jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1063                kstup = 2 * kstup * jstup;
 
 1064                working_vector[kstup + i % jstup] = val;
 
 1065                working_vector[kstup + 2 * jstup - 1 - i % jstup] = val;
 
 1068             else if (type == kTransformSinWalsh
 
 1069                      || type == kTransformSinHaar) {
 
 1070                jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1072                kstup = 2 * kstup * jstup;
 
 1073                working_vector[kstup + i % jstup] = val;
 
 1074                working_vector[kstup + 2 * jstup - 1 - i % jstup] = -val;
 
 1078                working_vector[i] = val;
 
 1081          case kTransformFourierWalsh:
 
 1082          case kTransformFourierHaar:
 
 1083          case kTransformWalshHaar:
 
 1084             GeneralExe(working_vector, 0, numx, degree, type);
 
 1085             for (i = 0; i < jstup; i++)
 
 1086                BitReverseHaar(working_vector, numx, kstup, i * kstup);
 
 1088          case kTransformCosWalsh:
 
 1089          case kTransformCosHaar:
 
 1090             m = (Int_t) TMath::Power(2, degree);
 
 1092             for (i = 0; i < l; i++)
 
 1093                BitReverseHaar(working_vector, 2 * numx, m, i * m);
 
 1094             GeneralExe(working_vector, 0, 2 * numx, degree, type);
 
 1095             for (i = 0; i < numx; i++) {
 
 1097                kstup = 2 * kstup * jstup;
 
 1098                a = pi * (Double_t) (i % jstup) / (Double_t) (2 * jstup);
 
 1100                b = working_vector[kstup + i % jstup];
 
 1102                   a = b / TMath::Sqrt(2.0);
 
 1106                working_vector[i] = a;
 
 1107                working_vector[i + 4 * numx] = 0;
 
 1110          case kTransformSinWalsh:
 
 1111          case kTransformSinHaar:
 
 1112             m = (Int_t) TMath::Power(2, degree);
 
 1114             for (i = 0; i < l; i++)
 
 1115                BitReverseHaar(working_vector, 2 * numx, m, i * m);
 
 1116             GeneralExe(working_vector, 0, 2 * numx, degree, type);
 
 1117             for (i = 0; i < numx; i++) {
 
 1119                kstup = 2 * kstup * jstup;
 
 1120                a = pi * (Double_t) (i % jstup) / (Double_t) (2 * jstup);
 
 1122                b = working_vector[jstup + kstup + i % jstup];
 
 1124                   a = b / TMath::Sqrt(2.0);
 
 1128                working_vector[jstup + kstup / 2 - i % jstup - 1] = a;
 
 1129                working_vector[i + 4 * numx] = 0;
 
 1133          if (type > kTransformWalshHaar)
 
 1134             kstup = (Int_t) TMath::Power(2, degree - 1);
 
 1137             kstup = (Int_t) TMath::Power(2, degree);
 
 1138          jstup = numx / kstup;
 
 1139          for (i = 0, l = 0; i < numx; i++, l = (l + kstup) % numx) {
 
 1140             working_vector[numx + i] = working_vector[l + i / jstup];
 
 1141             if (type == kTransformFourierWalsh
 
 1142                  || type == kTransformFourierHaar
 
 1143                  || type == kTransformWalshHaar)
 
 1144                working_vector[numx + i + 2 * numx] =
 
 1145                    working_vector[l + i / jstup + 2 * numx];
 
 1148                working_vector[numx + i + 4 * numx] =
 
 1149                    working_vector[l + i / jstup + 4 * numx];
 
 1151          for (i = 0; i < numx; i++) {
 
 1152             working_vector[i] = working_vector[numx + i];
 
 1153             if (type == kTransformFourierWalsh
 
 1154                  || type == kTransformFourierHaar
 
 1155                  || type == kTransformWalshHaar)
 
 1156                working_vector[i + 2 * numx] =
 
 1157                    working_vector[numx + i + 2 * numx];
 
 1160                working_vector[i + 4 * numx] =
 
 1161                    working_vector[numx + i + 4 * numx];
 
 1163          for (i = 0; i < numx; i++) {
 
 1164             working_matrix[i][j] = working_vector[i];
 
 1165             if (type == kTransformFourierWalsh
 
 1166                  || type == kTransformFourierHaar
 
 1167                  || type == kTransformWalshHaar)
 
 1168                working_matrix[i][j + numy] = working_vector[i + 2 * numx];
 
 1171                working_matrix[i][j + numy] = working_vector[i + 4 * numx];
 
 1174       for (i = 0; i < numx; i++) {
 
 1175          kstup = (Int_t) TMath::Power(2, degree);
 
 1176          jstup = numy / kstup;
 
 1177          for (j = 0; j < numy; j++) {
 
 1178             valx = working_matrix[i][j];
 
 1179             valz = working_matrix[i][j + numy];
 
 1180             if (type == kTransformCosWalsh
 
 1181                  || type == kTransformCosHaar) {
 
 1182                jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1184                kstup = 2 * kstup * jstup;
 
 1185                working_vector[kstup + j % jstup] = valx;
 
 1186                working_vector[kstup + 2 * jstup - 1 - j % jstup] = valx;
 
 1187                working_vector[kstup + j % jstup + 4 * numy] = valz;
 
 1188                working_vector[kstup + 2 * jstup - 1 - j % jstup +
 
 1192             else if (type == kTransformSinWalsh
 
 1193                      || type == kTransformSinHaar) {
 
 1194                jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1196                kstup = 2 * kstup * jstup;
 
 1197                working_vector[kstup + j % jstup] = valx;
 
 1198                working_vector[kstup + 2 * jstup - 1 - j % jstup] = -valx;
 
 1199                working_vector[kstup + j % jstup + 4 * numy] = valz;
 
 1200                working_vector[kstup + 2 * jstup - 1 - j % jstup +
 
 1205                working_vector[j] = valx;
 
 1206                working_vector[j + 2 * numy] = valz;
 
 1210          case kTransformFourierWalsh:
 
 1211          case kTransformFourierHaar:
 
 1212          case kTransformWalshHaar:
 
 1213             GeneralExe(working_vector, 1, numy, degree, type);
 
 1214             for (j = 0; j < jstup; j++)
 
 1215                BitReverseHaar(working_vector, numy, kstup, j * kstup);
 
 1217          case kTransformCosWalsh:
 
 1218          case kTransformCosHaar:
 
 1219             m = (Int_t) TMath::Power(2, degree);
 
 1221             for (j = 0; j < l; j++)
 
 1222                BitReverseHaar(working_vector, 2 * numy, m, j * m);
 
 1223             GeneralExe(working_vector, 1, 2 * numy, degree, type);
 
 1224             for (j = 0; j < numy; j++) {
 
 1226                kstup = 2 * kstup * jstup;
 
 1227                a = pi * (Double_t) (j % jstup) / (Double_t) (2 * jstup);
 
 1229                b = working_vector[kstup + j % jstup];
 
 1231                   a = b / TMath::Sqrt(2.0);
 
 1235                working_vector[j] = a;
 
 1236                working_vector[j + 4 * numy] = 0;
 
 1239          case kTransformSinWalsh:
 
 1240          case kTransformSinHaar:
 
 1241             m = (Int_t) TMath::Power(2, degree);
 
 1243             for (j = 0; j < l; j++)
 
 1244                BitReverseHaar(working_vector, 2 * numy, m, j * m);
 
 1245             GeneralExe(working_vector, 1, 2 * numy, degree, type);
 
 1246             for (j = 0; j < numy; j++) {
 
 1248                kstup = 2 * kstup * jstup;
 
 1249                a = pi * (Double_t) (j % jstup) / (Double_t) (2 * jstup);
 
 1251                b = working_vector[jstup + kstup + j % jstup];
 
 1253                   a = b / TMath::Sqrt(2.0);
 
 1257                working_vector[jstup + kstup / 2 - j % jstup - 1] = a;
 
 1258                working_vector[j + 4 * numy] = 0;
 
 1262          if (type > kTransformWalshHaar)
 
 1263             kstup = (Int_t) TMath::Power(2, degree - 1);
 
 1266             kstup = (Int_t) TMath::Power(2, degree);
 
 1267          jstup = numy / kstup;
 
 1268          for (j = 0, l = 0; j < numy; j++, l = (l + kstup) % numy) {
 
 1269             working_vector[numy + j] = working_vector[l + j / jstup];
 
 1270             if (type == kTransformFourierWalsh
 
 1271                  || type == kTransformFourierHaar
 
 1272                  || type == kTransformWalshHaar)
 
 1273                working_vector[numy + j + 2 * numy] =
 
 1274                    working_vector[l + j / jstup + 2 * numy];
 
 1277                working_vector[numy + j + 4 * numy] =
 
 1278                    working_vector[l + j / jstup + 4 * numy];
 
 1280          for (j = 0; j < numy; j++) {
 
 1281             working_vector[j] = working_vector[numy + j];
 
 1282             if (type == kTransformFourierWalsh
 
 1283                  || type == kTransformFourierHaar
 
 1284                  || type == kTransformWalshHaar)
 
 1285                working_vector[j + 2 * numy] =
 
 1286                    working_vector[numy + j + 2 * numy];
 
 1289                working_vector[j + 4 * numy] =
 
 1290                    working_vector[numy + j + 4 * numy];
 
 1292          for (j = 0; j < numy; j++) {
 
 1293             working_matrix[i][j] = working_vector[j];
 
 1294             if (type == kTransformFourierWalsh
 
 1295                  || type == kTransformFourierHaar
 
 1296                  || type == kTransformWalshHaar)
 
 1297                working_matrix[i][j + numy] = working_vector[j + 2 * numy];
 
 1300                working_matrix[i][j + numy] = working_vector[j + 4 * numy];
 
 1305    else if (direction == kTransformInverse) {
 
 1306       for (i = 0; i < numx; i++) {
 
 1307          kstup = (Int_t) TMath::Power(2, degree);
 
 1308          jstup = numy / kstup;
 
 1309          for (j = 0; j < numy; j++) {
 
 1310             working_vector[j] = working_matrix[i][j];
 
 1311             if (type == kTransformFourierWalsh
 
 1312                  || type == kTransformFourierHaar
 
 1313                  || type == kTransformWalshHaar)
 
 1314                working_vector[j + 2 * numy] = working_matrix[i][j + numy];
 
 1317                working_vector[j + 4 * numy] = working_matrix[i][j + numy];
 
 1319          if (type > kTransformWalshHaar)
 
 1320             kstup = (Int_t) TMath::Power(2, degree - 1);
 
 1323             kstup = (Int_t) TMath::Power(2, degree);
 
 1324          jstup = numy / kstup;
 
 1325          for (j = 0, l = 0; j < numy; j++, l = (l + kstup) % numy) {
 
 1326             working_vector[numy + l + j / jstup] = working_vector[j];
 
 1327             if (type == kTransformFourierWalsh
 
 1328                  || type == kTransformFourierHaar
 
 1329                  || type == kTransformWalshHaar)
 
 1330                working_vector[numy + l + j / jstup + 2 * numy] =
 
 1331                    working_vector[j + 2 * numy];
 
 1334                working_vector[numy + l + j / jstup + 4 * numy] =
 
 1335                    working_vector[j + 4 * numy];
 
 1337          for (j = 0; j < numy; j++) {
 
 1338             working_vector[j] = working_vector[numy + j];
 
 1339             if (type == kTransformFourierWalsh
 
 1340                  || type == kTransformFourierHaar
 
 1341                  || type == kTransformWalshHaar)
 
 1342                working_vector[j + 2 * numy] =
 
 1343                    working_vector[numy + j + 2 * numy];
 
 1346                working_vector[j + 4 * numy] =
 
 1347                    working_vector[numy + j + 4 * numy];
 
 1350          case kTransformFourierWalsh:
 
 1351          case kTransformFourierHaar:
 
 1352          case kTransformWalshHaar:
 
 1353             for (j = 0; j < jstup; j++)
 
 1354                BitReverseHaar(working_vector, numy, kstup, j * kstup);
 
 1355             GeneralInv(working_vector, numy, degree, type);
 
 1357          case kTransformCosWalsh:
 
 1358          case kTransformCosHaar:
 
 1359             jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1360             m = (Int_t) TMath::Power(2, degree);
 
 1362             for (j = 0; j < numy; j++) {
 
 1364                kstup = 2 * kstup * jstup;
 
 1365                a = pi * (Double_t) (j % jstup) / (Double_t) (2 * jstup);
 
 1366                if (j % jstup == 0) {
 
 1367                   working_vector[2 * numy + kstup + j % jstup] =
 
 1368                       working_vector[j] * TMath::Sqrt(2.0);
 
 1369                   working_vector[2 * numy + kstup + j % jstup +
 
 1376                   working_vector[2 * numy + kstup + j % jstup +
 
 1378                       -(Double_t) working_vector[j] * b;
 
 1379                   working_vector[2 * numy + kstup + j % jstup] =
 
 1380                       (Double_t) working_vector[j] * a;
 
 1381             } } 
for (j = 0; j < numy; j++) {
 
 1383                kstup = 2 * kstup * jstup;
 
 1384                if (j % jstup == 0) {
 
 1385                   working_vector[2 * numy + kstup + jstup] = 0;
 
 1386                   working_vector[2 * numy + kstup + jstup + 4 * numy] = 0;
 
 1390                   working_vector[2 * numy + kstup + 2 * jstup -
 
 1392                       working_vector[2 * numy + kstup + j % jstup];
 
 1393                   working_vector[2 * numy + kstup + 2 * jstup -
 
 1394                                   j % jstup + 4 * numy] =
 
 1395                       -working_vector[2 * numy + kstup + j % jstup +
 
 1399             for (j = 0; j < 2 * numy; j++) {
 
 1400                working_vector[j] = working_vector[2 * numy + j];
 
 1401                working_vector[j + 4 * numy] =
 
 1402                    working_vector[2 * numy + j + 4 * numy];
 
 1404             GeneralInv(working_vector, 2 * numy, degree, type);
 
 1405             m = (Int_t) TMath::Power(2, degree);
 
 1407             for (j = 0; j < l; j++)
 
 1408                BitReverseHaar(working_vector, 2 * numy, m, j * m);
 
 1410          case kTransformSinWalsh:
 
 1411          case kTransformSinHaar:
 
 1412             jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1413             m = (Int_t) TMath::Power(2, degree);
 
 1415             for (j = 0; j < numy; j++) {
 
 1417                kstup = 2 * kstup * jstup;
 
 1418                a = pi * (Double_t) (j % jstup) / (Double_t) (2 * jstup);
 
 1419                if (j % jstup == 0) {
 
 1420                   working_vector[2 * numy + kstup + jstup + j % jstup] =
 
 1421                       working_vector[jstup + kstup / 2 - j % jstup -
 
 1422                                      1] * TMath::Sqrt(2.0);
 
 1423                   working_vector[2 * numy + kstup + jstup + j % jstup +
 
 1430                   working_vector[2 * numy + kstup + jstup + j % jstup +
 
 1432                       -(Double_t) working_vector[jstup + kstup / 2 -
 
 1434                   working_vector[2 * numy + kstup + jstup + j % jstup] =
 
 1435                       (Double_t) working_vector[jstup + kstup / 2 -
 
 1437             } } 
for (j = 0; j < numy; j++) {
 
 1439                kstup = 2 * kstup * jstup;
 
 1440                if (j % jstup == 0) {
 
 1441                   working_vector[2 * numy + kstup] = 0;
 
 1442                   working_vector[2 * numy + kstup + 4 * numy] = 0;
 
 1446                   working_vector[2 * numy + kstup + j % jstup] =
 
 1447                       working_vector[2 * numy + kstup + 2 * jstup -
 
 1449                   working_vector[2 * numy + kstup + j % jstup +
 
 1451                       -working_vector[2 * numy + kstup + 2 * jstup -
 
 1452                                       j % jstup + 4 * numy];
 
 1455             for (j = 0; j < 2 * numy; j++) {
 
 1456                working_vector[j] = working_vector[2 * numy + j];
 
 1457                working_vector[j + 4 * numy] =
 
 1458                    working_vector[2 * numy + j + 4 * numy];
 
 1460             GeneralInv(working_vector, 2 * numy, degree, type);
 
 1461             for (j = 0; j < l; j++)
 
 1462                BitReverseHaar(working_vector, 2 * numy, m, j * m);
 
 1465          for (j = 0; j < numy; j++) {
 
 1466             if (type > kTransformWalshHaar) {
 
 1468                kstup = 2 * kstup * jstup;
 
 1469                valx = working_vector[kstup + j % jstup];
 
 1470                valz = working_vector[kstup + j % jstup + 4 * numy];
 
 1474                valx = working_vector[j];
 
 1475                valz = working_vector[j + 2 * numy];
 
 1477             working_matrix[i][j] = valx;
 
 1478             working_matrix[i][j + numy] = valz;
 
 1481       for (j = 0; j < numy; j++) {
 
 1482          kstup = (Int_t) TMath::Power(2, degree);
 
 1483          jstup = numy / kstup;
 
 1484          for (i = 0; i < numx; i++) {
 
 1485             working_vector[i] = working_matrix[i][j];
 
 1486             if (type == kTransformFourierWalsh
 
 1487                  || type == kTransformFourierHaar
 
 1488                  || type == kTransformWalshHaar)
 
 1489                working_vector[i + 2 * numx] = working_matrix[i][j + numy];
 
 1492                working_vector[i + 4 * numx] = working_matrix[i][j + numy];
 
 1494          if (type > kTransformWalshHaar)
 
 1495             kstup = (Int_t) TMath::Power(2, degree - 1);
 
 1498             kstup = (Int_t) TMath::Power(2, degree);
 
 1499          jstup = numx / kstup;
 
 1500          for (i = 0, l = 0; i < numx; i++, l = (l + kstup) % numx) {
 
 1501             working_vector[numx + l + i / jstup] = working_vector[i];
 
 1502             if (type == kTransformFourierWalsh
 
 1503                  || type == kTransformFourierHaar
 
 1504                  || type == kTransformWalshHaar)
 
 1505                working_vector[numx + l + i / jstup + 2 * numx] =
 
 1506                    working_vector[i + 2 * numx];
 
 1509                working_vector[numx + l + i / jstup + 4 * numx] =
 
 1510                    working_vector[i + 4 * numx];
 
 1512          for (i = 0; i < numx; i++) {
 
 1513             working_vector[i] = working_vector[numx + i];
 
 1514             if (type == kTransformFourierWalsh
 
 1515                  || type == kTransformFourierHaar
 
 1516                  || type == kTransformWalshHaar)
 
 1517                working_vector[i + 2 * numx] =
 
 1518                    working_vector[numx + i + 2 * numx];
 
 1521                working_vector[i + 4 * numx] =
 
 1522                    working_vector[numx + i + 4 * numx];
 
 1525          case kTransformFourierWalsh:
 
 1526          case kTransformFourierHaar:
 
 1527          case kTransformWalshHaar:
 
 1528             for (i = 0; i < jstup; i++)
 
 1529                BitReverseHaar(working_vector, numx, kstup, i * kstup);
 
 1530             GeneralInv(working_vector, numx, degree, type);
 
 1532          case kTransformCosWalsh:
 
 1533          case kTransformCosHaar:
 
 1534             jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1535             m = (Int_t) TMath::Power(2, degree);
 
 1537             for (i = 0; i < numx; i++) {
 
 1539                kstup = 2 * kstup * jstup;
 
 1540                a = pi * (Double_t) (i % jstup) / (Double_t) (2 * jstup);
 
 1541                if (i % jstup == 0) {
 
 1542                   working_vector[2 * numx + kstup + i % jstup] =
 
 1543                       working_vector[i] * TMath::Sqrt(2.0);
 
 1544                   working_vector[2 * numx + kstup + i % jstup +
 
 1551                   working_vector[2 * numx + kstup + i % jstup +
 
 1553                       -(Double_t) working_vector[i] * b;
 
 1554                   working_vector[2 * numx + kstup + i % jstup] =
 
 1555                       (Double_t) working_vector[i] * a;
 
 1556             } } 
for (i = 0; i < numx; i++) {
 
 1558                kstup = 2 * kstup * jstup;
 
 1559                if (i % jstup == 0) {
 
 1560                   working_vector[2 * numx + kstup + jstup] = 0;
 
 1561                   working_vector[2 * numx + kstup + jstup + 4 * numx] = 0;
 
 1565                   working_vector[2 * numx + kstup + 2 * jstup -
 
 1567                       working_vector[2 * numx + kstup + i % jstup];
 
 1568                   working_vector[2 * numx + kstup + 2 * jstup -
 
 1569                                   i % jstup + 4 * numx] =
 
 1570                       -working_vector[2 * numx + kstup + i % jstup +
 
 1574             for (i = 0; i < 2 * numx; i++) {
 
 1575                working_vector[i] = working_vector[2 * numx + i];
 
 1576                working_vector[i + 4 * numx] =
 
 1577                    working_vector[2 * numx + i + 4 * numx];
 
 1579             GeneralInv(working_vector, 2 * numx, degree, type);
 
 1580             m = (Int_t) TMath::Power(2, degree);
 
 1582             for (i = 0; i < l; i++)
 
 1583                BitReverseHaar(working_vector, 2 * numx, m, i * m);
 
 1585          case kTransformSinWalsh:
 
 1586          case kTransformSinHaar:
 
 1587             jstup = (Int_t) TMath::Power(2, degree) / 2;
 
 1588             m = (Int_t) TMath::Power(2, degree);
 
 1590             for (i = 0; i < numx; i++) {
 
 1592                kstup = 2 * kstup * jstup;
 
 1593                a = pi * (Double_t) (i % jstup) / (Double_t) (2 * jstup);
 
 1594                if (i % jstup == 0) {
 
 1595                   working_vector[2 * numx + kstup + jstup + i % jstup] =
 
 1596                       working_vector[jstup + kstup / 2 - i % jstup -
 
 1597                                      1] * TMath::Sqrt(2.0);
 
 1598                   working_vector[2 * numx + kstup + jstup + i % jstup +
 
 1605                   working_vector[2 * numx + kstup + jstup + i % jstup +
 
 1607                       -(Double_t) working_vector[jstup + kstup / 2 -
 
 1609                   working_vector[2 * numx + kstup + jstup + i % jstup] =
 
 1610                       (Double_t) working_vector[jstup + kstup / 2 -
 
 1612             } } 
for (i = 0; i < numx; i++) {
 
 1614                kstup = 2 * kstup * jstup;
 
 1615                if (i % jstup == 0) {
 
 1616                   working_vector[2 * numx + kstup] = 0;
 
 1617                   working_vector[2 * numx + kstup + 4 * numx] = 0;
 
 1621                   working_vector[2 * numx + kstup + i % jstup] =
 
 1622                       working_vector[2 * numx + kstup + 2 * jstup -
 
 1624                   working_vector[2 * numx + kstup + i % jstup +
 
 1626                       -working_vector[2 * numx + kstup + 2 * jstup -
 
 1627                                       i % jstup + 4 * numx];
 
 1630             for (i = 0; i < 2 * numx; i++) {
 
 1631                working_vector[i] = working_vector[2 * numx + i];
 
 1632                working_vector[i + 4 * numx] =
 
 1633                    working_vector[2 * numx + i + 4 * numx];
 
 1635             GeneralInv(working_vector, 2 * numx, degree, type);
 
 1636             for (i = 0; i < l; i++)
 
 1637                BitReverseHaar(working_vector, 2 * numx, m, i * m);
 
 1640          for (i = 0; i < numx; i++) {
 
 1641             if (type > kTransformWalshHaar) {
 
 1643                kstup = 2 * kstup * jstup;
 
 1644                val = working_vector[kstup + i % jstup];
 
 1648                val = working_vector[i];
 
 1649             working_matrix[i][j] = val;
 
 1754 void TSpectrum2Transform::Transform(
const Double_t **fSource, Double_t **fDest)
 
 1758    Double_t *working_vector = 0, **working_matrix = 0;
 
 1759    size = (Int_t) TMath::Max(fSizeX, fSizeY);
 
 1760    switch (fTransformType) {
 
 1761    case kTransformHaar:
 
 1762    case kTransformWalsh:
 
 1763       working_vector = 
new Double_t[2 * size];
 
 1764       working_matrix = 
new Double_t *[fSizeX];
 
 1765       for (i = 0; i < fSizeX; i++)
 
 1766          working_matrix[i] = 
new Double_t[fSizeY];
 
 1770    case kTransformFourier:
 
 1771    case kTransformHartley:
 
 1772    case kTransformFourierWalsh:
 
 1773    case kTransformFourierHaar:
 
 1774    case kTransformWalshHaar:
 
 1775       working_vector = 
new Double_t[4 * size];
 
 1776       working_matrix = 
new Double_t *[fSizeX];
 
 1777       for (i = 0; i < fSizeX; i++)
 
 1778          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 1780    case kTransformCosWalsh:
 
 1781    case kTransformCosHaar:
 
 1782    case kTransformSinWalsh:
 
 1783    case kTransformSinHaar:
 
 1784       working_vector = 
new Double_t[8 * size];
 
 1785       working_matrix = 
new Double_t *[fSizeX];
 
 1786       for (i = 0; i < fSizeX; i++)
 
 1787          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 1790    if (fDirection == kTransformForward) {
 
 1791       switch (fTransformType) {
 
 1792       case kTransformHaar:
 
 1793          for (i = 0; i < fSizeX; i++) {
 
 1794             for (j = 0; j < fSizeY; j++) {
 
 1795                working_matrix[i][j] = fSource[i][j];
 
 1798          HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 1799                      fDirection, kTransformHaar);
 
 1800          for (i = 0; i < fSizeX; i++) {
 
 1801             for (j = 0; j < fSizeY; j++) {
 
 1802                fDest[i][j] = working_matrix[i][j];
 
 1806       case kTransformWalsh:
 
 1807          for (i = 0; i < fSizeX; i++) {
 
 1808             for (j = 0; j < fSizeY; j++) {
 
 1809                working_matrix[i][j] = fSource[i][j];
 
 1812          HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 1813                      fDirection, kTransformWalsh);
 
 1814          for (i = 0; i < fSizeX; i++) {
 
 1815             for (j = 0; j < fSizeY; j++) {
 
 1816                fDest[i][j] = working_matrix[i][j];
 
 1821          for (i = 0; i < fSizeX; i++) {
 
 1822             for (j = 0; j < fSizeY; j++) {
 
 1823                working_matrix[i][j] = fSource[i][j];
 
 1826          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1828          for (i = 0; i < fSizeX; i++) {
 
 1829             for (j = 0; j < fSizeY; j++) {
 
 1830                fDest[i][j] = working_matrix[i][j];
 
 1835          for (i = 0; i < fSizeX; i++) {
 
 1836             for (j = 0; j < fSizeY; j++) {
 
 1837                working_matrix[i][j] = fSource[i][j];
 
 1840          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1842          for (i = 0; i < fSizeX; i++) {
 
 1843             for (j = 0; j < fSizeY; j++) {
 
 1844                fDest[i][j] = working_matrix[i][j];
 
 1848       case kTransformFourier:
 
 1849          for (i = 0; i < fSizeX; i++) {
 
 1850             for (j = 0; j < fSizeY; j++) {
 
 1851                working_matrix[i][j] = fSource[i][j];
 
 1854          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1856          for (i = 0; i < fSizeX; i++) {
 
 1857             for (j = 0; j < fSizeY; j++) {
 
 1858                fDest[i][j] = working_matrix[i][j];
 
 1861          for (i = 0; i < fSizeX; i++) {
 
 1862             for (j = 0; j < fSizeY; j++) {
 
 1863                fDest[i][j + fSizeY] = working_matrix[i][j + fSizeY];
 
 1867       case kTransformHartley:
 
 1868          for (i = 0; i < fSizeX; i++) {
 
 1869             for (j = 0; j < fSizeY; j++) {
 
 1870                working_matrix[i][j] = fSource[i][j];
 
 1873          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1875          for (i = 0; i < fSizeX; i++) {
 
 1876             for (j = 0; j < fSizeY; j++) {
 
 1877                fDest[i][j] = working_matrix[i][j];
 
 1881       case kTransformFourierWalsh:
 
 1882       case kTransformFourierHaar:
 
 1883       case kTransformWalshHaar:
 
 1884       case kTransformCosWalsh:
 
 1885       case kTransformCosHaar:
 
 1886       case kTransformSinWalsh:
 
 1887       case kTransformSinHaar:
 
 1888          for (i = 0; i < fSizeX; i++) {
 
 1889             for (j = 0; j < fSizeY; j++) {
 
 1890                working_matrix[i][j] = fSource[i][j];
 
 1893          General2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1894                    fTransformType, fDegree);
 
 1895          for (i = 0; i < fSizeX; i++) {
 
 1896             for (j = 0; j < fSizeY; j++) {
 
 1897                fDest[i][j] = working_matrix[i][j];
 
 1900          if (fTransformType == kTransformFourierWalsh
 
 1901               || fTransformType == kTransformFourierHaar) {
 
 1902             for (i = 0; i < fSizeX; i++) {
 
 1903                for (j = 0; j < fSizeY; j++) {
 
 1904                   fDest[i][j + fSizeY] = working_matrix[i][j + fSizeY];
 
 1912    else if (fDirection == kTransformInverse) {
 
 1913       switch (fTransformType) {
 
 1914       case kTransformHaar:
 
 1915          for (i = 0; i < fSizeX; i++) {
 
 1916             for (j = 0; j < fSizeY; j++) {
 
 1917                working_matrix[i][j] = fSource[i][j];
 
 1920          HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 1921                      fDirection, kTransformHaar);
 
 1922          for (i = 0; i < fSizeX; i++) {
 
 1923             for (j = 0; j < fSizeY; j++) {
 
 1924                fDest[i][j] = working_matrix[i][j];
 
 1928       case kTransformWalsh:
 
 1929          for (i = 0; i < fSizeX; i++) {
 
 1930             for (j = 0; j < fSizeY; j++) {
 
 1931                working_matrix[i][j] = fSource[i][j];
 
 1934          HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 1935                      fDirection, kTransformWalsh);
 
 1936          for (i = 0; i < fSizeX; i++) {
 
 1937             for (j = 0; j < fSizeY; j++) {
 
 1938                fDest[i][j] = working_matrix[i][j];
 
 1943          for (i = 0; i < fSizeX; i++) {
 
 1944             for (j = 0; j < fSizeY; j++) {
 
 1945                working_matrix[i][j] = fSource[i][j];
 
 1948          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1950          for (i = 0; i < fSizeX; i++) {
 
 1951             for (j = 0; j < fSizeY; j++) {
 
 1952                fDest[i][j] = working_matrix[i][j];
 
 1957          for (i = 0; i < fSizeX; i++) {
 
 1958             for (j = 0; j < fSizeY; j++) {
 
 1959                working_matrix[i][j] = fSource[i][j];
 
 1962          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1964          for (i = 0; i < fSizeX; i++) {
 
 1965             for (j = 0; j < fSizeY; j++) {
 
 1966                fDest[i][j] = working_matrix[i][j];
 
 1970       case kTransformFourier:
 
 1971          for (i = 0; i < fSizeX; i++) {
 
 1972             for (j = 0; j < fSizeY; j++) {
 
 1973                working_matrix[i][j] = fSource[i][j];
 
 1976          for (i = 0; i < fSizeX; i++) {
 
 1977             for (j = 0; j < fSizeY; j++) {
 
 1978                working_matrix[i][j + fSizeY] = fSource[i][j + fSizeY];
 
 1981          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1983          for (i = 0; i < fSizeX; i++) {
 
 1984             for (j = 0; j < fSizeY; j++) {
 
 1985                fDest[i][j] = working_matrix[i][j];
 
 1989       case kTransformHartley:
 
 1990          for (i = 0; i < fSizeX; i++) {
 
 1991             for (j = 0; j < fSizeY; j++) {
 
 1992                working_matrix[i][j] = fSource[i][j];
 
 1995          FourCos2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 1997          for (i = 0; i < fSizeX; i++) {
 
 1998             for (j = 0; j < fSizeY; j++) {
 
 1999                fDest[i][j] = working_matrix[i][j];
 
 2003       case kTransformFourierWalsh:
 
 2004       case kTransformFourierHaar:
 
 2005       case kTransformWalshHaar:
 
 2006       case kTransformCosWalsh:
 
 2007       case kTransformCosHaar:
 
 2008       case kTransformSinWalsh:
 
 2009       case kTransformSinHaar:
 
 2010          for (i = 0; i < fSizeX; i++) {
 
 2011             for (j = 0; j < fSizeY; j++) {
 
 2012                working_matrix[i][j] = fSource[i][j];
 
 2015          if (fTransformType == kTransformFourierWalsh
 
 2016               || fTransformType == kTransformFourierHaar) {
 
 2017             for (i = 0; i < fSizeX; i++) {
 
 2018                for (j = 0; j < fSizeY; j++) {
 
 2019                   working_matrix[i][j + fSizeY] = fSource[i][j + fSizeY];
 
 2023          General2(working_matrix, working_vector, fSizeX, fSizeY, fDirection,
 
 2024                    fTransformType, fDegree);
 
 2025          for (i = 0; i < fSizeX; i++) {
 
 2026             for (j = 0; j < fSizeY; j++) {
 
 2027                fDest[i][j] = working_matrix[i][j];
 
 2033    for (i = 0; i < fSizeX; i++) {
 
 2034       if (working_matrix) 
delete[]working_matrix[i];
 
 2036    delete[]working_matrix;
 
 2037    delete[]working_vector;
 
 2114 void TSpectrum2Transform::FilterZonal(
const Double_t **fSource, Double_t **fDest)
 
 2117    Double_t a, old_area = 0, new_area = 0;
 
 2119    Double_t *working_vector = 0, **working_matrix = 0;
 
 2120    size = (Int_t) TMath::Max(fSizeX, fSizeY);
 
 2121    switch (fTransformType) {
 
 2122    case kTransformHaar:
 
 2123    case kTransformWalsh:
 
 2124       working_vector = 
new Double_t[2 * size];
 
 2125       working_matrix = 
new Double_t *[fSizeX];
 
 2126       for (i = 0; i < fSizeX; i++)
 
 2127          working_matrix[i] = 
new Double_t[fSizeY];
 
 2131    case kTransformFourier:
 
 2132    case kTransformHartley:
 
 2133    case kTransformFourierWalsh:
 
 2134    case kTransformFourierHaar:
 
 2135    case kTransformWalshHaar:
 
 2136       working_vector = 
new Double_t[4 * size];
 
 2137       working_matrix = 
new Double_t *[fSizeX];
 
 2138       for (i = 0; i < fSizeX; i++)
 
 2139          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 2141    case kTransformCosWalsh:
 
 2142    case kTransformCosHaar:
 
 2143    case kTransformSinWalsh:
 
 2144    case kTransformSinHaar:
 
 2145       working_vector = 
new Double_t[8 * size];
 
 2146       working_matrix = 
new Double_t *[fSizeX];
 
 2147       for (i = 0; i < fSizeX; i++)
 
 2148          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 2151    switch (fTransformType) {
 
 2152    case kTransformHaar:
 
 2153       for (i = 0; i < fSizeX; i++) {
 
 2154          for (j = 0; j < fSizeY; j++) {
 
 2155             working_matrix[i][j] = fSource[i][j];
 
 2156             old_area = old_area + fSource[i][j];
 
 2159       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2160                   kTransformForward, kTransformHaar);
 
 2162    case kTransformWalsh:
 
 2163       for (i = 0; i < fSizeX; i++) {
 
 2164          for (j = 0; j < fSizeY; j++) {
 
 2165             working_matrix[i][j] = fSource[i][j];
 
 2166             old_area = old_area + fSource[i][j];
 
 2169       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2170                   kTransformForward, kTransformWalsh);
 
 2173       for (i = 0; i < fSizeX; i++) {
 
 2174          for (j = 0; j < fSizeY; j++) {
 
 2175             working_matrix[i][j] = fSource[i][j];
 
 2176             old_area = old_area + fSource[i][j];
 
 2179       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2180                 kTransformForward, kTransformCos);
 
 2183       for (i = 0; i < fSizeX; i++) {
 
 2184          for (j = 0; j < fSizeY; j++) {
 
 2185             working_matrix[i][j] = fSource[i][j];
 
 2186             old_area = old_area + fSource[i][j];
 
 2189       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2190                 kTransformForward, kTransformSin);
 
 2192    case kTransformFourier:
 
 2193       for (i = 0; i < fSizeX; i++) {
 
 2194          for (j = 0; j < fSizeY; j++) {
 
 2195             working_matrix[i][j] = fSource[i][j];
 
 2196             old_area = old_area + fSource[i][j];
 
 2199       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2200                 kTransformForward, kTransformFourier);
 
 2202    case kTransformHartley:
 
 2203       for (i = 0; i < fSizeX; i++) {
 
 2204          for (j = 0; j < fSizeY; j++) {
 
 2205             working_matrix[i][j] = fSource[i][j];
 
 2206             old_area = old_area + fSource[i][j];
 
 2209       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2210                 kTransformForward, kTransformHartley);
 
 2212    case kTransformFourierWalsh:
 
 2213    case kTransformFourierHaar:
 
 2214    case kTransformWalshHaar:
 
 2215    case kTransformCosWalsh:
 
 2216    case kTransformCosHaar:
 
 2217    case kTransformSinWalsh:
 
 2218    case kTransformSinHaar:
 
 2219       for (i = 0; i < fSizeX; i++) {
 
 2220          for (j = 0; j < fSizeY; j++) {
 
 2221             working_matrix[i][j] = fSource[i][j];
 
 2222             old_area = old_area + fSource[i][j];
 
 2225       General2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2226                 kTransformForward, fTransformType, fDegree);
 
 2229    for (i = 0; i < fSizeX; i++) {
 
 2230       for (j = 0; j < fSizeY; j++) {
 
 2231          if (i >= fXmin && i <= fXmax && j >= fYmin && j <= fYmax)
 
 2232             if (working_matrix) working_matrix[i][j] = fFilterCoeff;
 
 2235    if (fTransformType == kTransformFourier || fTransformType == kTransformFourierWalsh
 
 2236         || fTransformType == kTransformFourierHaar) {
 
 2237       for (i = 0; i < fSizeX; i++) {
 
 2238          for (j = 0; j < fSizeY; j++) {
 
 2239             if (i >= fXmin && i <= fXmax && j >= fYmin && j <= fYmax)
 
 2240                if (working_matrix) working_matrix[i][j + fSizeY] = fFilterCoeff;
 
 2244    switch (fTransformType) {
 
 2245    case kTransformHaar:
 
 2246       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2247                   kTransformInverse, kTransformHaar);
 
 2248       for (i = 0; i < fSizeX; i++) {
 
 2249          for (j = 0; j < fSizeY; j++) {
 
 2250             new_area = new_area + working_matrix[i][j];
 
 2253       if (new_area != 0) {
 
 2254          a = old_area / new_area;
 
 2255          for (i = 0; i < fSizeX; i++) {
 
 2256             for (j = 0; j < fSizeY; j++) {
 
 2257                fDest[i][j] = working_matrix[i][j] * a;
 
 2262    case kTransformWalsh:
 
 2263       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2264                   kTransformInverse, kTransformWalsh);
 
 2265       for (i = 0; i < fSizeX; i++) {
 
 2266          for (j = 0; j < fSizeY; j++) {
 
 2267             new_area = new_area + working_matrix[i][j];
 
 2270       if (new_area != 0) {
 
 2271          a = old_area / new_area;
 
 2272          for (i = 0; i < fSizeX; i++) {
 
 2273             for (j = 0; j < fSizeY; j++) {
 
 2274                fDest[i][j] = working_matrix[i][j] * a;
 
 2280       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2281                 kTransformInverse, kTransformCos);
 
 2282       for (i = 0; i < fSizeX; i++) {
 
 2283          for (j = 0; j < fSizeY; j++) {
 
 2284             new_area = new_area + working_matrix[i][j];
 
 2287       if (new_area != 0) {
 
 2288          a = old_area / new_area;
 
 2289          for (i = 0; i < fSizeX; i++) {
 
 2290             for (j = 0; j < fSizeY; j++) {
 
 2291                fDest[i][j] = working_matrix[i][j] * a;
 
 2297       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2298                 kTransformInverse, kTransformSin);
 
 2299       for (i = 0; i < fSizeX; i++) {
 
 2300          for (j = 0; j < fSizeY; j++) {
 
 2301             new_area = new_area + working_matrix[i][j];
 
 2304       if (new_area != 0) {
 
 2305          a = old_area / new_area;
 
 2306          for (i = 0; i < fSizeX; i++) {
 
 2307             for (j = 0; j < fSizeY; j++) {
 
 2308                fDest[i][j] = working_matrix[i][j] * a;
 
 2313    case kTransformFourier:
 
 2314       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2315                 kTransformInverse, kTransformFourier);
 
 2316       for (i = 0; i < fSizeX; i++) {
 
 2317          for (j = 0; j < fSizeY; j++) {
 
 2318             new_area = new_area + working_matrix[i][j];
 
 2321       if (new_area != 0) {
 
 2322          a = old_area / new_area;
 
 2323          for (i = 0; i < fSizeX; i++) {
 
 2324             for (j = 0; j < fSizeY; j++) {
 
 2325                fDest[i][j] = working_matrix[i][j] * a;
 
 2330    case kTransformHartley:
 
 2331       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2332                 kTransformInverse, kTransformHartley);
 
 2333       for (i = 0; i < fSizeX; i++) {
 
 2334          for (j = 0; j < fSizeY; j++) {
 
 2335             new_area = new_area + working_matrix[i][j];
 
 2338       if (new_area != 0) {
 
 2339          a = old_area / new_area;
 
 2340          for (i = 0; i < fSizeX; i++) {
 
 2341             for (j = 0; j < fSizeY; j++) {
 
 2342                fDest[i][j] = working_matrix[i][j] * a;
 
 2347    case kTransformFourierWalsh:
 
 2348    case kTransformFourierHaar:
 
 2349    case kTransformWalshHaar:
 
 2350    case kTransformCosWalsh:
 
 2351    case kTransformCosHaar:
 
 2352    case kTransformSinWalsh:
 
 2353    case kTransformSinHaar:
 
 2354       General2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2355                 kTransformInverse, fTransformType, fDegree);
 
 2356       for (i = 0; i < fSizeX; i++) {
 
 2357          for (j = 0; j < fSizeY; j++) {
 
 2358             new_area = new_area + working_matrix[i][j];
 
 2361       if (new_area != 0) {
 
 2362          a = old_area / new_area;
 
 2363          for (i = 0; i < fSizeX; i++) {
 
 2364             for (j = 0; j < fSizeY; j++) {
 
 2365                fDest[i][j] = working_matrix[i][j] * a;
 
 2371    for (i = 0; i < fSizeX; i++) {
 
 2372       if (working_matrix) 
delete[]working_matrix[i];
 
 2374    delete[]working_matrix;
 
 2375    delete[]working_vector;
 
 2445 void TSpectrum2Transform::Enhance(
const Double_t **fSource, Double_t **fDest)
 
 2448    Double_t a, old_area = 0, new_area = 0;
 
 2450    Double_t *working_vector = 0, **working_matrix = 0;
 
 2451    size = (Int_t) TMath::Max(fSizeX, fSizeY);
 
 2452    switch (fTransformType) {
 
 2453    case kTransformHaar:
 
 2454    case kTransformWalsh:
 
 2455       working_vector = 
new Double_t[2 * size];
 
 2456       working_matrix = 
new Double_t *[fSizeX];
 
 2457       for (i = 0; i < fSizeX; i++)
 
 2458          working_matrix[i] = 
new Double_t[fSizeY];
 
 2462    case kTransformFourier:
 
 2463    case kTransformHartley:
 
 2464    case kTransformFourierWalsh:
 
 2465    case kTransformFourierHaar:
 
 2466    case kTransformWalshHaar:
 
 2467       working_vector = 
new Double_t[4 * size];
 
 2468       working_matrix = 
new Double_t *[fSizeX];
 
 2469       for (i = 0; i < fSizeX; i++)
 
 2470          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 2472    case kTransformCosWalsh:
 
 2473    case kTransformCosHaar:
 
 2474    case kTransformSinWalsh:
 
 2475    case kTransformSinHaar:
 
 2476       working_vector = 
new Double_t[8 * size];
 
 2477       working_matrix = 
new Double_t *[fSizeX];
 
 2478       for (i = 0; i < fSizeX; i++)
 
 2479          working_matrix[i] = 
new Double_t[2 * fSizeY];
 
 2482    switch (fTransformType) {
 
 2483    case kTransformHaar:
 
 2484       for (i = 0; i < fSizeX; i++) {
 
 2485          for (j = 0; j < fSizeY; j++) {
 
 2486             working_matrix[i][j] = fSource[i][j];
 
 2487             old_area = old_area + fSource[i][j];
 
 2490       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2491                   kTransformForward, kTransformHaar);
 
 2493    case kTransformWalsh:
 
 2494       for (i = 0; i < fSizeX; i++) {
 
 2495          for (j = 0; j < fSizeY; j++) {
 
 2496             working_matrix[i][j] = fSource[i][j];
 
 2497             old_area = old_area + fSource[i][j];
 
 2500       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2501                   kTransformForward, kTransformWalsh);
 
 2504       for (i = 0; i < fSizeX; i++) {
 
 2505          for (j = 0; j < fSizeY; j++) {
 
 2506             working_matrix[i][j] = fSource[i][j];
 
 2507             old_area = old_area + fSource[i][j];
 
 2510       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2511                 kTransformForward, kTransformCos);
 
 2514       for (i = 0; i < fSizeX; i++) {
 
 2515          for (j = 0; j < fSizeY; j++) {
 
 2516             working_matrix[i][j] = fSource[i][j];
 
 2517             old_area = old_area + fSource[i][j];
 
 2520       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2521                 kTransformForward, kTransformSin);
 
 2523    case kTransformFourier:
 
 2524       for (i = 0; i < fSizeX; i++) {
 
 2525          for (j = 0; j < fSizeY; j++) {
 
 2526             working_matrix[i][j] = fSource[i][j];
 
 2527             old_area = old_area + fSource[i][j];
 
 2530       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2531                 kTransformForward, kTransformFourier);
 
 2533    case kTransformHartley:
 
 2534       for (i = 0; i < fSizeX; i++) {
 
 2535          for (j = 0; j < fSizeY; j++) {
 
 2536             working_matrix[i][j] = fSource[i][j];
 
 2537             old_area = old_area + fSource[i][j];
 
 2540       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2541                 kTransformForward, kTransformHartley);
 
 2543    case kTransformFourierWalsh:
 
 2544    case kTransformFourierHaar:
 
 2545    case kTransformWalshHaar:
 
 2546    case kTransformCosWalsh:
 
 2547    case kTransformCosHaar:
 
 2548    case kTransformSinWalsh:
 
 2549    case kTransformSinHaar:
 
 2550       for (i = 0; i < fSizeX; i++) {
 
 2551          for (j = 0; j < fSizeY; j++) {
 
 2552             working_matrix[i][j] = fSource[i][j];
 
 2553             old_area = old_area + fSource[i][j];
 
 2556       General2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2557                 kTransformForward, fTransformType, fDegree);
 
 2560    for (i = 0; i < fSizeX; i++) {
 
 2561       for (j = 0; j < fSizeY; j++) {
 
 2562          if (i >= fXmin && i <= fXmax && j >= fYmin && j <= fYmax)
 
 2563             if (working_matrix) working_matrix[i][j] *= fEnhanceCoeff;
 
 2566    if (fTransformType == kTransformFourier || fTransformType == kTransformFourierWalsh
 
 2567         || fTransformType == kTransformFourierHaar) {
 
 2568       for (i = 0; i < fSizeX; i++) {
 
 2569          for (j = 0; j < fSizeY; j++) {
 
 2570             if (i >= fXmin && i <= fXmax && j >= fYmin && j <= fYmax)
 
 2571                working_matrix[i][j + fSizeY] *= fEnhanceCoeff;
 
 2575    switch (fTransformType) {
 
 2576    case kTransformHaar:
 
 2577       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2578                   kTransformInverse, kTransformHaar);
 
 2579       for (i = 0; i < fSizeX; i++) {
 
 2580          for (j = 0; j < fSizeY; j++) {
 
 2581             new_area = new_area + working_matrix[i][j];
 
 2584       if (new_area != 0) {
 
 2585          a = old_area / new_area;
 
 2586          for (i = 0; i < fSizeX; i++) {
 
 2587             for (j = 0; j < fSizeY; j++) {
 
 2588                fDest[i][j] = working_matrix[i][j] * a;
 
 2593    case kTransformWalsh:
 
 2594       HaarWalsh2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2595                   kTransformInverse, kTransformWalsh);
 
 2596       for (i = 0; i < fSizeX; i++) {
 
 2597          for (j = 0; j < fSizeY; j++) {
 
 2598             new_area = new_area + working_matrix[i][j];
 
 2601       if (new_area != 0) {
 
 2602          a = old_area / new_area;
 
 2603          for (i = 0; i < fSizeX; i++) {
 
 2604             for (j = 0; j < fSizeY; j++) {
 
 2605                fDest[i][j] = working_matrix[i][j] * a;
 
 2611       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2612                 kTransformInverse, kTransformCos);
 
 2613       for (i = 0; i < fSizeX; i++) {
 
 2614          for (j = 0; j < fSizeY; j++) {
 
 2615             new_area = new_area + working_matrix[i][j];
 
 2618       if (new_area != 0) {
 
 2619          a = old_area / new_area;
 
 2620          for (i = 0; i < fSizeX; i++) {
 
 2621             for (j = 0; j < fSizeY; j++) {
 
 2622                fDest[i][j] = working_matrix[i][j] * a;
 
 2628       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2629                 kTransformInverse, kTransformSin);
 
 2630       for (i = 0; i < fSizeX; i++) {
 
 2631          for (j = 0; j < fSizeY; j++) {
 
 2632             new_area = new_area + working_matrix[i][j];
 
 2635       if (new_area != 0) {
 
 2636          a = old_area / new_area;
 
 2637          for (i = 0; i < fSizeX; i++) {
 
 2638             for (j = 0; j < fSizeY; j++) {
 
 2639                fDest[i][j] = working_matrix[i][j] * a;
 
 2644    case kTransformFourier:
 
 2645       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2646                 kTransformInverse, kTransformFourier);
 
 2647       for (i = 0; i < fSizeX; i++) {
 
 2648          for (j = 0; j < fSizeY; j++) {
 
 2649             new_area = new_area + working_matrix[i][j];
 
 2652       if (new_area != 0) {
 
 2653          a = old_area / new_area;
 
 2654          for (i = 0; i < fSizeX; i++) {
 
 2655             for (j = 0; j < fSizeY; j++) {
 
 2656                fDest[i][j] = working_matrix[i][j] * a;
 
 2661    case kTransformHartley:
 
 2662       FourCos2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2663                 kTransformInverse, kTransformHartley);
 
 2664       for (i = 0; i < fSizeX; i++) {
 
 2665          for (j = 0; j < fSizeY; j++) {
 
 2666             new_area = new_area + working_matrix[i][j];
 
 2669       if (new_area != 0) {
 
 2670          a = old_area / new_area;
 
 2671          for (i = 0; i < fSizeX; i++) {
 
 2672             for (j = 0; j < fSizeY; j++) {
 
 2673                fDest[i][j] = working_matrix[i][j] * a;
 
 2678    case kTransformFourierWalsh:
 
 2679    case kTransformFourierHaar:
 
 2680    case kTransformWalshHaar:
 
 2681    case kTransformCosWalsh:
 
 2682    case kTransformCosHaar:
 
 2683    case kTransformSinWalsh:
 
 2684    case kTransformSinHaar:
 
 2685       General2(working_matrix, working_vector, fSizeX, fSizeY,
 
 2686                 kTransformInverse, fTransformType, fDegree);
 
 2687       for (i = 0; i < fSizeX; i++) {
 
 2688          for (j = 0; j < fSizeY; j++) {
 
 2689             new_area = new_area + working_matrix[i][j];
 
 2692       if (new_area != 0) {
 
 2693          a = old_area / new_area;
 
 2694          for (i = 0; i < fSizeX; i++) {
 
 2695             for (j = 0; j < fSizeY; j++) {
 
 2696                fDest[i][j] = working_matrix[i][j] * a;
 
 2702    for (i = 0; i < fSizeX; i++) {
 
 2703       if (working_matrix) 
delete[]working_matrix[i];
 
 2705    delete[]working_matrix;
 
 2706    delete[]working_vector;
 
 2715 void TSpectrum2Transform::SetTransformType(Int_t transType, Int_t degree)
 
 2720    for (; n < fSizeX;) {
 
 2726    for (; n < fSizeY;) {
 
 2730    if (transType < kTransformHaar || transType > kTransformSinHaar){
 
 2731       Error (
"TSpectrumTransform",
"Invalid type of transform");
 
 2734    if (transType >= kTransformFourierWalsh && transType <= kTransformSinHaar) {
 
 2735       if (degree > j1 || degree > j2 || degree < 1){
 
 2736          Error (
"TSpectrumTransform",
"Invalid degree of mixed transform");
 
 2740    fTransformType = transType;
 
 2748 void TSpectrum2Transform::SetRegion(Int_t xmin, Int_t xmax, Int_t ymin, Int_t ymax)
 
 2750    if(xmin<0 || xmax < xmin || xmax >= fSizeX){
 
 2751       Error(
"TSpectrumTransform", 
"Wrong range");
 
 2754    if(ymin<0 || ymax < ymin || ymax >= fSizeY){
 
 2755       Error(
"TSpectrumTransform", 
"Wrong range");
 
 2768 void TSpectrum2Transform::SetDirection(Int_t direction)
 
 2770    if(direction != kTransformForward && direction != kTransformInverse){
 
 2771       Error(
"TSpectrumTransform", 
"Wrong direction");
 
 2774    fDirection = direction;
 
 2781 void TSpectrum2Transform::SetFilterCoeff(Double_t filterCoeff)
 
 2783    fFilterCoeff = filterCoeff;
 
 2790 void TSpectrum2Transform::SetEnhanceCoeff(Double_t enhanceCoeff)
 
 2792    fEnhanceCoeff = enhanceCoeff;