89 #define PEAK_WINDOW 1024
206 Error(
"Background",
"function not yet implemented: h=%s, iter=%d, option=%sn"
207 , h->
GetName(), number_of_iterations, option);
264 if (dimension != 2) {
265 Error(
"Search",
"Must be a 2-d histogram");
284 Int_t i, j, binx,biny, npeaks;
287 for (i = 0; i < sizex; i++) {
290 for (j = 0; j < sizey; j++) {
301 for (i = 0; i < npeaks; i++) {
307 for (i = 0; i < sizex; i++) {
316 if (!npeaks)
return 0;
327 ((
TH1*)hin)->Draw(option);
379 Int_t numberIterationsX,
380 Int_t numberIterationsY,
843 if (ssizex <= 0 || ssizey <= 0)
844 return "Wrong parameters";
845 if (numberIterationsX < 1 || numberIterationsY < 1)
846 return "Width of Clipping Window Must Be Positive";
847 if (ssizex < 2 * numberIterationsX + 1
848 || ssizey < 2 * numberIterationsY + 1)
849 return (
"Too Large Clipping Window");
851 for (i = 0; i < ssizex; i++)
852 working_space[i] =
new Double_t[ssizey];
857 for (i = 1; i <= sampling; i++) {
860 for (y = r2; y < ssizey -
r2; y++) {
861 for (x = r1; x < ssizex -
r1; x++) {
863 p1 = spectrum[x -
r1][y -
r2];
864 p2 = spectrum[x -
r1][y +
r2];
865 p3 = spectrum[x +
r1][y -
r2];
866 p4 = spectrum[x +
r1][y +
r2];
867 s1 = spectrum[
x][y -
r2];
868 s2 = spectrum[x -
r1][
y];
869 s3 = spectrum[x +
r1][
y];
870 s4 = spectrum[
x][y +
r2];
883 s1 = s1 - (p1 +
p3) / 2.0;
884 s2 = s2 - (p1 +
p2) / 2.0;
885 s3 = s3 - (p3 + p4) / 2.0;
886 s4 = s4 - (p2 + p4) / 2.0;
887 b = (s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
892 working_space[
x][
y] =
a;
895 for (y = r2; y < ssizey -
r2; y++) {
896 for (x = r1; x < ssizex -
r1; x++) {
897 spectrum[
x][
y] = working_space[
x][
y];
904 for (i = 1; i <= sampling; i++) {
907 for (y = r2; y < ssizey -
r2; y++) {
908 for (x = r1; x < ssizex -
r1; x++) {
910 b = -(spectrum[x -
r1][y -
r2] +
911 spectrum[x -
r1][y +
r2] + spectrum[x +
r1][y -
913 + spectrum[x +
r1][y +
r2]) / 4 +
914 (spectrum[x][y - r2] + spectrum[x - r1][y] +
915 spectrum[x + r1][y] + spectrum[x][y + r2]) / 2;
918 working_space[
x][
y] =
a;
921 for (y = i; y < ssizey - i; y++) {
922 for (x = i; x < ssizex - i; x++) {
923 spectrum[
x][
y] = working_space[
x][
y];
932 for (i = sampling; i >= 1; i--) {
935 for (y = r2; y < ssizey -
r2; y++) {
936 for (x = r1; x < ssizex -
r1; x++) {
938 p1 = spectrum[x -
r1][y -
r2];
939 p2 = spectrum[x -
r1][y +
r2];
940 p3 = spectrum[x +
r1][y -
r2];
941 p4 = spectrum[x +
r1][y +
r2];
942 s1 = spectrum[
x][y -
r2];
943 s2 = spectrum[x -
r1][
y];
944 s3 = spectrum[x +
r1][
y];
945 s4 = spectrum[
x][y +
r2];
958 s1 = s1 - (p1 +
p3) / 2.0;
959 s2 = s2 - (p1 +
p2) / 2.0;
960 s3 = s3 - (p3 + p4) / 2.0;
961 s4 = s4 - (p2 + p4) / 2.0;
962 b = (s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
967 working_space[
x][
y] =
a;
970 for (y = r2; y < ssizey -
r2; y++) {
971 for (x = r1; x < ssizex -
r1; x++) {
972 spectrum[
x][
y] = working_space[
x][
y];
979 for (i = sampling; i >= 1; i--) {
982 for (y = r2; y < ssizey -
r2; y++) {
983 for (x = r1; x < ssizex -
r1; x++) {
985 b = -(spectrum[x -
r1][y -
r2] +
986 spectrum[x -
r1][y +
r2] + spectrum[x +
r1][y -
988 + spectrum[x +
r1][y +
r2]) / 4 +
989 (spectrum[x][y - r2] + spectrum[x - r1][y] +
990 spectrum[x + r1][y] + spectrum[x][y + r2]) / 2;
993 working_space[
x][
y] =
a;
996 for (y = i; y < ssizey - i; y++) {
997 for (x = i; x < ssizex - i; x++) {
998 spectrum[
x][
y] = working_space[
x][
y];
1004 for (i = 0; i < ssizex; i++)
1005 delete[]working_space[i];
1006 delete[]working_space;
1246 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy, plocha = 0;
1248 return "Averaging Window must be positive";
1250 for(i = 0; i < ssizex; i++)
1251 working_space[i] =
new Double_t[ssizey];
1256 for(i = 0, maxch = 0; i < ssizex; i++){
1257 for(j = 0; j < ssizey; j++){
1258 working_space[i][j] = 0;
1259 if(maxch < source[i][j])
1260 maxch = source[i][j];
1262 plocha += source[i][j];
1266 delete [] working_space;
1272 for(i = xmin; i <
xmax; i++){
1273 nip = source[i][
ymin] / maxch;
1274 nim = source[i + 1][
ymin] / maxch;
1276 for(l = 1; l <= averWindow; l++){
1281 a = source[i +
l][
ymin] / maxch;
1291 if(i - l + 1 < xmin)
1295 a = source[i - l + 1][
ymin] / maxch;
1307 a = working_space[i + 1][
ymin] = a * working_space[i][
ymin];
1310 for(i = ymin; i <
ymax; i++){
1311 nip = source[
xmin][i] / maxch;
1312 nim = source[
xmin][i + 1] / maxch;
1314 for(l = 1; l <= averWindow; l++){
1319 a = source[
xmin][i +
l] / maxch;
1329 if(i - l + 1 < ymin)
1333 a = source[
xmin][i - l + 1] / maxch;
1345 a = working_space[
xmin][i + 1] = a * working_space[
xmin][i];
1348 for(i = xmin; i <
xmax; i++){
1349 for(j = ymin; j <
ymax; j++){
1350 nip = source[i][j + 1] / maxch;
1351 nim = source[i + 1][j + 1] / maxch;
1353 for(l = 1; l <= averWindow; l++){
1355 a = source[
xmax][j] / maxch;
1358 a = source[i +
l][j] / maxch;
1368 if(i - l + 1 < xmin)
1369 a = source[
xmin][j] / maxch;
1372 a = source[i - l + 1][j] / maxch;
1384 nip = source[i + 1][j] / maxch;
1385 nim = source[i + 1][j + 1] / maxch;
1386 for (l = 1; l <= averWindow; l++) {
1387 if (j + l > ymax) a = source[i][
ymax]/maxch;
1388 else a = source[i][j +
l] / maxch;
1390 if (a + nip <= 0) a = 1;
1395 if (j - l + 1 < ymin) a = source[i][
ymin] / maxch;
1396 else a = source[i][j - l + 1] / maxch;
1398 if (a + nim <= 0) a = 1;
1404 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx +smy);
1405 working_space[i + 1][j + 1] =
a;
1409 for(i = xmin; i <=
xmax; i++){
1410 for(j = ymin; j <=
ymax; j++){
1411 working_space[i][j] = working_space[i][j] / nom;
1414 for(i = 0;i < ssizex; i++){
1415 for(j = 0; j < ssizey; j++){
1416 source[i][j] = plocha * working_space[i][j];
1419 for (i = 0; i < ssizex; i++)
1420 delete[]working_space[i];
1421 delete[]working_space;
1446 Int_t numberIterations,
1447 Int_t numberRepetitions,
1987 Int_t i, j, lhx, lhy, i1, i2, j1, j2, k1, k2, lindex, i1min, i1max,
1988 i2min, i2max, j1min, j1max, j2min, j2max, positx = 0, posity = 0, repet;
1989 Double_t lda, ldb, ldc, area, maximum = 0;
1990 if (ssizex <= 0 || ssizey <= 0)
1991 return "Wrong parameters";
1992 if (numberIterations <= 0)
1993 return "Number of iterations must be positive";
1994 if (numberRepetitions <= 0)
1995 return "Number of repetitions must be positive";
1997 for (i = 0; i < ssizex; i++)
1998 working_space[i] =
new Double_t[5 * ssizey];
2001 for (i = 0; i < ssizex; i++) {
2002 for (j = 0; j < ssizey; j++) {
2010 working_space[i][j] = lda;
2012 if (lda > maximum) {
2014 positx = i, posity = j;
2018 if (lhx == -1 || lhy == -1) {
2019 delete [] working_space;
2020 return (
"Zero response data");
2024 for (i2 = 0; i2 < ssizey; i2++) {
2025 for (i1 = 0; i1 < ssizex; i1++) {
2027 for (j2 = 0; j2 <= (lhy - 1); j2++) {
2028 for (j1 = 0; j1 <= (lhx - 1); j1++) {
2029 k2 = i2 + j2, k1 = i1 + j1;
2030 if (k2 >= 0 && k2 < ssizey && k1 >= 0 && k1 < ssizex) {
2031 lda = working_space[j1][j2];
2032 ldb = source[k1][k2];
2033 ldc = ldc + lda * ldb;
2037 working_space[i1][i2 + ssizey] = ldc;
2042 i1min = -(lhx - 1), i1max = lhx - 1;
2043 i2min = -(lhy - 1), i2max = lhy - 1;
2044 for (i2 = i2min; i2 <= i2max; i2++) {
2045 for (i1 = i1min; i1 <= i1max; i1++) {
2050 j2max = lhy - 1 - i2;
2051 if (j2max > lhy - 1)
2053 for (j2 = j2min; j2 <= j2max; j2++) {
2057 j1max = lhx - 1 - i1;
2058 if (j1max > lhx - 1)
2060 for (j1 = j1min; j1 <= j1max; j1++) {
2061 lda = working_space[j1][j2];
2062 if (i1 + j1 < ssizex && i2 + j2 < ssizey)
2063 ldb = working_space[i1 + j1][i2 + j2];
2066 ldc = ldc + lda * ldb;
2069 working_space[i1 - i1min][i2 - i2min + 2 * ssizey ] = ldc;
2074 for (i2 = 0; i2 < ssizey; i2++) {
2075 for (i1 = 0; i1 < ssizex; i1++) {
2076 working_space[i1][i2 + 3 * ssizey] = 1;
2077 working_space[i1][i2 + 4 * ssizey] = 0;
2082 for (repet = 0; repet < numberRepetitions; repet++) {
2084 for (i = 0; i < ssizex; i++) {
2085 for (j = 0; j < ssizey; j++) {
2086 working_space[i][j + 3 * ssizey] =
2091 for (lindex = 0; lindex < numberIterations; lindex++) {
2092 for (i2 = 0; i2 < ssizey; i2++) {
2093 for (i1 = 0; i1 < ssizex; i1++) {
2096 if (j2min > lhy - 1)
2099 j2max = ssizey - i2 - 1;
2100 if (j2max > lhy - 1)
2103 if (j1min > lhx - 1)
2106 j1max = ssizex - i1 - 1;
2107 if (j1max > lhx - 1)
2109 for (j2 = j2min; j2 <= j2max; j2++) {
2110 for (j1 = j1min; j1 <= j1max; j1++) {
2111 ldc = working_space[j1 - i1min][j2 - i2min + 2 * ssizey];
2112 lda = working_space[i1 + j1][i2 + j2 + 3 * ssizey];
2113 ldb = ldb + lda * ldc;
2116 lda = working_space[i1][i2 + 3 * ssizey];
2117 ldc = working_space[i1][i2 + 1 * ssizey];
2118 if (ldc * lda != 0 && ldb != 0) {
2119 lda = lda * ldc / ldb;
2124 working_space[i1][i2 + 4 * ssizey] = lda;
2127 for (i2 = 0; i2 < ssizey; i2++) {
2128 for (i1 = 0; i1 < ssizex; i1++)
2129 working_space[i1][i2 + 3 * ssizey] =
2130 working_space[i1][i2 + 4 * ssizey];
2134 for (i = 0; i < ssizex; i++) {
2135 for (j = 0; j < ssizey; j++)
2136 source[(i + positx) % ssizex][(j + posity) % ssizey] =
2137 area * working_space[i][j + 3 * ssizey];
2139 for (i = 0; i < ssizex; i++)
2140 delete[]working_space[i];
2141 delete[]working_space;
2861 Int_t number_of_iterations = (
Int_t)(4 * sigma + 0.5);
2862 Int_t k, lindex, priz;
2863 Double_t lda, ldb, ldc, area, maximum;
2864 Int_t xmin,
xmax,
l, peak_index = 0, ssizex_ext = ssizex + 4 * number_of_iterations, ssizey_ext = ssizey + 4 * number_of_iterations, shift = 2 * number_of_iterations;
2866 Double_t a, b, ax, ay, maxch, plocha = 0;
2867 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy;
2870 Int_t lhx, lhy, i1, i2, j1, j2, k1, k2, i1min, i1max, i2min, i2max, j1min, j1max, j2min, j2max, positx, posity;
2872 Error(
"SearchHighRes",
"Invalid sigma, must be greater than or equal to 1");
2876 if(threshold<=0||threshold>=100){
2877 Error(
"SearchHighRes",
"Invalid threshold, must be positive and less than 100");
2881 j = (
Int_t) (5.0 * sigma + 0.5);
2883 Error(
"SearchHighRes",
"Too large sigma");
2887 if (markov ==
true) {
2888 if (averWindow <= 0) {
2889 Error(
"SearchHighRes",
"Averanging window must be positive");
2893 if(backgroundRemove ==
true){
2894 if(ssizex_ext < 2 * number_of_iterations + 1 || ssizey_ext < 2 * number_of_iterations + 1){
2895 Error(
"SearchHighRes",
"Too large clipping window");
2899 i = (
Int_t)(4 * sigma + 0.5);
2902 for (j = 0; j < ssizex + i; j++) {
2904 for (k=0;k<16 * (ssizey + i);k++) wsk[k] = 0;
2906 for(j = 0; j < ssizey_ext; j++){
2907 for(i = 0; i < ssizex_ext; i++){
2910 working_space[i][j + ssizey_ext] = source[0][0];
2912 else if(j >= ssizey + shift)
2913 working_space[i][j + ssizey_ext] = source[0][ssizey - 1];
2916 working_space[i][j + ssizey_ext] = source[0][j - shift];
2919 else if(i >= ssizex + shift){
2921 working_space[i][j + ssizey_ext] = source[ssizex - 1][0];
2923 else if(j >= ssizey + shift)
2924 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1];
2927 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift];
2932 working_space[i][j + ssizey_ext] = source[i - shift][0];
2934 else if(j >= ssizey + shift)
2935 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1];
2938 working_space[i][j + ssizey_ext] = source[i - shift][j - shift];
2942 if(backgroundRemove ==
true){
2943 for(i = 1; i <= number_of_iterations; i++){
2944 for(y = i; y < ssizey_ext - i; y++){
2945 for(x = i; x < ssizex_ext - i; x++){
2946 a = working_space[
x][y + ssizey_ext];
2947 p1 = working_space[x - i][y + ssizey_ext - i];
2948 p2 = working_space[x - i][y + ssizey_ext + i];
2949 p3 = working_space[x + i][y + ssizey_ext - i];
2950 p4 = working_space[x + i][y + ssizey_ext + i];
2951 s1 = working_space[
x][y + ssizey_ext - i];
2952 s2 = working_space[x - i][y + ssizey_ext];
2953 s3 = working_space[x + i][y + ssizey_ext];
2954 s4 = working_space[
x][y + ssizey_ext + i];
2955 b = (p1 +
p2) / 2.0;
2958 b = (p1 +
p3) / 2.0;
2961 b = (p2 + p4) / 2.0;
2964 b = (p3 + p4) / 2.0;
2967 s1 = s1 - (p1 +
p3) / 2.0;
2968 s2 = s2 - (p1 +
p2) / 2.0;
2969 s3 = s3 - (p3 + p4) / 2.0;
2970 s4 = s4 - (p2 + p4) / 2.0;
2971 b = (s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
2974 working_space[
x][
y] =
a;
2977 for(y = i;y < ssizey_ext - i; y++){
2978 for(x = i; x < ssizex_ext - i; x++){
2979 working_space[
x][y + ssizey_ext] = working_space[
x][
y];
2983 for(j = 0;j < ssizey_ext; j++){
2984 for(i = 0; i < ssizex_ext; i++){
2987 working_space[i][j + ssizey_ext] = source[0][0] - working_space[i][j + ssizey_ext];
2989 else if(j >= ssizey + shift)
2990 working_space[i][j + ssizey_ext] = source[0][ssizey - 1] - working_space[i][j + ssizey_ext];
2993 working_space[i][j + ssizey_ext] = source[0][j - shift] - working_space[i][j + ssizey_ext];
2996 else if(i >= ssizex + shift){
2998 working_space[i][j + ssizey_ext] = source[ssizex - 1][0] - working_space[i][j + ssizey_ext];
3000 else if(j >= ssizey + shift)
3001 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1] - working_space[i][j + ssizey_ext];
3004 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift] - working_space[i][j + ssizey_ext];
3009 working_space[i][j + ssizey_ext] = source[i - shift][0] - working_space[i][j + ssizey_ext];
3011 else if(j >= ssizey + shift)
3012 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1] - working_space[i][j + ssizey_ext];
3015 working_space[i][j + ssizey_ext] = source[i - shift][j - shift] - working_space[i][j + ssizey_ext];
3020 for(j = 0; j < ssizey_ext; j++){
3021 for(i = 0; i < ssizex_ext; i++){
3022 working_space[i][j + 15*ssizey_ext] = working_space[i][j + ssizey_ext];
3026 for(i = 0;i < ssizex_ext; i++){
3027 for(j = 0; j < ssizey_ext; j++)
3028 working_space[i][j + 2 * ssizex_ext] = working_space[i][ssizey_ext + j];
3031 xmax = ssizex_ext - 1;
3033 ymax = ssizey_ext - 1;
3034 for(i = 0, maxch = 0; i < ssizex_ext; i++){
3035 for(j = 0; j < ssizey_ext; j++){
3036 working_space[i][j] = 0;
3037 if(maxch < working_space[i][j + 2 * ssizey_ext])
3038 maxch = working_space[i][j + 2 * ssizey_ext];
3039 plocha += working_space[i][j + 2 * ssizey_ext];
3043 delete [] working_space;
3049 for(i = xmin; i <
xmax; i++){
3050 nip = working_space[i][ymin + 2 * ssizey_ext] / maxch;
3051 nim = working_space[i + 1][ymin + 2 * ssizey_ext] / maxch;
3053 for(l = 1;l <= averWindow; l++){
3055 a = working_space[xmax][ymin + 2 * ssizey_ext] / maxch;
3058 a = working_space[i +
l][ymin + 2 * ssizey_ext] / maxch;
3069 if(i - l + 1 < xmin)
3070 a = working_space[
xmin][ymin + 2 * ssizey_ext] / maxch;
3073 a = working_space[i - l + 1][ymin + 2 * ssizey_ext] / maxch;
3085 a = working_space[i + 1][
ymin] = a * working_space[i][
ymin];
3088 for(i = ymin; i <
ymax; i++){
3089 nip = working_space[
xmin][i + 2 * ssizey_ext] / maxch;
3090 nim = working_space[
xmin][i + 1 + 2 * ssizey_ext] / maxch;
3092 for(l = 1; l <= averWindow; l++){
3094 a = working_space[
xmin][ymax + 2 * ssizey_ext] / maxch;
3097 a = working_space[
xmin][i + l + 2 * ssizey_ext] / maxch;
3107 if(i - l + 1 < ymin)
3108 a = working_space[
xmin][ymin + 2 * ssizey_ext] / maxch;
3111 a = working_space[
xmin][i - l + 1 + 2 * ssizey_ext] / maxch;
3123 a = working_space[
xmin][i + 1] = a * working_space[
xmin][i];
3126 for(i = xmin; i <
xmax; i++){
3127 for(j = ymin; j <
ymax; j++){
3128 nip = working_space[i][j + 1 + 2 * ssizey_ext] / maxch;
3129 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
3131 for(l = 1; l <= averWindow; l++){
3133 a = working_space[
xmax][j + 2 * ssizey_ext] / maxch;
3136 a = working_space[i +
l][j + 2 * ssizey_ext] / maxch;
3146 if(i - l + 1 < xmin)
3147 a = working_space[
xmin][j + 2 * ssizey_ext] / maxch;
3150 a = working_space[i - l + 1][j + 2 * ssizey_ext] / maxch;
3162 nip = working_space[i + 1][j + 2 * ssizey_ext] / maxch;
3163 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
3164 for(l = 1; l <= averWindow; l++){
3166 a = working_space[i][ymax + 2 * ssizey_ext] / maxch;
3169 a = working_space[i][j + l + 2 * ssizey_ext] / maxch;
3179 if(j - l + 1 < ymin)
3180 a = working_space[i][ymin + 2 * ssizey_ext] / maxch;
3183 a = working_space[i][j - l + 1 + 2 * ssizey_ext] / maxch;
3193 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx + smy);
3194 working_space[i + 1][j + 1] =
a;
3198 for(i = xmin; i <=
xmax; i++){
3199 for(j = ymin; j <=
ymax; j++){
3200 working_space[i][j] = working_space[i][j] / nom;
3203 for(i = 0; i < ssizex_ext; i++){
3204 for(j = 0; j < ssizey_ext; j++){
3205 working_space[i][j + ssizey_ext] = working_space[i][j] * plocha;
3206 working_space[i][2 * ssizey_ext + j] = working_space[i][ssizey_ext + j];
3213 positx = 0,posity = 0;
3216 for(i = 0; i < ssizex_ext; i++){
3217 for(j = 0; j < ssizey_ext; j++){
3220 lda = (lda * lda + ldb * ldb) / (2 * sigma * sigma);
3230 working_space[i][j] = lda;
3234 positx = i,posity = j;
3239 for(i = 0;i < ssizex_ext; i++){
3240 for(j = 0;j < ssizey_ext; j++){
3241 working_space[i][j + 14 * ssizey_ext] =
TMath::Abs(working_space[i][j + ssizey_ext]);
3253 i1min = -i,i1max = i;
3254 i2min = -j,i2max = j;
3255 for(i2 = i2min; i2 <= i2max; i2++){
3256 for(i1 = i1min; i1 <= i1max; i1++){
3262 j2max = lhy - 1 - i2;
3266 for(j2 = j2min; j2 <= j2max; j2++){
3271 j1max = lhx - 1 - i1;
3275 for(j1 = j1min; j1 <= j1max; j1++){
3276 lda = working_space[j1][j2];
3277 ldb = working_space[i1 + j1][i2 + j2];
3278 ldc = ldc + lda * ldb;
3281 k = (i1 + ssizex_ext) / ssizex_ext;
3282 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext] = ldc;
3294 i2min = -j,i2max = ssizey_ext + j - 1;
3295 i1min = -i,i1max = ssizex_ext + i - 1;
3296 for(i2 = i2min; i2 <= i2max; i2++){
3297 for(i1=i1min;i1<=i1max;i1++){
3299 for(j2 = 0; j2 <= (lhy - 1); j2++){
3300 for(j1 = 0; j1 <= (lhx - 1); j1++){
3301 k2 = i2 + j2,k1 = i1 + j1;
3302 if(k2 >= 0 && k2 < ssizey_ext && k1 >= 0 && k1 < ssizex_ext){
3303 lda = working_space[j1][j2];
3304 ldb = working_space[k1][k2 + 14 * ssizey_ext];
3305 ldc = ldc + lda * ldb;
3309 k = (i1 + ssizex_ext) / ssizex_ext;
3310 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext] = ldc;
3314 for(i2 = 0; i2 < ssizey_ext; i2++){
3315 for(i1 = 0; i1 < ssizex_ext; i1++){
3316 k = (i1 + ssizex_ext) / ssizex_ext;
3317 ldb = working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext];
3318 working_space[i1][i2 + 14 * ssizey_ext] = ldb;
3322 for(i2 = 0; i2 < ssizey_ext; i2++){
3323 for(i1 = 0; i1 < ssizex_ext; i1++){
3324 working_space[i1][i2 + ssizey_ext] = 1;
3325 working_space[i1][i2 + 2 * ssizey_ext] = 0;
3329 for(lindex = 0; lindex < deconIterations; lindex++){
3330 for(i2 = 0; i2 < ssizey_ext; i2++){
3331 for(i1 = 0; i1 < ssizex_ext; i1++){
3332 lda = working_space[i1][i2 + ssizey_ext];
3333 ldc = working_space[i1][i2 + 14 * ssizey_ext];
3334 if(lda > 0.000001 && ldc > 0.000001){
3341 j2max = ssizey_ext - i2 - 1;
3350 j1max = ssizex_ext - i1 - 1;
3354 for(j2 = j2min; j2 <= j2max; j2++){
3355 for(j1 = j1min; j1 <= j1max; j1++){
3356 k = (j1 + ssizex_ext) / ssizex_ext;
3357 ldc = working_space[(j1 + ssizex_ext) % ssizex_ext][j2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext];
3358 lda = working_space[i1 + j1][i2 + j2 + ssizey_ext];
3359 ldb = ldb + lda * ldc;
3362 lda = working_space[i1][i2 + ssizey_ext];
3363 ldc = working_space[i1][i2 + 14 * ssizey_ext];
3364 if(ldc * lda != 0 && ldb != 0){
3365 lda =lda * ldc / ldb;
3370 working_space[i1][i2 + 2 * ssizey_ext] = lda;
3374 for(i2 = 0; i2 < ssizey_ext; i2++){
3375 for(i1 = 0; i1 < ssizex_ext; i1++)
3376 working_space[i1][i2 + ssizey_ext] = working_space[i1][i2 + 2 * ssizey_ext];
3381 for(i = 0; i < ssizex_ext; i++){
3382 for(j = 0; j < ssizey_ext; j++){
3383 working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext] = area * working_space[i][j + ssizey_ext];
3384 if(maximum < working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext])
3385 maximum = working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext];
3390 for(i = 1; i < ssizex_ext - 1; i++){
3391 for(j = 1; j < ssizey_ext - 1; j++){
3392 if(working_space[i][j] > working_space[i - 1][j] && working_space[i][j] > working_space[i - 1][j - 1] && working_space[i][j] > working_space[i][j - 1] && working_space[i][j] > working_space[i + 1][j - 1] && working_space[i][j] > working_space[i + 1][j] && working_space[i][j] > working_space[i + 1][j + 1] && working_space[i][j] > working_space[i][j + 1] && working_space[i][j] > working_space[i - 1][j + 1]){
3393 if(i >= shift && i < ssizex + shift && j >= shift && j < ssizey + shift){
3394 if(working_space[i][j] > threshold * maximum / 100.0){
3396 for(k = i - 1,a = 0,b = 0; k <= i + 1; k++){
3397 a += (
Double_t)(k - shift) * working_space[k][j];
3398 b += working_space[k][j];
3407 for(k = j - 1,a = 0,b = 0; k <= j + 1; k++){
3408 a += (
Double_t)(k - shift) * working_space[i][k];
3409 b += working_space[i][k];
3418 if(peak_index == 0){
3425 for(k = 0, priz = 0; k < peak_index && priz == 0; k++){
3437 for(l = peak_index; l >= k; l--){
3456 for(i = 0; i < ssizex; i++){
3457 for(j = 0; j < ssizey; j++){
3458 dest[i][j] = working_space[i + shift][j + shift];
3461 i = (
Int_t)(4 * sigma + 0.5);
3463 for (j = 0; j < ssizex + i; j++)
3464 delete[]working_space[j];
3465 delete[]working_space;
3479 return s.
Search(hist,sigma,option,threshold);
const char * Deconvolution(Double_t **source, Double_t **resp, Int_t ssizex, Int_t ssizey, Int_t numberIterations, Int_t numberRepetitions, Double_t boost)
TWO-DIMENSIONAL DECONVOLUTION FUNCTION This function calculates deconvolution from source spectrum ac...
TList * GetListOfFunctions() const
ClassImp(TSpectrum2) TSpectrum2
Constructor.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
static double p3(double t, double a, double b, double c, double d)
Advanced 2-dimentional spectra processing.
TString & ReplaceAll(const TString &s1, const TString &s2)
virtual Int_t GetDimension() const
Double_t background(Double_t *x, Double_t *par)
static Int_t fgAverageWindow
static void SetDeconIterations(Int_t n=3)
static function: Set max number of decon iterations in deconvolution operation see TSpectrum2::Search...
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
void SetResolution(Double_t resolution=1)
resolution: determines resolution of the neighboring peaks default value is 1 correspond to 3 sigma d...
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
The TNamed class is the base class for all named ROOT classes.
static double p2(double t, double a, double b, double c)
virtual void SetMarkerColor(Color_t mcolor=1)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual TObject * Remove(TObject *obj)
Remove object from the list.
unsigned int r1[N_CITIES]
static void SetAverageWindow(Int_t w=3)
static function: Set average window of searched peaks see TSpectrum2::SearchHighRes ...
LVector boost(const LVector &v, const BoostVector &b)
Boost a generic Lorentz Vector class using a generic 3D Vector class describing the boost The only re...
virtual const char * GetName() const
Returns name of object.
virtual void SetMarkerStyle(Style_t mstyle=1)
static double p1(double t, double a, double b)
virtual void SetMarkerSize(Size_t msize=1)
virtual void Print(Option_t *option="") const
Print the array of positions.
static Int_t StaticSearch(const TH1 *hist, Double_t sigma=2, Option_t *option="goff", Double_t threshold=0.05)
static function, interface to TSpectrum2::Search
A PolyMarker is defined by an array on N points in a 2-D space.
ClassImp(TMCParticle) void TMCParticle printf(": p=(%7.3f,%7.3f,%9.3f) ;", fPx, fPy, fPz)
virtual ~TSpectrum2()
Destructor.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
virtual void Add(TObject *obj)
const char * SmoothMarkov(Double_t **source, Int_t ssizex, Int_t ssizey, Int_t averWindow)
TWO-DIMENSIONAL MARKOV SPECTRUM SMOOTHING FUNCTION.
#define dest(otri, vertexptr)
Short_t Max(Short_t a, Short_t b)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
static TH1 * StaticBackground(const TH1 *hist, Int_t niter=20, Option_t *option="")
static function, interface to TSpectrum2::Background
virtual TH1 * Background(const TH1 *hist, Int_t niter=20, Option_t *option="")
TWO-DIMENSIONAL BACKGROUND ESTIMATION FUNCTION // This function calculates the background spectrum in...
Double_t Sqrt(Double_t x)
Int_t SearchHighRes(Double_t **source, Double_t **dest, Int_t ssizex, Int_t ssizey, Double_t sigma, Double_t threshold, Bool_t backgroundRemove, Int_t deconIterations, Bool_t markov, Int_t averWindow)
unsigned int r2[N_CITIES]
static Int_t fgIterations
virtual Int_t Search(const TH1 *hist, Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
TWO-DIMENSIONAL PEAK SEARCH FUNCTION // This function searches for peaks in source spectrum in hin //...