TSpectrum3.cxx

Go to the documentation of this file.
00001 // @(#)root/spectrum:$Id: TSpectrum3.cxx 35373 2010-09-17 13:25:30Z brun $
00002 // Author: Miroslav Morhac   25/09/2006
00003 
00004 /////////////////////////////////////////////////////////////////////////////
00005 //   THIS CLASS CONTAINS ADVANCED SPECTRA PROCESSING FUNCTIONS.            //
00006 //                                                                         //
00007 //   THREE-DIMENSIONAL BACKGROUND ESTIMATION FUNCTIONS                     //
00008 //   THREE-DIMENSIONAL SMOOTHING FUNCTIONS                                 //
00009 //   THREE-DIMENSIONAL DECONVOLUTION FUNCTIONS                             //
00010 //   THREE-DIMENSIONAL PEAK SEARCH FUNCTIONS                               //
00011 //                                                                         //
00012 //   These functions were written by:                                      //
00013 //   Miroslav Morhac                                                       //
00014 //   Institute of Physics                                                  //
00015 //   Slovak Academy of Sciences                                            //
00016 //   Dubravska cesta 9, 842 28 BRATISLAVA                                  //
00017 //   SLOVAKIA                                                              //
00018 //                                                                         //
00019 //   email:fyzimiro@savba.sk,    fax:+421 7 54772479                       //
00020 //                                                                         //
00021 //  The original code in C has been repackaged as a C++ class by R.Brun    //
00022 //                                                                         //
00023 //  The algorithms in this class have been published in the following      //
00024 //  references:                                                            //
00025 //   [1]  M.Morhac et al.: Background elimination methods for              //
00026 //   multidimensional coincidence gamma-ray spectra. Nuclear               //
00027 //   Instruments and Methods in Physics Research A 401 (1997) 113-         //
00028 //   132.                                                                  //
00029 //                                                                         //
00030 //   [2]  M.Morhac et al.: Efficient one- and two-dimensional Gold         //
00031 //   deconvolution and its application to gamma-ray spectra                //
00032 //   decomposition. Nuclear Instruments and Methods in Physics             //
00033 //   Research A 401 (1997) 385-408.                                        //
00034 //                                                                         //
00035 //   [3] M. Morhac et al.: Efficient algorithm of multidimensional         //
00036 //   deconvolution and its application to nuclear data processing. Digital //
00037 //   Signal Processing, Vol. 13, No. 1, (2003), 144-171.                   //
00038 //                                                                         //
00039 //   [4]  M.Morhac et al.: Identification of peaks in multidimensional     //
00040 //   coincidence gamma-ray spectra. Nuclear Instruments and Methods in     //
00041 //   Research Physics A  443(2000), 108-125.                               //
00042 //                                                                         //
00043 //   These NIM papers are also available as Postscript files from:         //
00044 //
00045 //
00046 //   ftp://root.cern.ch/root/SpectrumDec.ps.gz
00047 //   ftp://root.cern.ch/root/SpectrumSrc.ps.gz
00048 //   ftp://root.cern.ch/root/SpectrumBck.ps.gz
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    // Constructor.
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 //  maxpositions:  maximum number of peaks
00082 //  resolution:    determines resolution of the neighboring peaks
00083 //                 default value is 1 correspond to 3 sigma distance
00084 //                 between peaks. Higher values allow higher resolution
00085 //                 (smaller distance between peaks.
00086 //                 May be set later through SetResolution.
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    // Destructor.
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 //   ONE-DIMENSIONAL BACKGROUND ESTIMATION FUNCTION                        //
00117 //   This function calculates background spectrum from source in h.        //
00118 //   The result is placed in the vector pointed by spectrum pointer.       //
00119 //                                                                         //
00120 //   Function parameters:                                                  //
00121 //   spectrum:  pointer to the vector of source spectrum                   //
00122 //   size:      length of spectrum and working space vectors               //
00123 //   number_of_iterations, for details we refer to manual                  //
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    // Print the array of positions
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 //   ONE-DIMENSIONAL PEAK SEARCH FUNCTION                                  //
00150 //   This function searches for peaks in source spectrum in hin            //
00151 //   The number of found peaks and their positions are written into        //
00152 //   the members fNpeaks and fPositionX.                                   //
00153 //                                                                         //
00154 //   Function parameters:                                                  //
00155 //   hin:       pointer to the histogram of source spectrum                //
00156 //   sigma:   sigma of searched peaks, for details we refer to manual      //
00157 //            Note that sigma is in number of bins                         //
00158 //   threshold: (default=0.05)  peaks with amplitude less than             //
00159 //       threshold*highest_peak are discarded.                             //
00160 //                                                                         //
00161 //   if option is not equal to "goff" (goff is the default), then          //
00162 //   a polymarker object is created and added to the list of functions of  //
00163 //   the histogram. The histogram is drawn with the specified option and   //
00164 //   the polymarker object drawn on top of the histogram.                  //
00165 //   The polymarker coordinates correspond to the npeaks peaks found in    //
00166 //   the histogram.                                                        //
00167 //   A pointer to the polymarker object can be retrieved later via:        //
00168 //    TList *functions = hin->GetListOfFunctions();                        //
00169 //    TPolyMarker *pm = (TPolyMarker*)functions->FindObject("TPolyMarker") //
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    //the smoothing option is used for 1-d but not for 2-d histograms
00197    npeaks = SearchHighRes((const float***)source, dest, sizex, sizey, sizez, sigma, 100*threshold, kTRUE, 3, kFALSE, 3);
00198 
00199    //The logic in the loop should be improved to use the fact
00200    //that fPositionX,Y give a precise position inside a bin.
00201    //The current algorithm takes the center of the bin only.
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 //  resolution: determines resolution of the neighboring peaks
00232 //              default value is 1 correspond to 3 sigma distance
00233 //              between peaks. Higher values allow higher resolution
00234 //              (smaller distance between peaks.
00235 //              May be set later through SetResolution.
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 // THREE-DIMENSIONAL BACKGROUND ESTIMATION FUNCTIONS                         //
00253 // This function calculates background spectrum from source spectrum.        //
00254 // The result is placed to the array pointed by spectrum pointer.            //
00255 //                                                                           //
00256 // Function parameters:                                                      //
00257 // spectrum-pointer to the array of source spectrum                          //
00258 // ssizex-x length of spectrum                                               //
00259 // ssizey-y length of spectrum                                               //
00260 // ssizez-z length of spectrum                                               //
00261 // numberIterationsX-maximal x width of clipping window                      //
00262 // numberIterationsY-maximal y width of clipping window                      //
00263 // numberIterationsZ-maximal z width of clipping window                      //
00264 //                           for details we refer to manual                  //
00265 // direction- direction of change of clipping window                         //
00266 //               - possible values=kBackIncreasingWindow                     //
00267 //                                 kBackDecreasingWindow                     //
00268 // filterType-determines the algorithm of the filtering                      //
00269 //                  -possible values=kBackSuccessiveFiltering                //
00270 //                                   kBackOneStepFiltering                   //
00271 //                                                                           //
00272 //                                                                           //
00273 ///////////////////////////////////////////////////////////////////////////////
00274 //Begin_Html <!--
00275 /* -->
00276 <div class=Section1>
00277 
00278 <p class=MsoNormal style='text-align:justify'><b><span style='font-size:14.0pt'>Background
00279 estimation</span></b></p>
00280 
00281 <p class=MsoNormal style='text-align:justify'><i>&nbsp;</i></p>
00282 
00283 <p class=MsoNormal style='text-align:justify'><i>Goal: Separation of useful
00284 information (peaks) from useless information (background)</i> </p>
00285 
00286 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
00287 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
00288 </span>method is based on Sensitive Nonlinear Iterative Peak (SNIP) clipping
00289 algorithm [1]</p>
00290 
00291 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
00292 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
00293 </span>there exist two algorithms for the estimation of new value in the
00294 channel “<sub><img width=43 height=24 src="gif/gif/spectrum3_background_image001.gif"></sub>”</p>
00295 
00296 <p class=MsoNormal style='margin-left:18.0pt;text-align:justify'>&nbsp;</p>
00297 
00298 <p class=MsoNormal style='text-align:justify'><i>Algorithm based on Successive
00299 Comparisons</i></p>
00300 
00301 <p class=MsoNormal style='text-align:justify'>It is an extension of
00302 one-dimensional SNIP algorithm to another dimension. For details we refer to
00303 [2].</p>
00304 
00305 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
00306 
00307 <p class=MsoNormal style='text-align:justify'><i>Algorithm based on One Step
00308 Filtering</i></p>
00309 
00310 <p class=MsoNormal style='text-align:justify'>The algorithm is analogous to
00311 that for 2-dimensional data. For details we refer to TSpectrum2. New value in
00312 the estimated channel is calculated as</p>
00313 
00314 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
00315 
00316 <p class=MsoNormal style='text-align:justify'><sub><img width=103 height=26
00317 src="gif/gif/spectrum3_background_image002.gif"></sub></p>
00318 
00319 <p class=MsoNormal style='text-align:justify'><sub><img width=621 height=408
00320 src="gif/gif/spectrum3_background_image003.gif"></sub><sub><img width=148 height=27
00321 src="gif/gif/spectrum3_background_image004.gif"></sub></p>
00322 
00323 <p class=MsoNormal>&nbsp;</p>
00324 
00325 <p class=MsoNormal style='text-align:justify'>where p = 1, 2, …,
00326 number_of_iterations. </p>
00327 
00328 <p class=MsoNormal><i>&nbsp;</i></p>
00329 
00330 <p class=MsoNormal><i>Function:</i></p>
00331 
00332 <p class=MsoNormal style='text-align:justify'><b>const <a
00333 href="http://root.cern.ch/root/html/ListOfTypes.html#char" target="_parent">char</a>*
00334 </b><a href="http://root.cern.ch/root/html/TSpectrum.html#TSpectrum:Fit1Awmi"><b>TSpectrum3::Background</b></a><b>
00335 (<a href="http://root.cern.ch/root/html/ListOfTypes.html#float" target="_parent">float</a>
00336 ***fSpectrum, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
00337 target="_parent">int</a> fSizex, <a
00338 href="http://root.cern.ch/root/html/ListOfTypes.html#int" target="_parent">int</a>
00339 fSizey, int fSizez, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
00340 target="_parent">int</a> fNumberIterationsX, <a
00341 href="http://root.cern.ch/root/html/ListOfTypes.html#int" target="_parent">int</a>
00342 fNumberIterationsY, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
00343 target="_parent">int</a> fNumberIterationsZ,  <a
00344 href="http://root.cern.ch/root/html/ListOfTypes.html#int" target="_parent">int</a>
00345 fDirection, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
00346 target="_parent">int</a> fFilterType)  </b></p>
00347 
00348 <p class=MsoNormal>&nbsp;</p>
00349 
00350 <p class=MsoNormal style='text-align:justify'>This function calculates
00351 background spectrum from the source spectrum.  The result is placed in the matrix
00352 pointed by fSpectrum pointer.  One can also switch the direction of the change
00353 of the clipping window and to select one of the two above given algorithms. On
00354 successful completion it returns 0. On error it returns pointer to the string
00355 describing error.</p>
00356 
00357 <p class=MsoNormal>&nbsp;</p>
00358 
00359 <p class=MsoNormal><i><span style='color:red'>Parameters:</span></i></p>
00360 
00361 <p class=MsoNormal>        <b>fSpectrum</b>-pointer to the matrix of source
00362 spectrum                  </p>
00363 
00364 <p class=MsoNormal>        <b>fSizex, fSizey, fSizez </b>-lengths of the
00365 spectrum matrix                                 </p>
00366 
00367 <p class=MsoNormal style='text-align:justify'>        <b>fNumberIterationsX,
00368 fNumberIterationsY, fNumberIterationsZ </b>maximal</p>
00369 
00370 <p class=MsoNormal style='text-align:justify'>        widths of clipping window,                                
00371 </p>
00372 
00373 <p class=MsoNormal>        <b>fDirection</b>- direction of change of clipping
00374 window                  </p>
00375 
00376 <p class=MsoNormal>               - possible
00377 values=kBackIncreasingWindow                      </p>
00378 
00379 <p class=MsoNormal>                                           
00380 kBackDecreasingWindow                      </p>
00381 
00382 <p class=MsoNormal>        <b>fFilterType</b>-type of the clipping algorithm,          
00383                    </p>
00384 
00385 <p class=MsoNormal>                  -possible values=kBack SuccessiveFiltering</p>
00386 
00387 <p class=MsoNormal>                                             
00388 kBackOneStepFiltering                              </p>
00389 
00390 <p class=MsoNormal>&nbsp;</p>
00391 
00392 <p class=MsoNormal><b><i>References:</i></b></p>
00393 
00394 <p class=MsoNormal style='text-align:justify'>[1]  C. G Ryan et al.: SNIP, a
00395 statistics-sensitive background treatment for the quantitative analysis of PIXE
00396 spectra in geoscience applications. NIM, B34 (1988), 396-402.</p>
00397 
00398 <p class=MsoNormal style='text-align:justify'>[2] <span lang=SK> M.
00399 Morhá&#269;, J. Kliman, V. Matoušek, M. Veselský, I. Turzo</span>.: Background
00400 elimination methods for multidimensional gamma-ray spectra. NIM, A401 (1997)
00401 113-132.</p>
00402 
00403 <p class=MsoNormal style='text-align:justify'><span style='font-size:16.0pt'>&nbsp;</span></p>
00404 
00405 <p class=MsoNormal><i>Example 1– script Back3.c :</i></p>
00406 
00407 <p class=MsoNormal><i><span style='font-size:18.0pt'><img border=0 width=601
00408 height=368 src="gif/gif/spectrum3_background_image005.jpg"></span></i></p>
00409 
00410 <p class=MsoNormal>&nbsp;</p>
00411 
00412 <p class=MsoNormal style='text-align:justify'><b>Fig. 1 Original three-dimensional
00413 gamma-gamma-gamma-ray spectrum</b></p>
00414 
00415 <p class=MsoNormal style='text-align:justify'><b><span style='font-size:16.0pt'><img
00416 border=0 width=601 height=368 src="gif/gif/spectrum3_background_image006.jpg"></span></b></p>
00417 
00418 <p class=MsoNormal style='text-align:justify'><b>Fig. 2 Background estimated
00419 from data from Fig. 1 using decreasing clipping window with widths 5, 5, 5 and
00420 algorithm based on successive comparisons. The estimate includes not only
00421 continuously changing background but also one- and two-dimensional ridges.</b></p>
00422 
00423 <p class=MsoNormal><b><span style='font-size:14.0pt;color:green'>&nbsp;</span></b></p>
00424 
00425 <p class=MsoNormal><b><span style='font-size:14.0pt;color:green'><img border=0
00426 width=601 height=368 src="gif/spectrum3_background_image007.jpg"></span></b></p>
00427 
00428 <p class=MsoNormal style='text-align:justify'><b>Fig. 3 Resulting peaks after
00429 subtraction of the estimated background (Fig. 2) from original three-dimensional
00430 gamma-gamma-gamma-ray spectrum (Fig. 1).</b></p>
00431 
00432 <p class=MsoNormal><b><span style='color:green'>&nbsp;</span></b></p>
00433 
00434 <p class=MsoNormal><b><span style='color:green'>&nbsp;</span></b></p>
00435 
00436 <p class=MsoNormal><b><span style='color:green'>Script:</span></b></p>
00437 
00438 <p class=MsoNormal><span style='font-size:10.0pt'>// Example to illustrate the
00439 background estimator (class TSpectrum3).</span></p>
00440 
00441 <p class=MsoNormal><span style='font-size:10.0pt'>// To execute this example,
00442 do</span></p>
00443 
00444 <p class=MsoNormal><span style='font-size:10.0pt'>// root &gt; .x Back3.C</span></p>
00445 
00446 <p class=MsoNormal><span style='font-size:10.0pt'>&nbsp;</span></p>
00447 
00448 <p class=MsoNormal><span style='font-size:10.0pt'>void Back3() {</span></p>
00449 
00450 <p class=MsoNormal><span style='font-size:10.0pt'>   Int_t i, j, k;</span></p>
00451 
00452 <p class=MsoNormal><span style='font-size:10.0pt'>   </span><span lang=FR
00453 style='font-size:10.0pt'>Int_t nbinsx = 64;</span></p>
00454 
00455 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsy = 64;</span></p>
00456 
00457 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsz =
00458 64;   </span></p>
00459 
00460 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmin  = 0;</span></p>
00461 
00462 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmax  =
00463 nbinsx;</span></p>
00464 
00465 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymin  = 0;</span></p>
00466 
00467 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymax  =
00468 nbinsy;   </span></p>
00469 
00470 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t zmin  = 0;</span></p>
00471 
00472 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   </span><span
00473 style='font-size:10.0pt'>Int_t zmax  = nbinsz;      </span></p>
00474 
00475 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** source = new
00476 float **[nbinsx];</span></p>
00477 
00478 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** dest = new float
00479 **[nbinsx];      </span></p>
00480 
00481 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
00482 
00483 <p class=MsoNormal><span style='font-size:10.0pt'>      source[i]=new float*
00484 [nbinsy];</span></p>
00485 
00486 <p class=MsoNormal><span style='font-size:10.0pt'>     
00487 for(j=0;j&lt;nbinsy;j++)</span></p>
00488 
00489 <p class=MsoNormal><span style='font-size:10.0pt'>         source[i][j]=new
00490 float [nbinsz];</span></p>
00491 
00492 <p class=MsoNormal><span style='font-size:10.0pt'>   }           </span></p>
00493 
00494 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
00495 
00496 <p class=MsoNormal><span style='font-size:10.0pt'>      dest[i]=new float*
00497 [nbinsy];</span></p>
00498 
00499 <p class=MsoNormal><span style='font-size:10.0pt'>     
00500 for(j=0;j&lt;nbinsy;j++)</span></p>
00501 
00502 <p class=MsoNormal><span style='font-size:10.0pt'>         dest[i][j]=new float
00503 [nbinsz];</span></p>
00504 
00505 <p class=MsoNormal><span style='font-size:10.0pt'>   }              </span></p>
00506 
00507 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *back = new
00508 TH3F(&quot;back&quot;,&quot;Background
00509 estimation&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);</span></p>
00510 
00511 <p class=MsoNormal><span style='font-size:10.0pt'>   TFile *f = new
00512 TFile(&quot;TSpectrum3.root&quot;);</span></p>
00513 
00514 <p class=MsoNormal><span style='font-size:10.0pt'>   back=(TH3F*)
00515 f-&gt;Get(&quot;back;1&quot;);</span></p>
00516 
00517 <p class=MsoNormal><span style='font-size:10.0pt'>   TCanvas *Background = new
00518 TCanvas(&quot;Background&quot;,&quot;Estimation of background with decreasing
00519 window&quot;,10,10,1000,700);</span></p>
00520 
00521 <p class=MsoNormal><span style='font-size:10.0pt'>   TSpectrum3 *s = new
00522 TSpectrum3();</span></p>
00523 
00524 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
00525 i++){</span></p>
00526 
00527 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
00528 nbinsy; j++){</span></p>
00529 
00530 <p class=MsoNormal><span style='font-size:10.0pt'>                  for (k = 0;
00531 k &lt; nbinsz; k++){</span></p>
00532 
00533 <p class=MsoNormal><span style='font-size:10.0pt'>                       source[i][j][k]
00534 = back-&gt;GetBinContent(i + 1,j + 1,k + 1);</span></p>
00535 
00536 <p class=MsoNormal><span style='font-size:10.0pt'>                       dest[i][j][k]
00537 = back-&gt;GetBinContent(i + 1,j + 1,k + 1);                     </span></p>
00538 
00539 <p class=MsoNormal><span style='font-size:10.0pt'>                    } </span></p>
00540 
00541 <p class=MsoNormal><span style='font-size:10.0pt'>                 }</span></p>
00542 
00543 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
00544 
00545 <p class=MsoNormal><span style='font-size:10.0pt'>  
00546 s-&gt;Background(dest,nbinsx,nbinsy,nbinsz,5,5,5,s-&gt;kBackDecreasingWindow,s-&gt;kBackSuccessiveFiltering);</span></p>
00547 
00548 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
00549 i++){</span></p>
00550 
00551 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
00552 nbinsy; j++){</span></p>
00553 
00554 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
00555 nbinsz; k++){</span></p>
00556 
00557 <p class=MsoNormal><span style='font-size:10.0pt'>          
00558 back-&gt;SetBinContent(i + 1,j + 1,k + 1, dest[i][j][k]);</span></p>
00559 
00560 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
00561 
00562 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
00563 
00564 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
00565 
00566 <p class=MsoNormal><span style='font-size:10.0pt'>&nbsp;</span></p>
00567 
00568 <p class=MsoNormal><span style='font-size:10.0pt'>   FILE *out;</span></p>
00569 
00570 <p class=MsoNormal><span style='font-size:10.0pt'>   char PATH[80];   </span></p>
00571 
00572 <p class=MsoNormal><span style='font-size:10.0pt'>  
00573 strcpy(PATH,&quot;spectra3\\back_output_5ds.spe&quot;);   </span></p>
00574 
00575 <p class=MsoNormal><span style='font-size:10.0pt'>   out=fopen(PATH,&quot;wb&quot;);</span></p>
00576 
00577 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
00578 
00579 <p class=MsoNormal><span style='font-size:10.0pt'>     
00580 for(j=0;j&lt;nbinsy;j++){                   </span></p>
00581 
00582 <p class=MsoNormal><span style='font-size:10.0pt'>         fwrite(dest[i][j],
00583 sizeof(dest[0][0][0]),nbinsz,out);</span></p>
00584 
00585 <p class=MsoNormal><span style='font-size:10.0pt'>      }</span></p>
00586 
00587 <p class=MsoNormal><span style='font-size:10.0pt'>   }   </span></p>
00588 
00589 <p class=MsoNormal><span style='font-size:10.0pt'>   fclose(out);   </span></p>
00590 
00591 <p class=MsoNormal><span style='font-size:10.0pt'>   </span></p>
00592 
00593 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
00594 i++){</span></p>
00595 
00596 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
00597 nbinsy; j++){</span></p>
00598 
00599 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
00600 nbinsz; k++){</span></p>
00601 
00602 <p class=MsoNormal><span style='font-size:10.0pt'>           source[i][j][k] =
00603 source[i][j][k] - dest[i][j][k];</span></p>
00604 
00605 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
00606 
00607 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
00608 
00609 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
00610 
00611 <p class=MsoNormal><span style='font-size:10.0pt'>   </span></p>
00612 
00613 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
00614 i++){</span></p>
00615 
00616 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
00617 nbinsy; j++){</span></p>
00618 
00619 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
00620 nbinsz; k++){</span></p>
00621 
00622 <p class=MsoNormal><span style='font-size:10.0pt'>          
00623 back-&gt;SetBinContent(i + 1,j + 1,k + 1, source[i][j][k]);</span></p>
00624 
00625 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
00626 
00627 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
00628 
00629 <p class=MsoNormal><span style='font-size:10.0pt'>   }   </span></p>
00630 
00631 <p class=MsoNormal><span style='font-size:10.0pt'>   </span></p>
00632 
00633 <p class=MsoNormal><span style='font-size:10.0pt'>  
00634 strcpy(PATH,&quot;spectra3\\back_peaks_5ds.spe&quot;);   </span></p>
00635 
00636 <p class=MsoNormal><span style='font-size:10.0pt'>  
00637 out=fopen(PATH,&quot;wb&quot;);</span></p>
00638 
00639 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
00640 
00641 <p class=MsoNormal><span style='font-size:10.0pt'>     
00642 for(j=0;j&lt;nbinsy;j++){                   </span></p>
00643 
00644 <p class=MsoNormal><span style='font-size:10.0pt'>         fwrite(source[i][j],
00645 sizeof(source[0][0][0]),nbinsz,out);</span></p>
00646 
00647 <p class=MsoNormal><span style='font-size:10.0pt'>      }</span></p>
00648 
00649 <p class=MsoNormal><span style='font-size:10.0pt'>   }   </span></p>
00650 
00651 <p class=MsoNormal><span style='font-size:10.0pt'>   fclose(out);      </span></p>
00652 
00653 <p class=MsoNormal><span style='font-size:10.0pt'>   </span></p>
00654 
00655 <p class=MsoNormal><span style='font-size:10.0pt'>  
00656 back-&gt;Draw(&quot;&quot;);  </span></p>
00657 
00658 <p class=MsoNormal><span style='font-size:10.0pt'>}</span></p>
00659 
00660 <p class=MsoNormal>&nbsp;</p>
00661 
00662 <p class=MsoNormal style='text-align:justify'><span style='font-size:16.0pt'>&nbsp;</span></p>
00663 
00664 </div>
00665 
00666 <!-- */
00667 // --> End_Html
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 // THREE-DIMENSIONAL MARKOV SPECTRUM SMOOTHING FUNCTION                    //
01049 //                                                                         //
01050 // This function calculates smoothed spectrum from source spectrum         //
01051 //      based on Markov chain method.                                      //
01052 // The result is placed in the array pointed by spectrum pointer.          //
01053 //                                                                         //
01054 // Function parameters:                                                    //
01055 // source-pointer to the array of source spectrum                          //
01056 // working_space-pointer to the working array                              //
01057 // ssizex-x length of spectrum and working space arrays                    //
01058 // ssizey-y length of spectrum and working space arrays                    //
01059 // ssizey-z length of spectrum and working space arrays                    //
01060 // averWindow-width of averaging smoothing window                          //
01061 //                                                                         //
01062 /////////////////////////////////////////////////////////////////////////////
01063 //Begin_Html <!--
01064 /* -->
01065 
01066 <div class=Section2>
01067 
01068 <p class=MsoNormal style='text-align:justify'><b><span style='font-size:14.0pt'>Smoothing</span></b></p>
01069 
01070 <p class=MsoNormal style='text-align:justify'><i>&nbsp;</i></p>
01071 
01072 <p class=MsoNormal><i>Goal: Suppression of statistical fluctuations</i></p>
01073 
01074 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01075 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01076 </span>the algorithm is based on discrete Markov chain, which has very simple
01077 invariant distribution</p>
01078 
01079 <p class=MsoNormal>&nbsp;</p>
01080 
01081 <p class=MsoNormal>            <sub><img width=404 height=42
01082 src="Smoothing_files/image001.gif"></sub><span style='font-family:Arial'>     </span></p>
01083 
01084 <p class=MsoNormal style='text-align:justify'><span style='font-family:Arial'>       
01085 </span><sub><img width=22 height=28 src="Smoothing_files/image002.gif"></sub><span
01086 style='font-family:Arial'>  </span>being defined from the normalization
01087 condition <sub><img width=50 height=37 src="Smoothing_files/image003.gif"></sub></p>
01088 
01089 <p class=MsoNormal>         n is the length of the smoothed spectrum and </p>
01090 
01091 <p class=MsoNormal>
01092 
01093 <table cellpadding=0 cellspacing=0 align=left>
01094  <tr>
01095   <td width=65 height=9></td>
01096  </tr>
01097  <tr>
01098   <td></td>
01099   <td><img width=205 height=48 src="Smoothing_files/image004.gif"></td>
01100  </tr>
01101 </table>
01102 
01103  &nbsp;</p>
01104 
01105 <p class=MsoNormal>&nbsp;</p>
01106 
01107 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
01108 
01109 <br clear=ALL>
01110 
01111 <p class=MsoNormal style='margin-left:34.2pt;text-align:justify'>is the
01112 probability of the change of the peak position from channel i to the channel
01113 i+1.  <sub><img width=24 height=31 src="Smoothing_files/image005.gif"></sub>is
01114 the normalization constant so that <sub><img width=99 height=25
01115 src="Smoothing_files/image006.gif"></sub> and m is a width of smoothing window.
01116 We have extended this algorithm to three dimensions. </p>
01117 
01118 <p class=MsoNormal><i>&nbsp;</i></p>
01119 
01120 <p class=MsoNormal><i>Function:</i></p>
01121 
01122 <p class=MsoNormal><b>const <a
01123 href="http://root.cern.ch/root/html/ListOfTypes.html#char" target="_parent">char</a>*
01124 </b><a href="http://root.cern.ch/root/html/TSpectrum.html#TSpectrum:Fit1Awmi"><b>TSpectrum3::SmoothMarkov</b></a><b>(<a
01125 href="http://root.cern.ch/root/html/ListOfTypes.html#float" target="_parent">float</a>
01126 ***fSpectrum, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
01127 target="_parent">int</a> fSizex, <a
01128 href="http://root.cern.ch/root/html/ListOfTypes.html#int" target="_parent">int</a>
01129 fSizey, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int"
01130 target="_parent">int</a> fSizey,  <a
01131 href="http://root.cern.ch/root/html/ListOfTypes.html#int" target="_parent">int</a>
01132 fAverWindow)  </b></p>
01133 
01134 <p class=MsoNormal>&nbsp;</p>
01135 
01136 <p class=MsoNormal style='text-align:justify'>This function calculates smoothed
01137 spectrum from the source spectrum based on Markov chain method. The result is
01138 placed in the field pointed by source pointer. On successful completion it
01139 returns 0. On error it returns pointer to the string describing error.</p>
01140 
01141 <p class=MsoNormal>&nbsp;</p>
01142 
01143 <p class=MsoNormal><i><span style='color:red'>Parameters:</span></i></p>
01144 
01145 <p class=MsoNormal>        <b>fSpectrum</b>-pointer to the matrix of source
01146 spectrum                  </p>
01147 
01148 <p class=MsoNormal>        <b>fSizex, fSizey, fSizez</b> -lengths of the
01149 spectrum matrix                                 </p>
01150 
01151 <p class=MsoNormal>        <b>fAverWindow</b>-width of averaging smoothing
01152 window </p>
01153 
01154 <p class=MsoNormal>&nbsp;</p>
01155 
01156 <p class=MsoNormal><b><i>Reference:</i></b></p>
01157 
01158 <p class=MsoNormal style='text-align:justify'>[1] Z.K. Silagadze, A new
01159 algorithm for automatic photopeak searches. NIM A 376 (1996), 451<b>.</b>  </p>
01160 
01161 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
01162 
01163 <p class=MsoNormal><i>Example 1 – script SmootMarkov3.c :</i></p>
01164 
01165 <p class=MsoNormal><i><img border=0 width=601 height=368
01166 src="Smoothing_files/image007.jpg"></i><b>Fig. 1 Original noisy spectrum.    </b></p>
01167 
01168 <p class=MsoNormal><b><img border=0 width=601 height=368
01169 src="Smoothing_files/image008.jpg"></b></p>
01170 
01171 <p class=MsoNormal><b>Fig. 2 Smoothed spectrum with averaging window m=3.</b></p>
01172 
01173 <p class=MsoNormal><b><span style='color:#339966'>&nbsp;</span></b></p>
01174 
01175 <p class=MsoNormal><b><span style='color:#339966'>Script:</span></b></p>
01176 
01177 <p class=MsoNormal><span style='font-size:10.0pt'>// Example to illustrate the
01178 Markov smoothing (class TSpectrum3).</span></p>
01179 
01180 <p class=MsoNormal><span style='font-size:10.0pt'>// To execute this example,
01181 do</span></p>
01182 
01183 <p class=MsoNormal><span style='font-size:10.0pt'>// root &gt; .x
01184 SmoothMarkov3.C</span></p>
01185 
01186 <p class=MsoNormal><span style='font-size:10.0pt'>&nbsp;</span></p>
01187 
01188 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>void SmoothMarkov3()
01189 {</span></p>
01190 
01191 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t i, j, k;</span></p>
01192 
01193 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsx = 64;</span></p>
01194 
01195 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsy = 64;</span></p>
01196 
01197 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsz =
01198 64;   </span></p>
01199 
01200 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmin  = 0;</span></p>
01201 
01202 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmax  =
01203 nbinsx;</span></p>
01204 
01205 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymin  = 0;</span></p>
01206 
01207 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymax  =
01208 nbinsy;   </span></p>
01209 
01210 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t zmin  = 0;</span></p>
01211 
01212 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   </span><span
01213 style='font-size:10.0pt'>Int_t zmax  = nbinsz;      </span></p>
01214 
01215 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** source = new
01216 float **[nbinsx];</span></p>
01217 
01218 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
01219 
01220 <p class=MsoNormal><span style='font-size:10.0pt'>      source[i]=new float*
01221 [nbinsy];</span></p>
01222 
01223 <p class=MsoNormal><span style='font-size:10.0pt'>     
01224 for(j=0;j&lt;nbinsy;j++)</span></p>
01225 
01226 <p class=MsoNormal><span style='font-size:10.0pt'>         source[i][j]=new
01227 float [nbinsz];</span></p>
01228 
01229 <p class=MsoNormal><span style='font-size:10.0pt'>   }           </span></p>
01230 
01231 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *sm = new
01232 TH3F(&quot;Smoothing&quot;,&quot;Markov
01233 smoothing&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);</span></p>
01234 
01235 <p class=MsoNormal><span style='font-size:10.0pt'>   TFile *f = new
01236 TFile(&quot;TSpectrum3.root&quot;);</span></p>
01237 
01238 <p class=MsoNormal><span style='font-size:10.0pt'>   sm=(TH3F*)
01239 f-&gt;Get(&quot;back;1&quot;);</span></p>
01240 
01241 <p class=MsoNormal><span style='font-size:10.0pt'>   TCanvas *Background = new
01242 TCanvas(&quot;Smoothing&quot;,&quot;Markov smoothing&quot;,10,10,1000,700);</span></p>
01243 
01244 <p class=MsoNormal><span style='font-size:10.0pt'>   TSpectrum3 *s = new
01245 TSpectrum3();</span></p>
01246 
01247 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
01248 i++){</span></p>
01249 
01250 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
01251 nbinsy; j++){</span></p>
01252 
01253 <p class=MsoNormal><span style='font-size:10.0pt'>                  for (k = 0;
01254 k &lt; nbinsz; k++){</span></p>
01255 
01256 <p class=MsoNormal><span style='font-size:10.0pt'>                       source[i][j][k]
01257 = sm-&gt;GetBinContent(i + 1,j + 1,k + 1);</span></p>
01258 
01259 <p class=MsoNormal><span style='font-size:10.0pt'>                    } </span></p>
01260 
01261 <p class=MsoNormal><span style='font-size:10.0pt'>                 }</span></p>
01262 
01263 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
01264 
01265 <p class=MsoNormal><span style='font-size:10.0pt'>  
01266 s-&gt;SmoothMarkov(source,nbinsx,nbinsy,nbinsz,3);</span></p>
01267 
01268 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
01269 i++){</span></p>
01270 
01271 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
01272 nbinsy; j++){</span></p>
01273 
01274 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
01275 nbinsz; k++){</span></p>
01276 
01277 <p class=MsoNormal><span style='font-size:10.0pt'>          
01278 sm-&gt;SetBinContent(i + 1,j + 1,k + 1, source[i][j][k]);</span></p>
01279 
01280 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
01281 
01282 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
01283 
01284 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
01285 
01286 <p class=MsoNormal><span style='font-size:10.0pt'>  
01287 sm-&gt;Draw(&quot;&quot;);  </span></p>
01288 
01289 <p class=MsoNormal><span style='font-size:10.0pt'>}</span></p>
01290 
01291 </div>
01292 
01293 <!-- */
01294 // --> End_Html
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 // THREE-DIMENSIONAL DECONVOLUTION FUNCTION                                //
01850 // This function calculates deconvolution from source spectrum             //
01851 // according to response spectrum                                          //
01852 // The result is placed in the cube pointed by source pointer.             //
01853 //                                                                         //
01854 // Function parameters:                                                    //
01855 // source-pointer to the cube of source spectrum                           //
01856 // resp-pointer to the cube of response spectrum                           //
01857 // ssizex-x length of source and response spectra                          //
01858 // ssizey-y length of source and response spectra                          //
01859 // ssizey-y length of source and response spectra                          //
01860 // numberIterations, for details we refer to manual                        //
01861 // numberRepetitions, for details we refer to manual                       //
01862 // boost, boosting factor, for details we refer to manual                  //
01863 //                                                                         //
01864 /////////////////////////////////////////////////////////////////////////////
01865 //Begin_Html <!--
01866 /* -->
01867 
01868 <div class=Section3>
01869 
01870 <p class=MsoNormal style='text-align:justify'><b><span style='font-size:14.0pt'>Deconvolution</span></b></p>
01871 
01872 <p class=MsoNormal style='text-align:justify'><i>&nbsp;</i></p>
01873 
01874 <p class=MsoNormal style='text-align:justify'><i>Goal: Improvement of the
01875 resolution in spectra, decomposition of multiplets</i></p>
01876 
01877 <p class=MsoNormal>&nbsp;</p>
01878 
01879 <p class=MsoNormal>Mathematical formulation of the 3-dimensional convolution
01880 system is</p>
01881 
01882 <p class=MsoNormal style='margin-left:18.0pt'>
01883 
01884 <table cellpadding=0 cellspacing=0 align=left>
01885  <tr>
01886   <td width=69 height=1></td>
01887  </tr>
01888  <tr>
01889   <td></td>
01890   <td><img width=334 height=67 src="gif/spectrum3_deconvolution_image001.gif"></td>
01891  </tr>
01892 </table>
01893 
01894 <span style='font-size:16.0pt'>&nbsp;</span></p>
01895 
01896 <p class=MsoNormal><span style='font-size:16.0pt'>&nbsp;</span></p>
01897 
01898 <p class=MsoNormal>&nbsp;</p>
01899 
01900 <p class=MsoNormal>&nbsp;</p>
01901 
01902 <br clear=ALL>
01903 
01904 <p class=MsoNormal>where h(i,j,k) is the impulse response function, x, y are
01905 input and output fields, respectively, <sub><img width=69 height=24
01906 src="gif/spectrum3_deconvolution_image002.gif"></sub>, are the lengths of x and h fields<i>
01907 </i></p>
01908 
01909 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01910 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01911 </span>let us assume that we know the response and the output fields (spectra)
01912 of the above given system. </p>
01913 
01914 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01915 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01916 </span>the deconvolution represents solution of the overdetermined system of
01917 linear equations, i.e.,  the calculation of the field <b>x.</b></p>
01918 
01919 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01920 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01921 </span>from numerical stability point of view the operation of deconvolution is
01922 extremely critical (ill-posed  problem) as well as time consuming operation. </p>
01923 
01924 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01925 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01926 </span>the Gold deconvolution algorithm proves to work very well even for
01927 2-dimensional systems. Generalization of the algorithm for 2-dimensional
01928 systems was presented in [1], and for multidimensional systems in [2].</p>
01929 
01930 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
01931 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
01932 </span>for Gold deconvolution algorithm as well as for boosted deconvolution
01933 algorithm we refer also to TSpectrum and TSpectrum2 </p>
01934 
01935 <p class=MsoNormal><i>&nbsp;</i></p>
01936 
01937 <p class=MsoNormal><i>Function:</i></p>
01938 
01939 <p class=MsoNormal style='text-align:justify'><b>const <a
01940 href="http://root.cern.ch/root/html/ListOfTypes.html#char">char</a>* </b><a
01941 name="TSpectrum:Deconvolution1"></a><a
01942 href="http://root.cern.ch/root/html/TSpectrum.html#TSpectrum:Fit1Awmi"><b>TSpectrum3::Deconvolution</b></a><b>(<a
01943 href="http://root.cern.ch/root/html/ListOfTypes.html#float">float</a> ***fSource,
01944 const <a href="http://root.cern.ch/root/html/ListOfTypes.html#float">float</a>
01945 ***fResp, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
01946 fSizex, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
01947 fSizey, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
01948 fSizez, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
01949 fNumberIterations, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
01950 fNumberRepetitions, <a
01951 href="http://root.cern.ch/root/html/ListOfTypes.html#double">double</a> fBoost)</b></p>
01952 
01953 <p class=MsoNormal>&nbsp;</p>
01954 
01955 <p class=MsoNormal style='text-align:justify'>This function calculates
01956 deconvolution from source spectrum according to response spectrum using Gold
01957 deconvolution algorithm. The result is placed in the field pointed by source
01958 pointer. On successful completion it returns 0. On error it returns pointer to
01959 the string describing error. If desired after every fNumberIterations one can apply
01960 boosting operation (exponential function with exponent given by fBoost
01961 coefficient) and repeat it fNumberRepetitions times.</p>
01962 
01963 <p class=MsoNormal>&nbsp;</p>
01964 
01965 <p class=MsoNormal><i><span style='color:red'>Parameters:</span></i></p>
01966 
01967 <p class=MsoNormal>        <b>fSource</b>-pointer to the matrix of source
01968 spectrum                  </p>
01969 
01970 <p class=MsoNormal>        <b>fResp</b>-pointer to the matrix of response
01971 spectrum                  </p>
01972 
01973 <p class=MsoNormal>        <b>fSizex, fSizey, fSizez</b> -lengths of the
01974 spectrum matrix                                 </p>
01975 
01976 <p class=MsoNormal style='text-align:justify'>        <b>fNumberIterations</b>-number
01977 of iterations </p>
01978 
01979 <p class=MsoNormal style='text-align:justify'>        <b>fNumberRepetitions</b>-number
01980 of repetitions for boosted deconvolution. It must be </p>
01981 
01982 <p class=MsoNormal style='text-align:justify'>        greater or equal to one.</p>
01983 
01984 <p class=MsoNormal style='text-align:justify'>        <b>fBoost</b>-boosting
01985 coefficient, applies only if fNumberRepetitions is greater than one.  </p>
01986 
01987 <p class=MsoNormal style='text-align:justify'>        <span style='color:fuchsia'>Recommended
01988 range &lt;1,2&gt;.</span></p>
01989 
01990 <p class=MsoNormal>&nbsp;</p>
01991 
01992 <p class=MsoNormal><b><i>References:</i></b></p>
01993 
01994 <p class=MsoNormal style='text-align:justify'> [1] <span lang=SK>M.
01995 Morhá&#269;, J. Kliman, V. Matoušek, M. Veselský, I. Turzo</span>.: Efficient
01996 one- and two-dimensional Gold deconvolution and its application to gamma-ray
01997 spectra decomposition. NIM, A401 (1997) 385-408.</p>
01998 
01999 <p class=MsoNormal style='text-align:justify'>[2] Morhá&#269; M., Matoušek V.,
02000 Kliman J., Efficient algorithm of multidimensional deconvolution and its
02001 application to nuclear data processing, Digital Signal Processing 13 (2003)
02002 144. </p>
02003 
02004 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
02005 
02006 <p class=MsoNormal><i>Example 1 – script Decon.c :</i></p>
02007 
02008 <p class=MsoNormal style='margin-left:36.0pt;text-align:justify;text-indent:
02009 -18.0pt'>•<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
02010 </span>response function (usually peak) should be shifted to the beginning of
02011 the coordinate system (see Fig. 1)</p>
02012 
02013 <p class=MsoNormal style='text-align:justify'><b><span style='font-size:16.0pt'><img
02014 border=0 width=601 height=368 src="gif/spectrum3_deconvolution_image003.jpg"></span></b></p>
02015 
02016 <p class=MsoNormal style='text-align:justify'><b>Fig. 1 Three-dimensional
02017 response spectrum</b></p>
02018 
02019 <p class=MsoNormal>&nbsp;</p>
02020 
02021 <p class=MsoNormal><img border=0 width=601 height=368
02022 src="gif/spectrum3_deconvolution_image004.jpg"></p>
02023 
02024 <p class=MsoNormal>&nbsp;</p>
02025 
02026 <p class=MsoNormal style='text-align:justify'><b>Fig. 2 Three-dimensional input
02027 spectrum (before deconvolution)</b></p>
02028 
02029 <p class=MsoNormal>&nbsp;</p>
02030 
02031 <p class=MsoNormal><img border=0 width=601 height=368
02032 src="gif/spectrum3_deconvolution_image005.jpg"></p>
02033 
02034 <p class=MsoNormal style='text-align:justify'><b>Fig. 3 Spectrum from Fig. 2
02035 after deconvolution (100 iterations)</b></p>
02036 
02037 <p class=MsoNormal>&nbsp;</p>
02038 
02039 <p class=MsoNormal><b><span style='color:#339966'>Script:</span></b></p>
02040 
02041 <p class=MsoNormal><span style='font-size:10.0pt'>// Example to illustrate the
02042 Gold deconvolution (class TSpectrum3).</span></p>
02043 
02044 <p class=MsoNormal><span style='font-size:10.0pt'>// To execute this example,
02045 do</span></p>
02046 
02047 <p class=MsoNormal><span style='font-size:10.0pt'>// root &gt; .x Decon3.C</span></p>
02048 
02049 <p class=MsoNormal><span style='font-size:10.0pt'>&nbsp;</span></p>
02050 
02051 <p class=MsoNormal><span style='font-size:10.0pt'>#include &lt;TSpectrum3&gt;</span></p>
02052 
02053 <p class=MsoNormal><span style='font-size:10.0pt'>&nbsp;</span></p>
02054 
02055 <p class=MsoNormal><span style='font-size:10.0pt'>void Decon3() {</span></p>
02056 
02057 <p class=MsoNormal><span style='font-size:10.0pt'>   Int_t i, j, k;</span></p>
02058 
02059 <p class=MsoNormal><span style='font-size:10.0pt'>   </span><span lang=FR
02060 style='font-size:10.0pt'>Int_t nbinsx = 32;</span></p>
02061 
02062 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsy = 32;</span></p>
02063 
02064 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsz =
02065 32;   </span></p>
02066 
02067 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmin  = 0;</span></p>
02068 
02069 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmax  =
02070 nbinsx;</span></p>
02071 
02072 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymin  = 0;</span></p>
02073 
02074 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymax  =
02075 nbinsy;   </span></p>
02076 
02077 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t zmin  = 0;</span></p>
02078 
02079 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   </span><span
02080 style='font-size:10.0pt'>Int_t zmax  = nbinsz;      </span></p>
02081 
02082 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** source = new
02083 float **[nbinsx];</span></p>
02084 
02085 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** resp = new float
02086 **[nbinsx];      </span></p>
02087 
02088 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02089 
02090 <p class=MsoNormal><span style='font-size:10.0pt'>      source[i]=new float*
02091 [nbinsy];</span></p>
02092 
02093 <p class=MsoNormal><span style='font-size:10.0pt'>     
02094 for(j=0;j&lt;nbinsy;j++)</span></p>
02095 
02096 <p class=MsoNormal><span style='font-size:10.0pt'>         source[i][j]=new
02097 float [nbinsz];</span></p>
02098 
02099 <p class=MsoNormal><span style='font-size:10.0pt'>   }           </span></p>
02100 
02101 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02102 
02103 <p class=MsoNormal><span style='font-size:10.0pt'>      resp[i]=new float*
02104 [nbinsy];</span></p>
02105 
02106 <p class=MsoNormal><span style='font-size:10.0pt'>     
02107 for(j=0;j&lt;nbinsy;j++)</span></p>
02108 
02109 <p class=MsoNormal><span style='font-size:10.0pt'>         resp[i][j]=new float
02110 [nbinsz];</span></p>
02111 
02112 <p class=MsoNormal><span style='font-size:10.0pt'>   }              </span></p>
02113 
02114 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *decon_in = new
02115 TH3F(&quot;decon_in&quot;,&quot;Deconvolution&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);</span></p>
02116 
02117 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *decon_resp = new
02118 TH3F(&quot;decon_resp&quot;,&quot;Deconvolution&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);  
02119 </span></p>
02120 
02121 <p class=MsoNormal><span style='font-size:10.0pt'>   TFile *f = new
02122 TFile(&quot;TSpectrum3.root&quot;);</span></p>
02123 
02124 <p class=MsoNormal><span style='font-size:10.0pt'>   decon_in=(TH3F*)
02125 f-&gt;Get(&quot;decon_in;1&quot;);</span></p>
02126 
02127 <p class=MsoNormal><span style='font-size:10.0pt'>   decon_resp=(TH3F*)
02128 f-&gt;Get(&quot;decon_resp;1&quot;);   </span></p>
02129 
02130 <p class=MsoNormal><span style='font-size:10.0pt'>   TCanvas *Deconvolution =
02131 new TCanvas(&quot;Deconvolution&quot;,&quot;Deconvolution of 3-dimensional
02132 spectra&quot;,10,10,1000,700);</span></p>
02133 
02134 <p class=MsoNormal><span style='font-size:10.0pt'>   TSpectrum3 *s = new
02135 TSpectrum3();</span></p>
02136 
02137 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02138 i++){</span></p>
02139 
02140 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02141 nbinsy; j++){</span></p>
02142 
02143 <p class=MsoNormal><span style='font-size:10.0pt'>                  for (k = 0;
02144 k &lt; nbinsz; k++){</span></p>
02145 
02146 <p class=MsoNormal><span style='font-size:10.0pt'>                       source[i][j][k]
02147 = decon_in-&gt;GetBinContent(i + 1,j + 1,k + 1);</span></p>
02148 
02149 <p class=MsoNormal><span style='font-size:10.0pt'>                       resp[i][j][k]
02150 = decon_resp-&gt;GetBinContent(i + 1,j + 1,k + 1);                        </span></p>
02151 
02152 <p class=MsoNormal><span style='font-size:10.0pt'>                    } </span></p>
02153 
02154 <p class=MsoNormal><span style='font-size:10.0pt'>                 }</span></p>
02155 
02156 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02157 
02158 <p class=MsoNormal><span style='font-size:10.0pt'>  
02159 s-&gt;Deconvolution(source,resp,nbinsx,nbinsy,nbinsz,100,1,1);</span></p>
02160 
02161 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02162 i++){</span></p>
02163 
02164 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02165 nbinsy; j++){</span></p>
02166 
02167 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
02168 nbinsz; k++){</span></p>
02169 
02170 <p class=MsoNormal><span style='font-size:10.0pt'>          
02171 decon_in-&gt;SetBinContent(i + 1,j + 1,k + 1, source[i][j][k]);</span></p>
02172 
02173 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
02174 
02175 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
02176 
02177 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02178 
02179 <p class=MsoNormal>   decon_in-&gt;Draw(&quot;&quot;);  </p>
02180 
02181 <p class=MsoNormal>}</p>
02182 
02183 <p class=MsoNormal>&nbsp;</p>
02184 
02185 <p class=MsoNormal><i>Example 2 – script Decon_hr.c :</i></p>
02186 
02187 <p class=MsoNormal style='text-align:justify'>This example illustrates repeated
02188 Gold deconvolution with boosting. After every 10 iterations we apply power
02189 function with exponent = 2 to the spectrum given in Fig. 2.</p>
02190 
02191 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
02192 
02193 <p class=MsoNormal style='text-align:justify'><img border=0 width=601
02194 height=368 src="gif/spectrum3_deconvolution_image006.jpg"></p>
02195 
02196 <p class=MsoNormal style='text-align:justify'><b>Fig. 4 Spectrum from Fig. 2
02197 after boosted deconvolution (10 iterations repeated 10 times). It decomposes
02198 completely cluster of peaks from Fig 2.</b></p>
02199 
02200 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
02201 
02202 <p class=MsoNormal><b><span style='color:#339966'>Script:</span></b></p>
02203 
02204 <p class=MsoNormal><span style='font-size:10.0pt'>// Example to illustrate the
02205 Gold deconvolution (class TSpectrum3).</span></p>
02206 
02207 <p class=MsoNormal><span style='font-size:10.0pt'>// To execute this example,
02208 do</span></p>
02209 
02210 <p class=MsoNormal><span style='font-size:10.0pt'>// root &gt; .x Decon3_hr.C</span></p>
02211 
02212 <p class=MsoNormal><span style='font-size:10.0pt'>void Decon3_hr() {</span></p>
02213 
02214 <p class=MsoNormal><span style='font-size:10.0pt'>   Int_t i, j, k;</span></p>
02215 
02216 <p class=MsoNormal><span style='font-size:10.0pt'>   </span><span lang=FR
02217 style='font-size:10.0pt'>Int_t nbinsx = 32;</span></p>
02218 
02219 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsy = 32;</span></p>
02220 
02221 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsz =
02222 32;   </span></p>
02223 
02224 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmin  = 0;</span></p>
02225 
02226 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmax  =
02227 nbinsx;</span></p>
02228 
02229 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymin  = 0;</span></p>
02230 
02231 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymax  =
02232 nbinsy;   </span></p>
02233 
02234 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t zmin  = 0;</span></p>
02235 
02236 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   </span><span
02237 style='font-size:10.0pt'>Int_t zmax  = nbinsz;      </span></p>
02238 
02239 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** source = new
02240 float **[nbinsx];</span></p>
02241 
02242 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** resp = new float
02243 **[nbinsx];      </span></p>
02244 
02245 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02246 
02247 <p class=MsoNormal><span style='font-size:10.0pt'>      source[i]=new float*
02248 [nbinsy];</span></p>
02249 
02250 <p class=MsoNormal><span style='font-size:10.0pt'>     
02251 for(j=0;j&lt;nbinsy;j++)</span></p>
02252 
02253 <p class=MsoNormal><span style='font-size:10.0pt'>         source[i][j]=new
02254 float [nbinsz];</span></p>
02255 
02256 <p class=MsoNormal><span style='font-size:10.0pt'>   }           </span></p>
02257 
02258 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02259 
02260 <p class=MsoNormal><span style='font-size:10.0pt'>      resp[i]=new float*
02261 [nbinsy];</span></p>
02262 
02263 <p class=MsoNormal><span style='font-size:10.0pt'>     
02264 for(j=0;j&lt;nbinsy;j++)</span></p>
02265 
02266 <p class=MsoNormal><span style='font-size:10.0pt'>         resp[i][j]=new float
02267 [nbinsz];</span></p>
02268 
02269 <p class=MsoNormal><span style='font-size:10.0pt'>   }              </span></p>
02270 
02271 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *decon_in = new
02272 TH3F(&quot;decon_in&quot;,&quot;Deconvolution&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);</span></p>
02273 
02274 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *decon_resp = new
02275 TH3F(&quot;decon_resp&quot;,&quot;Deconvolution&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);  
02276 </span></p>
02277 
02278 <p class=MsoNormal><span style='font-size:10.0pt'>   TFile *f = new
02279 TFile(&quot;TSpectrum3.root&quot;);</span></p>
02280 
02281 <p class=MsoNormal><span style='font-size:10.0pt'>   decon_in=(TH3F*)
02282 f-&gt;Get(&quot;decon_in;1&quot;);</span></p>
02283 
02284 <p class=MsoNormal><span style='font-size:10.0pt'>   decon_resp=(TH3F*)
02285 f-&gt;Get(&quot;decon_resp;1&quot;);   </span></p>
02286 
02287 <p class=MsoNormal><span style='font-size:10.0pt'>   TCanvas *Deconvolution =
02288 new TCanvas(&quot;Deconvolution&quot;,&quot;High resolution deconvolution of
02289 3-dimensional spectra&quot;,10,10,1000,700);</span></p>
02290 
02291 <p class=MsoNormal><span style='font-size:10.0pt'>   TSpectrum3 *s = new
02292 TSpectrum3();</span></p>
02293 
02294 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02295 i++){</span></p>
02296 
02297 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02298 nbinsy; j++){</span></p>
02299 
02300 <p class=MsoNormal><span style='font-size:10.0pt'>                  for (k = 0;
02301 k &lt; nbinsz; k++){</span></p>
02302 
02303 <p class=MsoNormal><span style='font-size:10.0pt'>                       source[i][j][k]
02304 = decon_in-&gt;GetBinContent(i + 1,j + 1,k + 1);</span></p>
02305 
02306 <p class=MsoNormal><span style='font-size:10.0pt'>                       resp[i][j][k]
02307 = decon_resp-&gt;GetBinContent(i + 1,j + 1,k + 1);                        </span></p>
02308 
02309 <p class=MsoNormal><span style='font-size:10.0pt'>                    } </span></p>
02310 
02311 <p class=MsoNormal><span style='font-size:10.0pt'>                 }</span></p>
02312 
02313 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02314 
02315 <p class=MsoNormal><span style='font-size:10.0pt'>  
02316 s-&gt;Deconvolution(source,resp,nbinsx,nbinsy,nbinsz,10,10,2);</span></p>
02317 
02318 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02319 i++){</span></p>
02320 
02321 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02322 nbinsy; j++){</span></p>
02323 
02324 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
02325 nbinsz; k++){</span></p>
02326 
02327 <p class=MsoNormal><span style='font-size:10.0pt'>          
02328 decon_in-&gt;SetBinContent(i + 1,j + 1,k + 1, source[i][j][k]);</span></p>
02329 
02330 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
02331 
02332 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
02333 
02334 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02335 
02336 <p class=MsoNormal><span style='font-size:10.0pt'>  
02337 decon_in-&gt;Draw(&quot;&quot;);  </span></p>
02338 
02339 <p class=MsoNormal><span style='font-size:10.0pt'>}</span></p>
02340 
02341 <p class=MsoNormal style='text-align:justify'><span style='font-size:16.0pt'>&nbsp;</span></p>
02342 
02343 <p class=MsoNormal style='text-align:justify'><span style='font-size:16.0pt'>&nbsp;</span></p>
02344 
02345 </div>
02346 
02347 <!-- */
02348 // --> End_Html
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 //calculate ht*y and write into p
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 //calculate matrix b=ht*h
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 //initialization in x1 matrix
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  //START OF ITERATIONS
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 // THREE-DIMENSIONAL HIGH-RESOLUTION PEAK SEARCH FUNCTION                  //
02550 // This function searches for peaks in source spectrum                     //
02551 //  It is based on deconvolution method. First the background is           //
02552 //  removed (if desired), then Markov spectrum is calculated               //
02553 //  (if desired), then the response function is generated                  //
02554 //  according to given sigma and deconvolution is carried out.             //
02555 // It returns number of found peaks.                                       //
02556 //                                                                         //
02557 // Function parameters:                                                    //
02558 // source-pointer to the matrix of source spectrum                         //
02559 // dest-pointer to the matrix of resulting deconvolved spectrum            //
02560 // ssizex-x length of source spectrum                                      //
02561 // ssizey-y length of source spectrum                                      //
02562 // ssizez-z length of source spectrum                                      //
02563 // sigma-sigma of searched peaks, for details we refer to manual           //
02564 // threshold-threshold value in % for selected peaks, peaks with           //
02565 //                amplitude less than threshold*highest_peak/100           //
02566 //                are ignored, see manual                                  //
02567 //  backgroundRemove-logical variable, set if the removal of               //
02568 //                background before deconvolution is desired               //
02569 //  deconIterations-number of iterations in deconvolution operation        //
02570 //  markov-logical variable, if it is true, first the source spectrum      //
02571 //             is replaced by new spectrum calculated using Markov         //
02572 //             chains method.                                              //
02573 // averWindow-averanging window of searched peaks, for details             //
02574 //                  we refer to manual (applies only for Markov method)    //
02575 //                                                                         //
02576 /////////////////////////////////////////////////////////////////////////////
02577 //Begin_Html <!--
02578 /* -->
02579 
02580 <div class=Section4>
02581 
02582 <p class=MsoNormal><b><span style='font-size:14.0pt'>Peaks searching</span></b></p>
02583 
02584 <p class=MsoNormal style='text-align:justify'><i>&nbsp;</i></p>
02585 
02586 <p class=MsoNormal style='text-align:justify'><i>Goal: to identify
02587 automatically the peaks in spectrum with the presence of the continuous
02588 background, one- and two-fold coincidences (ridges) and statistical
02589 fluctuations - noise.</i> </p>
02590 
02591 <p class=MsoNormal><span style='font-family:Arial'>&nbsp;</span></p>
02592 
02593 <p class=MsoNormal style='text-align:justify'>The common problems connected
02594 with correct peak identification in three-dimensional coincidence spectra are</p>
02595 
02596 <ul style='margin-top:0mm' type=disc>
02597  <li class=MsoNormal style='text-align:justify'>non-sensitivity to noise, i.e.,
02598      only statistically relevant peaks should be identified</li>
02599  <li class=MsoNormal style='text-align:justify'>non-sensitivity of the
02600      algorithm to continuous background</li>
02601  <li class=MsoNormal style='text-align:justify'>non-sensitivity to one-fold coincidences
02602      (coincidences peak – peak – background in all dimensions) and their
02603      crossings</li>
02604  <li class=MsoNormal style='text-align:justify'>non-sensitivity to two-fold
02605      coincidences (coincidences peak – background – background in all
02606      dimensions) and their crossings</li>
02607  <li class=MsoNormal style='text-align:justify'>ability to identify peaks close
02608      to the edges of the spectrum region</li>
02609  <li class=MsoNormal style='text-align:justify'>resolution, decomposition of
02610      doublets and multiplets. The algorithm should be able to recognize close
02611      positioned peaks. </li>
02612 </ul>
02613 
02614 <p class=MsoNormal><i>&nbsp;</i></p>
02615 
02616 <p class=MsoNormal><i>Function:</i></p>
02617 
02618 <p class=MsoNormal style='text-align:justify'><b><a
02619 href="http://root.cern.ch/root/html/ListOfTypes.html#Int_t">Int_t</a> </b><a
02620 name="TSpectrum:Search1HighRes"></a><a
02621 href="http://root.cern.ch/root/html/TSpectrum.html#TSpectrum:Fit1Awmi"><b>TSpectrum3::SearchHighRes</b></a><b>
02622 (const <a href="http://root.cern.ch/root/html/ListOfTypes.html#float">float</a>
02623 ***fSource,<a href="http://root.cern.ch/root/html/ListOfTypes.html#float">float</a>
02624 ***fDest, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
02625 fSizex, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
02626 fSizey, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
02627 fSizez, <a href="http://root.cern.ch/root/html/ListOfTypes.html#float">float</a>
02628 fSigma, <a href="http://root.cern.ch/root/html/ListOfTypes.html#double">double</a>
02629 fThreshold, <a href="http://root.cern.ch/root/html/ListOfTypes.html#bool">bool</a>
02630 fBackgroundRemove,<a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
02631 fDeconIterations, <a href="http://root.cern.ch/root/html/ListOfTypes.html#bool">bool</a>
02632 fMarkov, <a href="http://root.cern.ch/root/html/ListOfTypes.html#int">int</a>
02633 fAverWindow)   </b></p>
02634 
02635 <p class=MsoNormal>&nbsp;</p>
02636 
02637 <p class=MsoNormal style='text-align:justify'>This function searches for peaks
02638 in source spectrum. It is based on deconvolution method. First the background
02639 is removed (if desired), then Markov smoothed spectrum is calculated (if
02640 desired), then the response function is generated according to given sigma and
02641 deconvolution is carried out. On success it returns number of found peaks.</p>
02642 
02643 <p class=MsoNormal>&nbsp;</p>
02644 
02645 <p class=MsoNormal><i><span style='color:red'>Parameters:</span></i></p>
02646 
02647 <p class=MsoNormal style='text-align:justify'>        <b>fSource</b>-pointer to
02648 the matrix of source spectrum                  </p>
02649 
02650 <p class=MsoNormal style='text-align:justify'>        <b>fDest</b>-resulting
02651 spectrum after deconvolution</p>
02652 
02653 <p class=MsoNormal style='text-align:justify'>        <b>fSizex, fSizey, fSizez</b>
02654 -lengths of the source and destination spectra                </p>
02655 
02656 <p class=MsoNormal style='text-align:justify'>        <b>fSigma</b>-sigma of
02657 searched peaks</p>
02658 
02659 <p class=MsoNormal style='margin-left:22.8pt;text-align:justify'><b>fThreshold</b>-
02660 threshold value in % for selected peaks, peaks with amplitude less than
02661 threshold*highest_peak/100 are ignored</p>
02662 
02663 <p class=MsoNormal style='margin-left:22.8pt;text-align:justify'><b>fBackgroundRemove</b>-
02664 background_remove-logical variable, true if the removal of background before
02665 deconvolution is desired  </p>
02666 
02667 <p class=MsoNormal style='margin-left:22.8pt;text-align:justify'><b>fDeconIterations</b>-number
02668 of iterations in deconvolution operation</p>
02669 
02670 <p class=MsoNormal style='margin-left:22.8pt;text-align:justify'><b>fMarkov</b>-logical
02671 variable, if it is true, first the source spectrum is replaced by new spectrum
02672 calculated using Markov chains method </p>
02673 
02674 <p class=MsoNormal style='margin-left:19.95pt;text-align:justify;text-indent:
02675 2.85pt'><b>fAverWindow</b>-width of averaging smoothing window </p>
02676 
02677 <p class=MsoNormal>&nbsp;</p>
02678 
02679 <p class=MsoNormal><b><i>References:</i></b></p>
02680 
02681 <p class=MsoNormal style='text-align:justify'>[1] M.A. Mariscotti: A method for
02682 identification of peaks in the presence of background and its application to
02683 spectrum analysis. NIM 50 (1967), 309-320.</p>
02684 
02685 <p class=MsoNormal style='text-align:justify'>[2] <span lang=SK> M.
02686 Morhá&#269;, J. Kliman, V. Matoušek, M. Veselský, I. Turzo</span>.:Identification
02687 of peaks in multidimensional coincidence gamma-ray spectra. NIM, A443 (2000)
02688 108-125.</p>
02689 
02690 <p class=MsoNormal style='text-align:justify'>[3] Z.K. Silagadze, A new
02691 algorithm for automatic photopeak searches. NIM A 376 (1996), 451.</p>
02692 
02693 <p class=MsoNormal style='text-align:justify'>&nbsp;</p>
02694 
02695 <p class=MsoNormal><b>Example of peak searching method</b></p>
02696 
02697 <p class=MsoNormal>&nbsp;</p>
02698 
02699 <p class=MsoNormal style='text-align:justify'><a
02700 href="http://root.cern.ch/root/html/src/TSpectrum.cxx.html#TSpectrum:Search1HighRes"
02701 target="_parent">SearchHighRes</a> function provides users with the possibility
02702 to vary the input parameters and with the access to the output deconvolved data
02703 in the destination spectrum. Based on the output data one can tune the
02704 parameters. </p>
02705 
02706 <p class=MsoNormal><i>Example 1 – script Search3.c:</i></p>
02707 
02708 <p class=MsoNormal>&nbsp;</p>
02709 
02710 <p class=MsoNormal><img border=0 width=601 height=368
02711 src="gif/spectrum3_searching_image001.jpg"></p>
02712 
02713 <p class=MsoNormal style='text-align:justify'><b>Fig. 1 Three-dimensional
02714 spectrum with 5 peaks (<sub><img border=0 width=40 height=19
02715 src="gif/spectrum3_searching_image002.gif"></sub>, threshold=5%, 3 iterations steps in
02716 the deconvolution)</b></p>
02717 
02718 <p class=MsoNormal style='text-align:justify'><b>&nbsp;</b></p>
02719 
02720 <p class=MsoNormal style='text-align:justify'><b><img border=0 width=601
02721 height=368 src="gif/spectrum3_searching_image003.jpg"></b></p>
02722 
02723 <p class=MsoNormal style='text-align:justify'><b>Fig. 2 Spectrum from Fig. 1
02724 after background elimination and deconvolution</b></p>
02725 
02726 <p class=MsoNormal><b><span style='color:#339966'>&nbsp;</span></b></p>
02727 
02728 <p class=MsoNormal><b><span style='color:#339966'>Script:</span></b></p>
02729 
02730 <p class=MsoNormal><span style='font-size:10.0pt'>// Example to illustrate high
02731 resolution peak searching function (class TSpectrum3).</span></p>
02732 
02733 <p class=MsoNormal><span style='font-size:10.0pt'>// To execute this example,
02734 do</span></p>
02735 
02736 <p class=MsoNormal><span style='font-size:10.0pt'>// root &gt; .x Search3.C</span></p>
02737 
02738 <p class=MsoNormal><span style='font-size:10.0pt'>void Search3() {</span></p>
02739 
02740 <p class=MsoNormal><span style='font-size:10.0pt'>   Int_t i, j, k, nfound;</span></p>
02741 
02742 <p class=MsoNormal><span style='font-size:10.0pt'>   </span><span lang=FR
02743 style='font-size:10.0pt'>Int_t nbinsx = 32;</span></p>
02744 
02745 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsy = 32;</span></p>
02746 
02747 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t nbinsz =
02748 32;   </span></p>
02749 
02750 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmin  = 0;</span></p>
02751 
02752 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t xmax  =
02753 nbinsx;</span></p>
02754 
02755 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymin  = 0;</span></p>
02756 
02757 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t ymax  =
02758 nbinsy;   </span></p>
02759 
02760 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   Int_t zmin  = 0;</span></p>
02761 
02762 <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>   </span><span
02763 style='font-size:10.0pt'>Int_t zmax  = nbinsz;      </span></p>
02764 
02765 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** source = new
02766 float **[nbinsx];</span></p>
02767 
02768 <p class=MsoNormal><span style='font-size:10.0pt'>   float *** dest = new float
02769 **[nbinsx];      </span></p>
02770 
02771 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02772 
02773 <p class=MsoNormal><span style='font-size:10.0pt'>      source[i]=new float*
02774 [nbinsy];</span></p>
02775 
02776 <p class=MsoNormal><span style='font-size:10.0pt'>     
02777 for(j=0;j&lt;nbinsy;j++)</span></p>
02778 
02779 <p class=MsoNormal><span style='font-size:10.0pt'>         source[i][j]=new
02780 float [nbinsz];</span></p>
02781 
02782 <p class=MsoNormal><span style='font-size:10.0pt'>   }           </span></p>
02783 
02784 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nbinsx;i++){</span></p>
02785 
02786 <p class=MsoNormal><span style='font-size:10.0pt'>      dest[i]=new float*
02787 [nbinsy];</span></p>
02788 
02789 <p class=MsoNormal><span style='font-size:10.0pt'>     
02790 for(j=0;j&lt;nbinsy;j++)</span></p>
02791 
02792 <p class=MsoNormal><span style='font-size:10.0pt'>         dest[i][j]=new float
02793 [nbinsz];</span></p>
02794 
02795 <p class=MsoNormal><span style='font-size:10.0pt'>   }              </span></p>
02796 
02797 <p class=MsoNormal><span style='font-size:10.0pt'>   TH3F *search = new
02798 TH3F(&quot;Search&quot;,&quot;Peak
02799 searching&quot;,nbinsx,xmin,xmax,nbinsy,ymin,ymax,nbinsz,zmin,zmax);</span></p>
02800 
02801 <p class=MsoNormal><span style='font-size:10.0pt'>   TFile *f = new
02802 TFile(&quot;TSpectrum3.root&quot;);</span></p>
02803 
02804 <p class=MsoNormal><span style='font-size:10.0pt'>   search=(TH3F*)
02805 f-&gt;Get(&quot;search2;1&quot;);   </span></p>
02806 
02807 <p class=MsoNormal><span style='font-size:10.0pt'>   TCanvas *Search = new
02808 TCanvas(&quot;Search&quot;,&quot;Peak searching&quot;,10,10,1000,700);</span></p>
02809 
02810 <p class=MsoNormal><span style='font-size:10.0pt'>   TSpectrum3 *s = new
02811 TSpectrum3();</span></p>
02812 
02813 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02814 i++){</span></p>
02815 
02816 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02817 nbinsy; j++){</span></p>
02818 
02819 <p class=MsoNormal><span style='font-size:10.0pt'>                  for (k = 0;
02820 k &lt; nbinsz; k++){</span></p>
02821 
02822 <p class=MsoNormal><span style='font-size:10.0pt'>                       source[i][j][k]
02823 = search-&gt;GetBinContent(i + 1,j + 1,k + 1);</span></p>
02824 
02825 <p class=MsoNormal><span style='font-size:10.0pt'>                    } </span></p>
02826 
02827 <p class=MsoNormal><span style='font-size:10.0pt'>                 }</span></p>
02828 
02829 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02830 
02831 <p class=MsoNormal><span style='font-size:10.0pt'>   nfound =
02832 s-&gt;SearchHighRes(source, dest, nbinsx, nbinsy, nbinsz, 2, 5, kTRUE, 3,
02833 kFALSE, 3);   </span></p>
02834 
02835 <p class=MsoNormal><span style='font-size:10.0pt'>   printf(&quot;Found %d
02836 candidate peaks\n&quot;,nfound);   </span></p>
02837 
02838 <p class=MsoNormal><span style='font-size:10.0pt'>   for (i = 0; i &lt; nbinsx;
02839 i++){</span></p>
02840 
02841 <p class=MsoNormal><span style='font-size:10.0pt'>     for (j = 0; j &lt;
02842 nbinsy; j++){</span></p>
02843 
02844 <p class=MsoNormal><span style='font-size:10.0pt'>        for (k = 0; k &lt;
02845 nbinsz; k++){</span></p>
02846 
02847 <p class=MsoNormal><span style='font-size:10.0pt'>          
02848 search-&gt;SetBinContent(i + 1,j + 1,k + 1, dest[i][j][k]);</span></p>
02849 
02850 <p class=MsoNormal><span style='font-size:10.0pt'>        }    </span></p>
02851 
02852 <p class=MsoNormal><span style='font-size:10.0pt'>     }</span></p>
02853 
02854 <p class=MsoNormal><span style='font-size:10.0pt'>   }</span></p>
02855 
02856 <p class=MsoNormal><span style='font-size:10.0pt'>   Float_t *PosX = new
02857 Float_t[nfound];         </span></p>
02858 
02859 <p class=MsoNormal><span style='font-size:10.0pt'>   Float_t *PosY = new
02860 Float_t[nfound];</span></p>
02861 
02862 <p class=MsoNormal><span style='font-size:10.0pt'>   Float_t *PosZ = new
02863 Float_t[nfound];      </span></p>
02864 
02865 <p class=MsoNormal><span style='font-size:10.0pt'>   PosX =
02866 s-&gt;GetPositionX();</span></p>
02867 
02868 <p class=MsoNormal><span style='font-size:10.0pt'>   PosY =
02869 s-&gt;GetPositionY();         </span></p>
02870 
02871 <p class=MsoNormal><span style='font-size:10.0pt'>   PosZ =
02872 s-&gt;GetPositionZ();            </span></p>
02873 
02874 <p class=MsoNormal><span style='font-size:10.0pt'>   for(i=0;i&lt;nfound;i++)</span></p>
02875 
02876 <p class=MsoNormal><span style='font-size:10.0pt'>                    </span><span
02877 lang=PL style='font-size:10.0pt'>printf(&quot;posx= %d, posy= %d, posz=
02878 %d\n&quot;,(int)(PosX[i]+0.5), (int)(PosY[i]+0.5),
02879 (int)(PosZ[i]+0.5));           </span></p>
02880 
02881 <p class=MsoNormal><span lang=PL style='font-size:10.0pt'>   </span><span
02882 style='font-size:10.0pt'>search-&gt;Draw(&quot;&quot;);  </span></p>
02883 
02884 <p class=MsoNormal><span style='font-size:10.0pt'>}</span></p>
02885 
02886 </div>
02887 
02888 <!-- */
02889 // --> End_Html
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    //deconvolution starts
03839    area = 0;
03840    lhx = -1,lhy = -1,lhz = -1;
03841    positx = 0,posity = 0,positz = 0;
03842    maximum = 0;
03843    //generate response cube
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    //read source cube
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    //calculate ht*y and write into p
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 //calculate b=ht*h
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 //initialization in x1 cube
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 //START OF ITERATIONS
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 //write back resulting spectrum
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 //searching for peaks in deconvolved spectrum
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 // THREE-DIMENSIONAL CLASSICAL PEAK SEARCH FUNCTION                        //
04095 // This function searches for peaks in source spectrum using               //
04096 //  the algorithm based on smoothed second differences.                    //
04097 //                                                                         //
04098 // Function parameters:                                                    //
04099 // source-pointer to the matrix of source spectrum                         //
04100 // ssizex-x length of source spectrum                                      //
04101 // ssizey-y length of source spectrum                                      //
04102 // ssizez-z length of source spectrum                                      //
04103 // sigma-sigma of searched peaks, for details we refer to manual           //
04104 // threshold-threshold value in % for selected peaks, peaks with           //
04105 //                amplitude less than threshold*highest_peak/100           //
04106 //                are ignored, see manual                                  //
04107 //  markov-logical variable, if it is true, first the source spectrum      //
04108 //             is replaced by new spectrum calculated using Markov         //
04109 //             chains method.                                              //
04110 // averWindow-averanging window of searched peaks, for details             //
04111 //                  we refer to manual (applies only for Markov method)    //
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 }

Generated on Tue Jul 5 14:24:39 2011 for ROOT_528-00b_version by  doxygen 1.5.1