47#define PEAK_WINDOW 1024
158 Error(
"Background",
"function not yet implemented: h=%s, iter=%d, option=%sn"
159 ,
h->GetName(), number_of_iterations, option);
168 printf(
"\nNumber of positions = %d\n",
fNPeaks);
212 if (dimension != 2) {
213 Error(
"Search",
"Must be a 2-d histogram");
232 Int_t i, j, binx,biny, npeaks;
235 for (i = 0; i < sizex; i++) {
238 for (j = 0; j < sizey; j++) {
249 for (i = 0; i < npeaks; i++) {
255 for (i = 0; i < sizex; i++) {
264 if (!npeaks)
return 0;
275 ((
TH1*)hin)->Draw(option);
369 Int_t numberIterationsX,
370 Int_t numberIterationsY,
374 Int_t i,
x,
y, sampling, r1, r2;
376 if (ssizex <= 0 || ssizey <= 0)
377 return "Wrong parameters";
378 if (numberIterationsX < 1 || numberIterationsY < 1)
379 return "Width of Clipping Window Must Be Positive";
380 if (ssizex < 2 * numberIterationsX + 1
381 || ssizey < 2 * numberIterationsY + 1)
382 return (
"Too Large Clipping Window");
384 for (i = 0; i < ssizex; i++)
385 working_space[i] =
new Double_t[ssizey];
390 for (i = 1; i <= sampling; i++) {
393 for (
y = r2;
y < ssizey - r2;
y++) {
394 for (
x = r1;
x < ssizex - r1;
x++) {
396 p1 = spectrum[
x - r1][
y - r2];
397 p2 = spectrum[
x - r1][
y + r2];
398 p3 = spectrum[
x + r1][
y - r2];
399 p4 = spectrum[
x + r1][
y + r2];
400 s1 = spectrum[
x][
y - r2];
401 s2 = spectrum[
x - r1][
y];
402 s3 = spectrum[
x + r1][
y];
403 s4 = spectrum[
x][
y + r2];
416 s1 =
s1 - (p1 + p3) / 2.0;
417 s2 = s2 - (p1 + p2) / 2.0;
418 s3 = s3 - (p3 + p4) / 2.0;
419 s4 = s4 - (p2 + p4) / 2.0;
420 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
425 working_space[
x][
y] =
a;
428 for (
y = r2;
y < ssizey - r2;
y++) {
429 for (
x = r1;
x < ssizex - r1;
x++) {
430 spectrum[
x][
y] = working_space[
x][
y];
437 for (i = 1; i <= sampling; i++) {
440 for (
y = r2;
y < ssizey - r2;
y++) {
441 for (
x = r1;
x < ssizex - r1;
x++) {
443 b = -(spectrum[
x - r1][
y - r2] +
444 spectrum[
x - r1][
y + r2] + spectrum[
x + r1][
y -
446 + spectrum[
x + r1][
y + r2]) / 4 +
447 (spectrum[
x][
y - r2] + spectrum[
x - r1][
y] +
448 spectrum[
x + r1][
y] + spectrum[
x][
y + r2]) / 2;
451 working_space[
x][
y] =
a;
454 for (
y = i;
y < ssizey - i;
y++) {
455 for (
x = i;
x < ssizex - i;
x++) {
456 spectrum[
x][
y] = working_space[
x][
y];
465 for (i = sampling; i >= 1; i--) {
468 for (
y = r2;
y < ssizey - r2;
y++) {
469 for (
x = r1;
x < ssizex - r1;
x++) {
471 p1 = spectrum[
x - r1][
y - r2];
472 p2 = spectrum[
x - r1][
y + r2];
473 p3 = spectrum[
x + r1][
y - r2];
474 p4 = spectrum[
x + r1][
y + r2];
475 s1 = spectrum[
x][
y - r2];
476 s2 = spectrum[
x - r1][
y];
477 s3 = spectrum[
x + r1][
y];
478 s4 = spectrum[
x][
y + r2];
491 s1 =
s1 - (p1 + p3) / 2.0;
492 s2 = s2 - (p1 + p2) / 2.0;
493 s3 = s3 - (p3 + p4) / 2.0;
494 s4 = s4 - (p2 + p4) / 2.0;
495 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
500 working_space[
x][
y] =
a;
503 for (
y = r2;
y < ssizey - r2;
y++) {
504 for (
x = r1;
x < ssizex - r1;
x++) {
505 spectrum[
x][
y] = working_space[
x][
y];
512 for (i = sampling; i >= 1; i--) {
515 for (
y = r2;
y < ssizey - r2;
y++) {
516 for (
x = r1;
x < ssizex - r1;
x++) {
518 b = -(spectrum[
x - r1][
y - r2] +
519 spectrum[
x - r1][
y + r2] + spectrum[
x + r1][
y -
521 + spectrum[
x + r1][
y + r2]) / 4 +
522 (spectrum[
x][
y - r2] + spectrum[
x - r1][
y] +
523 spectrum[
x + r1][
y] + spectrum[
x][
y + r2]) / 2;
526 working_space[
x][
y] =
a;
529 for (
y = i;
y < ssizey - i;
y++) {
530 for (
x = i;
x < ssizex - i;
x++) {
531 spectrum[
x][
y] = working_space[
x][
y];
537 for (i = 0; i < ssizex; i++)
538 delete[]working_space[i];
539 delete[]working_space;
585 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy, plocha = 0;
587 return "Averaging Window must be positive";
589 for(i = 0; i < ssizex; i++)
590 working_space[i] =
new Double_t[ssizey];
595 for(i = 0, maxch = 0; i < ssizex; i++){
596 for(j = 0; j < ssizey; j++){
597 working_space[i][j] = 0;
598 if(maxch < source[i][j])
599 maxch = source[i][j];
601 plocha += source[i][j];
605 for (i = 0; i < ssizex; i++)
606 delete[]working_space[i];
607 delete [] working_space;
614 nip = source[i][
ymin] / maxch;
615 nim = source[i + 1][
ymin] / maxch;
617 for(
l = 1;
l <= averWindow;
l++){
622 a = source[i +
l][
ymin] / maxch;
636 a = source[i -
l + 1][
ymin] / maxch;
648 a = working_space[i + 1][
ymin] =
a * working_space[i][
ymin];
652 nip = source[
xmin][i] / maxch;
653 nim = source[
xmin][i + 1] / maxch;
655 for(
l = 1;
l <= averWindow;
l++){
660 a = source[
xmin][i +
l] / maxch;
674 a = source[
xmin][i -
l + 1] / maxch;
686 a = working_space[
xmin][i + 1] =
a * working_space[
xmin][i];
691 nip = source[i][j + 1] / maxch;
692 nim = source[i + 1][j + 1] / maxch;
694 for(
l = 1;
l <= averWindow;
l++){
696 a = source[
xmax][j] / maxch;
699 a = source[i +
l][j] / maxch;
710 a = source[
xmin][j] / maxch;
713 a = source[i -
l + 1][j] / maxch;
725 nip = source[i + 1][j] / maxch;
726 nim = source[i + 1][j + 1] / maxch;
727 for (
l = 1;
l <= averWindow;
l++) {
729 else a = source[i][j +
l] / maxch;
731 if (
a + nip <= 0)
a = 1;
736 if (j -
l + 1 <
ymin)
a = source[i][
ymin] / maxch;
737 else a = source[i][j -
l + 1] / maxch;
739 if (
a + nim <= 0)
a = 1;
745 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx +smy);
746 working_space[i + 1][j + 1] =
a;
752 working_space[i][j] = working_space[i][j] / nom;
755 for(i = 0;i < ssizex; i++){
756 for(j = 0; j < ssizey; j++){
757 source[i][j] = plocha * working_space[i][j];
760 for (i = 0; i < ssizex; i++)
761 delete[]working_space[i];
762 delete[]working_space;
835 Int_t numberIterations,
836 Int_t numberRepetitions,
839 Int_t i, j, lhx, lhy, i1, i2, j1, j2, k1, k2, lindex, i1min, i1max,
840 i2min, i2max, j1min, j1max, j2min, j2max, positx = 0, posity = 0, repet;
841 Double_t lda, ldb, ldc, area, maximum = 0;
842 if (ssizex <= 0 || ssizey <= 0)
843 return "Wrong parameters";
844 if (numberIterations <= 0)
845 return "Number of iterations must be positive";
846 if (numberRepetitions <= 0)
847 return "Number of repetitions must be positive";
849 for (i = 0; i < ssizex; i++)
850 working_space[i] =
new Double_t[5 * ssizey];
853 for (i = 0; i < ssizex; i++) {
854 for (j = 0; j < ssizey; j++) {
862 working_space[i][j] = lda;
866 positx = i, posity = j;
870 if (lhx == -1 || lhy == -1) {
871 for (i = 0; i < ssizex; i++)
872 delete[]working_space[i];
873 delete [] working_space;
874 return (
"Zero response data");
878 for (i2 = 0; i2 < ssizey; i2++) {
879 for (i1 = 0; i1 < ssizex; i1++) {
881 for (j2 = 0; j2 <= (lhy - 1); j2++) {
882 for (j1 = 0; j1 <= (lhx - 1); j1++) {
883 k2 = i2 + j2, k1 = i1 + j1;
884 if (k2 >= 0 && k2 < ssizey && k1 >= 0 && k1 < ssizex) {
885 lda = working_space[j1][j2];
886 ldb = source[k1][k2];
887 ldc = ldc + lda * ldb;
891 working_space[i1][i2 + ssizey] = ldc;
896 i1min = -(lhx - 1), i1max = lhx - 1;
897 i2min = -(lhy - 1), i2max = lhy - 1;
898 for (i2 = i2min; i2 <= i2max; i2++) {
899 for (i1 = i1min; i1 <= i1max; i1++) {
904 j2max = lhy - 1 - i2;
907 for (j2 = j2min; j2 <= j2max; j2++) {
911 j1max = lhx - 1 - i1;
914 for (j1 = j1min; j1 <= j1max; j1++) {
915 lda = working_space[j1][j2];
916 if (i1 + j1 < ssizex && i2 + j2 < ssizey)
917 ldb = working_space[i1 + j1][i2 + j2];
920 ldc = ldc + lda * ldb;
923 working_space[i1 - i1min][i2 - i2min + 2 * ssizey ] = ldc;
928 for (i2 = 0; i2 < ssizey; i2++) {
929 for (i1 = 0; i1 < ssizex; i1++) {
930 working_space[i1][i2 + 3 * ssizey] = 1;
931 working_space[i1][i2 + 4 * ssizey] = 0;
936 for (repet = 0; repet < numberRepetitions; repet++) {
938 for (i = 0; i < ssizex; i++) {
939 for (j = 0; j < ssizey; j++) {
940 working_space[i][j + 3 * ssizey] =
945 for (lindex = 0; lindex < numberIterations; lindex++) {
946 for (i2 = 0; i2 < ssizey; i2++) {
947 for (i1 = 0; i1 < ssizex; i1++) {
953 j2max = ssizey - i2 - 1;
960 j1max = ssizex - i1 - 1;
963 for (j2 = j2min; j2 <= j2max; j2++) {
964 for (j1 = j1min; j1 <= j1max; j1++) {
965 ldc = working_space[j1 - i1min][j2 - i2min + 2 * ssizey];
966 lda = working_space[i1 + j1][i2 + j2 + 3 * ssizey];
967 ldb = ldb + lda * ldc;
970 lda = working_space[i1][i2 + 3 * ssizey];
971 ldc = working_space[i1][i2 + 1 * ssizey];
972 if (ldc * lda != 0 && ldb != 0) {
973 lda = lda * ldc / ldb;
978 working_space[i1][i2 + 4 * ssizey] = lda;
981 for (i2 = 0; i2 < ssizey; i2++) {
982 for (i1 = 0; i1 < ssizex; i1++)
983 working_space[i1][i2 + 3 * ssizey] =
984 working_space[i1][i2 + 4 * ssizey];
988 for (i = 0; i < ssizex; i++) {
989 for (j = 0; j < ssizey; j++)
990 source[(i + positx) % ssizex][(j + posity) % ssizey] =
991 area * working_space[i][j + 3 * ssizey];
993 for (i = 0; i < ssizex; i++)
994 delete[]working_space[i];
995 delete[]working_space;
1095 Int_t k, lindex, priz;
1096 Double_t lda, ldb, ldc, area, maximum;
1097 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;
1100 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy;
1103 Int_t lhx, lhy, i1, i2, j1, j2, k1, k2, i1min, i1max, i2min, i2max, j1min, j1max, j2min, j2max, positx, posity;
1105 Error(
"SearchHighRes",
"Invalid sigma, must be greater than or equal to 1");
1109 if(threshold<=0||threshold>=100){
1110 Error(
"SearchHighRes",
"Invalid threshold, must be positive and less than 100");
1116 Error(
"SearchHighRes",
"Too large sigma");
1120 if (markov ==
true) {
1121 if (averWindow <= 0) {
1122 Error(
"SearchHighRes",
"Averaging window must be positive");
1126 if(backgroundRemove ==
true){
1127 if(ssizex_ext < 2 * number_of_iterations + 1 || ssizey_ext < 2 * number_of_iterations + 1){
1128 Error(
"SearchHighRes",
"Too large clipping window");
1135 for (j = 0; j < ssizex + i; j++) {
1137 for (k=0;k<16 * (ssizey + i);k++) wsk[k] = 0;
1139 for(j = 0; j < ssizey_ext; j++){
1140 for(i = 0; i < ssizex_ext; i++){
1143 working_space[i][j + ssizey_ext] = source[0][0];
1145 else if(j >= ssizey + shift)
1146 working_space[i][j + ssizey_ext] = source[0][ssizey - 1];
1149 working_space[i][j + ssizey_ext] = source[0][j - shift];
1152 else if(i >= ssizex + shift){
1154 working_space[i][j + ssizey_ext] = source[ssizex - 1][0];
1156 else if(j >= ssizey + shift)
1157 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1];
1160 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift];
1165 working_space[i][j + ssizey_ext] = source[i - shift][0];
1167 else if(j >= ssizey + shift)
1168 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1];
1171 working_space[i][j + ssizey_ext] = source[i - shift][j - shift];
1175 if(backgroundRemove ==
true){
1176 for(i = 1; i <= number_of_iterations; i++){
1177 for(
y = i;
y < ssizey_ext - i;
y++){
1178 for(
x = i;
x < ssizex_ext - i;
x++){
1179 a = working_space[
x][
y + ssizey_ext];
1180 p1 = working_space[
x - i][
y + ssizey_ext - i];
1181 p2 = working_space[
x - i][
y + ssizey_ext + i];
1182 p3 = working_space[
x + i][
y + ssizey_ext - i];
1183 p4 = working_space[
x + i][
y + ssizey_ext + i];
1184 s1 = working_space[
x][
y + ssizey_ext - i];
1185 s2 = working_space[
x - i][
y + ssizey_ext];
1186 s3 = working_space[
x + i][
y + ssizey_ext];
1187 s4 = working_space[
x][
y + ssizey_ext + i];
1188 b = (p1 + p2) / 2.0;
1191 b = (p1 + p3) / 2.0;
1194 b = (p2 + p4) / 2.0;
1197 b = (p3 + p4) / 2.0;
1200 s1 =
s1 - (p1 + p3) / 2.0;
1201 s2 = s2 - (p1 + p2) / 2.0;
1202 s3 = s3 - (p3 + p4) / 2.0;
1203 s4 = s4 - (p2 + p4) / 2.0;
1204 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
1207 working_space[
x][
y] =
a;
1210 for(
y = i;
y < ssizey_ext - i;
y++){
1211 for(
x = i;
x < ssizex_ext - i;
x++){
1212 working_space[
x][
y + ssizey_ext] = working_space[
x][
y];
1216 for(j = 0;j < ssizey_ext; j++){
1217 for(i = 0; i < ssizex_ext; i++){
1220 working_space[i][j + ssizey_ext] = source[0][0] - working_space[i][j + ssizey_ext];
1222 else if(j >= ssizey + shift)
1223 working_space[i][j + ssizey_ext] = source[0][ssizey - 1] - working_space[i][j + ssizey_ext];
1226 working_space[i][j + ssizey_ext] = source[0][j - shift] - working_space[i][j + ssizey_ext];
1229 else if(i >= ssizex + shift){
1231 working_space[i][j + ssizey_ext] = source[ssizex - 1][0] - working_space[i][j + ssizey_ext];
1233 else if(j >= ssizey + shift)
1234 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1] - working_space[i][j + ssizey_ext];
1237 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift] - working_space[i][j + ssizey_ext];
1242 working_space[i][j + ssizey_ext] = source[i - shift][0] - working_space[i][j + ssizey_ext];
1244 else if(j >= ssizey + shift)
1245 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1] - working_space[i][j + ssizey_ext];
1248 working_space[i][j + ssizey_ext] = source[i - shift][j - shift] - working_space[i][j + ssizey_ext];
1253 for(j = 0; j < ssizey_ext; j++){
1254 for(i = 0; i < ssizex_ext; i++){
1255 working_space[i][j + 15*ssizey_ext] = working_space[i][j + ssizey_ext];
1259 for(i = 0;i < ssizex_ext; i++){
1260 for(j = 0; j < ssizey_ext; j++)
1261 working_space[i][j + 2 * ssizex_ext] = working_space[i][ssizey_ext + j];
1264 xmax = ssizex_ext - 1;
1266 ymax = ssizey_ext - 1;
1267 for(i = 0, maxch = 0; i < ssizex_ext; i++){
1268 for(j = 0; j < ssizey_ext; j++){
1269 working_space[i][j] = 0;
1270 if(maxch < working_space[i][j + 2 * ssizey_ext])
1271 maxch = working_space[i][j + 2 * ssizey_ext];
1272 plocha += working_space[i][j + 2 * ssizey_ext];
1278 for (j = 0; j < ssizex + i; j++)
1279 delete[]working_space[j];
1280 delete [] working_space;
1287 nip = working_space[i][
ymin + 2 * ssizey_ext] / maxch;
1288 nim = working_space[i + 1][
ymin + 2 * ssizey_ext] / maxch;
1290 for(
l = 1;
l <= averWindow;
l++){
1292 a = working_space[
xmax][
ymin + 2 * ssizey_ext] / maxch;
1295 a = working_space[i +
l][
ymin + 2 * ssizey_ext] / maxch;
1306 if(i -
l + 1 <
xmin)
1307 a = working_space[
xmin][
ymin + 2 * ssizey_ext] / maxch;
1310 a = working_space[i -
l + 1][
ymin + 2 * ssizey_ext] / maxch;
1322 a = working_space[i + 1][
ymin] =
a * working_space[i][
ymin];
1326 nip = working_space[
xmin][i + 2 * ssizey_ext] / maxch;
1327 nim = working_space[
xmin][i + 1 + 2 * ssizey_ext] / maxch;
1329 for(
l = 1;
l <= averWindow;
l++){
1331 a = working_space[
xmin][
ymax + 2 * ssizey_ext] / maxch;
1334 a = working_space[
xmin][i +
l + 2 * ssizey_ext] / maxch;
1344 if(i -
l + 1 <
ymin)
1345 a = working_space[
xmin][
ymin + 2 * ssizey_ext] / maxch;
1348 a = working_space[
xmin][i -
l + 1 + 2 * ssizey_ext] / maxch;
1360 a = working_space[
xmin][i + 1] =
a * working_space[
xmin][i];
1365 nip = working_space[i][j + 1 + 2 * ssizey_ext] / maxch;
1366 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
1368 for(
l = 1;
l <= averWindow;
l++){
1370 a = working_space[
xmax][j + 2 * ssizey_ext] / maxch;
1373 a = working_space[i +
l][j + 2 * ssizey_ext] / maxch;
1383 if(i -
l + 1 <
xmin)
1384 a = working_space[
xmin][j + 2 * ssizey_ext] / maxch;
1387 a = working_space[i -
l + 1][j + 2 * ssizey_ext] / maxch;
1399 nip = working_space[i + 1][j + 2 * ssizey_ext] / maxch;
1400 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
1401 for(
l = 1;
l <= averWindow;
l++){
1403 a = working_space[i][
ymax + 2 * ssizey_ext] / maxch;
1406 a = working_space[i][j +
l + 2 * ssizey_ext] / maxch;
1416 if(j -
l + 1 <
ymin)
1417 a = working_space[i][
ymin + 2 * ssizey_ext] / maxch;
1420 a = working_space[i][j -
l + 1 + 2 * ssizey_ext] / maxch;
1430 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx + smy);
1431 working_space[i + 1][j + 1] =
a;
1437 working_space[i][j] = working_space[i][j] / nom;
1440 for(i = 0; i < ssizex_ext; i++){
1441 for(j = 0; j < ssizey_ext; j++){
1442 working_space[i][j + ssizey_ext] = working_space[i][j] * plocha;
1443 working_space[i][2 * ssizey_ext + j] = working_space[i][ssizey_ext + j];
1450 positx = 0,posity = 0;
1453 for(i = 0; i < ssizex_ext; i++){
1454 for(j = 0; j < ssizey_ext; j++){
1457 lda = (lda * lda + ldb * ldb) / (2 *
sigma *
sigma);
1467 working_space[i][j] = lda;
1471 positx = i,posity = j;
1476 for(i = 0;i < ssizex_ext; i++){
1477 for(j = 0;j < ssizey_ext; j++){
1478 working_space[i][j + 14 * ssizey_ext] =
TMath::Abs(working_space[i][j + ssizey_ext]);
1490 i1min = -i,i1max = i;
1491 i2min = -j,i2max = j;
1492 for(i2 = i2min; i2 <= i2max; i2++){
1493 for(i1 = i1min; i1 <= i1max; i1++){
1499 j2max = lhy - 1 - i2;
1503 for(j2 = j2min; j2 <= j2max; j2++){
1508 j1max = lhx - 1 - i1;
1512 for(j1 = j1min; j1 <= j1max; j1++){
1513 lda = working_space[j1][j2];
1514 ldb = working_space[i1 + j1][i2 + j2];
1515 ldc = ldc + lda * ldb;
1518 k = (i1 + ssizex_ext) / ssizex_ext;
1519 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext] = ldc;
1531 i2min = -j,i2max = ssizey_ext + j - 1;
1532 i1min = -i,i1max = ssizex_ext + i - 1;
1533 for(i2 = i2min; i2 <= i2max; i2++){
1534 for(i1=i1min;i1<=i1max;i1++){
1536 for(j2 = 0; j2 <= (lhy - 1); j2++){
1537 for(j1 = 0; j1 <= (lhx - 1); j1++){
1538 k2 = i2 + j2,k1 = i1 + j1;
1539 if(k2 >= 0 && k2 < ssizey_ext && k1 >= 0 && k1 < ssizex_ext){
1540 lda = working_space[j1][j2];
1541 ldb = working_space[k1][k2 + 14 * ssizey_ext];
1542 ldc = ldc + lda * ldb;
1546 k = (i1 + ssizex_ext) / ssizex_ext;
1547 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext] = ldc;
1551 for(i2 = 0; i2 < ssizey_ext; i2++){
1552 for(i1 = 0; i1 < ssizex_ext; i1++){
1553 k = (i1 + ssizex_ext) / ssizex_ext;
1554 ldb = working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext];
1555 working_space[i1][i2 + 14 * ssizey_ext] = ldb;
1559 for(i2 = 0; i2 < ssizey_ext; i2++){
1560 for(i1 = 0; i1 < ssizex_ext; i1++){
1561 working_space[i1][i2 + ssizey_ext] = 1;
1562 working_space[i1][i2 + 2 * ssizey_ext] = 0;
1566 for(lindex = 0; lindex < deconIterations; lindex++){
1567 for(i2 = 0; i2 < ssizey_ext; i2++){
1568 for(i1 = 0; i1 < ssizex_ext; i1++){
1569 lda = working_space[i1][i2 + ssizey_ext];
1570 ldc = working_space[i1][i2 + 14 * ssizey_ext];
1571 if(lda > 0.000001 && ldc > 0.000001){
1578 j2max = ssizey_ext - i2 - 1;
1587 j1max = ssizex_ext - i1 - 1;
1591 for(j2 = j2min; j2 <= j2max; j2++){
1592 for(j1 = j1min; j1 <= j1max; j1++){
1593 k = (j1 + ssizex_ext) / ssizex_ext;
1594 ldc = working_space[(j1 + ssizex_ext) % ssizex_ext][j2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext];
1595 lda = working_space[i1 + j1][i2 + j2 + ssizey_ext];
1596 ldb = ldb + lda * ldc;
1599 lda = working_space[i1][i2 + ssizey_ext];
1600 ldc = working_space[i1][i2 + 14 * ssizey_ext];
1601 if(ldc * lda != 0 && ldb != 0){
1602 lda =lda * ldc / ldb;
1607 working_space[i1][i2 + 2 * ssizey_ext] = lda;
1611 for(i2 = 0; i2 < ssizey_ext; i2++){
1612 for(i1 = 0; i1 < ssizex_ext; i1++)
1613 working_space[i1][i2 + ssizey_ext] = working_space[i1][i2 + 2 * ssizey_ext];
1618 for(i = 0; i < ssizex_ext; i++){
1619 for(j = 0; j < ssizey_ext; j++){
1620 working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext] = area * working_space[i][j + ssizey_ext];
1621 if(maximum < working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext])
1622 maximum = working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext];
1627 for(i = 1; i < ssizex_ext - 1; i++){
1628 for(j = 1; j < ssizey_ext - 1; j++){
1629 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]){
1630 if(i >= shift && i < ssizex + shift && j >= shift && j < ssizey + shift){
1631 if(working_space[i][j] > threshold * maximum / 100.0){
1633 for(k = i - 1,
a = 0,
b = 0; k <= i + 1; k++){
1634 a += (
Double_t)(k - shift) * working_space[k][j];
1635 b += working_space[k][j];
1644 for(k = j - 1,
a = 0,
b = 0; k <= j + 1; k++){
1645 a += (
Double_t)(k - shift) * working_space[i][k];
1646 b += working_space[i][k];
1655 if(peak_index == 0){
1662 for(k = 0, priz = 0; k < peak_index && priz == 0; k++){
1674 for(
l = peak_index;
l >= k;
l--){
1693 for(i = 0; i < ssizex; i++){
1694 for(j = 0; j < ssizey; j++){
1695 dest[i][j] = working_space[i + shift][j + shift];
1700 for (j = 0; j < ssizex + i; j++)
1701 delete[]working_space[j];
1702 delete[]working_space;
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetDimension() const
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
TList * GetListOfFunctions() const
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual void Add(TObject *obj)
virtual TObject * Remove(TObject *obj)
Remove object from the list.
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
The TNamed class is the base class for all named ROOT classes.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
A PolyMarker is defined by an array on N points in a 2-D space.
Advanced 2-dimensional spectra processing.
Double_t fResolution
NOT USED resolution of the neighboring peaks
TH1 * fHistogram
resulting histogram
static Int_t fgIterations
Maximum number of decon iterations (default=3)
static void SetDeconIterations(Int_t n=3)
static function: Set max number of decon iterations in deconvolution operation see TSpectrum2::Search...
static TH1 * StaticBackground(const TH1 *hist, Int_t niter=20, Option_t *option="")
static function (called by TH1), interface to TSpectrum2::Background
const char * SmoothMarkov(Double_t **source, Int_t ssizex, Int_t ssizey, Int_t averWindow)
This function calculates smoothed spectrum from source spectrum based on Markov chain method.
void SetResolution(Double_t resolution=1)
NOT USED resolution: determines resolution of the neighboring peaks default value is 1 correspond to ...
virtual ~TSpectrum2()
Destructor.
static Int_t fgAverageWindow
Average window of searched peaks.
Int_t fMaxPeaks
Maximum number of peaks to be found.
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)
This function searches for peaks in source spectrum It is based on deconvolution method.
Int_t fNPeaks
number of peaks found
virtual TH1 * Background(const TH1 *hist, Int_t niter=20, Option_t *option="")
This function calculates the background spectrum in the input histogram h.
virtual void Print(Option_t *option="") const
Print the array of positions.
static void SetAverageWindow(Int_t w=3)
static function: Set average window of searched peaks see TSpectrum2::SearchHighRes
virtual Int_t Search(const TH1 *hist, Double_t sigma=2, Option_t *option="", Double_t threshold=0.05)
This function searches for peaks in source spectrum in hin The number of found peaks and their positi...
Double_t * fPositionY
[fNPeaks] Y position of peaks
static Int_t StaticSearch(const TH1 *hist, Double_t sigma=2, Option_t *option="goff", Double_t threshold=0.05)
static function (called by TH1), interface to TSpectrum2::Search
Double_t * fPosition
[fNPeaks] array of current peak positions
const char * Deconvolution(Double_t **source, Double_t **resp, Int_t ssizex, Int_t ssizey, Int_t numberIterations, Int_t numberRepetitions, Double_t boost)
This function calculates deconvolution from source spectrum according to response spectrum The result...
Double_t * fPositionX
[fNPeaks] X position of peaks
@ kBackSuccessiveFiltering
void ToLower()
Change string to lower-case.
TString & ReplaceAll(const TString &s1, const TString &s2)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Short_t Max(Short_t a, Short_t b)
Double_t Sqrt(Double_t x)
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Short_t Min(Short_t a, Short_t b)
#define dest(otri, vertexptr)