00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #include "TSpectrum3.h"
00055 #include "TH1.h"
00056 #include "TMath.h"
00057 #define PEAK_WINDOW 1024
00058
00059 ClassImp(TSpectrum3)
00060
00061
00062 TSpectrum3::TSpectrum3() :TNamed("Spectrum", "Miroslav Morhac peak finder")
00063 {
00064
00065
00066 Int_t n = 100;
00067 fMaxPeaks = n;
00068 fPosition = new Float_t[n];
00069 fPositionX = new Float_t[n];
00070 fPositionY = new Float_t[n];
00071 fPositionZ = new Float_t[n];
00072 fResolution = 1;
00073 fHistogram = 0;
00074 fNPeaks = 0;
00075 }
00076
00077
00078
00079 TSpectrum3::TSpectrum3(Int_t maxpositions, Float_t resolution) :TNamed("Spectrum", "Miroslav Morhac peak finder")
00080 {
00081
00082
00083
00084
00085
00086
00087 Int_t n = TMath::Max(maxpositions, 100);
00088 fMaxPeaks = n;
00089 fPosition = new Float_t[n];
00090 fPositionX = new Float_t[n];
00091 fPositionY = new Float_t[n];
00092 fPositionZ = new Float_t[n];
00093 fHistogram = 0;
00094 fNPeaks = 0;
00095 SetResolution(resolution);
00096 }
00097
00098
00099
00100 TSpectrum3::~TSpectrum3()
00101 {
00102
00103
00104 delete [] fPosition;
00105 delete [] fPositionX;
00106 delete [] fPositionY;
00107 delete [] fPositionZ;
00108 delete fHistogram;
00109 }
00110
00111
00112 const char *TSpectrum3::Background(const TH1 * h, int number_of_iterations,
00113 Option_t * option)
00114 {
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 Error("Background","function not yet implemented: h=%s, iter=%d, option=%sn"
00127 , h->GetName(), number_of_iterations, option);
00128 return 0;
00129 }
00130
00131
00132 void TSpectrum3::Print(Option_t *) const
00133 {
00134
00135
00136 printf("\nNumber of positions = %d\n",fNPeaks);
00137 for (Int_t i=0;i<fNPeaks;i++) {
00138 printf(" x[%d] = %g, y[%d] = %g, z[%d] = %g\n",i,fPositionX[i],i,fPositionY[i],i,fPositionZ[i]);
00139 }
00140 }
00141
00142
00143
00144
00145 Int_t TSpectrum3::Search(const TH1 * hin, Double_t sigma,
00146 Option_t * option, Double_t threshold)
00147 {
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 if (hin == 0)
00173 return 0;
00174 Int_t dimension = hin->GetDimension();
00175 if (dimension != 3) {
00176 Error("Search", "Must be a 3-d histogram");
00177 return 0;
00178 }
00179
00180 Int_t sizex = hin->GetXaxis()->GetNbins();
00181 Int_t sizey = hin->GetYaxis()->GetNbins();
00182 Int_t sizez = hin->GetZaxis()->GetNbins();
00183 Int_t i, j, k, binx,biny,binz, npeaks;
00184 float *** source = new float **[sizex];
00185 float *** dest = new float **[sizex];
00186 for (i = 0; i < sizex; i++) {
00187 source[i] = new float *[sizey];
00188 dest[i] = new float *[sizey];
00189 for (j = 0; j < sizey; j++) {
00190 source[i][j] = new float [sizez];
00191 dest[i][j] = new float [sizez];
00192 for (k = 0; k < sizez; k++)
00193 source[i][j][k] = (float) hin->GetBinContent(i + 1, j + 1, k + 1);
00194 }
00195 }
00196
00197 npeaks = SearchHighRes((const float***)source, dest, sizex, sizey, sizez, sigma, 100*threshold, kTRUE, 3, kFALSE, 3);
00198
00199
00200
00201
00202 for (i = 0; i < npeaks; i++) {
00203 binx = 1 + Int_t(fPositionX[i] + 0.5);
00204 biny = 1 + Int_t(fPositionY[i] + 0.5);
00205 binz = 1 + Int_t(fPositionZ[i] + 0.5);
00206 fPositionX[i] = hin->GetXaxis()->GetBinCenter(binx);
00207 fPositionY[i] = hin->GetYaxis()->GetBinCenter(biny);
00208 fPositionZ[i] = hin->GetZaxis()->GetBinCenter(binz);
00209 }
00210 for (i = 0; i < sizex; i++) {
00211 for (j = 0; j < sizey; j++){
00212 delete [] source[i][j];
00213 delete [] dest[i][j];
00214 }
00215 delete [] source[i];
00216 delete [] dest[i];
00217 }
00218 delete [] source;
00219 delete [] dest;
00220
00221 if (strstr(option, "goff"))
00222 return npeaks;
00223 if (!npeaks) return 0;
00224 return npeaks;
00225 }
00226
00227
00228
00229 void TSpectrum3::SetResolution(Float_t resolution)
00230 {
00231
00232
00233
00234
00235
00236 if (resolution > 1)
00237 fResolution = resolution;
00238 else
00239 fResolution = 1;
00240 }
00241
00242
00243 const char *TSpectrum3::Background(float ***spectrum,
00244 Int_t ssizex, Int_t ssizey, Int_t ssizez,
00245 Int_t numberIterationsX,
00246 Int_t numberIterationsY,
00247 Int_t numberIterationsZ,
00248 Int_t direction,
00249 Int_t filterType)
00250 {
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668 int i, j, x, y, z, sampling, q1, q2, q3;
00669 float a, b, c, d, p1, p2, p3, p4, p5, p6, p7, p8, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, r1, r2, r3, r4, r5, r6;
00670 if (ssizex <= 0 || ssizey <= 0 || ssizez <= 0)
00671 return "Wrong parameters";
00672 if (numberIterationsX < 1 || numberIterationsY < 1 || numberIterationsZ < 1)
00673 return "Width of Clipping Window Must Be Positive";
00674 if (ssizex < 2 * numberIterationsX + 1 || ssizey < 2 * numberIterationsY + 1 || ssizey < 2 * numberIterationsZ + 1)
00675 return ("Too Large Clipping Window");
00676 float ***working_space=new float** [ssizex];
00677 for(i=0;i<ssizex;i++){
00678 working_space[i]=new float* [ssizey];
00679 for(j=0;j<ssizey;j++)
00680 working_space[i][j]=new float [ssizez];
00681 }
00682 sampling =(int) TMath::Max(numberIterationsX, numberIterationsY);
00683 sampling =(int) TMath::Max(sampling, numberIterationsZ);
00684 if (direction == kBackIncreasingWindow) {
00685 if (filterType == kBackSuccessiveFiltering) {
00686 for (i = 1; i <= sampling; i++) {
00687 q1 = (int) TMath::Min(i, numberIterationsX), q2 =(int) TMath::Min(i, numberIterationsY), q3 =(int) TMath::Min(i, numberIterationsZ);
00688 for (z = q3; z < ssizez - q3; z++) {
00689 for (y = q2; y < ssizey - q2; y++) {
00690 for (x = q1; x < ssizex - q1; x++) {
00691 a = spectrum[x][y][z];
00692 p1 = spectrum[x + q1][y + q2][z - q3];
00693 p2 = spectrum[x - q1][y + q2][z - q3];
00694 p3 = spectrum[x + q1][y - q2][z - q3];
00695 p4 = spectrum[x - q1][y - q2][z - q3];
00696 p5 = spectrum[x + q1][y + q2][z + q3];
00697 p6 = spectrum[x - q1][y + q2][z + q3];
00698 p7 = spectrum[x + q1][y - q2][z + q3];
00699 p8 = spectrum[x - q1][y - q2][z + q3];
00700 s1 = spectrum[x + q1][y ][z - q3];
00701 s2 = spectrum[x ][y + q2][z - q3];
00702 s3 = spectrum[x - q1][y ][z - q3];
00703 s4 = spectrum[x ][y - q2][z - q3];
00704 s5 = spectrum[x + q1][y ][z + q3];
00705 s6 = spectrum[x ][y + q2][z + q3];
00706 s7 = spectrum[x - q1][y ][z + q3];
00707 s8 = spectrum[x ][y - q2][z + q3];
00708 s9 = spectrum[x - q1][y + q2][z ];
00709 s10 = spectrum[x - q1][y - q2][z ];
00710 s11 = spectrum[x + q1][y + q2][z ];
00711 s12 = spectrum[x + q1][y - q2][z ];
00712 r1 = spectrum[x ][y ][z - q3];
00713 r2 = spectrum[x ][y ][z + q3];
00714 r3 = spectrum[x - q1][y ][z ];
00715 r4 = spectrum[x + q1][y ][z ];
00716 r5 = spectrum[x ][y + q2][z ];
00717 r6 = spectrum[x ][y - q2][z ];
00718 b = (p1 + p3) / 2.0;
00719 if(b > s1)
00720 s1 = b;
00721 b = (p1 + p2) / 2.0;
00722 if(b > s2)
00723 s2 = b;
00724 b = (p2 + p4) / 2.0;
00725 if(b > s3)
00726 s3 = b;
00727 b = (p3 + p4) / 2.0;
00728 if(b > s4)
00729 s4 = b;
00730 b = (p5 + p7) / 2.0;
00731 if(b > s5)
00732 s5 = b;
00733 b = (p5 + p6) / 2.0;
00734 if(b > s6)
00735 s6 = b;
00736 b = (p6 + p8) / 2.0;
00737 if(b > s7)
00738 s7 = b;
00739 b = (p7 + p8) / 2.0;
00740 if(b > s8)
00741 s8 = b;
00742 b = (p2 + p6) / 2.0;
00743 if(b > s9)
00744 s9 = b;
00745 b = (p4 + p8) / 2.0;
00746 if(b > s10)
00747 s10 = b;
00748 b = (p1 + p5) / 2.0;
00749 if(b > s11)
00750 s11 = b;
00751 b = (p3 + p7) / 2.0;
00752 if(b > s12)
00753 s12 = b;
00754 s1 = s1 - (p1 + p3) / 2.0;
00755 s2 = s2 - (p1 + p2) / 2.0;
00756 s3 = s3 - (p2 + p4) / 2.0;
00757 s4 = s4 - (p3 + p4) / 2.0;
00758 s5 = s5 - (p5 + p7) / 2.0;
00759 s6 = s6 - (p5 + p6) / 2.0;
00760 s7 = s7 - (p6 + p8) / 2.0;
00761 s8 = s8 - (p7 + p8) / 2.0;
00762 s9 = s9 - (p2 + p6) / 2.0;
00763 s10 = s10 - (p4 + p8) / 2.0;
00764 s11 = s11 - (p1 + p5) / 2.0;
00765 s12 = s12 - (p3 + p7) / 2.0;
00766 b = (s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
00767 if(b > r1)
00768 r1 = b;
00769 b = (s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0;
00770 if(b > r2)
00771 r2 = b;
00772 b = (s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0;
00773 if(b > r3)
00774 r3 = b;
00775 b = (s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0;
00776 if(b > r4)
00777 r4 = b;
00778 b = (s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0;
00779 if(b > r5)
00780 r5 = b;
00781 b = (s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0;
00782 if(b > r6)
00783 r6 = b;
00784 r1 = r1 - ((s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0);
00785 r2 = r2 - ((s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0);
00786 r3 = r3 - ((s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0);
00787 r4 = r4 - ((s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0);
00788 r5 = r5 - ((s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0);
00789 r6 = r6 - ((s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0);
00790 b = (r1 + r2) / 2.0 + (r3 + r4) / 2.0 + (r5 + r6) / 2.0 + (s1 + s3 + s5 + s7) / 4.0 + (s2 + s4 + s6 + s8) / 4.0 + (s9 + s10 + s11 + s12) / 4.0 + (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8.0;
00791 if(b < a)
00792 a = b;
00793 working_space[x][y][z] = a;
00794 }
00795 }
00796 }
00797 for (z = q3; z < ssizez - q3; z++) {
00798 for (y = q2; y < ssizey - q2; y++) {
00799 for (x = q1; x < ssizex - q1; x++) {
00800 spectrum[x][y][z] = working_space[x][y][z];
00801 }
00802 }
00803 }
00804 }
00805 }
00806
00807 else if (filterType == kBackOneStepFiltering) {
00808 for (i = 1; i <= sampling; i++) {
00809 q1 = (int) TMath::Min(i, numberIterationsX), q2 =(int) TMath::Min(i, numberIterationsY), q3 =(int) TMath::Min(i, numberIterationsZ);
00810 for (z = q3; z < ssizez - q3; z++) {
00811 for (y = q2; y < ssizey - q2; y++) {
00812 for (x = q1; x < ssizex - q1; x++) {
00813 a = spectrum[x][y][z];
00814 p1 = spectrum[x + q1][y + q2][z - q3];
00815 p2 = spectrum[x - q1][y + q2][z - q3];
00816 p3 = spectrum[x + q1][y - q2][z - q3];
00817 p4 = spectrum[x - q1][y - q2][z - q3];
00818 p5 = spectrum[x + q1][y + q2][z + q3];
00819 p6 = spectrum[x - q1][y + q2][z + q3];
00820 p7 = spectrum[x + q1][y - q2][z + q3];
00821 p8 = spectrum[x - q1][y - q2][z + q3];
00822 s1 = spectrum[x + q1][y ][z - q3];
00823 s2 = spectrum[x ][y + q2][z - q3];
00824 s3 = spectrum[x - q1][y ][z - q3];
00825 s4 = spectrum[x ][y - q2][z - q3];
00826 s5 = spectrum[x + q1][y ][z + q3];
00827 s6 = spectrum[x ][y + q2][z + q3];
00828 s7 = spectrum[x - q1][y ][z + q3];
00829 s8 = spectrum[x ][y - q2][z + q3];
00830 s9 = spectrum[x - q1][y + q2][z ];
00831 s10 = spectrum[x - q1][y - q2][z ];
00832 s11 = spectrum[x + q1][y + q2][z ];
00833 s12 = spectrum[x + q1][y - q2][z ];
00834 r1 = spectrum[x ][y ][z - q3];
00835 r2 = spectrum[x ][y ][z + q3];
00836 r3 = spectrum[x - q1][y ][z ];
00837 r4 = spectrum[x + q1][y ][z ];
00838 r5 = spectrum[x ][y + q2][z ];
00839 r6 = spectrum[x ][y - q2][z ];
00840 b=(p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8 - (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 4 + (r1 + r2 + r3 + r4 + r5 + r6) / 2;
00841 c = -(s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 4 + (r1 + r2 + r3 + r4 + r5 + r6) / 2;
00842 d = -(p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8 + (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 12;
00843 if(b < a && b >= 0 && c >=0 && d >= 0)
00844 a = b;
00845 working_space[x][y][z] = a;
00846 }
00847 }
00848 }
00849 for (z = q3; z < ssizez - q3; z++) {
00850 for (y = q2; y < ssizey - q2; y++) {
00851 for (x = q1; x < ssizex - q1; x++) {
00852 spectrum[x][y][z] = working_space[x][y][z];
00853 }
00854 }
00855 }
00856 }
00857 }
00858 }
00859
00860 else if (direction == kBackDecreasingWindow) {
00861 if (filterType == kBackSuccessiveFiltering) {
00862 for (i = sampling; i >= 1; i--) {
00863 q1 = (int) TMath::Min(i, numberIterationsX), q2 =(int) TMath::Min(i, numberIterationsY), q3 =(int) TMath::Min(i, numberIterationsZ);
00864 for (z = q3; z < ssizez - q3; z++) {
00865 for (y = q2; y < ssizey - q2; y++) {
00866 for (x = q1; x < ssizex - q1; x++) {
00867 a = spectrum[x][y][z];
00868 p1 = spectrum[x + q1][y + q2][z - q3];
00869 p2 = spectrum[x - q1][y + q2][z - q3];
00870 p3 = spectrum[x + q1][y - q2][z - q3];
00871 p4 = spectrum[x - q1][y - q2][z - q3];
00872 p5 = spectrum[x + q1][y + q2][z + q3];
00873 p6 = spectrum[x - q1][y + q2][z + q3];
00874 p7 = spectrum[x + q1][y - q2][z + q3];
00875 p8 = spectrum[x - q1][y - q2][z + q3];
00876 s1 = spectrum[x + q1][y ][z - q3];
00877 s2 = spectrum[x ][y + q2][z - q3];
00878 s3 = spectrum[x - q1][y ][z - q3];
00879 s4 = spectrum[x ][y - q2][z - q3];
00880 s5 = spectrum[x + q1][y ][z + q3];
00881 s6 = spectrum[x ][y + q2][z + q3];
00882 s7 = spectrum[x - q1][y ][z + q3];
00883 s8 = spectrum[x ][y - q2][z + q3];
00884 s9 = spectrum[x - q1][y + q2][z ];
00885 s10 = spectrum[x - q1][y - q2][z ];
00886 s11 = spectrum[x + q1][y + q2][z ];
00887 s12 = spectrum[x + q1][y - q2][z ];
00888 r1 = spectrum[x ][y ][z - q3];
00889 r2 = spectrum[x ][y ][z + q3];
00890 r3 = spectrum[x - q1][y ][z ];
00891 r4 = spectrum[x + q1][y ][z ];
00892 r5 = spectrum[x ][y + q2][z ];
00893 r6 = spectrum[x ][y - q2][z ];
00894 b = (p1 + p3) / 2.0;
00895 if(b > s1)
00896 s1 = b;
00897 b = (p1 + p2) / 2.0;
00898 if(b > s2)
00899 s2 = b;
00900 b = (p2 + p4) / 2.0;
00901 if(b > s3)
00902 s3 = b;
00903 b = (p3 + p4) / 2.0;
00904 if(b > s4)
00905 s4 = b;
00906 b = (p5 + p7) / 2.0;
00907 if(b > s5)
00908 s5 = b;
00909 b = (p5 + p6) / 2.0;
00910 if(b > s6)
00911 s6 = b;
00912 b = (p6 + p8) / 2.0;
00913 if(b > s7)
00914 s7 = b;
00915 b = (p7 + p8) / 2.0;
00916 if(b > s8)
00917 s8 = b;
00918 b = (p2 + p6) / 2.0;
00919 if(b > s9)
00920 s9 = b;
00921 b = (p4 + p8) / 2.0;
00922 if(b > s10)
00923 s10 = b;
00924 b = (p1 + p5) / 2.0;
00925 if(b > s11)
00926 s11 = b;
00927 b = (p3 + p7) / 2.0;
00928 if(b > s12)
00929 s12 = b;
00930 s1 = s1 - (p1 + p3) / 2.0;
00931 s2 = s2 - (p1 + p2) / 2.0;
00932 s3 = s3 - (p2 + p4) / 2.0;
00933 s4 = s4 - (p3 + p4) / 2.0;
00934 s5 = s5 - (p5 + p7) / 2.0;
00935 s6 = s6 - (p5 + p6) / 2.0;
00936 s7 = s7 - (p6 + p8) / 2.0;
00937 s8 = s8 - (p7 + p8) / 2.0;
00938 s9 = s9 - (p2 + p6) / 2.0;
00939 s10 = s10 - (p4 + p8) / 2.0;
00940 s11 = s11 - (p1 + p5) / 2.0;
00941 s12 = s12 - (p3 + p7) / 2.0;
00942 b = (s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
00943 if(b > r1)
00944 r1 = b;
00945 b = (s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0;
00946 if(b > r2)
00947 r2 = b;
00948 b = (s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0;
00949 if(b > r3)
00950 r3 = b;
00951 b = (s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0;
00952 if(b > r4)
00953 r4 = b;
00954 b = (s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0;
00955 if(b > r5)
00956 r5 = b;
00957 b = (s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0;
00958 if(b > r6)
00959 r6 = b;
00960 r1 = r1 - ((s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0);
00961 r2 = r2 - ((s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0);
00962 r3 = r3 - ((s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0);
00963 r4 = r4 - ((s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0);
00964 r5 = r5 - ((s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0);
00965 r6 = r6 - ((s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0);
00966 b = (r1 + r2) / 2.0 + (r3 + r4) / 2.0 + (r5 + r6) / 2.0 + (s1 + s3 + s5 + s7) / 4.0 + (s2 + s4 + s6 + s8) / 4.0 + (s9 + s10 + s11 + s12) / 4.0 + (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8.0;
00967 if(b < a)
00968 a = b;
00969 working_space[x][y][z] = a;
00970 }
00971 }
00972 }
00973 for (z = q3; z < ssizez - q3; z++) {
00974 for (y = q2; y < ssizey - q2; y++) {
00975 for (x = q1; x < ssizex - q1; x++) {
00976 spectrum[x][y][z] = working_space[x][y][z];
00977 }
00978 }
00979 }
00980 }
00981 }
00982
00983 else if (filterType == kBackOneStepFiltering) {
00984 for (i = sampling; i >= 1; i--) {
00985 q1 = (int) TMath::Min(i, numberIterationsX), q2 =(int) TMath::Min(i, numberIterationsY), q3 =(int) TMath::Min(i, numberIterationsZ);
00986 for (z = q3; z < ssizez - q3; z++) {
00987 for (y = q2; y < ssizey - q2; y++) {
00988 for (x = q1; x < ssizex - q1; x++) {
00989 a = spectrum[x][y][z];
00990 p1 = spectrum[x + q1][y + q2][z - q3];
00991 p2 = spectrum[x - q1][y + q2][z - q3];
00992 p3 = spectrum[x + q1][y - q2][z - q3];
00993 p4 = spectrum[x - q1][y - q2][z - q3];
00994 p5 = spectrum[x + q1][y + q2][z + q3];
00995 p6 = spectrum[x - q1][y + q2][z + q3];
00996 p7 = spectrum[x + q1][y - q2][z + q3];
00997 p8 = spectrum[x - q1][y - q2][z + q3];
00998 s1 = spectrum[x + q1][y ][z - q3];
00999 s2 = spectrum[x ][y + q2][z - q3];
01000 s3 = spectrum[x - q1][y ][z - q3];
01001 s4 = spectrum[x ][y - q2][z - q3];
01002 s5 = spectrum[x + q1][y ][z + q3];
01003 s6 = spectrum[x ][y + q2][z + q3];
01004 s7 = spectrum[x - q1][y ][z + q3];
01005 s8 = spectrum[x ][y - q2][z + q3];
01006 s9 = spectrum[x - q1][y + q2][z ];
01007 s10 = spectrum[x - q1][y - q2][z ];
01008 s11 = spectrum[x + q1][y + q2][z ];
01009 s12 = spectrum[x + q1][y - q2][z ];
01010 r1 = spectrum[x ][y ][z - q3];
01011 r2 = spectrum[x ][y ][z + q3];
01012 r3 = spectrum[x - q1][y ][z ];
01013 r4 = spectrum[x + q1][y ][z ];
01014 r5 = spectrum[x ][y + q2][z ];
01015 r6 = spectrum[x ][y - q2][z ];
01016 b = (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8 - (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 4 + (r1 + r2 + r3 + r4 + r5 + r6) / 2;
01017 c = -(s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 4+(r1 + r2 + r3 + r4 + r5 + r6) / 2;
01018 d = -(p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8)/8 + (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12) / 12;
01019 if(b < a && b >= 0 && c >=0 && d >= 0)
01020 a = b;
01021 working_space[x][y][z] = a;
01022 }
01023 }
01024 }
01025 for (z = q3; z < ssizez - q3; z++) {
01026 for (y = q2; y < ssizey - q2; y++) {
01027 for (x = q1; x < ssizex - q1; x++) {
01028 spectrum[x][y][z] = working_space[x][y][z];
01029 }
01030 }
01031 }
01032 }
01033 }
01034 }
01035 for(i = 0;i < ssizex; i++){
01036 for(j = 0;j < ssizey; j++)
01037 delete[] working_space[i][j];
01038 delete[] working_space[i];
01039 }
01040 delete[] working_space;
01041 return 0;
01042 }
01043
01044
01045 const char* TSpectrum3::SmoothMarkov(float ***source, Int_t ssizex, Int_t ssizey, Int_t ssizez, Int_t averWindow)
01046 {
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296 int xmin,xmax,ymin,ymax,zmin,zmax,i,j,k,l;
01297 double a,b,maxch;
01298 double nom,nip,nim,sp,sm,spx,smx,spy,smy,spz,smz,plocha=0;
01299 if(averWindow<=0)
01300 return "Averaging Window must be positive";
01301 float ***working_space = new float** [ssizex];
01302 for(i = 0;i < ssizex; i++){
01303 working_space[i] = new float* [ssizey];
01304 for(j = 0;j < ssizey; j++)
01305 working_space[i][j] = new float [ssizez];
01306 }
01307 xmin = 0;
01308 xmax = ssizex - 1;
01309 ymin = 0;
01310 ymax = ssizey - 1;
01311 zmin = 0;
01312 zmax = ssizez - 1;
01313 for(i = 0,maxch = 0;i < ssizex; i++){
01314 for(j = 0;j < ssizey; j++){
01315 for(k = 0;k < ssizez; k++){
01316 working_space[i][j][k] = 0;
01317 if(maxch < source[i][j][k])
01318 maxch = source[i][j][k];
01319 plocha += source[i][j][k];
01320 }
01321 }
01322 }
01323 if(maxch == 0) {
01324 delete [] working_space;
01325 return 0;
01326 }
01327
01328 nom = 0;
01329 working_space[xmin][ymin][zmin] = 1;
01330 for(i = xmin;i < xmax; i++){
01331 nip = source[i][ymin][zmin] / maxch;
01332 nim = source[i + 1][ymin][zmin] / maxch;
01333 sp = 0,sm = 0;
01334 for(l = 1;l <= averWindow; l++){
01335 if((i + l) > xmax)
01336 a = source[xmax][ymin][zmin] / maxch;
01337
01338 else
01339 a = source[i + l][ymin][zmin] / maxch;
01340
01341 b = a - nip;
01342 if(a + nip <= 0)
01343 a = 1;
01344
01345 else
01346 a = TMath::Sqrt(a + nip);
01347
01348 b = b / a;
01349 b = TMath::Exp(b);
01350 sp = sp + b;
01351 if(i - l + 1 < xmin)
01352 a = source[xmin][ymin][zmin] / maxch;
01353
01354 else
01355 a = source[i - l + 1][ymin][zmin] / maxch;
01356
01357 b = a - nim;
01358 if(a + nim <= 0)
01359 a = 1;
01360
01361 else
01362 a = TMath::Sqrt(a + nim);
01363
01364 b = b / a;
01365 b = TMath::Exp(b);
01366 sm = sm + b;
01367 }
01368 a = sp / sm;
01369 a = working_space[i + 1][ymin][zmin] = a * working_space[i][ymin][zmin];
01370 nom = nom + a;
01371 }
01372 for(i = ymin;i < ymax; i++){
01373 nip = source[xmin][i][zmin] / maxch;
01374 nim = source[xmin][i + 1][zmin] / maxch;
01375 sp = 0,sm = 0;
01376 for(l = 1;l <= averWindow; l++){
01377 if((i + l) > ymax)
01378 a = source[xmin][ymax][zmin] / maxch;
01379
01380 else
01381 a = source[xmin][i + l][zmin] / maxch;
01382
01383 b = a - nip;
01384 if(a + nip <= 0)
01385 a = 1;
01386
01387 else
01388 a = TMath::Sqrt(a + nip);
01389
01390 b = b / a;
01391 b = TMath::Exp(b);
01392 sp = sp + b;
01393 if(i - l + 1 < ymin)
01394 a = source[xmin][ymin][zmin] / maxch;
01395
01396 else
01397 a = source[xmin][i - l + 1][zmin] / maxch;
01398
01399 b = a - nim;
01400 if(a + nim <= 0)
01401 a = 1;
01402
01403 else
01404 a = TMath::Sqrt(a + nim);
01405
01406 b = b / a;
01407 b = TMath::Exp(b);
01408 sm = sm + b;
01409 }
01410 a = sp / sm;
01411 a = working_space[xmin][i + 1][zmin] = a * working_space[xmin][i][zmin];
01412 nom = nom + a;
01413 }
01414 for(i = zmin;i < zmax; i++){
01415 nip = source[xmin][ymin][i] / maxch;
01416 nim = source[xmin][ymin][i + 1] / maxch;
01417 sp = 0,sm = 0;
01418 for(l = 1;l <= averWindow; l++){
01419 if((i + l) > zmax)
01420 a = source[xmin][ymin][zmax] / maxch;
01421
01422 else
01423 a = source[xmin][ymin][i + l] / maxch;
01424
01425 b = a - nip;
01426 if(a + nip <= 0)
01427 a = 1;
01428
01429 else
01430 a = TMath::Sqrt(a + nip);
01431
01432 b = b / a;
01433 b = TMath::Exp(b);
01434 sp = sp + b;
01435 if(i - l + 1 < zmin)
01436 a = source[xmin][ymin][zmin] / maxch;
01437
01438 else
01439 a = source[xmin][ymin][i - l + 1] / maxch;
01440
01441 b = a - nim;
01442 if(a + nim <= 0)
01443 a = 1;
01444
01445 else
01446 a = TMath::Sqrt(a + nim);
01447 b = b / a;
01448 b = TMath::Exp(b);
01449 sm = sm + b;
01450 }
01451 a = sp / sm;
01452 a = working_space[xmin][ymin][i + 1] = a * working_space[xmin][ymin][i];
01453 nom = nom + a;
01454 }
01455 for(i = xmin;i < xmax; i++){
01456 for(j = ymin;j < ymax; j++){
01457 nip = source[i][j + 1][zmin] / maxch;
01458 nim = source[i + 1][j + 1][zmin] / maxch;
01459 spx = 0,smx = 0;
01460 for(l = 1;l <= averWindow; l++){
01461 if(i + l > xmax)
01462 a = source[xmax][j][zmin] / maxch;
01463
01464 else
01465 a = source[i + l][j][zmin] / maxch;
01466
01467 b = a - nip;
01468 if(a + nip <= 0)
01469 a = 1;
01470
01471 else
01472 a = TMath::Sqrt(a + nip);
01473
01474 b = b / a;
01475 b = TMath::Exp(b);
01476 spx = spx + b;
01477 if(i - l + 1 < xmin)
01478 a = source[xmin][j][zmin] / maxch;
01479
01480 else
01481 a = source[i - l + 1][j][zmin] / maxch;
01482
01483 b = a - nim;
01484 if(a + nim <= 0)
01485 a = 1;
01486
01487 else
01488 a = TMath::Sqrt(a + nim);
01489
01490 b = b / a;
01491 b = TMath::Exp(b);
01492 smx = smx + b;
01493 }
01494 spy = 0,smy = 0;
01495 nip = source[i + 1][j][zmin] / maxch;
01496 nim = source[i + 1][j + 1][zmin] / maxch;
01497 for(l = 1;l <= averWindow; l++){
01498 if(j + l > ymax)
01499 a = source[i][ymax][zmin] / maxch;
01500
01501 else
01502 a = source[i][j + l][zmin] / maxch;
01503
01504 b = a - nip;
01505 if(a + nip <= 0)
01506 a = 1;
01507
01508 else
01509 a = TMath::Sqrt(a + nip);
01510
01511 b = b / a;
01512 b = TMath::Exp(b);
01513 spy = spy + b;
01514 if(j - l + 1 < ymin)
01515 a = source[i][ymin][zmin] / maxch;
01516
01517 else
01518 a = source[i][j - l + 1][zmin] / maxch;
01519
01520 b = a - nim;
01521 if(a + nim <= 0)
01522 a = 1;
01523
01524 else
01525 a = TMath::Sqrt(a + nim);
01526
01527 b = b / a;
01528 b = TMath::Exp(b);
01529 smy = smy + b;
01530 }
01531 a = (spx * working_space[i][j + 1][zmin] + spy * working_space[i + 1][j][zmin]) / (smx + smy);
01532 working_space[i + 1][j + 1][zmin] = a;
01533 nom = nom + a;
01534 }
01535 }
01536 for(i = xmin;i < xmax; i++){
01537 for(j = zmin;j < zmax; j++){
01538 nip = source[i][ymin][j + 1] / maxch;
01539 nim = source[i + 1][ymin][j + 1] / maxch;
01540 spx = 0,smx = 0;
01541 for(l = 1;l <= averWindow; l++){
01542 if(i + l > xmax)
01543 a = source[xmax][ymin][j] / maxch;
01544
01545 else
01546 a = source[i + l][ymin][j] / maxch;
01547
01548 b = a - nip;
01549 if(a + nip <= 0)
01550 a = 1;
01551
01552 else
01553 a = TMath::Sqrt(a + nip);
01554
01555 b = b / a;
01556 b = TMath::Exp(b);
01557 spx = spx + b;
01558 if(i - l + 1 < xmin)
01559 a = source[xmin][ymin][j] / maxch;
01560
01561 else
01562 a = source[i - l + 1][ymin][j] / maxch;
01563
01564 b = a - nim;
01565 if(a + nim <= 0)
01566 a = 1;
01567
01568 else
01569 a = TMath::Sqrt(a + nim);
01570
01571 b = b / a;
01572 b = TMath::Exp(b);
01573 smx = smx + b;
01574 }
01575 spz = 0,smz = 0;
01576 nip = source[i + 1][ymin][j] / maxch;
01577 nim = source[i + 1][ymin][j + 1] / maxch;
01578 for(l = 1;l <= averWindow; l++){
01579 if(j + l > zmax)
01580 a = source[i][ymin][zmax] / maxch;
01581
01582 else
01583 a = source[i][ymin][j + l] / maxch;
01584
01585 b = a - nip;
01586 if(a + nip <= 0)
01587 a = 1;
01588
01589 else
01590 a = TMath::Sqrt(a + nip);
01591
01592 b = b / a;
01593 b = TMath::Exp(b);
01594 spz = spz + b;
01595 if(j - l + 1 < zmin)
01596 a = source[i][ymin][zmin] / maxch;
01597
01598 else
01599 a = source[i][ymin][j - l + 1] / maxch;
01600
01601 b = a - nim;
01602 if(a + nim <= 0)
01603 a = 1;
01604
01605 else
01606 a = TMath::Sqrt(a + nim);
01607
01608 b = b / a;
01609 b = TMath::Exp(b);
01610 smz = smz + b;
01611 }
01612 a = (spx * working_space[i][ymin][j + 1] + spz * working_space[i + 1][ymin][j]) / (smx + smz);
01613 working_space[i + 1][ymin][j + 1] = a;
01614 nom = nom + a;
01615 }
01616 }
01617 for(i = ymin;i < ymax; i++){
01618 for(j = zmin;j < zmax; j++){
01619 nip = source[xmin][i][j + 1] / maxch;
01620 nim = source[xmin][i + 1][j + 1] / maxch;
01621 spy = 0,smy = 0;
01622 for(l = 1;l <= averWindow; l++){
01623 if(i + l > ymax)
01624 a = source[xmin][ymax][j] / maxch;
01625
01626 else
01627 a = source[xmin][i + l][j] / maxch;
01628
01629 b = a - nip;
01630 if(a + nip <= 0)
01631 a = 1;
01632
01633 else
01634 a = TMath::Sqrt(a + nip);
01635
01636 b = b / a;
01637 b = TMath::Exp(b);
01638 spy = spy + b;
01639 if(i - l + 1 < ymin)
01640 a = source[xmin][ymin][j] / maxch;
01641
01642 else
01643 a = source[xmin][i - l + 1][j] / maxch;
01644
01645 b = a - nim;
01646 if(a + nim <= 0)
01647 a = 1;
01648
01649 else
01650 a = TMath::Sqrt(a + nim);
01651
01652 b = b / a;
01653 b = TMath::Exp(b);
01654 smy = smy + b;
01655 }
01656 spz = 0,smz = 0;
01657 nip = source[xmin][i + 1][j] / maxch;
01658 nim = source[xmin][i + 1][j + 1] / maxch;
01659 for(l = 1;l <= averWindow; l++){
01660 if(j + l > zmax)
01661 a = source[xmin][i][zmax] / maxch;
01662
01663 else
01664 a = source[xmin][i][j + l] / maxch;
01665
01666 b = a - nip;
01667 if(a + nip <= 0)
01668 a = 1;
01669
01670 else
01671 a = TMath::Sqrt(a + nip);
01672
01673 b = b / a;
01674 b = TMath::Exp(b);
01675 spz = spz + b;
01676 if(j - l + 1 < zmin)
01677 a = source[xmin][i][zmin] / maxch;
01678
01679 else
01680 a = source[xmin][i][j - l + 1] / maxch;
01681
01682 b = a - nim;
01683 if(a + nim <= 0)
01684 a = 1;
01685
01686 else
01687 a = TMath::Sqrt(a + nim);
01688
01689 b = b / a;
01690 b = TMath::Exp(b);
01691 smz = smz + b;
01692 }
01693 a = (spy * working_space[xmin][i][j + 1] + spz * working_space[xmin][i + 1][j]) / (smy + smz);
01694 working_space[xmin][i + 1][j + 1] = a;
01695 nom = nom + a;
01696 }
01697 }
01698 for(i = xmin;i < xmax; i++){
01699 for(j = ymin;j < ymax; j++){
01700 for(k = zmin;k < zmax; k++){
01701 nip = source[i][j + 1][k + 1] / maxch;
01702 nim = source[i + 1][j + 1][k + 1] / maxch;
01703 spx = 0,smx = 0;
01704 for(l = 1;l <= averWindow; l++){
01705 if(i + l > xmax)
01706 a = source[xmax][j][k] / maxch;
01707
01708 else
01709 a = source[i + l][j][k] / maxch;
01710
01711 b = a - nip;
01712 if(a + nip <= 0)
01713 a = 1;
01714
01715 else
01716 a = TMath::Sqrt(a + nip);
01717
01718 b = b / a;
01719 b = TMath::Exp(b);
01720 spx = spx + b;
01721 if(i - l + 1 < xmin)
01722 a = source[xmin][j][k] / maxch;
01723
01724 else
01725 a = source[i - l + 1][j][k] / maxch;
01726
01727 b = a - nim;
01728 if(a + nim <= 0)
01729 a = 1;
01730
01731 else
01732 a = TMath::Sqrt(a + nim);
01733
01734 b = b / a;
01735 b = TMath::Exp(b);
01736 smx = smx + b;
01737 }
01738 spy = 0,smy = 0;
01739 nip = source[i + 1][j][k + 1] / maxch;
01740 nim = source[i + 1][j + 1][k + 1] / maxch;
01741 for(l = 1;l <= averWindow; l++){
01742 if(j + l > ymax)
01743 a = source[i][ymax][k] / maxch;
01744
01745 else
01746 a = source[i][j + l][k] / maxch;
01747
01748 b = a - nip;
01749 if(a + nip <= 0)
01750 a = 1;
01751
01752 else
01753 a = TMath::Sqrt(a + nip);
01754
01755 b = b / a;
01756 b = TMath::Exp(b);
01757 spy = spy + b;
01758 if(j - l + 1 < ymin)
01759 a = source[i][ymin][k] / maxch;
01760
01761 else
01762 a = source[i][j - l + 1][k] / maxch;
01763
01764 b = a - nim;
01765 if(a + nim <= 0)
01766 a = 1;
01767
01768 else
01769 a = TMath::Sqrt(a + nim);
01770
01771 b = b / a;
01772 b = TMath::Exp(b);
01773 smy = smy + b;
01774 }
01775 spz = 0,smz = 0;
01776 nip = source[i + 1][j + 1][k] / maxch;
01777 nim = source[i + 1][j + 1][k + 1] / maxch;
01778 for(l = 1;l <= averWindow; l++){
01779 if(j + l > zmax)
01780 a = source[i][j][zmax] / maxch;
01781
01782 else
01783 a = source[i][j][k + l] / maxch;
01784
01785 b = a - nip;
01786 if(a + nip <= 0)
01787 a = 1;
01788
01789 else
01790 a = TMath::Sqrt(a + nip);
01791
01792 b = b / a;
01793 b = TMath::Exp(b);
01794 spz = spz + b;
01795 if(j - l + 1 < ymin)
01796 a = source[i][j][zmin] / maxch;
01797
01798 else
01799 a = source[i][j][k - l + 1] / maxch;
01800
01801 b = a - nim;
01802 if(a + nim <= 0)
01803 a = 1;
01804
01805 else
01806 a = TMath::Sqrt(a + nim);
01807
01808 b = b / a;
01809 b = TMath::Exp(b);
01810 smz = smz+b;
01811 }
01812 a = (spx * working_space[i][j + 1][k + 1] + spy * working_space[i + 1][j][k + 1] + spz * working_space[i + 1][j + 1][k]) / (smx + smy + smz);
01813 working_space[i + 1][j + 1][k + 1] = a;
01814 nom = nom + a;
01815 }
01816 }
01817 }
01818 for(i = xmin;i <= xmax; i++){
01819 for(j = ymin;j <= ymax; j++){
01820 for(k = zmin;k <= zmax; k++){
01821 working_space[i][j][k] = working_space[i][j][k] / nom;
01822 }
01823 }
01824 }
01825 for(i = 0;i < ssizex; i++){
01826 for(j = 0;j < ssizey; j++){
01827 for(k = 0;k < ssizez; k++){
01828 source[i][j][k] = plocha * working_space[i][j][k];
01829 }
01830 }
01831 }
01832 for(i = 0;i < ssizex; i++){
01833 for(j = 0;j < ssizey; j++)
01834 delete[] working_space[i][j];
01835 delete[] working_space[i];
01836 }
01837 delete[] working_space;
01838 return 0;
01839 }
01840
01841
01842 const char *TSpectrum3::Deconvolution(float ***source, const float ***resp,
01843 Int_t ssizex, Int_t ssizey, Int_t ssizez,
01844 Int_t numberIterations,
01845 Int_t numberRepetitions,
01846 Double_t boost)
01847 {
01848
01849
01850
01851
01852
01853
01854
01855
01856
01857
01858
01859
01860
01861
01862
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892
01893
01894
01895
01896
01897
01898
01899
01900
01901
01902
01903
01904
01905
01906
01907
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926
01927
01928
01929
01930
01931
01932
01933
01934
01935
01936
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003
02004
02005
02006
02007
02008
02009
02010
02011
02012
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041
02042
02043
02044
02045
02046
02047
02048
02049
02050
02051
02052
02053
02054
02055
02056
02057
02058
02059
02060
02061
02062
02063
02064
02065
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076
02077
02078
02079
02080
02081
02082
02083
02084
02085
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148
02149
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163
02164
02165
02166
02167
02168
02169
02170
02171
02172
02173
02174
02175
02176
02177
02178
02179
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189
02190
02191
02192
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209
02210
02211
02212
02213
02214
02215
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235
02236
02237
02238
02239
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251
02252
02253
02254
02255
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265
02266
02267
02268
02269
02270
02271
02272
02273
02274
02275
02276
02277
02278
02279
02280
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298
02299
02300
02301
02302
02303
02304
02305
02306
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316
02317
02318
02319
02320
02321
02322
02323
02324
02325
02326
02327
02328
02329
02330
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350 int i, j, k, lhx, lhy, lhz, i1, i2, i3, j1, j2, j3, k1, k2, k3, lindex, i1min, i1max, i2min, i2max, i3min, i3max, j1min, j1max, j2min, j2max, j3min, j3max, positx = 0, posity = 0, positz = 0, repet;
02351 double lda, ldb, ldc, area, maximum = 0;
02352 if (ssizex <= 0 || ssizey <= 0 || ssizez <= 0)
02353 return "Wrong parameters";
02354 if (numberIterations <= 0)
02355 return "Number of iterations must be positive";
02356 if (numberRepetitions <= 0)
02357 return "Number of repetitions must be positive";
02358 double ***working_space=new double** [ssizex];
02359 for(i=0;i<ssizex;i++){
02360 working_space[i]=new double* [ssizey];
02361 for(j=0;j<ssizey;j++)
02362 working_space[i][j]=new double [5*ssizez];
02363 }
02364 area = 0;
02365 lhx = -1, lhy = -1, lhz = -1;
02366 for (i = 0; i < ssizex; i++) {
02367 for (j = 0; j < ssizey; j++) {
02368 for (k = 0; k < ssizez; k++) {
02369 lda = resp[i][j][k];
02370 if (lda != 0) {
02371 if ((i + 1) > lhx)
02372 lhx = i + 1;
02373 if ((j + 1) > lhy)
02374 lhy = j + 1;
02375 if ((k + 1) > lhz)
02376 lhz = k + 1;
02377 }
02378 working_space[i][j][k] = lda;
02379 area = area + lda;
02380 if (lda > maximum) {
02381 maximum = lda;
02382 positx = i, posity = j, positz = k;
02383 }
02384 }
02385 }
02386 }
02387 if (lhx == -1 || lhy == -1 || lhz == -1)
02388 return ("Zero response data");
02389
02390
02391 for (i3 = 0; i3 < ssizez; i3++) {
02392 for (i2 = 0; i2 < ssizey; i2++) {
02393 for (i1 = 0; i1 < ssizex; i1++) {
02394 ldc = 0;
02395 for (j3 = 0; j3 <= (lhz - 1); j3++) {
02396 for (j2 = 0; j2 <= (lhy - 1); j2++) {
02397 for (j1 = 0; j1 <= (lhx - 1); j1++) {
02398 k3 = i3 + j3, k2 = i2 + j2, k1 = i1 + j1;
02399 if (k3 >= 0 && k3 < ssizez && k2 >= 0 && k2 < ssizey && k1 >= 0 && k1 < ssizex) {
02400 lda = working_space[j1][j2][j3];
02401 ldb = source[k1][k2][k3];
02402 ldc = ldc + lda * ldb;
02403 }
02404 }
02405 }
02406 }
02407 working_space[i1][i2][i3 + ssizez] = ldc;
02408 }
02409 }
02410 }
02411
02412
02413 i1min = -(lhx - 1), i1max = lhx - 1;
02414 i2min = -(lhy - 1), i2max = lhy - 1;
02415 i3min = -(lhz - 1), i3max = lhz - 1;
02416 for (i3 = i3min; i3 <= i3max; i3++) {
02417 for (i2 = i2min; i2 <= i2max; i2++) {
02418 for (i1 = i1min; i1 <= i1max; i1++) {
02419 ldc = 0;
02420 j3min = -i3;
02421 if (j3min < 0)
02422 j3min = 0;
02423 j3max = lhz - 1 - i3;
02424 if (j3max > lhz - 1)
02425 j3max = lhz - 1;
02426 for (j3 = j3min; j3 <= j3max; j3++) {
02427 j2min = -i2;
02428 if (j2min < 0)
02429 j2min = 0;
02430 j2max = lhy - 1 - i2;
02431 if (j2max > lhy - 1)
02432 j2max = lhy - 1;
02433 for (j2 = j2min; j2 <= j2max; j2++) {
02434 j1min = -i1;
02435 if (j1min < 0)
02436 j1min = 0;
02437 j1max = lhx - 1 - i1;
02438 if (j1max > lhx - 1)
02439 j1max = lhx - 1;
02440 for (j1 = j1min; j1 <= j1max; j1++) {
02441 lda = working_space[j1][j2][j3];
02442 if (i1 + j1 < ssizex && i2 + j2 < ssizey)
02443 ldb = working_space[i1 + j1][i2 + j2][i3 + j3];
02444 else
02445 ldb = 0;
02446 ldc = ldc + lda * ldb;
02447 }
02448 }
02449 }
02450 working_space[i1 - i1min][i2 - i2min][i3 - i3min + 2 * ssizez ] = ldc;
02451 }
02452 }
02453 }
02454
02455
02456 for (i3 = 0; i3 < ssizez; i3++) {
02457 for (i2 = 0; i2 < ssizey; i2++) {
02458 for (i1 = 0; i1 < ssizex; i1++) {
02459 working_space[i1][i2][i3 + 3 * ssizez] = 1;
02460 working_space[i1][i2][i3 + 4 * ssizez] = 0;
02461 }
02462 }
02463 }
02464
02465
02466 for (repet = 0; repet < numberRepetitions; repet++) {
02467 if (repet != 0) {
02468 for (i = 0; i < ssizex; i++) {
02469 for (j = 0; j < ssizey; j++) {
02470 for (k = 0; k < ssizez; k++) {
02471 working_space[i][j][k + 3 * ssizez] = TMath::Power(working_space[i][j][k + 3 * ssizez],boost);
02472 }
02473 }
02474 }
02475 }
02476 for (lindex = 0; lindex < numberIterations; lindex++) {
02477 for (i3 = 0; i3 < ssizez; i3++) {
02478 for (i2 = 0; i2 < ssizey; i2++) {
02479 for (i1 = 0; i1 < ssizex; i1++) {
02480 ldb = 0;
02481 j3min = i3;
02482 if (j3min > lhz - 1)
02483 j3min = lhz - 1;
02484 j3min = -j3min;
02485 j3max = ssizez - i3 - 1;
02486 if (j3max > lhz - 1)
02487 j3max = lhz - 1;
02488 j2min = i2;
02489 if (j2min > lhy - 1)
02490 j2min = lhy - 1;
02491 j2min = -j2min;
02492 j2max = ssizey - i2 - 1;
02493 if (j2max > lhy - 1)
02494 j2max = lhy - 1;
02495 j1min = i1;
02496 if (j1min > lhx - 1)
02497 j1min = lhx - 1;
02498 j1min = -j1min;
02499 j1max = ssizex - i1 - 1;
02500 if (j1max > lhx - 1)
02501 j1max = lhx - 1;
02502 for (j3 = j3min; j3 <= j3max; j3++) {
02503 for (j2 = j2min; j2 <= j2max; j2++) {
02504 for (j1 = j1min; j1 <= j1max; j1++) {
02505 ldc = working_space[j1 - i1min][j2 - i2min][j3 - i3min + 2 * ssizez];
02506 lda = working_space[i1 + j1][i2 + j2][i3 + j3 + 3 * ssizez];
02507 ldb = ldb + lda * ldc;
02508 }
02509 }
02510 }
02511 lda = working_space[i1][i2][i3 + 3 * ssizez];
02512 ldc = working_space[i1][i2][i3 + 1 * ssizez];
02513 if (ldc * lda != 0 && ldb != 0) {
02514 lda = lda * ldc / ldb;
02515 }
02516
02517 else
02518 lda = 0;
02519 working_space[i1][i2][i3 + 4 * ssizez] = lda;
02520 }
02521 }
02522 }
02523 for (i3 = 0; i3 < ssizez; i3++) {
02524 for (i2 = 0; i2 < ssizey; i2++) {
02525 for (i1 = 0; i1 < ssizex; i1++)
02526 working_space[i1][i2][i3 + 3 * ssizez] = working_space[i1][i2][i3 + 4 * ssizez];
02527 }
02528 }
02529 }
02530 }
02531 for (i = 0; i < ssizex; i++) {
02532 for (j = 0; j < ssizey; j++){
02533 for (k = 0; k < ssizez; k++)
02534 source[(i + positx) % ssizex][(j + posity) % ssizey][(k + positz) % ssizez] = area * working_space[i][j][k + 3 * ssizez];
02535 }
02536 }
02537 delete [] working_space;
02538 return 0;
02539 }
02540
02541
02542 Int_t TSpectrum3::SearchHighRes(const float ***source,float ***dest, Int_t ssizex, Int_t ssizey, Int_t ssizez,
02543 Double_t sigma, Double_t threshold,
02544 Bool_t backgroundRemove,Int_t deconIterations,
02545 Bool_t markov, Int_t averWindow)
02546
02547 {
02548
02549
02550
02551
02552
02553
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566
02567
02568
02569
02570
02571
02572
02573
02574
02575
02576
02577
02578
02579
02580
02581
02582
02583
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599
02600
02601
02602
02603
02604
02605
02606
02607
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617
02618
02619
02620
02621
02622
02623
02624
02625
02626
02627
02628
02629
02630
02631
02632
02633
02634
02635
02636
02637
02638
02639
02640
02641
02642
02643
02644
02645
02646
02647
02648
02649
02650
02651
02652
02653
02654
02655
02656
02657
02658
02659
02660
02661
02662
02663
02664
02665
02666
02667
02668
02669
02670
02671
02672
02673
02674
02675
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02686
02687
02688
02689
02690
02691
02692
02693
02694
02695
02696
02697
02698
02699
02700
02701
02702
02703
02704
02705
02706
02707
02708
02709
02710
02711
02712
02713
02714
02715
02716
02717
02718
02719
02720
02721
02722
02723
02724
02725
02726
02727
02728
02729
02730
02731
02732
02733
02734
02735
02736
02737
02738
02739
02740
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750
02751
02752
02753
02754
02755
02756
02757
02758
02759
02760
02761
02762
02763
02764
02765
02766
02767
02768
02769
02770
02771
02772
02773
02774
02775
02776
02777
02778
02779
02780
02781
02782
02783
02784
02785
02786
02787
02788
02789
02790
02791
02792
02793
02794
02795
02796
02797
02798
02799
02800
02801
02802
02803
02804
02805
02806
02807
02808
02809
02810
02811
02812
02813
02814
02815
02816
02817
02818
02819
02820
02821
02822
02823
02824
02825
02826
02827
02828
02829
02830
02831
02832
02833
02834
02835
02836
02837
02838
02839
02840
02841
02842
02843
02844
02845
02846
02847
02848
02849
02850
02851
02852
02853
02854
02855
02856
02857
02858
02859
02860
02861
02862
02863
02864
02865
02866
02867
02868
02869
02870
02871
02872
02873
02874
02875
02876
02877
02878
02879
02880
02881
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891 int number_of_iterations = (int)(4 * sigma + 0.5);
02892 int k,lindex;
02893 double lda,ldb,ldc,area,maximum;
02894 int xmin,xmax,l,peak_index = 0,sizex_ext=ssizex + 4 * number_of_iterations,sizey_ext = ssizey + 4 * number_of_iterations,sizez_ext = ssizez + 4 * number_of_iterations,shift = 2 * number_of_iterations;
02895 int ymin,ymax,zmin,zmax,i,j;
02896 double a,b,maxch,plocha = 0,plocha_markov = 0;
02897 double nom,nip,nim,sp,sm,spx,spy,smx,smy,spz,smz;
02898 double p1,p2,p3,p4,p5,p6,p7,p8,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,r1,r2,r3,r4,r5,r6;
02899 int x,y,z;
02900 double pocet_sigma = 5;
02901 int lhx,lhy,lhz,i1,i2,i3,j1,j2,j3,k1,k2,k3,i1min,i1max,i2min,i2max,i3min,i3max,j1min,j1max,j2min,j2max,j3min,j3max,positx,posity,positz;
02902 if(sigma < 1){
02903 Error("SearchHighRes", "Invalid sigma, must be greater than or equal to 1");
02904 return 0;
02905 }
02906
02907 if(threshold<=0||threshold>=100){
02908 Error("SearchHighRes", "Invalid threshold, must be positive and less than 100");
02909 return 0;
02910 }
02911
02912 j = (int)(pocet_sigma*sigma+0.5);
02913 if (j >= PEAK_WINDOW / 2) {
02914 Error("SearchHighRes", "Too large sigma");
02915 return 0;
02916 }
02917
02918 if (markov == true) {
02919 if (averWindow <= 0) {
02920 Error("SearchHighRes", "Averanging window must be positive");
02921 return 0;
02922 }
02923 }
02924
02925 if(backgroundRemove == true){
02926 if(sizex_ext < 2 * number_of_iterations + 1 || sizey_ext < 2 * number_of_iterations + 1 || sizez_ext < 2 * number_of_iterations + 1){
02927 Error("SearchHighRes", "Too large clipping window");
02928 return 0;
02929 }
02930 }
02931
02932 i = (int)(4 * sigma + 0.5);
02933 i = 4 * i;
02934 double ***working_space = new double** [ssizex + i];
02935 for(j = 0;j < ssizex + i; j++){
02936 working_space[j] = new double* [ssizey + i];
02937 for(k = 0;k < ssizey + i; k++)
02938 working_space[j][k] = new double [5 * (ssizez + i)];
02939 }
02940 for(k = 0;k < sizez_ext; k++){
02941 for(j = 0;j < sizey_ext; j++){
02942 for(i = 0;i < sizex_ext; i++){
02943 if(i < shift){
02944 if(j < shift){
02945 if(k < shift)
02946 working_space[i][j][k + sizez_ext] = source[0][0][0];
02947
02948 else if(k >= ssizez + shift)
02949 working_space[i][j][k + sizez_ext] = source[0][0][ssizez - 1];
02950
02951 else
02952 working_space[i][j][k + sizez_ext] = source[0][0][k - shift];
02953 }
02954
02955 else if(j >= ssizey + shift){
02956 if(k < shift)
02957 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][0];
02958
02959 else if(k >= ssizez + shift)
02960 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][ssizez - 1];
02961
02962 else
02963 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][k - shift];
02964 }
02965
02966 else{
02967 if(k < shift)
02968 working_space[i][j][k + sizez_ext] = source[0][j - shift][0];
02969
02970 else if(k >= ssizez + shift)
02971 working_space[i][j][k + sizez_ext] = source[0][j - shift][ssizez - 1];
02972
02973 else
02974 working_space[i][j][k + sizez_ext] = source[0][j - shift][k - shift];
02975 }
02976 }
02977
02978 else if(i >= ssizex + shift){
02979 if(j < shift){
02980 if(k < shift)
02981 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][0];
02982
02983 else if(k >= ssizez + shift)
02984 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][ssizez - 1];
02985
02986 else
02987 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][k - shift];
02988 }
02989
02990 else if(j >= ssizey + shift){
02991 if(k < shift)
02992 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][0];
02993
02994 else if(k >= ssizez + shift)
02995 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][ssizez - 1];
02996
02997 else
02998 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][k - shift];
02999 }
03000
03001 else{
03002 if(k < shift)
03003 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][0];
03004
03005 else if(k >= ssizez + shift)
03006 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][ssizez - 1];
03007
03008 else
03009 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][k - shift];
03010 }
03011 }
03012
03013 else{
03014 if(j < shift){
03015 if(k < shift)
03016 working_space[i][j][k + sizez_ext] = source[i - shift][0][0];
03017
03018 else if(k >= ssizez + shift)
03019 working_space[i][j][k + sizez_ext] = source[i - shift][0][ssizez - 1];
03020
03021 else
03022 working_space[i][j][k + sizez_ext] = source[i - shift][0][k - shift];
03023 }
03024
03025 else if(j >= ssizey + shift){
03026 if(k < shift)
03027 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][0];
03028
03029 else if(k >= ssizez + shift)
03030 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][ssizez - 1];
03031
03032 else
03033 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][k - shift];
03034 }
03035
03036 else{
03037 if(k < shift)
03038 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][0];
03039
03040 else if(k >= ssizez + shift)
03041 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][ssizez - 1];
03042
03043 else
03044 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][k - shift];
03045 }
03046 }
03047 }
03048 }
03049 }
03050 if(backgroundRemove == true){
03051 for(i = 1;i <= number_of_iterations; i++){
03052 for(z = i;z < sizez_ext - i; z++){
03053 for(y = i;y < sizey_ext - i; y++){
03054 for(x = i;x < sizex_ext - i; x++){
03055 a = working_space[x][y][z + sizez_ext];
03056 p1 = working_space[x + i][y + i][z - i + sizez_ext];
03057 p2 = working_space[x - i][y + i][z - i + sizez_ext];
03058 p3 = working_space[x + i][y - i][z - i + sizez_ext];
03059 p4 = working_space[x - i][y - i][z - i + sizez_ext];
03060 p5 = working_space[x + i][y + i][z + i + sizez_ext];
03061 p6 = working_space[x - i][y + i][z + i + sizez_ext];
03062 p7 = working_space[x + i][y - i][z + i + sizez_ext];
03063 p8 = working_space[x - i][y - i][z + i + sizez_ext];
03064 s1 = working_space[x + i][y ][z - i + sizez_ext];
03065 s2 = working_space[x ][y + i][z - i + sizez_ext];
03066 s3 = working_space[x - i][y ][z - i + sizez_ext];
03067 s4 = working_space[x ][y - i][z - i + sizez_ext];
03068 s5 = working_space[x + i][y ][z + i + sizez_ext];
03069 s6 = working_space[x ][y + i][z + i + sizez_ext];
03070 s7 = working_space[x - i][y ][z + i + sizez_ext];
03071 s8 = working_space[x ][y - i][z + i + sizez_ext];
03072 s9 = working_space[x - i][y + i][z + sizez_ext];
03073 s10 = working_space[x - i][y - i][z +sizez_ext];
03074 s11 = working_space[x + i][y + i][z +sizez_ext];
03075 s12 = working_space[x + i][y - i][z +sizez_ext];
03076 r1 = working_space[x ][y ][z - i + sizez_ext];
03077 r2 = working_space[x ][y ][z + i + sizez_ext];
03078 r3 = working_space[x - i][y ][z + sizez_ext];
03079 r4 = working_space[x + i][y ][z + sizez_ext];
03080 r5 = working_space[x ][y + i][z + sizez_ext];
03081 r6 = working_space[x ][y - i][z + sizez_ext];
03082 b = (p1 + p3) / 2.0;
03083 if(b > s1)
03084 s1 = b;
03085
03086 b = (p1 + p2) / 2.0;
03087 if(b > s2)
03088 s2 = b;
03089
03090 b = (p2 + p4) / 2.0;
03091 if(b > s3)
03092 s3 = b;
03093
03094 b = (p3 + p4) / 2.0;
03095 if(b > s4)
03096 s4 = b;
03097
03098 b = (p5 + p7) / 2.0;
03099 if(b > s5)
03100 s5 = b;
03101
03102 b = (p5 + p6) / 2.0;
03103 if(b > s6)
03104 s6 = b;
03105
03106 b = (p6 + p8) / 2.0;
03107 if(b > s7)
03108 s7 = b;
03109
03110 b = (p7 + p8) / 2.0;
03111 if(b > s8)
03112 s8 = b;
03113
03114 b = (p2 + p6) / 2.0;
03115 if(b > s9)
03116 s9 = b;
03117
03118 b = (p4 + p8) / 2.0;
03119 if(b > s10)
03120 s10 = b;
03121
03122 b = (p1 + p5) / 2.0;
03123 if(b > s11)
03124 s11 = b;
03125
03126 b = (p3 + p7) / 2.0;
03127 if(b > s12)
03128 s12 = b;
03129
03130 s1 = s1 - (p1 + p3) / 2.0;
03131 s2 = s2 - (p1 + p2) / 2.0;
03132 s3 = s3 - (p2 + p4) / 2.0;
03133 s4 = s4 - (p3 + p4) / 2.0;
03134 s5 = s5 - (p5 + p7) / 2.0;
03135 s6 = s6 - (p5 + p6) / 2.0;
03136 s7 = s7 - (p6 + p8) / 2.0;
03137 s8 = s8 - (p7 + p8) / 2.0;
03138 s9 = s9 - (p2 + p6) / 2.0;
03139 s10 = s10 - (p4 + p8) / 2.0;
03140 s11 = s11 - (p1 + p5) / 2.0;
03141 s12 = s12 - (p3 + p7) / 2.0;
03142 b = (s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
03143 if(b > r1)
03144 r1 = b;
03145
03146 b = (s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0;
03147 if(b > r2)
03148 r2 = b;
03149
03150 b = (s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0;
03151 if(b > r3)
03152 r3 = b;
03153
03154 b = (s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0;
03155 if(b > r4)
03156 r4 = b;
03157
03158 b = (s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0;
03159 if(b > r5)
03160 r5 = b;
03161
03162 b = (s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0;
03163 if(b > r6)
03164 r6 = b;
03165
03166 r1 = r1 - ((s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0);
03167 r2 = r2 - ((s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0);
03168 r3 = r3 - ((s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0);
03169 r4 = r4 - ((s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0);
03170 r5 = r5 - ((s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0);
03171 r6 = r6 - ((s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0);
03172 b = (r1 + r2) / 2.0 + (r3 + r4) / 2.0 + (r5 + r6) / 2.0 + (s1 + s3 + s5 + s7) / 4.0 + (s2 + s4 + s6 + s8) / 4.0 + (s9 + s10 + s11 + s12) / 4.0 + (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8.0;
03173 if(b < a)
03174 a = b;
03175
03176 working_space[x][y][z] = a;
03177 }
03178 }
03179 }
03180 for(z = i;z < sizez_ext - i; z++){
03181 for(y = i;y < sizey_ext - i; y++){
03182 for(x = i;x < sizex_ext - i; x++){
03183 working_space[x][y][z + sizez_ext] = working_space[x][y][z];
03184 }
03185 }
03186 }
03187 }
03188 for(k = 0;k < sizez_ext; k++){
03189 for(j = 0;j < sizey_ext; j++){
03190 for(i = 0;i < sizex_ext; i++){
03191 if(i < shift){
03192 if(j < shift){
03193 if(k < shift)
03194 working_space[i][j][k + sizez_ext] = source[0][0][0] - working_space[i][j][k + sizez_ext];
03195
03196 else if(k >= ssizez + shift)
03197 working_space[i][j][k + sizez_ext] = source[0][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
03198
03199 else
03200 working_space[i][j][k + sizez_ext] = source[0][0][k - shift] - working_space[i][j][k + sizez_ext];
03201 }
03202
03203 else if(j >= ssizey + shift){
03204 if(k < shift)
03205 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
03206
03207 else if(k >= ssizez + shift)
03208 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
03209
03210 else
03211 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
03212 }
03213
03214 else{
03215 if(k < shift)
03216 working_space[i][j][k + sizez_ext] = source[0][j - shift][0] - working_space[i][j][k + sizez_ext];
03217
03218 else if(k >= ssizez + shift)
03219 working_space[i][j][k + sizez_ext] = source[0][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
03220
03221 else
03222 working_space[i][j][k + sizez_ext] = source[0][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
03223 }
03224 }
03225
03226 else if(i >= ssizex + shift){
03227 if(j < shift){
03228 if(k < shift)
03229 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][0] - working_space[i][j][k + sizez_ext];
03230
03231 else if(k >= ssizez + shift)
03232 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
03233
03234 else
03235 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][k - shift] - working_space[i][j][k + sizez_ext];
03236 }
03237
03238 else if(j >= ssizey + shift){
03239 if(k < shift)
03240 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
03241
03242 else if(k >= ssizez + shift)
03243 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
03244
03245 else
03246 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
03247 }
03248
03249 else{
03250 if(k < shift)
03251 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][0] - working_space[i][j][k + sizez_ext];
03252
03253 else if(k >= ssizez + shift)
03254 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
03255
03256 else
03257 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
03258 }
03259 }
03260
03261 else{
03262 if(j < shift){
03263 if(k < shift)
03264 working_space[i][j][k + sizez_ext] = source[i - shift][0][0] - working_space[i][j][k + sizez_ext];
03265
03266 else if(k >= ssizez + shift)
03267 working_space[i][j][k + sizez_ext] = source[i - shift][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
03268
03269 else
03270 working_space[i][j][k + sizez_ext] = source[i - shift][0][k - shift] - working_space[i][j][k + sizez_ext];
03271 }
03272
03273 else if(j >= ssizey + shift){
03274 if(k < shift)
03275 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
03276
03277 else if(k >= ssizez + shift)
03278 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
03279
03280 else
03281 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
03282 }
03283
03284 else{
03285 if(k < shift)
03286 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][0] - working_space[i][j][k + sizez_ext];
03287
03288 else if(k >= ssizez + shift)
03289 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
03290
03291 else
03292 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
03293 }
03294 }
03295 }
03296 }
03297 }
03298 }
03299
03300 if(markov == true){
03301 for(i = 0;i < sizex_ext; i++){
03302 for(j = 0;j < sizey_ext; j++){
03303 for(k = 0;k < sizez_ext; k++){
03304 working_space[i][j][k + 2 * sizez_ext] = working_space[i][j][sizez_ext + k];
03305 plocha_markov = plocha_markov + working_space[i][j][sizez_ext + k];
03306 }
03307 }
03308 }
03309 xmin = 0;
03310 xmax = sizex_ext - 1;
03311 ymin = 0;
03312 ymax = sizey_ext - 1;
03313 zmin = 0;
03314 zmax = sizez_ext - 1;
03315 for(i = 0,maxch = 0;i < sizex_ext; i++){
03316 for(j = 0;j < sizey_ext;j++){
03317 for(k = 0;k < sizez_ext;k++){
03318 working_space[i][j][k] = 0;
03319 if(maxch < working_space[i][j][k + 2 * sizez_ext])
03320 maxch = working_space[i][j][k + 2 * sizez_ext];
03321
03322 plocha += working_space[i][j][k + 2 * sizez_ext];
03323 }
03324 }
03325 }
03326 if(maxch == 0) {
03327 delete [] working_space;
03328 return 0;
03329 }
03330 nom = 0;
03331 working_space[xmin][ymin][zmin] = 1;
03332 for(i = xmin;i < xmax; i++){
03333 nip = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
03334 nim = working_space[i + 1][ymin][zmin + 2 * sizez_ext] / maxch;
03335 sp = 0,sm = 0;
03336 for(l = 1;l <= averWindow; l++){
03337 if((i + l) > xmax)
03338 a = working_space[xmax][ymin][zmin + 2 * sizez_ext] / maxch;
03339
03340 else
03341 a = working_space[i + l][ymin][zmin + 2 * sizez_ext] / maxch;
03342
03343 b = a - nip;
03344 if(a + nip <= 0)
03345 a = 1;
03346
03347 else
03348 a = TMath::Sqrt(a + nip);
03349
03350 b = b / a;
03351 b = TMath::Exp(b);
03352 sp = sp + b;
03353 if(i - l + 1 < xmin)
03354 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
03355
03356 else
03357 a = working_space[i - l + 1][ymin][zmin + 2 * sizez_ext] / maxch;
03358
03359 b = a - nim;
03360 if(a + nim <= 0)
03361 a = 1;
03362
03363 else
03364 a = TMath::Sqrt(a + nim);
03365
03366 b = b / a;
03367 b = TMath::Exp(b);
03368 sm = sm + b;
03369 }
03370 a = sp / sm;
03371 a = working_space[i + 1][ymin][zmin] = a * working_space[i][ymin][zmin];
03372 nom = nom + a;
03373 }
03374 for(i = ymin;i < ymax; i++){
03375 nip = working_space[xmin][i][zmin + 2 * sizez_ext] / maxch;
03376 nim = working_space[xmin][i + 1][zmin + 2 * sizez_ext] / maxch;
03377 sp = 0,sm = 0;
03378 for(l = 1;l <= averWindow; l++){
03379 if((i + l) > ymax)
03380 a = working_space[xmin][ymax][zmin + 2 * sizez_ext] / maxch;
03381
03382 else
03383 a = working_space[xmin][i + l][zmin + 2 * sizez_ext] / maxch;
03384
03385 b = a - nip;
03386 if(a + nip <= 0)
03387 a = 1;
03388
03389 else
03390 a = TMath::Sqrt(a + nip);
03391
03392 b = b / a;
03393 b = TMath::Exp(b);
03394 sp = sp + b;
03395 if(i - l + 1 < ymin)
03396 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
03397
03398 else
03399 a = working_space[xmin][i - l + 1][zmin + 2 * sizez_ext] / maxch;
03400
03401 b = a - nim;
03402 if(a + nim <= 0)
03403 a = 1;
03404
03405 else
03406 a = TMath::Sqrt(a + nim);
03407
03408 b = b / a;
03409 b = TMath::Exp(b);
03410 sm = sm + b;
03411 }
03412 a = sp / sm;
03413 a = working_space[xmin][i + 1][zmin] = a * working_space[xmin][i][zmin];
03414 nom = nom + a;
03415 }
03416 for(i = zmin;i < zmax;i++){
03417 nip = working_space[xmin][ymin][i + 2 * sizez_ext] / maxch;
03418 nim = working_space[xmin][ymin][i + 1 + 2 * sizez_ext] / maxch;
03419 sp = 0,sm = 0;
03420 for(l = 1;l <= averWindow;l++){
03421 if((i + l) > zmax)
03422 a = working_space[xmin][ymin][zmax + 2 * sizez_ext] / maxch;
03423
03424 else
03425 a = working_space[xmin][ymin][i + l + 2 * sizez_ext] / maxch;
03426
03427 b = a - nip;
03428 if(a + nip <= 0)
03429 a = 1;
03430
03431 else
03432 a = TMath::Sqrt(a + nip);
03433
03434 b = b / a;
03435 b = TMath::Exp(b);
03436 sp = sp + b;
03437 if(i - l + 1 < zmin)
03438 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
03439
03440 else
03441 a = working_space[xmin][ymin][i - l + 1 + 2 * sizez_ext] / maxch;
03442
03443 b = a - nim;
03444 if(a + nim <= 0)
03445 a = 1;
03446
03447 else
03448 a = TMath::Sqrt(a + nim);
03449
03450 b = b / a;
03451 b = TMath::Exp(b);
03452 sm = sm + b;
03453 }
03454 a = sp / sm;
03455 a = working_space[xmin][ymin][i + 1] = a * working_space[xmin][ymin][i];
03456 nom = nom + a;
03457 }
03458 for(i = xmin;i < xmax; i++){
03459 for(j = ymin;j < ymax; j++){
03460 nip = working_space[i][j + 1][zmin + 2 * sizez_ext] / maxch;
03461 nim = working_space[i + 1][j + 1][zmin + 2 * sizez_ext] / maxch;
03462 spx = 0,smx = 0;
03463 for(l = 1;l <= averWindow; l++){
03464 if(i + l > xmax)
03465 a = working_space[xmax][j][zmin + 2 * sizez_ext] / maxch;
03466
03467 else
03468 a = working_space[i + l][j][zmin + 2 * sizez_ext] / maxch;
03469
03470 b = a - nip;
03471 if(a + nip <= 0)
03472 a = 1;
03473
03474 else
03475 a = TMath::Sqrt(a + nip);
03476
03477 b = b / a;
03478 b = TMath::Exp(b);
03479 spx = spx + b;
03480 if(i - l + 1 < xmin)
03481 a = working_space[xmin][j][zmin + 2 * sizez_ext] / maxch;
03482
03483 else
03484 a = working_space[i - l + 1][j][zmin + 2 * sizez_ext] / maxch;
03485
03486 b = a - nim;
03487 if(a + nim <= 0)
03488 a = 1;
03489
03490 else
03491 a = TMath::Sqrt(a + nim);
03492
03493 b = b / a;
03494 b = TMath::Exp(b);
03495 smx = smx + b;
03496 }
03497 spy = 0,smy = 0;
03498 nip = working_space[i + 1][j][zmin + 2 * sizez_ext] / maxch;
03499 nim = working_space[i + 1][j + 1][zmin + 2 * sizez_ext] / maxch;
03500 for(l = 1;l <= averWindow; l++){
03501 if(j + l > ymax)
03502 a = working_space[i][ymax][zmin + 2 * sizez_ext] / maxch;
03503
03504 else
03505 a = working_space[i][j + l][zmin + 2 * sizez_ext] / maxch;
03506
03507 b = a - nip;
03508 if(a + nip <= 0)
03509 a = 1;
03510
03511 else
03512 a = TMath::Sqrt(a + nip);
03513
03514 b = b / a;
03515 b = TMath::Exp(b);
03516 spy = spy + b;
03517 if(j - l + 1 < ymin)
03518 a = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
03519
03520 else
03521 a = working_space[i][j - l + 1][zmin + 2 * sizez_ext] / maxch;
03522
03523 b = a - nim;
03524 if(a + nim <= 0)
03525 a = 1;
03526
03527 else
03528 a = TMath::Sqrt(a + nim);
03529
03530 b = b / a;
03531 b = TMath::Exp(b);
03532 smy = smy + b;
03533 }
03534 a = (spx * working_space[i][j + 1][zmin] + spy * working_space[i + 1][j][zmin]) / (smx + smy);
03535 working_space[i + 1][j + 1][zmin] = a;
03536 nom = nom + a;
03537 }
03538 }
03539 for(i = xmin;i < xmax;i++){
03540 for(j = zmin;j < zmax;j++){
03541 nip = working_space[i][ymin][j + 1 + 2 * sizez_ext] / maxch;
03542 nim = working_space[i + 1][ymin][j + 1 + 2 * sizez_ext] / maxch;
03543 spx = 0,smx = 0;
03544 for(l = 1;l <= averWindow; l++){
03545 if(i + l > xmax)
03546 a = working_space[xmax][ymin][j + 2 * sizez_ext] / maxch;
03547
03548 else
03549 a = working_space[i + l][ymin][j + 2 * sizez_ext] / maxch;
03550
03551 b = a - nip;
03552 if(a + nip <= 0)
03553 a = 1;
03554
03555 else
03556 a = TMath::Sqrt(a + nip);
03557
03558 b = b / a;
03559 b = TMath::Exp(b);
03560 spx = spx + b;
03561 if(i - l + 1 < xmin)
03562 a = working_space[xmin][ymin][j + 2 * sizez_ext] / maxch;
03563
03564 else
03565 a = working_space[i - l + 1][ymin][j + 2 * sizez_ext] / maxch;
03566
03567 b = a - nim;
03568 if(a + nim <= 0)
03569 a = 1;
03570
03571 else
03572 a = TMath::Sqrt(a + nim);
03573
03574 b = b / a;
03575 b = TMath::Exp(b);
03576 smx = smx + b;
03577 }
03578 spz = 0,smz = 0;
03579 nip = working_space[i + 1][ymin][j + 2 * sizez_ext] / maxch;
03580 nim = working_space[i + 1][ymin][j + 1 + 2 * sizez_ext] / maxch;
03581 for(l = 1;l <= averWindow; l++){
03582 if(j + l > zmax)
03583 a = working_space[i][ymin][zmax + 2 * sizez_ext] / maxch;
03584
03585 else
03586 a = working_space[i][ymin][j + l + 2 * sizez_ext] / maxch;
03587
03588 b = a - nip;
03589 if(a + nip <= 0)
03590 a = 1;
03591
03592 else
03593 a = TMath::Sqrt(a + nip);
03594
03595 b = b / a;
03596 b = TMath::Exp(b);
03597 spz = spz + b;
03598 if(j - l + 1 < zmin)
03599 a = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
03600
03601 else
03602 a = working_space[i][ymin][j - l + 1 + 2 * sizez_ext] / maxch;
03603
03604 b = a - nim;
03605 if(a + nim <= 0)
03606 a = 1;
03607
03608 else
03609 a = TMath::Sqrt(a + nim);
03610
03611 b = b / a;
03612 b = TMath::Exp(b);
03613 smz = smz + b;
03614 }
03615 a = (spx * working_space[i][ymin][j + 1] + spz * working_space[i + 1][ymin][j]) / (smx + smz);
03616 working_space[i + 1][ymin][j + 1] = a;
03617 nom = nom + a;
03618 }
03619 }
03620 for(i = ymin;i < ymax;i++){
03621 for(j = zmin;j < zmax;j++){
03622 nip = working_space[xmin][i][j + 1 + 2 * sizez_ext] / maxch;
03623 nim = working_space[xmin][i + 1][j + 1 + 2 * sizez_ext] / maxch;
03624 spy = 0,smy = 0;
03625 for(l = 1;l <= averWindow; l++){
03626 if(i + l > ymax)
03627 a = working_space[xmin][ymax][j + 2 * sizez_ext] / maxch;
03628
03629 else
03630 a = working_space[xmin][i + l][j + 2 * sizez_ext] / maxch;
03631
03632 b = a - nip;
03633 if(a + nip <= 0)
03634 a = 1;
03635
03636 else
03637 a = TMath::Sqrt(a + nip);
03638
03639 b = b / a;
03640 b = TMath::Exp(b);
03641 spy = spy + b;
03642 if(i - l + 1 < ymin)
03643 a = working_space[xmin][ymin][j + 2 * sizez_ext] / maxch;
03644
03645 else
03646 a = working_space[xmin][i - l + 1][j + 2 * sizez_ext] / maxch;
03647
03648 b = a - nim;
03649 if(a + nim <= 0)
03650 a = 1;
03651
03652 else
03653 a = TMath::Sqrt(a + nim);
03654
03655 b = b / a;
03656 b = TMath::Exp(b);
03657 smy = smy + b;
03658 }
03659 spz = 0,smz = 0;
03660 nip = working_space[xmin][i + 1][j + 2 * sizez_ext] / maxch;
03661 nim = working_space[xmin][i + 1][j + 1 + 2 * sizez_ext] / maxch;
03662 for(l = 1;l <= averWindow; l++){
03663 if(j + l > zmax)
03664 a = working_space[xmin][i][zmax + 2 * sizez_ext] / maxch;
03665
03666 else
03667 a = working_space[xmin][i][j + l + 2 * sizez_ext] / maxch;
03668
03669 b = a - nip;
03670 if(a + nip <= 0)
03671 a = 1;
03672
03673 else
03674 a = TMath::Sqrt(a + nip);
03675
03676 b = b / a;
03677 b = TMath::Exp(b);
03678 spz = spz + b;
03679 if(j - l + 1 < zmin)
03680 a = working_space[xmin][i][zmin + 2 * sizez_ext] / maxch;
03681
03682 else
03683 a = working_space[xmin][i][j - l + 1 + 2 * sizez_ext] / maxch;
03684
03685 b = a - nim;
03686 if(a + nim <= 0)
03687 a = 1;
03688
03689 else
03690 a = TMath::Sqrt(a + nim);
03691
03692 b = b / a;
03693 b = TMath::Exp(b);
03694 smz = smz + b;
03695 }
03696 a = (spy * working_space[xmin][i][j + 1] + spz * working_space[xmin][i + 1][j]) / (smy + smz);
03697 working_space[xmin][i + 1][j + 1] = a;
03698 nom = nom + a;
03699 }
03700 }
03701 for(i = xmin;i < xmax; i++){
03702 for(j = ymin;j < ymax; j++){
03703 for(k = zmin;k < zmax; k++){
03704 nip = working_space[i][j + 1][k + 1 + 2 * sizez_ext] / maxch;
03705 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
03706 spx = 0,smx = 0;
03707 for(l = 1;l <= averWindow; l++){
03708 if(i + l > xmax)
03709 a = working_space[xmax][j][k + 2 * sizez_ext] / maxch;
03710
03711 else
03712 a = working_space[i + l][j][k + 2 * sizez_ext] / maxch;
03713
03714 b = a - nip;
03715 if(a + nip <= 0)
03716 a = 1;
03717
03718 else
03719 a = TMath::Sqrt(a + nip);
03720
03721 b = b / a;
03722 b = TMath::Exp(b);
03723 spx = spx + b;
03724 if(i - l + 1 < xmin)
03725 a = working_space[xmin][j][k + 2 * sizez_ext] / maxch;
03726
03727 else
03728 a = working_space[i - l + 1][j][k + 2 * sizez_ext] / maxch;
03729
03730 b = a - nim;
03731 if(a + nim <= 0)
03732 a = 1;
03733
03734 else
03735 a = TMath::Sqrt(a + nim);
03736
03737 b = b / a;
03738 b = TMath::Exp(b);
03739 smx = smx + b;
03740 }
03741 spy = 0,smy = 0;
03742 nip = working_space[i + 1][j][k + 1 + 2 * sizez_ext] / maxch;
03743 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
03744 for(l = 1;l <= averWindow; l++){
03745 if(j + l > ymax)
03746 a = working_space[i][ymax][k + 2 * sizez_ext] / maxch;
03747
03748 else
03749 a = working_space[i][j + l][k + 2 * sizez_ext] / maxch;
03750
03751 b = a - nip;
03752 if(a + nip <= 0)
03753 a = 1;
03754
03755 else
03756 a = TMath::Sqrt(a + nip);
03757
03758 b = b / a;
03759 b = TMath::Exp(b);
03760 spy = spy + b;
03761 if(j - l + 1 < ymin)
03762 a = working_space[i][ymin][k + 2 * sizez_ext] / maxch;
03763
03764 else
03765 a = working_space[i][j - l + 1][k + 2 * sizez_ext] / maxch;
03766
03767 b = a - nim;
03768 if(a + nim <= 0)
03769 a = 1;
03770
03771 else
03772 a = TMath::Sqrt(a + nim);
03773
03774 b = b / a;
03775 b = TMath::Exp(b);
03776 smy = smy + b;
03777 }
03778 spz = 0,smz = 0;
03779 nip = working_space[i + 1][j + 1][k + 2 * sizez_ext] / maxch;
03780 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
03781 for(l = 1;l <= averWindow; l++ ){
03782 if(j + l > zmax)
03783 a = working_space[i][j][zmax + 2 * sizez_ext] / maxch;
03784
03785 else
03786 a = working_space[i][j][k + l + 2 * sizez_ext] / maxch;
03787
03788 b = a - nip;
03789 if(a + nip <= 0)
03790 a = 1;
03791
03792 else
03793 a = TMath::Sqrt(a + nip);
03794
03795 b = b / a;
03796 b = TMath::Exp(b);
03797 spz = spz + b;
03798 if(j - l + 1 < ymin)
03799 a = working_space[i][j][zmin + 2 * sizez_ext] / maxch;
03800
03801 else
03802 a = working_space[i][j][k - l + 1 + 2 * sizez_ext] / maxch;
03803
03804 b = a - nim;
03805 if(a + nim <= 0)
03806 a = 1;
03807
03808 else
03809 a = TMath::Sqrt(a + nim);
03810
03811 b = b / a;
03812 b = TMath::Exp(b);
03813 smz = smz + b;
03814 }
03815 a = (spx * working_space[i][j + 1][k + 1] + spy * working_space[i + 1][j][k + 1] + spz * working_space[i + 1][j + 1][k]) / (smx + smy + smz);
03816 working_space[i + 1][j + 1][k + 1] = a;
03817 nom = nom + a;
03818 }
03819 }
03820 }
03821 a = 0;
03822 for(i = xmin;i <= xmax; i++){
03823 for(j = ymin;j <= ymax; j++){
03824 for(k = zmin;k <= zmax; k++){
03825 working_space[i][j][k] = working_space[i][j][k] / nom;
03826 a+=working_space[i][j][k];
03827 }
03828 }
03829 }
03830 for(i = 0;i < sizex_ext; i++){
03831 for(j = 0;j < sizey_ext; j++){
03832 for(k = 0;k < sizez_ext; k++){
03833 working_space[i][j][k + sizez_ext] = working_space[i][j][k] * plocha_markov / a;
03834 }
03835 }
03836 }
03837 }
03838
03839 area = 0;
03840 lhx = -1,lhy = -1,lhz = -1;
03841 positx = 0,posity = 0,positz = 0;
03842 maximum = 0;
03843
03844 for(i = 0;i < sizex_ext; i++){
03845 for(j = 0;j < sizey_ext; j++){
03846 for(k = 0;k < sizez_ext; k++){
03847 lda = (double)i - 3 * sigma;
03848 ldb = (double)j - 3 * sigma;
03849 ldc = (double)k - 3 * sigma;
03850 lda = (lda * lda + ldb * ldb + ldc * ldc) / (2 * sigma * sigma);
03851 l = (int)(1000 * exp(-lda));
03852 lda = l;
03853 if(lda!=0){
03854 if((i + 1) > lhx)
03855 lhx = i + 1;
03856
03857 if((j + 1) > lhy)
03858 lhy = j + 1;
03859
03860 if((k + 1) > lhz)
03861 lhz = k + 1;
03862 }
03863 working_space[i][j][k] = lda;
03864 area = area + lda;
03865 if(lda > maximum){
03866 maximum = lda;
03867 positx = i,posity = j,positz = k;
03868 }
03869 }
03870 }
03871 }
03872
03873 for(i = 0;i < sizex_ext; i++){
03874 for(j = 0;j < sizey_ext; j++){
03875 for(k = 0;k < sizez_ext; k++){
03876 working_space[i][j][k + 2 * sizez_ext] = TMath::Abs(working_space[i][j][k + sizez_ext]);
03877 }
03878 }
03879 }
03880
03881 for (i3 = 0; i3 < sizez_ext; i3++) {
03882 for (i2 = 0; i2 < sizey_ext; i2++) {
03883 for (i1 = 0; i1 < sizex_ext; i1++) {
03884 ldc = 0;
03885 for (j3 = 0; j3 <= (lhz - 1); j3++) {
03886 for (j2 = 0; j2 <= (lhy - 1); j2++) {
03887 for (j1 = 0; j1 <= (lhx - 1); j1++) {
03888 k3 = i3 + j3, k2 = i2 + j2, k1 = i1 + j1;
03889 if (k3 >= 0 && k3 < sizez_ext && k2 >= 0 && k2 < sizey_ext && k1 >= 0 && k1 < sizex_ext) {
03890 lda = working_space[j1][j2][j3];
03891 ldb = working_space[k1][k2][k3+2*sizez_ext];
03892 ldc = ldc + lda * ldb;
03893 }
03894 }
03895 }
03896 }
03897 working_space[i1][i2][i3 + sizez_ext] = ldc;
03898 }
03899 }
03900 }
03901
03902 i1min = -(lhx - 1), i1max = lhx - 1;
03903 i2min = -(lhy - 1), i2max = lhy - 1;
03904 i3min = -(lhz - 1), i3max = lhz - 1;
03905 for (i3 = i3min; i3 <= i3max; i3++) {
03906 for (i2 = i2min; i2 <= i2max; i2++) {
03907 for (i1 = i1min; i1 <= i1max; i1++) {
03908 ldc = 0;
03909 j3min = -i3;
03910 if (j3min < 0)
03911 j3min = 0;
03912
03913 j3max = lhz - 1 - i3;
03914 if (j3max > lhz - 1)
03915 j3max = lhz - 1;
03916
03917 for (j3 = j3min; j3 <= j3max; j3++) {
03918 j2min = -i2;
03919 if (j2min < 0)
03920 j2min = 0;
03921
03922 j2max = lhy - 1 - i2;
03923 if (j2max > lhy - 1)
03924 j2max = lhy - 1;
03925
03926 for (j2 = j2min; j2 <= j2max; j2++) {
03927 j1min = -i1;
03928 if (j1min < 0)
03929 j1min = 0;
03930
03931 j1max = lhx - 1 - i1;
03932 if (j1max > lhx - 1)
03933 j1max = lhx - 1;
03934
03935 for (j1 = j1min; j1 <= j1max; j1++) {
03936 lda = working_space[j1][j2][j3];
03937 if (i1 + j1 < sizex_ext && i2 + j2 < sizey_ext)
03938 ldb = working_space[i1 + j1][i2 + j2][i3 + j3];
03939
03940 else
03941 ldb = 0;
03942
03943 ldc = ldc + lda * ldb;
03944 }
03945 }
03946 }
03947 working_space[i1 - i1min][i2 - i2min][i3 - i3min + 2 * sizez_ext ] = ldc;
03948 }
03949 }
03950 }
03951
03952 for (i3 = 0; i3 < sizez_ext; i3++) {
03953 for (i2 = 0; i2 < sizey_ext; i2++) {
03954 for (i1 = 0; i1 < sizex_ext; i1++) {
03955 working_space[i1][i2][i3 + 3 * sizez_ext] = 1;
03956 working_space[i1][i2][i3 + 4 * sizez_ext] = 0;
03957 }
03958 }
03959 }
03960
03961
03962 for (lindex=0;lindex<deconIterations;lindex++){
03963 for (i3 = 0; i3 < sizez_ext; i3++) {
03964 for (i2 = 0; i2 < sizey_ext; i2++) {
03965 for (i1 = 0; i1 < sizex_ext; i1++) {
03966 if (TMath::Abs(working_space[i1][i2][i3 + 3 * sizez_ext])>1e-6 && TMath::Abs(working_space[i1][i2][i3 + 1 * sizez_ext])>1e-6){
03967 ldb = 0;
03968 j3min = i3;
03969 if (j3min > lhz - 1)
03970 j3min = lhz - 1;
03971
03972 j3min = -j3min;
03973 j3max = sizez_ext - i3 - 1;
03974 if (j3max > lhz - 1)
03975 j3max = lhz - 1;
03976
03977 j2min = i2;
03978 if (j2min > lhy - 1)
03979 j2min = lhy - 1;
03980
03981 j2min = -j2min;
03982 j2max = sizey_ext - i2 - 1;
03983 if (j2max > lhy - 1)
03984 j2max = lhy - 1;
03985
03986 j1min = i1;
03987 if (j1min > lhx - 1)
03988 j1min = lhx - 1;
03989
03990 j1min = -j1min;
03991 j1max = sizex_ext - i1 - 1;
03992 if (j1max > lhx - 1)
03993 j1max = lhx - 1;
03994
03995 for (j3 = j3min; j3 <= j3max; j3++) {
03996 for (j2 = j2min; j2 <= j2max; j2++) {
03997 for (j1 = j1min; j1 <= j1max; j1++) {
03998 ldc = working_space[j1 - i1min][j2 - i2min][j3 - i3min + 2 * sizez_ext];
03999 lda = working_space[i1 + j1][i2 + j2][i3 + j3 + 3 * sizez_ext];
04000 ldb = ldb + lda * ldc;
04001 }
04002 }
04003 }
04004 lda = working_space[i1][i2][i3 + 3 * sizez_ext];
04005 ldc = working_space[i1][i2][i3 + 1 * sizez_ext];
04006 if (ldc * lda != 0 && ldb != 0) {
04007 lda = lda * ldc / ldb;
04008 }
04009
04010 else
04011 lda = 0;
04012 working_space[i1][i2][i3 + 4 * sizez_ext] = lda;
04013 }
04014 }
04015 }
04016 }
04017 for (i3 = 0; i3 < sizez_ext; i3++) {
04018 for (i2 = 0; i2 < sizey_ext; i2++) {
04019 for (i1 = 0; i1 < sizex_ext; i1++)
04020 working_space[i1][i2][i3 + 3 * sizez_ext] = working_space[i1][i2][i3 + 4 * sizez_ext];
04021 }
04022 }
04023 }
04024
04025 maximum=0;
04026 for(i = 0;i < sizex_ext; i++){
04027 for(j = 0;j < sizey_ext; j++){
04028 for(k = 0;k < sizez_ext; k++){
04029 working_space[(i + positx) % sizex_ext][(j + posity) % sizey_ext][(k + positz) % sizez_ext] = area * working_space[i][j][k + 3 * sizez_ext];
04030 if(maximum < working_space[(i + positx) % sizex_ext][(j + posity) % sizey_ext][(k + positz) % sizez_ext])
04031 maximum = working_space[(i + positx) % sizex_ext][(j + posity) % sizey_ext][(k + positz) % sizez_ext];
04032 }
04033 }
04034 }
04035
04036 for(i = 1;i < sizex_ext - 1; i++){
04037 for(j = 1;j < sizey_ext - 1; j++){
04038 for(l = 1;l < sizez_ext - 1; l++){
04039 a = working_space[i][j][l];
04040 if(a > working_space[i][j][l - 1] && a > working_space[i - 1][j][l - 1] && a > working_space[i - 1][j - 1][l - 1] && a > working_space[i][j - 1][l - 1] && a > working_space[i + 1][j - 1][l - 1] && a > working_space[i + 1][j][l - 1] && a > working_space[i + 1][j + 1][l - 1] && a > working_space[i][j + 1][l - 1] && a > working_space[i - 1][j + 1][l - 1] && a > working_space[i - 1][j][l] && a > working_space[i - 1][j - 1][l] && a > working_space[i][j - 1][l] && a > working_space[i + 1][j - 1][l] && a > working_space[i + 1][j][l] && a > working_space[i + 1][j + 1][l] && a > working_space[i][j + 1][l] && a > working_space[i - 1][j + 1][l] && a > working_space[i][j][l + 1] && a > working_space[i - 1][j][l + 1] && a > working_space[i - 1][j - 1][l + 1] && a > working_space[i][j - 1][l + 1] && a > working_space[i + 1][j - 1][l + 1] && a > working_space[i + 1][j][l + 1] && a > working_space[i + 1][j + 1][l + 1] && a > working_space[i][j + 1][l + 1] && a > working_space[i - 1][j + 1][l + 1]){
04041 if(i >= shift && i < ssizex + shift && j >= shift && j < ssizey + shift && l >= shift && l < ssizez + shift){
04042 if(working_space[i][j][l] > threshold * maximum / 100.0){
04043 if(peak_index < fMaxPeaks){
04044 for(k = i - 1,a = 0,b = 0;k <= i + 1; k++){
04045 a += (double)(k - shift) * working_space[k][j][l];
04046 b += working_space[k][j][l];
04047 }
04048 fPositionX[peak_index] = a / b;
04049 for(k = j - 1,a = 0,b = 0;k <= j + 1; k++){
04050 a += (double)(k - shift) * working_space[i][k][l];
04051 b += working_space[i][k][l];
04052 }
04053 fPositionY[peak_index] = a / b;
04054 for(k = l - 1,a = 0,b = 0;k <= l + 1; k++){
04055 a += (double)(k - shift) * working_space[i][j][k];
04056 b += working_space[i][j][k];
04057 }
04058 fPositionZ[peak_index] = a / b;
04059 peak_index += 1;
04060 }
04061 }
04062 }
04063 }
04064 }
04065 }
04066 }
04067 for(i = 0;i < ssizex; i++){
04068 for(j = 0;j < ssizey; j++){
04069 for(k = 0;k < ssizez; k++){
04070 dest[i][j][k] = working_space[i + shift][j + shift][k + shift];
04071 }
04072 }
04073 }
04074 k = (int)(4 * sigma + 0.5);
04075 k = 4 * k;
04076 for(i = 0;i < ssizex + k; i++){
04077 for(j = 0;j < ssizey + k; j++)
04078 delete[] working_space[i][j];
04079 delete[] working_space[i];
04080 }
04081 delete[] working_space;
04082 fNPeaks = peak_index;
04083 return fNPeaks;
04084 }
04085
04086
04087 Int_t TSpectrum3::SearchFast(const float ***source, float ***dest, Int_t ssizex, Int_t ssizey, Int_t ssizez,
04088 Double_t sigma, Double_t threshold,
04089 Bool_t markov, Int_t averWindow)
04090
04091 {
04092
04093
04094
04095
04096
04097
04098
04099
04100
04101
04102
04103
04104
04105
04106
04107
04108
04109
04110
04111
04112
04113
04114 int i,j,k,l,li,lj,lk,lmin,lmax,xmin,xmax,ymin,ymax,zmin,zmax;
04115 double maxch,plocha = 0,plocha_markov = 0;
04116 double nom,nip,nim,sp,sm,spx,spy,smx,smy,spz,smz;
04117 float norma,val,val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11,val12,val13,val14,val15,val16,val17,val18,val19,val20,val21,val22,val23,val24,val25,val26;
04118 double a,b,s,f,maximum;
04119 int x,y,z,peak_index=0;
04120 double p1,p2,p3,p4,p5,p6,p7,p8,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,r1,r2,r3,r4,r5,r6;
04121 double pocet_sigma = 5;
04122 int number_of_iterations=(int)(4 * sigma + 0.5);
04123 int sizex_ext=ssizex + 4 * number_of_iterations,sizey_ext = ssizey + 4 * number_of_iterations,sizez_ext = ssizez + 4 * number_of_iterations,shift = 2 * number_of_iterations;
04124 double c[PEAK_WINDOW],s_f_ratio_peaks = 5;
04125 if(sigma < 1){
04126 Error("SearchFast", "Invalid sigma, must be greater than or equal to 1");
04127 return 0;
04128 }
04129
04130 if(threshold<=0||threshold>=100){
04131 Error("SearchFast", "Invalid threshold, must be positive and less than 100");
04132 return 0;
04133 }
04134
04135 j = (int)(pocet_sigma*sigma+0.5);
04136 if (j >= PEAK_WINDOW / 2) {
04137 Error("SearchFast", "Too large sigma");
04138 return 0;
04139 }
04140
04141 if (markov == true) {
04142 if (averWindow <= 0) {
04143 Error("SearchFast", "Averanging window must be positive");
04144 return 0;
04145 }
04146 }
04147
04148 if(sizex_ext < 2 * number_of_iterations + 1 || sizey_ext < 2 * number_of_iterations + 1 || sizez_ext < 2 * number_of_iterations + 1){
04149 Error("SearchFast", "Too large clipping window");
04150 return 0;
04151 }
04152
04153 i = (int)(4 * sigma + 0.5);
04154 i = 4 * i;
04155 double ***working_space = new double** [ssizex + i];
04156 for(j = 0;j < ssizex + i; j++){
04157 working_space[j] = new double* [ssizey + i];
04158 for(k = 0;k < ssizey + i; k++)
04159 working_space[j][k] = new double [4 * (ssizez + i)];
04160 }
04161
04162 for(k = 0;k < sizez_ext; k++){
04163 for(j = 0;j < sizey_ext; j++){
04164 for(i = 0;i < sizex_ext; i++){
04165 if(i < shift){
04166 if(j < shift){
04167 if(k < shift)
04168 working_space[i][j][k + sizez_ext] = source[0][0][0];
04169
04170 else if(k >= ssizez + shift)
04171 working_space[i][j][k + sizez_ext] = source[0][0][ssizez - 1];
04172
04173 else
04174 working_space[i][j][k + sizez_ext] = source[0][0][k - shift];
04175 }
04176
04177 else if(j >= ssizey + shift){
04178 if(k < shift)
04179 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][0];
04180
04181 else if(k >= ssizez + shift)
04182 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][ssizez - 1];
04183
04184 else
04185 working_space[i][j][k + sizez_ext] = source[0][ssizey - 1][k - shift];
04186 }
04187
04188 else{
04189 if(k < shift)
04190 working_space[i][j][k + sizez_ext] = source[0][j - shift][0];
04191
04192 else if(k >= ssizez + shift)
04193 working_space[i][j][k + sizez_ext] = source[0][j - shift][ssizez - 1];
04194
04195 else
04196 working_space[i][j][k + sizez_ext] = source[0][j - shift][k - shift];
04197 }
04198 }
04199
04200 else if(i >= ssizex + shift){
04201 if(j < shift){
04202 if(k < shift)
04203 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][0];
04204
04205 else if(k >= ssizez + shift)
04206 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][ssizez - 1];
04207
04208 else
04209 working_space[i][j][k + sizez_ext] = source[ssizex - 1][0][k - shift];
04210 }
04211
04212 else if(j >= ssizey + shift){
04213 if(k < shift)
04214 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][0];
04215
04216 else if(k >= ssizez + shift)
04217 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][ssizez - 1];
04218
04219 else
04220 working_space[i][j][k + sizez_ext] = source[ssizex - 1][ssizey - 1][k - shift];
04221 }
04222
04223 else{
04224 if(k < shift)
04225 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][0];
04226
04227 else if(k >= ssizez + shift)
04228 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][ssizez - 1];
04229
04230 else
04231 working_space[i][j][k + sizez_ext] = source[ssizex - 1][j - shift][k - shift];
04232 }
04233 }
04234
04235 else{
04236 if(j < shift){
04237 if(k < shift)
04238 working_space[i][j][k + sizez_ext] = source[i - shift][0][0];
04239
04240 else if(k >= ssizez + shift)
04241 working_space[i][j][k + sizez_ext] = source[i - shift][0][ssizez - 1];
04242
04243 else
04244 working_space[i][j][k + sizez_ext] = source[i - shift][0][k - shift];
04245 }
04246
04247 else if(j >= ssizey + shift){
04248 if(k < shift)
04249 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][0];
04250
04251 else if(k >= ssizez + shift)
04252 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][ssizez - 1];
04253
04254 else
04255 working_space[i][j][k + sizez_ext] = source[i - shift][ssizey - 1][k - shift];
04256 }
04257
04258 else{
04259 if(k < shift)
04260 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][0];
04261
04262 else if(k >= ssizez + shift)
04263 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][ssizez - 1];
04264
04265 else
04266 working_space[i][j][k + sizez_ext] = source[i - shift][j - shift][k - shift];
04267 }
04268 }
04269 }
04270 }
04271 }
04272 for(i = 1;i <= number_of_iterations; i++){
04273 for(z = i;z < sizez_ext - i; z++){
04274 for(y = i;y < sizey_ext - i; y++){
04275 for(x = i;x < sizex_ext - i; x++){
04276 a = working_space[x][y][z + sizez_ext];
04277 p1 = working_space[x + i][y + i][z - i + sizez_ext];
04278 p2 = working_space[x - i][y + i][z - i + sizez_ext];
04279 p3 = working_space[x + i][y - i][z - i + sizez_ext];
04280 p4 = working_space[x - i][y - i][z - i + sizez_ext];
04281 p5 = working_space[x + i][y + i][z + i + sizez_ext];
04282 p6 = working_space[x - i][y + i][z + i + sizez_ext];
04283 p7 = working_space[x + i][y - i][z + i + sizez_ext];
04284 p8 = working_space[x - i][y - i][z + i + sizez_ext];
04285 s1 = working_space[x + i][y ][z - i + sizez_ext];
04286 s2 = working_space[x ][y + i][z - i + sizez_ext];
04287 s3 = working_space[x - i][y ][z - i + sizez_ext];
04288 s4 = working_space[x ][y - i][z - i + sizez_ext];
04289 s5 = working_space[x + i][y ][z + i + sizez_ext];
04290 s6 = working_space[x ][y + i][z + i + sizez_ext];
04291 s7 = working_space[x - i][y ][z + i + sizez_ext];
04292 s8 = working_space[x ][y - i][z + i + sizez_ext];
04293 s9 = working_space[x - i][y + i][z + sizez_ext];
04294 s10 = working_space[x - i][y - i][z +sizez_ext];
04295 s11 = working_space[x + i][y + i][z +sizez_ext];
04296 s12 = working_space[x + i][y - i][z +sizez_ext];
04297 r1 = working_space[x ][y ][z - i + sizez_ext];
04298 r2 = working_space[x ][y ][z + i + sizez_ext];
04299 r3 = working_space[x - i][y ][z + sizez_ext];
04300 r4 = working_space[x + i][y ][z + sizez_ext];
04301 r5 = working_space[x ][y + i][z + sizez_ext];
04302 r6 = working_space[x ][y - i][z + sizez_ext];
04303 b = (p1 + p3) / 2.0;
04304 if(b > s1)
04305 s1 = b;
04306
04307 b = (p1 + p2) / 2.0;
04308 if(b > s2)
04309 s2 = b;
04310
04311 b = (p2 + p4) / 2.0;
04312 if(b > s3)
04313 s3 = b;
04314
04315 b = (p3 + p4) / 2.0;
04316 if(b > s4)
04317 s4 = b;
04318
04319 b = (p5 + p7) / 2.0;
04320 if(b > s5)
04321 s5 = b;
04322
04323 b = (p5 + p6) / 2.0;
04324 if(b > s6)
04325 s6 = b;
04326
04327 b = (p6 + p8) / 2.0;
04328 if(b > s7)
04329 s7 = b;
04330
04331 b = (p7 + p8) / 2.0;
04332 if(b > s8)
04333 s8 = b;
04334
04335 b = (p2 + p6) / 2.0;
04336 if(b > s9)
04337 s9 = b;
04338
04339 b = (p4 + p8) / 2.0;
04340 if(b > s10)
04341 s10 = b;
04342
04343 b = (p1 + p5) / 2.0;
04344 if(b > s11)
04345 s11 = b;
04346
04347 b = (p3 + p7) / 2.0;
04348 if(b > s12)
04349 s12 = b;
04350
04351 s1 = s1 - (p1 + p3) / 2.0;
04352 s2 = s2 - (p1 + p2) / 2.0;
04353 s3 = s3 - (p2 + p4) / 2.0;
04354 s4 = s4 - (p3 + p4) / 2.0;
04355 s5 = s5 - (p5 + p7) / 2.0;
04356 s6 = s6 - (p5 + p6) / 2.0;
04357 s7 = s7 - (p6 + p8) / 2.0;
04358 s8 = s8 - (p7 + p8) / 2.0;
04359 s9 = s9 - (p2 + p6) / 2.0;
04360 s10 = s10 - (p4 + p8) / 2.0;
04361 s11 = s11 - (p1 + p5) / 2.0;
04362 s12 = s12 - (p3 + p7) / 2.0;
04363 b = (s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0;
04364 if(b > r1)
04365 r1 = b;
04366
04367 b = (s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0;
04368 if(b > r2)
04369 r2 = b;
04370
04371 b = (s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0;
04372 if(b > r3)
04373 r3 = b;
04374
04375 b = (s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0;
04376 if(b > r4)
04377 r4 = b;
04378
04379 b = (s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0;
04380 if(b > r5)
04381 r5 = b;
04382
04383 b = (s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0;
04384 if(b > r6)
04385 r6 = b;
04386
04387 r1 = r1 - ((s1 + s3) / 2.0 + (s2 + s4) / 2.0 + (p1 + p2 + p3 + p4) / 4.0);
04388 r2 = r2 - ((s5 + s7) / 2.0 + (s6 + s8) / 2.0 + (p5 + p6 + p7 + p8) / 4.0);
04389 r3 = r3 - ((s3 + s7) / 2.0 + (s9 + s10) / 2.0 + (p2 + p4 + p6 + p8) / 4.0);
04390 r4 = r4 - ((s1 + s5) / 2.0 + (s11 + s12) / 2.0 + (p1 + p3 + p5 + p7) / 4.0);
04391 r5 = r5 - ((s9 + s11) / 2.0 + (s2 + s6) / 2.0 + (p1 + p2 + p5 + p6) / 4.0);
04392 r6 = r6 - ((s4 + s8) / 2.0 + (s10 + s12) / 2.0 + (p3 + p4 + p7 + p8) / 4.0);
04393 b = (r1 + r2) / 2.0 + (r3 + r4) / 2.0 + (r5 + r6) / 2.0 + (s1 + s3 + s5 + s7) / 4.0 + (s2 + s4 + s6 + s8) / 4.0 + (s9 + s10 + s11 + s12) / 4.0 + (p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) / 8.0;
04394 if(b < a)
04395 a = b;
04396
04397 working_space[x][y][z] = a;
04398 }
04399 }
04400 }
04401 for(z = i;z < sizez_ext - i; z++){
04402 for(y = i;y < sizey_ext - i; y++){
04403 for(x = i;x < sizex_ext - i; x++){
04404 working_space[x][y][z + sizez_ext] = working_space[x][y][z];
04405 }
04406 }
04407 }
04408 }
04409 for(k = 0;k < sizez_ext; k++){
04410 for(j = 0;j < sizey_ext; j++){
04411 for(i = 0;i < sizex_ext; i++){
04412 if(i < shift){
04413 if(j < shift){
04414 if(k < shift)
04415 working_space[i][j][k + 3 * sizez_ext] = source[0][0][0] - working_space[i][j][k + sizez_ext];
04416
04417 else if(k >= ssizez + shift)
04418 working_space[i][j][k + 3 * sizez_ext] = source[0][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
04419
04420 else
04421 working_space[i][j][k + 3 * sizez_ext] = source[0][0][k - shift] - working_space[i][j][k + sizez_ext];
04422 }
04423
04424 else if(j >= ssizey + shift){
04425 if(k < shift)
04426 working_space[i][j][k + 3 * sizez_ext] = source[0][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
04427
04428 else if(k >= ssizez + shift)
04429 working_space[i][j][k + 3 * sizez_ext] = source[0][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
04430
04431 else
04432 working_space[i][j][k + 3 * sizez_ext] = source[0][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
04433 }
04434
04435 else{
04436 if(k < shift)
04437 working_space[i][j][k + 3 * sizez_ext] = source[0][j - shift][0] - working_space[i][j][k + sizez_ext];
04438
04439 else if(k >= ssizez + shift)
04440 working_space[i][j][k + 3 * sizez_ext] = source[0][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
04441
04442 else
04443 working_space[i][j][k + 3 * sizez_ext] = source[0][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
04444 }
04445 }
04446
04447 else if(i >= ssizex + shift){
04448 if(j < shift){
04449 if(k < shift)
04450 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][0][0] - working_space[i][j][k + sizez_ext];
04451
04452 else if(k >= ssizez + shift)
04453 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
04454
04455 else
04456 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][0][k - shift] - working_space[i][j][k + sizez_ext];
04457 }
04458
04459 else if(j >= ssizey + shift){
04460 if(k < shift)
04461 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
04462
04463 else if(k >= ssizez + shift)
04464 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
04465
04466 else
04467 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
04468 }
04469
04470 else{
04471 if(k < shift)
04472 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][j - shift][0] - working_space[i][j][k + sizez_ext];
04473
04474 else if(k >= ssizez + shift)
04475 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
04476
04477 else
04478 working_space[i][j][k + 3 * sizez_ext] = source[ssizex - 1][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
04479 }
04480 }
04481
04482 else{
04483 if(j < shift){
04484 if(k < shift)
04485 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][0][0] - working_space[i][j][k + sizez_ext];
04486
04487 else if(k >= ssizez + shift)
04488 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][0][ssizez - 1] - working_space[i][j][k + sizez_ext];
04489
04490 else
04491 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][0][k - shift] - working_space[i][j][k + sizez_ext];
04492 }
04493
04494 else if(j >= ssizey + shift){
04495 if(k < shift)
04496 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][ssizey - 1][0] - working_space[i][j][k + sizez_ext];
04497
04498 else if(k >= ssizez + shift)
04499 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][ssizey - 1][ssizez - 1] - working_space[i][j][k + sizez_ext];
04500
04501 else
04502 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][ssizey - 1][k - shift] - working_space[i][j][k + sizez_ext];
04503 }
04504
04505 else{
04506 if(k < shift)
04507 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][j - shift][0] - working_space[i][j][k + sizez_ext];
04508
04509 else if(k >= ssizez + shift)
04510 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][j - shift][ssizez - 1] - working_space[i][j][k + sizez_ext];
04511
04512 else
04513 working_space[i][j][k + 3 * sizez_ext] = source[i - shift][j - shift][k - shift] - working_space[i][j][k + sizez_ext];
04514 }
04515 }
04516 }
04517 }
04518 }
04519
04520 for(i = 0;i < sizex_ext; i++){
04521 for(j = 0;j < sizey_ext; j++){
04522 for(k = 0;k < sizez_ext; k++){
04523 if(i >= shift && i < ssizex + shift && j >= shift && j < ssizey + shift && k >= shift && k < ssizez + shift){
04524 working_space[i][j][k + 2 * sizez_ext] = source[i - shift][j - shift][k - shift];
04525 plocha_markov = plocha_markov + source[i - shift][j - shift][k - shift];
04526 }
04527 else
04528 working_space[i][j][k + 2 * sizez_ext] = 0;
04529 }
04530 }
04531 }
04532
04533 if(markov == true){
04534 xmin = 0;
04535 xmax = sizex_ext - 1;
04536 ymin = 0;
04537 ymax = sizey_ext - 1;
04538 zmin = 0;
04539 zmax = sizez_ext - 1;
04540 for(i = 0,maxch = 0;i < sizex_ext; i++){
04541 for(j = 0;j < sizey_ext;j++){
04542 for(k = 0;k < sizez_ext;k++){
04543 working_space[i][j][k] = 0;
04544 if(maxch < working_space[i][j][k + 2 * sizez_ext])
04545 maxch = working_space[i][j][k + 2 * sizez_ext];
04546
04547 plocha += working_space[i][j][k + 2 * sizez_ext];
04548 }
04549 }
04550 }
04551 if(maxch == 0) {
04552 delete [] working_space;
04553 return 0;
04554 }
04555
04556 nom = 0;
04557 working_space[xmin][ymin][zmin] = 1;
04558 for(i = xmin;i < xmax; i++){
04559 nip = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
04560 nim = working_space[i + 1][ymin][zmin + 2 * sizez_ext] / maxch;
04561 sp = 0,sm = 0;
04562 for(l = 1;l <= averWindow; l++){
04563 if((i + l) > xmax)
04564 a = working_space[xmax][ymin][zmin + 2 * sizez_ext] / maxch;
04565
04566 else
04567 a = working_space[i + l][ymin][zmin + 2 * sizez_ext] / maxch;
04568
04569 b = a - nip;
04570 if(a + nip <= 0)
04571 a = 1;
04572
04573 else
04574 a = TMath::Sqrt(a + nip);
04575
04576 b = b / a;
04577 b = TMath::Exp(b);
04578 sp = sp + b;
04579 if(i - l + 1 < xmin)
04580 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
04581
04582 else
04583 a = working_space[i - l + 1][ymin][zmin + 2 * sizez_ext] / maxch;
04584
04585 b = a - nim;
04586 if(a + nim <= 0)
04587 a = 1;
04588
04589 else
04590 a = TMath::Sqrt(a + nim);
04591
04592 b = b / a;
04593 b = TMath::Exp(b);
04594 sm = sm + b;
04595 }
04596 a = sp / sm;
04597 a = working_space[i + 1][ymin][zmin] = a * working_space[i][ymin][zmin];
04598 nom = nom + a;
04599 }
04600 for(i = ymin;i < ymax; i++){
04601 nip = working_space[xmin][i][zmin + 2 * sizez_ext] / maxch;
04602 nim = working_space[xmin][i + 1][zmin + 2 * sizez_ext] / maxch;
04603 sp = 0,sm = 0;
04604 for(l = 1;l <= averWindow; l++){
04605 if((i + l) > ymax)
04606 a = working_space[xmin][ymax][zmin + 2 * sizez_ext] / maxch;
04607
04608 else
04609 a = working_space[xmin][i + l][zmin + 2 * sizez_ext] / maxch;
04610
04611 b = a - nip;
04612 if(a + nip <= 0)
04613 a = 1;
04614
04615 else
04616 a = TMath::Sqrt(a + nip);
04617
04618 b = b / a;
04619 b = TMath::Exp(b);
04620 sp = sp + b;
04621 if(i - l + 1 < ymin)
04622 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
04623
04624 else
04625 a = working_space[xmin][i - l + 1][zmin + 2 * sizez_ext] / maxch;
04626
04627 b = a - nim;
04628 if(a + nim <= 0)
04629 a = 1;
04630
04631 else
04632 a = TMath::Sqrt(a + nim);
04633
04634 b = b / a;
04635 b = TMath::Exp(b);
04636 sm = sm + b;
04637 }
04638 a = sp / sm;
04639 a = working_space[xmin][i + 1][zmin] = a * working_space[xmin][i][zmin];
04640 nom = nom + a;
04641 }
04642 for(i = zmin;i < zmax;i++){
04643 nip = working_space[xmin][ymin][i + 2 * sizez_ext] / maxch;
04644 nim = working_space[xmin][ymin][i + 1 + 2 * sizez_ext] / maxch;
04645 sp = 0,sm = 0;
04646 for(l = 1;l <= averWindow;l++){
04647 if((i + l) > zmax)
04648 a = working_space[xmin][ymin][zmax + 2 * sizez_ext] / maxch;
04649
04650 else
04651 a = working_space[xmin][ymin][i + l + 2 * sizez_ext] / maxch;
04652
04653 b = a - nip;
04654 if(a + nip <= 0)
04655 a = 1;
04656
04657 else
04658 a = TMath::Sqrt(a + nip);
04659
04660 b = b / a;
04661 b = TMath::Exp(b);
04662 sp = sp + b;
04663 if(i - l + 1 < zmin)
04664 a = working_space[xmin][ymin][zmin + 2 * sizez_ext] / maxch;
04665
04666 else
04667 a = working_space[xmin][ymin][i - l + 1 + 2 * sizez_ext] / maxch;
04668
04669 b = a - nim;
04670 if(a + nim <= 0)
04671 a = 1;
04672
04673 else
04674 a = TMath::Sqrt(a + nim);
04675
04676 b = b / a;
04677 b = TMath::Exp(b);
04678 sm = sm + b;
04679 }
04680 a = sp / sm;
04681 a = working_space[xmin][ymin][i + 1] = a * working_space[xmin][ymin][i];
04682 nom = nom + a;
04683 }
04684 for(i = xmin;i < xmax; i++){
04685 for(j = ymin;j < ymax; j++){
04686 nip = working_space[i][j + 1][zmin + 2 * sizez_ext] / maxch;
04687 nim = working_space[i + 1][j + 1][zmin + 2 * sizez_ext] / maxch;
04688 spx = 0,smx = 0;
04689 for(l = 1;l <= averWindow; l++){
04690 if(i + l > xmax)
04691 a = working_space[xmax][j][zmin + 2 * sizez_ext] / maxch;
04692
04693 else
04694 a = working_space[i + l][j][zmin + 2 * sizez_ext] / maxch;
04695
04696 b = a - nip;
04697 if(a + nip <= 0)
04698 a = 1;
04699
04700 else
04701 a = TMath::Sqrt(a + nip);
04702
04703 b = b / a;
04704 b = TMath::Exp(b);
04705 spx = spx + b;
04706 if(i - l + 1 < xmin)
04707 a = working_space[xmin][j][zmin + 2 * sizez_ext] / maxch;
04708
04709 else
04710 a = working_space[i - l + 1][j][zmin + 2 * sizez_ext] / maxch;
04711
04712 b = a - nim;
04713 if(a + nim <= 0)
04714 a = 1;
04715
04716 else
04717 a = TMath::Sqrt(a + nim);
04718
04719 b = b / a;
04720 b = TMath::Exp(b);
04721 smx = smx + b;
04722 }
04723 spy = 0,smy = 0;
04724 nip = working_space[i + 1][j][zmin + 2 * sizez_ext] / maxch;
04725 nim = working_space[i + 1][j + 1][zmin + 2 * sizez_ext] / maxch;
04726 for(l = 1;l <= averWindow; l++){
04727 if(j + l > ymax)
04728 a = working_space[i][ymax][zmin + 2 * sizez_ext] / maxch;
04729
04730 else
04731 a = working_space[i][j + l][zmin + 2 * sizez_ext] / maxch;
04732
04733 b = a - nip;
04734 if(a + nip <= 0)
04735 a = 1;
04736
04737 else
04738 a = TMath::Sqrt(a + nip);
04739
04740 b = b / a;
04741 b = TMath::Exp(b);
04742 spy = spy + b;
04743 if(j - l + 1 < ymin)
04744 a = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
04745
04746 else
04747 a = working_space[i][j - l + 1][zmin + 2 * sizez_ext] / maxch;
04748
04749 b = a - nim;
04750 if(a + nim <= 0)
04751 a = 1;
04752
04753 else
04754 a = TMath::Sqrt(a + nim);
04755
04756 b = b / a;
04757 b = TMath::Exp(b);
04758 smy = smy + b;
04759 }
04760 a = (spx * working_space[i][j + 1][zmin] + spy * working_space[i + 1][j][zmin]) / (smx + smy);
04761 working_space[i + 1][j + 1][zmin] = a;
04762 nom = nom + a;
04763 }
04764 }
04765 for(i = xmin;i < xmax;i++){
04766 for(j = zmin;j < zmax;j++){
04767 nip = working_space[i][ymin][j + 1 + 2 * sizez_ext] / maxch;
04768 nim = working_space[i + 1][ymin][j + 1 + 2 * sizez_ext] / maxch;
04769 spx = 0,smx = 0;
04770 for(l = 1;l <= averWindow; l++){
04771 if(i + l > xmax)
04772 a = working_space[xmax][ymin][j + 2 * sizez_ext] / maxch;
04773
04774 else
04775 a = working_space[i + l][ymin][j + 2 * sizez_ext] / maxch;
04776
04777 b = a - nip;
04778 if(a + nip <= 0)
04779 a = 1;
04780
04781 else
04782 a = TMath::Sqrt(a + nip);
04783
04784 b = b / a;
04785 b = TMath::Exp(b);
04786 spx = spx + b;
04787 if(i - l + 1 < xmin)
04788 a = working_space[xmin][ymin][j + 2 * sizez_ext] / maxch;
04789
04790 else
04791 a = working_space[i - l + 1][ymin][j + 2 * sizez_ext] / maxch;
04792
04793 b = a - nim;
04794 if(a + nim <= 0)
04795 a = 1;
04796
04797 else
04798 a = TMath::Sqrt(a + nim);
04799
04800 b = b / a;
04801 b = TMath::Exp(b);
04802 smx = smx + b;
04803 }
04804 spz = 0,smz = 0;
04805 nip = working_space[i + 1][ymin][j + 2 * sizez_ext] / maxch;
04806 nim = working_space[i + 1][ymin][j + 1 + 2 * sizez_ext] / maxch;
04807 for(l = 1;l <= averWindow; l++){
04808 if(j + l > zmax)
04809 a = working_space[i][ymin][zmax + 2 * sizez_ext] / maxch;
04810
04811 else
04812 a = working_space[i][ymin][j + l + 2 * sizez_ext] / maxch;
04813
04814 b = a - nip;
04815 if(a + nip <= 0)
04816 a = 1;
04817
04818 else
04819 a = TMath::Sqrt(a + nip);
04820
04821 b = b / a;
04822 b = TMath::Exp(b);
04823 spz = spz + b;
04824 if(j - l + 1 < zmin)
04825 a = working_space[i][ymin][zmin + 2 * sizez_ext] / maxch;
04826
04827 else
04828 a = working_space[i][ymin][j - l + 1 + 2 * sizez_ext] / maxch;
04829
04830 b = a - nim;
04831 if(a + nim <= 0)
04832 a = 1;
04833
04834 else
04835 a = TMath::Sqrt(a + nim);
04836
04837 b = b / a;
04838 b = TMath::Exp(b);
04839 smz = smz + b;
04840 }
04841 a = (spx * working_space[i][ymin][j + 1] + spz * working_space[i + 1][ymin][j]) / (smx + smz);
04842 working_space[i + 1][ymin][j + 1] = a;
04843 nom = nom + a;
04844 }
04845 }
04846 for(i = ymin;i < ymax;i++){
04847 for(j = zmin;j < zmax;j++){
04848 nip = working_space[xmin][i][j + 1 + 2 * sizez_ext] / maxch;
04849 nim = working_space[xmin][i + 1][j + 1 + 2 * sizez_ext] / maxch;
04850 spy = 0,smy = 0;
04851 for(l = 1;l <= averWindow; l++){
04852 if(i + l > ymax)
04853 a = working_space[xmin][ymax][j + 2 * sizez_ext] / maxch;
04854
04855 else
04856 a = working_space[xmin][i + l][j + 2 * sizez_ext] / maxch;
04857
04858 b = a - nip;
04859 if(a + nip <= 0)
04860 a = 1;
04861
04862 else
04863 a = TMath::Sqrt(a + nip);
04864
04865 b = b / a;
04866 b = TMath::Exp(b);
04867 spy = spy + b;
04868 if(i - l + 1 < ymin)
04869 a = working_space[xmin][ymin][j + 2 * sizez_ext] / maxch;
04870
04871 else
04872 a = working_space[xmin][i - l + 1][j + 2 * sizez_ext] / maxch;
04873
04874 b = a - nim;
04875 if(a + nim <= 0)
04876 a = 1;
04877
04878 else
04879 a = TMath::Sqrt(a + nim);
04880
04881 b = b / a;
04882 b = TMath::Exp(b);
04883 smy = smy + b;
04884 }
04885 spz = 0,smz = 0;
04886 nip = working_space[xmin][i + 1][j + 2 * sizez_ext] / maxch;
04887 nim = working_space[xmin][i + 1][j + 1 + 2 * sizez_ext] / maxch;
04888 for(l = 1;l <= averWindow; l++){
04889 if(j + l > zmax)
04890 a = working_space[xmin][i][zmax + 2 * sizez_ext] / maxch;
04891
04892 else
04893 a = working_space[xmin][i][j + l + 2 * sizez_ext] / maxch;
04894
04895 b = a - nip;
04896 if(a + nip <= 0)
04897 a = 1;
04898
04899 else
04900 a = TMath::Sqrt(a + nip);
04901
04902 b = b / a;
04903 b = TMath::Exp(b);
04904 spz = spz + b;
04905 if(j - l + 1 < zmin)
04906 a = working_space[xmin][i][zmin + 2 * sizez_ext] / maxch;
04907
04908 else
04909 a = working_space[xmin][i][j - l + 1 + 2 * sizez_ext] / maxch;
04910
04911 b = a - nim;
04912 if(a + nim <= 0)
04913 a = 1;
04914
04915 else
04916 a = TMath::Sqrt(a + nim);
04917
04918 b = b / a;
04919 b = TMath::Exp(b);
04920 smz = smz + b;
04921 }
04922 a = (spy * working_space[xmin][i][j + 1] + spz * working_space[xmin][i + 1][j]) / (smy + smz);
04923 working_space[xmin][i + 1][j + 1] = a;
04924 nom = nom + a;
04925 }
04926 }
04927 for(i = xmin;i < xmax; i++){
04928 for(j = ymin;j < ymax; j++){
04929 for(k = zmin;k < zmax; k++){
04930 nip = working_space[i][j + 1][k + 1 + 2 * sizez_ext] / maxch;
04931 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
04932 spx = 0,smx = 0;
04933 for(l = 1;l <= averWindow; l++){
04934 if(i + l > xmax)
04935 a = working_space[xmax][j][k + 2 * sizez_ext] / maxch;
04936
04937 else
04938 a = working_space[i + l][j][k + 2 * sizez_ext] / maxch;
04939
04940 b = a - nip;
04941 if(a + nip <= 0)
04942 a = 1;
04943
04944 else
04945 a = TMath::Sqrt(a + nip);
04946
04947 b = b / a;
04948 b = TMath::Exp(b);
04949 spx = spx + b;
04950 if(i - l + 1 < xmin)
04951 a = working_space[xmin][j][k + 2 * sizez_ext] / maxch;
04952
04953 else
04954 a = working_space[i - l + 1][j][k + 2 * sizez_ext] / maxch;
04955
04956 b = a - nim;
04957 if(a + nim <= 0)
04958 a = 1;
04959
04960 else
04961 a = TMath::Sqrt(a + nim);
04962
04963 b = b / a;
04964 b = TMath::Exp(b);
04965 smx = smx + b;
04966 }
04967 spy = 0,smy = 0;
04968 nip = working_space[i + 1][j][k + 1 + 2 * sizez_ext] / maxch;
04969 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
04970 for(l = 1;l <= averWindow; l++){
04971 if(j + l > ymax)
04972 a = working_space[i][ymax][k + 2 * sizez_ext] / maxch;
04973
04974 else
04975 a = working_space[i][j + l][k + 2 * sizez_ext] / maxch;
04976
04977 b = a - nip;
04978 if(a + nip <= 0)
04979 a = 1;
04980
04981 else
04982 a = TMath::Sqrt(a + nip);
04983
04984 b = b / a;
04985 b = TMath::Exp(b);
04986 spy = spy + b;
04987 if(j - l + 1 < ymin)
04988 a = working_space[i][ymin][k + 2 * sizez_ext] / maxch;
04989
04990 else
04991 a = working_space[i][j - l + 1][k + 2 * sizez_ext] / maxch;
04992
04993 b = a - nim;
04994 if(a + nim <= 0)
04995 a = 1;
04996
04997 else
04998 a = TMath::Sqrt(a + nim);
04999
05000 b = b / a;
05001 b = TMath::Exp(b);
05002 smy = smy + b;
05003 }
05004 spz = 0,smz = 0;
05005 nip = working_space[i + 1][j + 1][k + 2 * sizez_ext] / maxch;
05006 nim = working_space[i + 1][j + 1][k + 1 + 2 * sizez_ext] / maxch;
05007 for(l = 1;l <= averWindow; l++ ){
05008 if(j + l > zmax)
05009 a = working_space[i][j][zmax + 2 * sizez_ext] / maxch;
05010
05011 else
05012 a = working_space[i][j][k + l + 2 * sizez_ext] / maxch;
05013
05014 b = a - nip;
05015 if(a + nip <= 0)
05016 a = 1;
05017
05018 else
05019 a = TMath::Sqrt(a + nip);
05020
05021 b = b / a;
05022 b = TMath::Exp(b);
05023 spz = spz + b;
05024 if(j - l + 1 < ymin)
05025 a = working_space[i][j][zmin + 2 * sizez_ext] / maxch;
05026
05027 else
05028 a = working_space[i][j][k - l + 1 + 2 * sizez_ext] / maxch;
05029
05030 b = a - nim;
05031 if(a + nim <= 0)
05032 a = 1;
05033
05034 else
05035 a = TMath::Sqrt(a + nim);
05036
05037 b = b / a;
05038 b = TMath::Exp(b);
05039 smz = smz + b;
05040 }
05041 a = (spx * working_space[i][j + 1][k + 1] + spy * working_space[i + 1][j][k + 1] + spz * working_space[i + 1][j + 1][k]) / (smx + smy + smz);
05042 working_space[i + 1][j + 1][k + 1] = a;
05043 nom = nom + a;
05044 }
05045 }
05046 }
05047 a = 0;
05048 for(i = xmin;i <= xmax; i++){
05049 for(j = ymin;j <= ymax; j++){
05050 for(k = zmin;k <= zmax; k++){
05051 working_space[i][j][k] = working_space[i][j][k] / nom;
05052 a+=working_space[i][j][k];
05053 }
05054 }
05055 }
05056 for(i = 0;i < sizex_ext; i++){
05057 for(j = 0;j < sizey_ext; j++){
05058 for(k = 0;k < sizez_ext; k++){
05059 working_space[i][j][k + 2 * sizez_ext] = working_space[i][j][k] * plocha_markov / a;
05060 }
05061 }
05062 }
05063 }
05064
05065 maximum = 0;
05066 for(k = 0;k < ssizez; k++){
05067 for(j = 0;j < ssizey; j++){
05068 for(i = 0;i < ssizex; i++){
05069 working_space[i][j][k] = 0;
05070 working_space[i][j][sizez_ext + k] = 0;
05071 if(working_space[i][j][k + 3 * sizez_ext] > maximum)
05072 maximum=working_space[i][j][k+3*sizez_ext];
05073 }
05074 }
05075 }
05076 for(i = 0;i < PEAK_WINDOW; i++){
05077 c[i] = 0;
05078 }
05079 j = (int)(pocet_sigma * sigma + 0.5);
05080 for(i = -j;i <= j; i++){
05081 a=i;
05082 a = -a * a;
05083 b = 2.0 * sigma * sigma;
05084 a = a / b;
05085 a = TMath::Exp(a);
05086 s = i;
05087 s = s * s;
05088 s = s - sigma * sigma;
05089 s = s / (sigma * sigma * sigma * sigma);
05090 s = s * a;
05091 c[PEAK_WINDOW / 2 + i] = s;
05092 }
05093 norma = 0;
05094 for(i = 0;i < PEAK_WINDOW; i++){
05095 norma = norma + TMath::Abs(c[i]);
05096 }
05097 for(i = 0;i < PEAK_WINDOW; i++){
05098 c[i] = c[i] / norma;
05099 }
05100 a = pocet_sigma * sigma + 0.5;
05101 i = (int)a;
05102 zmin = i;
05103 zmax = sizez_ext - i - 1;
05104 ymin = i;
05105 ymax = sizey_ext - i - 1;
05106 xmin = i;
05107 xmax = sizex_ext - i - 1;
05108 lmin = PEAK_WINDOW / 2 - i;
05109 lmax = PEAK_WINDOW / 2 + i;
05110 for(i = xmin;i <= xmax; i++){
05111 for(j = ymin;j <= ymax; j++){
05112 for(k = zmin;k <= zmax; k++){
05113 s = 0,f = 0;
05114 for(li = lmin;li <= lmax; li++){
05115 for(lj = lmin;lj <= lmax; lj++){
05116 for(lk = lmin;lk <= lmax; lk++){
05117 a = working_space[i + li - PEAK_WINDOW / 2][j + lj - PEAK_WINDOW / 2][k + lk - PEAK_WINDOW / 2 + 2 * sizez_ext];
05118 b = c[li] * c[lj] * c[lk];
05119 s += a * b;
05120 f += a * b * b;
05121 }
05122 }
05123 }
05124 working_space[i][j][k] = s;
05125 working_space[i][j][k + sizez_ext] = TMath::Sqrt(f);
05126 }
05127 }
05128 }
05129 for(x = xmin;x <= xmax; x++){
05130 for(y = ymin + 1;y < ymax; y++){
05131 for(z = zmin + 1;z < zmax; z++){
05132 val = working_space[x][y][z];
05133 val1 = working_space[x - 1][y - 1][z - 1];
05134 val2 = working_space[x ][y - 1][z - 1];
05135 val3 = working_space[x + 1][y - 1][z - 1];
05136 val4 = working_space[x - 1][y ][z - 1];
05137 val5 = working_space[x ][y ][z - 1];
05138 val6 = working_space[x + 1][y ][z - 1];
05139 val7 = working_space[x - 1][y + 1][z - 1];
05140 val8 = working_space[x ][y + 1][z - 1];
05141 val9 = working_space[x + 1][y + 1][z - 1];
05142 val10 = working_space[x - 1][y - 1][z ];
05143 val11 = working_space[x ][y - 1][z ];
05144 val12 = working_space[x + 1][y - 1][z ];
05145 val13 = working_space[x - 1][y ][z ];
05146 val14 = working_space[x + 1][y ][z ];
05147 val15 = working_space[x - 1][y + 1][z ];
05148 val16 = working_space[x ][y + 1][z ];
05149 val17 = working_space[x + 1][y + 1][z ];
05150 val18 = working_space[x - 1][y - 1][z + 1];
05151 val19 = working_space[x ][y - 1][z + 1];
05152 val20 = working_space[x + 1][y - 1][z + 1];
05153 val21 = working_space[x - 1][y ][z + 1];
05154 val22 = working_space[x ][y ][z + 1];
05155 val23 = working_space[x + 1][y ][z + 1];
05156 val24 = working_space[x - 1][y + 1][z + 1];
05157 val25 = working_space[x ][y + 1][z + 1];
05158 val26 = working_space[x + 1][y + 1][z + 1];
05159 f = -s_f_ratio_peaks * working_space[x][y][z + sizez_ext];
05160 if(val < f && val < val1 && val < val2 && val < val3 && val < val4 && val < val5 && val < val6 && val < val7 && val < val8 && val < val9 && val < val10 && val < val11 && val < val12 && val < val13 && val < val14 && val < val15 && val < val16 && val < val17 && val < val18 && val < val19 && val < val20 && val < val21 && val < val22 && val < val23 && val < val24 && val < val25 && val < val26){
05161 s=0,f=0;
05162 for(li = lmin;li <= lmax; li++){
05163 a = working_space[x + li - PEAK_WINDOW / 2][y][z + 2 * sizez_ext];
05164 s += a * c[li];
05165 f += a * c[li] * c[li];
05166 }
05167 f = -s_f_ratio_peaks * sqrt(f);
05168 if(s < f){
05169 s = 0,f = 0;
05170 for(li = lmin;li <= lmax; li++){
05171 a = working_space[x][y + li - PEAK_WINDOW / 2][z + 2 * sizez_ext];
05172 s += a * c[li];
05173 f += a * c[li] * c[li];
05174 }
05175 f = -s_f_ratio_peaks * sqrt(f);
05176 if(s < f){
05177 s = 0,f = 0;
05178 for(li = lmin;li <= lmax; li++){
05179 a = working_space[x][y][z + li - PEAK_WINDOW / 2 + 2 * sizez_ext];
05180 s += a * c[li];
05181 f += a * c[li] * c[li];
05182 }
05183 f = -s_f_ratio_peaks * sqrt(f);
05184 if(s < f){
05185 s = 0,f = 0;
05186 for(li = lmin;li <= lmax; li++){
05187 for(lj = lmin;lj <= lmax; lj++){
05188 a = working_space[x + li - PEAK_WINDOW / 2][y + lj - PEAK_WINDOW / 2][z + 2 * sizez_ext];
05189 s += a * c[li] * c[lj];
05190 f += a * c[li] * c[li] * c[lj] * c[lj];
05191 }
05192 }
05193 f = s_f_ratio_peaks * sqrt(f);
05194 if(s > f){
05195 s = 0,f = 0;
05196 for(li = lmin;li <= lmax; li++){
05197 for(lj = lmin;lj <= lmax; lj++){
05198 a = working_space[x + li - PEAK_WINDOW / 2][y][z + lj - PEAK_WINDOW / 2 + 2 * sizez_ext];
05199 s += a * c[li] * c[lj];
05200 f += a * c[li] * c[li] * c[lj] * c[lj];
05201 }
05202 }
05203 f = s_f_ratio_peaks * sqrt(f);
05204 if(s > f){
05205 s = 0,f = 0;
05206 for(li = lmin;li <= lmax; li++){
05207 for(lj=lmin;lj<=lmax;lj++){
05208 a = working_space[x][y + li - PEAK_WINDOW / 2][z + lj - PEAK_WINDOW / 2 + 2 * sizez_ext];
05209 s += a * c[li] * c[lj];
05210 f += a * c[li] * c[li] * c[lj] * c[lj];
05211 }
05212 }
05213 f = s_f_ratio_peaks * sqrt(f);
05214 if(s > f){
05215 if(x >= shift && x < ssizex + shift && y >= shift && y < ssizey + shift && z >= shift && z < ssizez + shift){
05216 if(working_space[x][y][z + 3 * sizez_ext] > threshold * maximum / 100.0){
05217 if(peak_index<fMaxPeaks){
05218 for(k = x - 1,a = 0,b = 0;k <= x + 1; k++){
05219 a += (double)(k - shift) * working_space[k][y][z];
05220 b += working_space[k][y][z];
05221 }
05222 fPositionX[peak_index] = a / b;
05223 for(k = y - 1,a = 0,b = 0;k <= y + 1; k++){
05224 a += (double)(k - shift) * working_space[x][k][z];
05225 b += working_space[x][k][z];
05226 }
05227 fPositionY[peak_index] = a / b;
05228 for(k = z - 1,a = 0,b = 0;k <= z + 1; k++){
05229 a += (double)(k - shift) * working_space[x][y][k];
05230 b += working_space[x][y][k];
05231 }
05232 fPositionZ[peak_index] = a / b;
05233 peak_index += 1;
05234 }
05235 }
05236 }
05237 }
05238 }
05239 }
05240 }
05241 }
05242 }
05243 }
05244 }
05245 }
05246 }
05247 for(i = 0;i < ssizex; i++){
05248 for(j = 0;j < ssizey; j++){
05249 for(k = 0;k < ssizez; k++){
05250 val = -working_space[i + shift][j + shift][k + shift];
05251 if( val < 0)
05252 val = 0;
05253 dest[i][j][k] = val;
05254 }
05255 }
05256 }
05257 k = (int)(4 * sigma + 0.5);
05258 k = 4 * k;
05259 for(i = 0;i < ssizex + k; i++){
05260 for(j = 0;j < ssizey + k; j++)
05261 delete[] working_space[i][j];
05262 delete[] working_space[i];
05263 }
05264 delete[] working_space;
05265 fNPeaks = peak_index;
05266 return fNPeaks;
05267 }