53#define PEAK_WINDOW 1024
119 Error(
"Background",
"function not yet implemented: h=%s, iter=%d, option=%sn"
166 Int_t dimension =
hin->GetDimension();
167 if (dimension != 3) {
168 Error(
"Search",
"Must be a 3-d histogram");
178 for (i = 0; i <
sizex; i++) {
184 for (k = 0; k <
sizez; k++)
189 npeaks =
SearchHighRes((
const Double_t***)
source,
dest,
sizex,
sizey,
sizez,
sigma, 100*
threshold,
kTRUE, 3,
kFALSE, 3);
194 for (i = 0; i <
npeaks; i++) {
202 for (i = 0; i <
sizex; i++) {
205 delete []
dest[i][
j];
394 Double_t 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;
396 return "Wrong parameters";
398 return "Width of Clipping Window Must Be Positive";
400 return (
"Too Large Clipping Window");
760 for(i = 0;i <
ssizex; i++){
864 Double_t nom,
nip,
nim,
sp,
sm,
spx,
smx,
spy,
smy,
spz,
smz,
plocha=0;
866 return "Averaging Window must be positive";
868 for(i = 0;i <
ssizex; i++){
881 for(k = 0;k <
ssizez; k++){
890 for(i = 0;i <
ssizex; i++){
985 for(i = zmin;i < zmax; i++){
1006 if(i -
l + 1 < zmin)
1048 if(i -
l + 1 <
xmin)
1108 for(
j = zmin;
j < zmax;
j++){
1129 if(i -
l + 1 <
xmin)
1166 if(
j -
l + 1 < zmin)
1189 for(
j = zmin;
j < zmax;
j++){
1210 if(i -
l + 1 <
ymin)
1247 if(
j -
l + 1 < zmin)
1271 for(k = zmin;k < zmax; k++){
1292 if(i -
l + 1 <
xmin)
1391 for(k = zmin;k <= zmax; k++){
1396 for(i = 0;i <
ssizex; i++){
1398 for(k = 0;k <
ssizez; k++){
1403 for(i = 0;i <
ssizex; i++){
1604 Int_t 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;
1607 return "Wrong parameters";
1609 return "Number of iterations must be positive";
1611 return "Number of repetitions must be positive";
1620 for (i = 0; i <
ssizex; i++) {
1622 for (k = 0; k <
ssizez; k++) {
1641 if (
lhx == -1 ||
lhy == -1 ||
lhz == -1) {
1642 for(i = 0;i <
ssizex; i++){
1648 return (
"Zero response data");
1729 for (i = 0; i <
ssizex; i++) {
1731 for (k = 0; k <
ssizez; k++) {
1792 for (i = 0; i <
ssizex; i++) {
1794 for (k = 0; k <
ssizez; k++)
1798 for(i = 0;i <
ssizex; i++){
1959 Double_t nom,
nip,
nim,
sp,
sm,
spx,
spy,
smx,
smy,
spz,
smz;
1960 Double_t 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;
1963 Int_t 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;
1965 Error(
"SearchHighRes",
"Invalid sigma, must be greater than or equal to 1");
1970 Error(
"SearchHighRes",
"Invalid threshold, must be positive and less than 100");
1976 Error(
"SearchHighRes",
"Too large sigma");
1982 Error(
"SearchHighRes",
"Averaging window must be positive");
1989 Error(
"SearchHighRes",
"Too large clipping window");
1999 for(k = 0;k <
ssizey + i; k++)
2010 else if(k >=
ssizez + shift)
2021 else if(k >=
ssizez + shift)
2032 else if(k >=
ssizez + shift)
2040 else if(i >=
ssizex + shift){
2045 else if(k >=
ssizez + shift)
2056 else if(k >=
ssizez + shift)
2067 else if(k >=
ssizez + shift)
2080 else if(k >=
ssizez + shift)
2091 else if(k >=
ssizez + shift)
2102 else if(k >=
ssizez + shift)
2144 b = (
p1 +
p3) / 2.0;
2148 b = (
p1 +
p2) / 2.0;
2152 b = (
p2 +
p4) / 2.0;
2156 b = (
p3 +
p4) / 2.0;
2160 b = (
p5 +
p7) / 2.0;
2164 b = (
p5 +
p6) / 2.0;
2168 b = (
p6 +
p8) / 2.0;
2172 b = (
p7 +
p8) / 2.0;
2176 b = (
p2 +
p6) / 2.0;
2180 b = (
p4 +
p8) / 2.0;
2184 b = (
p1 +
p5) / 2.0;
2188 b = (
p3 +
p7) / 2.0;
2258 else if(k >=
ssizez + shift)
2269 else if(k >=
ssizez + shift)
2280 else if(k >=
ssizez + shift)
2288 else if(i >=
ssizex + shift){
2293 else if(k >=
ssizez + shift)
2304 else if(k >=
ssizez + shift)
2315 else if(k >=
ssizez + shift)
2328 else if(k >=
ssizez + shift)
2339 else if(k >=
ssizez + shift)
2350 else if(k >=
ssizez + shift)
2389 for(i = 0;i <
ssizex + k; i++){
2420 if(i -
l + 1 <
xmin)
2462 if(i -
l + 1 <
ymin)
2483 for(i = zmin;i < zmax;i++){
2504 if(i -
l + 1 < zmin)
2547 if(i -
l + 1 <
xmin)
2607 for(
j = zmin;
j < zmax;
j++){
2628 if(i -
l + 1 <
xmin)
2665 if(
j -
l + 1 < zmin)
2688 for(
j = zmin;
j < zmax;
j++){
2709 if(i -
l + 1 <
ymin)
2746 if(
j -
l + 1 < zmin)
2770 for(k = zmin;k < zmax; k++){
2791 if(i -
l + 1 <
xmin)
2891 for(k = zmin;k <= zmax; k++){
3111 for(k = i - 1,
a = 0,
b = 0;k <= i + 1; k++){
3116 for(k =
j - 1,
a = 0,
b = 0;k <=
j + 1; k++){
3121 for(k =
l - 1,
a = 0,
b = 0;k <=
l + 1; k++){
3134 for(i = 0;i <
ssizex; i++){
3136 for(k = 0;k <
ssizez; k++){
3143 for(i = 0;i <
ssizex + k; i++){
3178 Int_t i,
j,k,
l,
li,
lj,
lk,
lmin,
lmax,
xmin,
xmax,
ymin,
ymax,zmin,zmax;
3180 Double_t nom,
nip,
nim,
sp,
sm,
spx,
spy,
smx,
smy,
spz,
smz;
3181 Double_t 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;
3184 Double_t 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;
3190 Error(
"SearchFast",
"Invalid sigma, must be greater than or equal to 1");
3195 Error(
"SearchFast",
"Invalid threshold, must be positive and less than 100");
3201 Error(
"SearchFast",
"Too large sigma");
3207 Error(
"SearchFast",
"Averaging window must be positive");
3213 Error(
"SearchFast",
"Too large clipping window");
3222 for(k = 0;k <
ssizey + i; k++)
3234 else if(k >=
ssizez + shift)
3245 else if(k >=
ssizez + shift)
3256 else if(k >=
ssizez + shift)
3264 else if(i >=
ssizex + shift){
3269 else if(k >=
ssizez + shift)
3280 else if(k >=
ssizez + shift)
3291 else if(k >=
ssizez + shift)
3304 else if(k >=
ssizez + shift)
3315 else if(k >=
ssizez + shift)
3326 else if(k >=
ssizez + shift)
3367 b = (
p1 +
p3) / 2.0;
3371 b = (
p1 +
p2) / 2.0;
3375 b = (
p2 +
p4) / 2.0;
3379 b = (
p3 +
p4) / 2.0;
3383 b = (
p5 +
p7) / 2.0;
3387 b = (
p5 +
p6) / 2.0;
3391 b = (
p6 +
p8) / 2.0;
3395 b = (
p7 +
p8) / 2.0;
3399 b = (
p2 +
p6) / 2.0;
3403 b = (
p4 +
p8) / 2.0;
3407 b = (
p1 +
p5) / 2.0;
3411 b = (
p3 +
p7) / 2.0;
3481 else if(k >=
ssizez + shift)
3492 else if(k >=
ssizez + shift)
3503 else if(k >=
ssizez + shift)
3511 else if(i >=
ssizex + shift){
3516 else if(k >=
ssizez + shift)
3527 else if(k >=
ssizez + shift)
3538 else if(k >=
ssizez + shift)
3551 else if(k >=
ssizez + shift)
3562 else if(k >=
ssizez + shift)
3573 else if(k >=
ssizez + shift)
3616 for(i = 0;i <
ssizex + k; i++){
3648 if(i -
l + 1 <
xmin)
3690 if(i -
l + 1 <
ymin)
3711 for(i = zmin;i < zmax;i++){
3732 if(i -
l + 1 < zmin)
3775 if(i -
l + 1 <
xmin)
3835 for(
j = zmin;
j < zmax;
j++){
3856 if(i -
l + 1 <
xmin)
3893 if(
j -
l + 1 < zmin)
3916 for(
j = zmin;
j < zmax;
j++){
3937 if(i -
l + 1 <
ymin)
3974 if(
j -
l + 1 < zmin)
3998 for(k = zmin;k < zmax; k++){
4019 if(i -
l + 1 <
xmin)
4119 for(k = zmin;k <= zmax; k++){
4135 for(k = 0;k <
ssizez; k++){
4137 for(i = 0;i <
ssizex; i++){
4149 for(i = -
j;i <=
j; i++){
4181 for(k = zmin;k <= zmax; k++){
4200 for(z = zmin + 1;z < zmax; z++){
4287 for(k =
x - 1,
a = 0,
b = 0;k <=
x + 1; k++){
4292 for(k =
y - 1,
a = 0,
b = 0;k <=
y + 1; k++){
4297 for(k = z - 1,
a = 0,
b = 0;k <= z + 1; k++){
4316 for(i = 0;i <
ssizex; i++){
4318 for(k = 0;k <
ssizez; k++){
4322 dest[i][
j][k] = val;
4328 for(i = 0;i <
ssizex + k; i++){
int Int_t
Signed integer 4 bytes (int)
double Double_t
Double 8 bytes.
const char Option_t
Option string (const char)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
TH1 is the base class of all histogram classes in ROOT.
The TNamed class is the base class for all named ROOT classes.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Double_t fResolution
NOT USED resolution of the neighboring peaks
Int_t fMaxPeaks
Maximum number of peaks to be found.
Int_t SearchFast(const Double_t ***source, Double_t ***dest, Int_t ssizex, Int_t ssizey, Int_t ssizez, Double_t sigma, Double_t threshold, Bool_t markov, Int_t averWindow)
THREE-DIMENSIONAL CLASSICAL PEAK SEARCH FUNCTION This function searches for peaks in source spectrum ...
virtual const char * Background(const TH1 *hist, Int_t niter, Option_t *option="goff")
This function calculates background spectrum from source in h.
TH1 * fHistogram
resulting histogram
const char * Deconvolution(Double_t ***source, const Double_t ***resp, Int_t ssizex, Int_t ssizey, Int_t ssizez, Int_t numberIterations, Int_t numberRepetitions, Double_t boost)
This function calculates deconvolution from source spectrum according to response spectrum The result...
Double_t * fPositionY
[fNPeaks] Y positions of peaks
Double_t * fPosition
[fNPeaks] array of current peak positions
virtual Int_t Search(const TH1 *hist, Double_t sigma=2, Option_t *option="goff", Double_t threshold=0.05)
This function searches for peaks in source spectrum in hin The number of found peaks and their positi...
Int_t SearchHighRes(const Double_t ***source, Double_t ***dest, Int_t ssizex, Int_t ssizey, Int_t ssizez, Double_t sigma, Double_t threshold, Bool_t backgroundRemove, Int_t deconIterations, Bool_t markov, Int_t averWindow)
This function searches for peaks in source spectrum It is based on deconvolution method.
const char * SmoothMarkov(Double_t ***source, Int_t ssizex, Int_t ssizey, Int_t ssizez, Int_t averWindow)
This function calculates smoothed spectrum from source spectrum based on Markov chain method.
@ kBackSuccessiveFiltering
Double_t * fPositionZ
[fNPeaks] Z positions of peaks
Double_t * fPositionX
[fNPeaks] X positions of peaks
Int_t fNPeaks
number of peaks found
void Print(Option_t *option="") const override
Print the array of positions.
void SetResolution(Double_t resolution=1)
NOT USED resolution: determines resolution of the neighbouring peaks default value is 1 correspond to...
~TSpectrum3() override
Destructor.
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.