50#define PEAK_WINDOW 1024
148 Int_t dimension =
h->GetDimension();
149 if (dimension != 2) {
150 Error(
"Background",
"Only implemented for 2-d histograms");
158 if (opt.
Contains(
"backincreasingwindow"))
161 if (opt.
Contains(
"backonestepfiltering"))
163 Int_t firstX =
h->GetXaxis()->GetFirst();
164 Int_t lastX =
h->GetXaxis()->GetLast();
165 Int_t sizeX = lastX - firstX + 1;
166 Int_t firstY =
h->GetYaxis()->GetFirst();
167 Int_t lastY =
h->GetYaxis()->GetLast();
168 Int_t sizeY = lastY - firstY + 1;
171 for (i = 0; i < sizeX; i++) {
173 for (j = 0; j < sizeY; j++)
174 source[i][j] =
h->GetBinContent(i + firstX, j + firstY);
178 Background(source, sizeX, sizeY, nIterX, nIterY, direction, filterType);
182 Int_t nch = strlen(
h->GetName());
183 char *
hbname =
new char[nch + 20];
188 for (i = 0; i < sizeX; i++)
189 for (j = 0; j < sizeY; j++)
199 for (i = 0; i < sizeX; i++) {
212 printf(
"\nNumber of positions = %d\n",
fNPeaks);
256 if (dimension != 2) {
257 Error(
"Search",
"Must be a 2-d histogram");
276 Int_t i, j, binx,biny, npeaks;
279 for (i = 0; i < sizex; i++) {
282 for (j = 0; j < sizey; j++) {
293 for (i = 0; i < npeaks; i++) {
299 for (i = 0; i < sizex; i++) {
308 if (!npeaks)
return 0;
319 ((
TH1*)hin)->Draw(option);
413 Int_t numberIterationsX,
414 Int_t numberIterationsY,
418 Int_t i,
x,
y, sampling, r1, r2;
420 if (ssizex <= 0 || ssizey <= 0)
421 return "Wrong parameters";
422 if (numberIterationsX < 1 || numberIterationsY < 1)
423 return "Width of Clipping Window Must Be Positive";
424 if (ssizex < 2 * numberIterationsX + 1
425 || ssizey < 2 * numberIterationsY + 1)
426 return (
"Too Large Clipping Window");
428 for (i = 0; i < ssizex; i++)
429 working_space[i] =
new Double_t[ssizey];
434 for (i = 1; i <= sampling; i++) {
437 for (
y = r2;
y < ssizey - r2;
y++) {
438 for (
x = r1;
x < ssizex - r1;
x++) {
440 p1 = spectrum[
x - r1][
y - r2];
441 p2 = spectrum[
x - r1][
y + r2];
442 p3 = spectrum[
x + r1][
y - r2];
443 p4 = spectrum[
x + r1][
y + r2];
444 s1 = spectrum[
x][
y - r2];
445 s2 = spectrum[
x - r1][
y];
446 s3 = spectrum[
x + r1][
y];
447 s4 = spectrum[
x][
y + r2];
460 s1 =
s1 - (p1 + p3) / 2.0;
461 s2 = s2 - (p1 + p2) / 2.0;
462 s3 = s3 - (p3 + p4) / 2.0;
463 s4 = s4 - (p2 + p4) / 2.0;
464 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
469 working_space[
x][
y] =
a;
472 for (
y = r2;
y < ssizey - r2;
y++) {
473 for (
x = r1;
x < ssizex - r1;
x++) {
474 spectrum[
x][
y] = working_space[
x][
y];
481 for (i = 1; i <= sampling; i++) {
484 for (
y = r2;
y < ssizey - r2;
y++) {
485 for (
x = r1;
x < ssizex - r1;
x++) {
487 b = -(spectrum[
x - r1][
y - r2] +
488 spectrum[
x - r1][
y + r2] + spectrum[
x + r1][
y -
490 + spectrum[
x + r1][
y + r2]) / 4 +
491 (spectrum[
x][
y - r2] + spectrum[
x - r1][
y] +
492 spectrum[
x + r1][
y] + spectrum[
x][
y + r2]) / 2;
495 working_space[
x][
y] =
a;
498 for (
y = i;
y < ssizey - i;
y++) {
499 for (
x = i;
x < ssizex - i;
x++) {
500 spectrum[
x][
y] = working_space[
x][
y];
509 for (i = sampling; i >= 1; i--) {
512 for (
y = r2;
y < ssizey - r2;
y++) {
513 for (
x = r1;
x < ssizex - r1;
x++) {
515 p1 = spectrum[
x - r1][
y - r2];
516 p2 = spectrum[
x - r1][
y + r2];
517 p3 = spectrum[
x + r1][
y - r2];
518 p4 = spectrum[
x + r1][
y + r2];
519 s1 = spectrum[
x][
y - r2];
520 s2 = spectrum[
x - r1][
y];
521 s3 = spectrum[
x + r1][
y];
522 s4 = spectrum[
x][
y + r2];
535 s1 =
s1 - (p1 + p3) / 2.0;
536 s2 = s2 - (p1 + p2) / 2.0;
537 s3 = s3 - (p3 + p4) / 2.0;
538 s4 = s4 - (p2 + p4) / 2.0;
539 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 +
544 working_space[
x][
y] =
a;
547 for (
y = r2;
y < ssizey - r2;
y++) {
548 for (
x = r1;
x < ssizex - r1;
x++) {
549 spectrum[
x][
y] = working_space[
x][
y];
556 for (i = sampling; i >= 1; i--) {
559 for (
y = r2;
y < ssizey - r2;
y++) {
560 for (
x = r1;
x < ssizex - r1;
x++) {
562 b = -(spectrum[
x - r1][
y - r2] +
563 spectrum[
x - r1][
y + r2] + spectrum[
x + r1][
y -
565 + spectrum[
x + r1][
y + r2]) / 4 +
566 (spectrum[
x][
y - r2] + spectrum[
x - r1][
y] +
567 spectrum[
x + r1][
y] + spectrum[
x][
y + r2]) / 2;
570 working_space[
x][
y] =
a;
573 for (
y = i;
y < ssizey - i;
y++) {
574 for (
x = i;
x < ssizex - i;
x++) {
575 spectrum[
x][
y] = working_space[
x][
y];
581 for (i = 0; i < ssizex; i++)
582 delete[]working_space[i];
583 delete[]working_space;
629 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy, plocha = 0;
631 return "Averaging Window must be positive";
633 for(i = 0; i < ssizex; i++)
634 working_space[i] =
new Double_t[ssizey];
639 for(i = 0, maxch = 0; i < ssizex; i++){
640 for(j = 0; j < ssizey; j++){
641 working_space[i][j] = 0;
642 if(maxch < source[i][j])
643 maxch = source[i][j];
645 plocha += source[i][j];
649 for (i = 0; i < ssizex; i++)
650 delete[]working_space[i];
651 delete [] working_space;
658 nip = source[i][
ymin] / maxch;
659 nim = source[i + 1][
ymin] / maxch;
661 for(
l = 1;
l <= averWindow;
l++){
666 a = source[i +
l][
ymin] / maxch;
680 a = source[i -
l + 1][
ymin] / maxch;
692 a = working_space[i + 1][
ymin] =
a * working_space[i][
ymin];
696 nip = source[
xmin][i] / maxch;
697 nim = source[
xmin][i + 1] / maxch;
699 for(
l = 1;
l <= averWindow;
l++){
704 a = source[
xmin][i +
l] / maxch;
718 a = source[
xmin][i -
l + 1] / maxch;
730 a = working_space[
xmin][i + 1] =
a * working_space[
xmin][i];
735 nip = source[i][j + 1] / maxch;
736 nim = source[i + 1][j + 1] / maxch;
738 for(
l = 1;
l <= averWindow;
l++){
740 a = source[
xmax][j] / maxch;
743 a = source[i +
l][j] / maxch;
754 a = source[
xmin][j] / maxch;
757 a = source[i -
l + 1][j] / maxch;
769 nip = source[i + 1][j] / maxch;
770 nim = source[i + 1][j + 1] / maxch;
771 for (
l = 1;
l <= averWindow;
l++) {
773 else a = source[i][j +
l] / maxch;
775 if (
a + nip <= 0)
a = 1;
780 if (j -
l + 1 <
ymin)
a = source[i][
ymin] / maxch;
781 else a = source[i][j -
l + 1] / maxch;
783 if (
a + nim <= 0)
a = 1;
789 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx +smy);
790 working_space[i + 1][j + 1] =
a;
796 working_space[i][j] = working_space[i][j] / nom;
799 for(i = 0;i < ssizex; i++){
800 for(j = 0; j < ssizey; j++){
801 source[i][j] = plocha * working_space[i][j];
804 for (i = 0; i < ssizex; i++)
805 delete[]working_space[i];
806 delete[]working_space;
879 Int_t numberIterations,
880 Int_t numberRepetitions,
883 Int_t i, j, lhx, lhy, i1, i2, j1, j2, k1, k2, lindex, i1min, i1max,
884 i2min, i2max, j1min, j1max, j2min, j2max, positx = 0, posity = 0, repet;
885 Double_t lda, ldb, ldc, area, maximum = 0;
886 if (ssizex <= 0 || ssizey <= 0)
887 return "Wrong parameters";
888 if (numberIterations <= 0)
889 return "Number of iterations must be positive";
890 if (numberRepetitions <= 0)
891 return "Number of repetitions must be positive";
893 for (i = 0; i < ssizex; i++)
894 working_space[i] =
new Double_t[5 * ssizey];
897 for (i = 0; i < ssizex; i++) {
898 for (j = 0; j < ssizey; j++) {
906 working_space[i][j] = lda;
910 positx = i, posity = j;
914 if (lhx == -1 || lhy == -1) {
915 for (i = 0; i < ssizex; i++)
916 delete[]working_space[i];
917 delete [] working_space;
918 return (
"Zero response data");
922 for (i2 = 0; i2 < ssizey; i2++) {
923 for (i1 = 0; i1 < ssizex; i1++) {
925 for (j2 = 0; j2 <= (lhy - 1); j2++) {
926 for (j1 = 0; j1 <= (lhx - 1); j1++) {
927 k2 = i2 + j2, k1 = i1 + j1;
928 if (k2 >= 0 && k2 < ssizey && k1 >= 0 && k1 < ssizex) {
929 lda = working_space[j1][j2];
930 ldb = source[k1][k2];
931 ldc = ldc + lda * ldb;
935 working_space[i1][i2 + ssizey] = ldc;
940 i1min = -(lhx - 1), i1max = lhx - 1;
941 i2min = -(lhy - 1), i2max = lhy - 1;
942 for (i2 = i2min; i2 <= i2max; i2++) {
943 for (i1 = i1min; i1 <= i1max; i1++) {
948 j2max = lhy - 1 - i2;
951 for (j2 = j2min; j2 <= j2max; j2++) {
955 j1max = lhx - 1 - i1;
958 for (j1 = j1min; j1 <= j1max; j1++) {
959 lda = working_space[j1][j2];
960 if (i1 + j1 < ssizex && i2 + j2 < ssizey)
961 ldb = working_space[i1 + j1][i2 + j2];
964 ldc = ldc + lda * ldb;
967 working_space[i1 - i1min][i2 - i2min + 2 * ssizey ] = ldc;
972 for (i2 = 0; i2 < ssizey; i2++) {
973 for (i1 = 0; i1 < ssizex; i1++) {
974 working_space[i1][i2 + 3 * ssizey] = 1;
975 working_space[i1][i2 + 4 * ssizey] = 0;
980 for (repet = 0; repet < numberRepetitions; repet++) {
982 for (i = 0; i < ssizex; i++) {
983 for (j = 0; j < ssizey; j++) {
984 working_space[i][j + 3 * ssizey] =
989 for (lindex = 0; lindex < numberIterations; lindex++) {
990 for (i2 = 0; i2 < ssizey; i2++) {
991 for (i1 = 0; i1 < ssizex; i1++) {
997 j2max = ssizey - i2 - 1;
1001 if (j1min > lhx - 1)
1004 j1max = ssizex - i1 - 1;
1005 if (j1max > lhx - 1)
1007 for (j2 = j2min; j2 <= j2max; j2++) {
1008 for (j1 = j1min; j1 <= j1max; j1++) {
1009 ldc = working_space[j1 - i1min][j2 - i2min + 2 * ssizey];
1010 lda = working_space[i1 + j1][i2 + j2 + 3 * ssizey];
1011 ldb = ldb + lda * ldc;
1014 lda = working_space[i1][i2 + 3 * ssizey];
1015 ldc = working_space[i1][i2 + 1 * ssizey];
1016 if (ldc * lda != 0 && ldb != 0) {
1017 lda = lda * ldc / ldb;
1022 working_space[i1][i2 + 4 * ssizey] = lda;
1025 for (i2 = 0; i2 < ssizey; i2++) {
1026 for (i1 = 0; i1 < ssizex; i1++)
1027 working_space[i1][i2 + 3 * ssizey] =
1028 working_space[i1][i2 + 4 * ssizey];
1032 for (i = 0; i < ssizex; i++) {
1033 for (j = 0; j < ssizey; j++)
1034 source[(i + positx) % ssizex][(j + posity) % ssizey] =
1035 area * working_space[i][j + 3 * ssizey];
1037 for (i = 0; i < ssizex; i++)
1038 delete[]working_space[i];
1039 delete[]working_space;
1139 Int_t k, lindex, priz;
1140 Double_t lda, ldb, ldc, area, maximum;
1141 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;
1144 Double_t nom, nip, nim, sp, sm, spx, spy, smx, smy;
1147 Int_t lhx, lhy, i1, i2, j1, j2, k1, k2, i1min, i1max, i2min, i2max, j1min, j1max, j2min, j2max, positx, posity;
1149 Error(
"SearchHighRes",
"Invalid sigma, must be greater than or equal to 1");
1153 if(threshold<=0||threshold>=100){
1154 Error(
"SearchHighRes",
"Invalid threshold, must be positive and less than 100");
1160 Error(
"SearchHighRes",
"Too large sigma");
1164 if (markov ==
true) {
1165 if (averWindow <= 0) {
1166 Error(
"SearchHighRes",
"Averaging window must be positive");
1170 if(backgroundRemove ==
true){
1171 if(ssizex_ext < 2 * number_of_iterations + 1 || ssizey_ext < 2 * number_of_iterations + 1){
1172 Error(
"SearchHighRes",
"Too large clipping window");
1179 for (j = 0; j < ssizex + i; j++) {
1181 for (k=0;k<16 * (ssizey + i);k++) wsk[k] = 0;
1183 for(j = 0; j < ssizey_ext; j++){
1184 for(i = 0; i < ssizex_ext; i++){
1187 working_space[i][j + ssizey_ext] = source[0][0];
1189 else if(j >= ssizey + shift)
1190 working_space[i][j + ssizey_ext] = source[0][ssizey - 1];
1193 working_space[i][j + ssizey_ext] = source[0][j - shift];
1196 else if(i >= ssizex + shift){
1198 working_space[i][j + ssizey_ext] = source[ssizex - 1][0];
1200 else if(j >= ssizey + shift)
1201 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1];
1204 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift];
1209 working_space[i][j + ssizey_ext] = source[i - shift][0];
1211 else if(j >= ssizey + shift)
1212 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1];
1215 working_space[i][j + ssizey_ext] = source[i - shift][j - shift];
1219 if(backgroundRemove ==
true){
1220 for(i = 1; i <= number_of_iterations; i++){
1221 for(
y = i;
y < ssizey_ext - i;
y++){
1222 for(
x = i;
x < ssizex_ext - i;
x++){
1223 a = working_space[
x][
y + ssizey_ext];
1224 p1 = working_space[
x - i][
y + ssizey_ext - i];
1225 p2 = working_space[
x - i][
y + ssizey_ext + i];
1226 p3 = working_space[
x + i][
y + ssizey_ext - i];
1227 p4 = working_space[
x + i][
y + ssizey_ext + i];
1228 s1 = working_space[
x][
y + ssizey_ext - i];
1229 s2 = working_space[
x - i][
y + ssizey_ext];
1230 s3 = working_space[
x + i][
y + ssizey_ext];
1231 s4 = working_space[
x][
y + ssizey_ext + i];
1232 b = (p1 + p2) / 2.0;
1235 b = (p1 + p3) / 2.0;
1238 b = (p2 + p4) / 2.0;
1241 b = (p3 + p4) / 2.0;
1244 s1 =
s1 - (p1 + p3) / 2.0;
1245 s2 = s2 - (p1 + p2) / 2.0;
1246 s3 = s3 - (p3 + p4) / 2.0;
1247 s4 = s4 - (p2 + p4) / 2.0;
1248 b = (
s1 + s4) / 2.0 + (s2 + s3) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
1251 working_space[
x][
y] =
a;
1254 for(
y = i;
y < ssizey_ext - i;
y++){
1255 for(
x = i;
x < ssizex_ext - i;
x++){
1256 working_space[
x][
y + ssizey_ext] = working_space[
x][
y];
1260 for(j = 0;j < ssizey_ext; j++){
1261 for(i = 0; i < ssizex_ext; i++){
1264 working_space[i][j + ssizey_ext] = source[0][0] - working_space[i][j + ssizey_ext];
1266 else if(j >= ssizey + shift)
1267 working_space[i][j + ssizey_ext] = source[0][ssizey - 1] - working_space[i][j + ssizey_ext];
1270 working_space[i][j + ssizey_ext] = source[0][j - shift] - working_space[i][j + ssizey_ext];
1273 else if(i >= ssizex + shift){
1275 working_space[i][j + ssizey_ext] = source[ssizex - 1][0] - working_space[i][j + ssizey_ext];
1277 else if(j >= ssizey + shift)
1278 working_space[i][j + ssizey_ext] = source[ssizex - 1][ssizey - 1] - working_space[i][j + ssizey_ext];
1281 working_space[i][j + ssizey_ext] = source[ssizex - 1][j - shift] - working_space[i][j + ssizey_ext];
1286 working_space[i][j + ssizey_ext] = source[i - shift][0] - working_space[i][j + ssizey_ext];
1288 else if(j >= ssizey + shift)
1289 working_space[i][j + ssizey_ext] = source[i - shift][ssizey - 1] - working_space[i][j + ssizey_ext];
1292 working_space[i][j + ssizey_ext] = source[i - shift][j - shift] - working_space[i][j + ssizey_ext];
1297 for(j = 0; j < ssizey_ext; j++){
1298 for(i = 0; i < ssizex_ext; i++){
1299 working_space[i][j + 15*ssizey_ext] = working_space[i][j + ssizey_ext];
1303 for(i = 0;i < ssizex_ext; i++){
1304 for(j = 0; j < ssizey_ext; j++)
1305 working_space[i][j + 2 * ssizex_ext] = working_space[i][ssizey_ext + j];
1308 xmax = ssizex_ext - 1;
1310 ymax = ssizey_ext - 1;
1311 for(i = 0, maxch = 0; i < ssizex_ext; i++){
1312 for(j = 0; j < ssizey_ext; j++){
1313 working_space[i][j] = 0;
1314 if(maxch < working_space[i][j + 2 * ssizey_ext])
1315 maxch = working_space[i][j + 2 * ssizey_ext];
1316 plocha += working_space[i][j + 2 * ssizey_ext];
1322 for (j = 0; j < ssizex + i; j++)
1323 delete[]working_space[j];
1324 delete [] working_space;
1331 nip = working_space[i][
ymin + 2 * ssizey_ext] / maxch;
1332 nim = working_space[i + 1][
ymin + 2 * ssizey_ext] / maxch;
1334 for(
l = 1;
l <= averWindow;
l++){
1336 a = working_space[
xmax][
ymin + 2 * ssizey_ext] / maxch;
1339 a = working_space[i +
l][
ymin + 2 * ssizey_ext] / maxch;
1350 if(i -
l + 1 <
xmin)
1351 a = working_space[
xmin][
ymin + 2 * ssizey_ext] / maxch;
1354 a = working_space[i -
l + 1][
ymin + 2 * ssizey_ext] / maxch;
1366 a = working_space[i + 1][
ymin] =
a * working_space[i][
ymin];
1370 nip = working_space[
xmin][i + 2 * ssizey_ext] / maxch;
1371 nim = working_space[
xmin][i + 1 + 2 * ssizey_ext] / maxch;
1373 for(
l = 1;
l <= averWindow;
l++){
1375 a = working_space[
xmin][
ymax + 2 * ssizey_ext] / maxch;
1378 a = working_space[
xmin][i +
l + 2 * ssizey_ext] / maxch;
1388 if(i -
l + 1 <
ymin)
1389 a = working_space[
xmin][
ymin + 2 * ssizey_ext] / maxch;
1392 a = working_space[
xmin][i -
l + 1 + 2 * ssizey_ext] / maxch;
1404 a = working_space[
xmin][i + 1] =
a * working_space[
xmin][i];
1409 nip = working_space[i][j + 1 + 2 * ssizey_ext] / maxch;
1410 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
1412 for(
l = 1;
l <= averWindow;
l++){
1414 a = working_space[
xmax][j + 2 * ssizey_ext] / maxch;
1417 a = working_space[i +
l][j + 2 * ssizey_ext] / maxch;
1427 if(i -
l + 1 <
xmin)
1428 a = working_space[
xmin][j + 2 * ssizey_ext] / maxch;
1431 a = working_space[i -
l + 1][j + 2 * ssizey_ext] / maxch;
1443 nip = working_space[i + 1][j + 2 * ssizey_ext] / maxch;
1444 nim = working_space[i + 1][j + 1 + 2 * ssizey_ext] / maxch;
1445 for(
l = 1;
l <= averWindow;
l++){
1447 a = working_space[i][
ymax + 2 * ssizey_ext] / maxch;
1450 a = working_space[i][j +
l + 2 * ssizey_ext] / maxch;
1460 if(j -
l + 1 <
ymin)
1461 a = working_space[i][
ymin + 2 * ssizey_ext] / maxch;
1464 a = working_space[i][j -
l + 1 + 2 * ssizey_ext] / maxch;
1474 a = (spx * working_space[i][j + 1] + spy * working_space[i + 1][j]) / (smx + smy);
1475 working_space[i + 1][j + 1] =
a;
1481 working_space[i][j] = working_space[i][j] / nom;
1484 for(i = 0; i < ssizex_ext; i++){
1485 for(j = 0; j < ssizey_ext; j++){
1486 working_space[i][j + ssizey_ext] = working_space[i][j] * plocha;
1487 working_space[i][2 * ssizey_ext + j] = working_space[i][ssizey_ext + j];
1494 positx = 0,posity = 0;
1497 for(i = 0; i < ssizex_ext; i++){
1498 for(j = 0; j < ssizey_ext; j++){
1501 lda = (lda * lda + ldb * ldb) / (2 *
sigma *
sigma);
1511 working_space[i][j] = lda;
1515 positx = i,posity = j;
1520 for(i = 0;i < ssizex_ext; i++){
1521 for(j = 0;j < ssizey_ext; j++){
1522 working_space[i][j + 14 * ssizey_ext] =
TMath::Abs(working_space[i][j + ssizey_ext]);
1534 i1min = -i,i1max = i;
1535 i2min = -j,i2max = j;
1536 for(i2 = i2min; i2 <= i2max; i2++){
1537 for(i1 = i1min; i1 <= i1max; i1++){
1543 j2max = lhy - 1 - i2;
1547 for(j2 = j2min; j2 <= j2max; j2++){
1552 j1max = lhx - 1 - i1;
1556 for(j1 = j1min; j1 <= j1max; j1++){
1557 lda = working_space[j1][j2];
1558 ldb = working_space[i1 + j1][i2 + j2];
1559 ldc = ldc + lda * ldb;
1562 k = (i1 + ssizex_ext) / ssizex_ext;
1563 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext] = ldc;
1575 i2min = -j,i2max = ssizey_ext + j - 1;
1576 i1min = -i,i1max = ssizex_ext + i - 1;
1577 for(i2 = i2min; i2 <= i2max; i2++){
1578 for(i1=i1min;i1<=i1max;i1++){
1580 for(j2 = 0; j2 <= (lhy - 1); j2++){
1581 for(j1 = 0; j1 <= (lhx - 1); j1++){
1582 k2 = i2 + j2,k1 = i1 + j1;
1583 if(k2 >= 0 && k2 < ssizey_ext && k1 >= 0 && k1 < ssizex_ext){
1584 lda = working_space[j1][j2];
1585 ldb = working_space[k1][k2 + 14 * ssizey_ext];
1586 ldc = ldc + lda * ldb;
1590 k = (i1 + ssizex_ext) / ssizex_ext;
1591 working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext] = ldc;
1595 for(i2 = 0; i2 < ssizey_ext; i2++){
1596 for(i1 = 0; i1 < ssizex_ext; i1++){
1597 k = (i1 + ssizex_ext) / ssizex_ext;
1598 ldb = working_space[(i1 + ssizex_ext) % ssizex_ext][i2 + ssizey_ext + ssizey_ext + k * 3 * ssizey_ext];
1599 working_space[i1][i2 + 14 * ssizey_ext] = ldb;
1603 for(i2 = 0; i2 < ssizey_ext; i2++){
1604 for(i1 = 0; i1 < ssizex_ext; i1++){
1605 working_space[i1][i2 + ssizey_ext] = 1;
1606 working_space[i1][i2 + 2 * ssizey_ext] = 0;
1610 for(lindex = 0; lindex < deconIterations; lindex++){
1611 for(i2 = 0; i2 < ssizey_ext; i2++){
1612 for(i1 = 0; i1 < ssizex_ext; i1++){
1613 lda = working_space[i1][i2 + ssizey_ext];
1614 ldc = working_space[i1][i2 + 14 * ssizey_ext];
1615 if(lda > 0.000001 && ldc > 0.000001){
1622 j2max = ssizey_ext - i2 - 1;
1631 j1max = ssizex_ext - i1 - 1;
1635 for(j2 = j2min; j2 <= j2max; j2++){
1636 for(j1 = j1min; j1 <= j1max; j1++){
1637 k = (j1 + ssizex_ext) / ssizex_ext;
1638 ldc = working_space[(j1 + ssizex_ext) % ssizex_ext][j2 + ssizey_ext + 10 * ssizey_ext + k * 2 * ssizey_ext];
1639 lda = working_space[i1 + j1][i2 + j2 + ssizey_ext];
1640 ldb = ldb + lda * ldc;
1643 lda = working_space[i1][i2 + ssizey_ext];
1644 ldc = working_space[i1][i2 + 14 * ssizey_ext];
1645 if(ldc * lda != 0 && ldb != 0){
1646 lda =lda * ldc / ldb;
1651 working_space[i1][i2 + 2 * ssizey_ext] = lda;
1655 for(i2 = 0; i2 < ssizey_ext; i2++){
1656 for(i1 = 0; i1 < ssizex_ext; i1++)
1657 working_space[i1][i2 + ssizey_ext] = working_space[i1][i2 + 2 * ssizey_ext];
1662 for(i = 0; i < ssizex_ext; i++){
1663 for(j = 0; j < ssizey_ext; j++){
1664 working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext] = area * working_space[i][j + ssizey_ext];
1665 if(maximum < working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext])
1666 maximum = working_space[(i + positx) % ssizex_ext][(j + posity) % ssizey_ext];
1671 for(i = 1; i < ssizex_ext - 1; i++){
1672 for(j = 1; j < ssizey_ext - 1; j++){
1673 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]){
1674 if(i >= shift && i < ssizex + shift && j >= shift && j < ssizey + shift){
1675 if(working_space[i][j] > threshold * maximum / 100.0){
1677 for(k = i - 1,
a = 0,
b = 0; k <= i + 1; k++){
1678 a += (
Double_t)(k - shift) * working_space[k][j];
1679 b += working_space[k][j];
1688 for(k = j - 1,
a = 0,
b = 0; k <= j + 1; k++){
1689 a += (
Double_t)(k - shift) * working_space[i][k];
1690 b += working_space[i][k];
1699 if(peak_index == 0){
1706 for(k = 0, priz = 0; k < peak_index && priz == 0; k++){
1718 for(
l = peak_index;
l >= k;
l--){
1737 for(i = 0; i < ssizex; i++){
1738 for(j = 0; j < ssizey; j++){
1739 dest[i][j] = working_space[i + shift][j + shift];
1744 for (j = 0; j < ssizex + i; j++)
1745 delete[]working_space[j];
1746 delete[]working_space;
1766 return s.
Background(hist, nIterX, nIterY, option);
int Int_t
Signed integer 4 bytes (int).
bool Bool_t
Boolean (0=false, 1=true) (bool).
double Double_t
Double 8 bytes.
const char Option_t
Option string (const char).
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
void Draw(Option_t *option="") override
Draw this histogram with options.
TList * GetListOfFunctions() const
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual void SetEntries(Double_t n)
Service class for 2-D histogram classes.
void SetBinContent(Int_t bin, Double_t content) override
Set bin content.
void Reset(Option_t *option="") override
Reset this histogram: contents, errors, etc.
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
void Add(TObject *obj) override
TObject * Remove(TObject *obj) override
Remove object from the list.
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
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.
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...
const char * SmoothMarkov(Double_t **source, Int_t ssizex, Int_t ssizey, Int_t averWindow)
void SetResolution(Double_t resolution=1)
NOT USED resolution: determines resolution of the neighboring peaks default value is 1 correspond to ...
virtual TH1 * Background(const TH1 *hist, Int_t nIterX=20, Int_t nIterY=20, Option_t *option="")
This function calculates the background spectrum in the input histogram h.
static Int_t StaticSearch(const TH1 *hist, Double_t sigma=2, Option_t *option="goff", Double_t threshold=0.05)
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)
void Print(Option_t *option="") const override
Print the array of positions.
Int_t fNPeaks
number of peaks found
static void SetAverageWindow(Int_t w=3)
static function: Set average window of searched peaks see TSpectrum2::SearchHighRes
~TSpectrum2() override
Destructor.
@ kBackSuccessiveFiltering
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 TH1 * StaticBackground(const TH1 *hist, Int_t nIterX=20, Int_t nIterY=20, Option_t *option="")
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)
Double_t * fPositionX
[fNPeaks] X position of peaks
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)
Returns the largest of a and b.
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.