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;