Changeset 8546
- Timestamp:
- 06/11/07 16:49:42 (18 years ago)
- Location:
- trunk/MagicSoft/Mars
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/NEWS
r8518 r8546 7 7 Also the old values seemed not exactly the PulsePos used for 8 8 teh check. 9 10 - callisto: improved calculation of spline coefficients a lot. This 11 leads to a further improvement of the event rate calibrating MUX 12 data of about 15% (175evt/s instead of 150evt/s) 9 13 10 14 -
trunk/MagicSoft/Mars/mextralgo/MExtralgoSpline.cc
r8545 r8546 193 193 Float_t MExtralgoSpline::CalcIntegral(Float_t pos) const 194 194 { 195 /*196 // The number of steps is calculated directly from the integration197 // window. This is the only way to ensure we are not dealing with198 // numerical rounding uncertanties, because we always get the same199 // value under the same conditions -- it might still be different on200 // other machines!201 const Float_t start = pos-fRiseTime;202 const Float_t step = 0.2;203 const Float_t width = fRiseTime+fFallTime;204 const Float_t max = fNum-1 - (width+step);205 const Int_t num = TMath::Nint(width/step);206 207 // The order is important. In some cases (limlo-/limup-check) it can208 // happen that max<0. In this case we start at 0209 if (start > max)210 start = max;211 if (start < 0)212 start = 0;213 214 start += step/2;215 216 Double_t sum = 0.;217 for (Int_t i=0; i<num; i++)218 {219 // Note: if x is close to one integer number (= a FADC sample)220 // we get the same result by using that sample as klo, and the221 // next one as khi, or using the sample as khi and the previous222 // one as klo (the spline is of course continuous). So we do not223 // expect problems from rounding issues in the argument of224 // Floor() above (we have noticed differences in roundings225 // depending on the compilation options).226 227 sum += EvalAt(start + i*step);228 229 // FIXME? Perhaps the integral should be done analitically230 // between every two FADC slices, instead of numerically231 }232 sum *= step; // Transform sum in integral233 234 return sum;235 */236 237 195 // In the future we will calculate the intgeral analytically. 238 196 // It has been tested that it gives identical results within … … 280 238 if (fNum<2) 281 239 return; 282 /*283 //284 // Allow no saturated slice and285 // Don't start if the maxpos is too close to the limits.286 //287 288 const Bool_t limlo = maxbin < TMath::Ceil(fRiseTime);289 const Bool_t limup = maxbin > fNum-TMath::Ceil(fFallTime)-1;290 if (sat || limlo || limup)291 {292 fTimeDev = 1.0;293 if (fExtractionType == kAmplitude)294 {295 fSignal = fVal[maxbin];296 fTime = maxbin;297 fSignalDev = 0; // means: is valid298 return;299 }300 301 fSignal = CalcIntegral(limlo ? 0 : fNum);302 fTime = maxbin - 1;303 fSignalDev = 0; // means: is valid304 return;305 }306 307 //308 // Now find the maximum309 //310 311 Float_t step = 0.2; // start with step size of 1ns and loop again with the smaller one312 313 Int_t klo = maxbin-1;314 315 Float_t maxpos = maxbin;//! Current position of the maximum of the spline316 Float_t max = fVal[maxbin];//! Current maximum of the spline317 318 //319 // Search for the maximum, starting in interval maxpos-1 in steps of 0.2 till maxpos-0.2.320 // If no maximum is found, go to interval maxpos+1.321 //322 for (Int_t i=0; i<TMath::Nint(TMath::Ceil((1-0.3)/step)); i++)323 {324 const Float_t x = klo + step*(i+1);325 //const Float_t y = Eval(klo, x);326 const Float_t y = Eval(klo, x-klo);327 if (y > max)328 {329 max = y;330 maxpos = x;331 }332 }333 334 //335 // Search for the absolute maximum from maxpos to maxpos+1 in steps of 0.2336 //337 if (maxpos > maxbin - 0.1)338 {339 klo = maxbin;340 341 for (Int_t i=0; i<TMath::Nint(TMath::Ceil((1-0.3)/step)); i++)342 {343 const Float_t x = klo + step*(i+1);344 //const Float_t y = Eval(klo, x);345 const Float_t y = Eval(klo, x-klo);346 if (y > max)347 {348 max = y;349 maxpos = x;350 }351 }352 }353 354 //355 // Now, the time, abmax and khicont and klocont are set correctly within the previous precision.356 // Try a better precision.357 //358 const Float_t up = maxpos+step - 3.0*fResolution;359 const Float_t lo = maxpos-step + 3.0*fResolution;360 const Float_t abmaxpos = maxpos;361 362 step = 2.*fResolution; // step size of 0.1 FADC slices363 364 for (int i=0; i<TMath::Nint(TMath::Ceil((up-abmaxpos)/step)); i++)365 {366 const Float_t x = abmaxpos + (i+1)*step;367 //const Float_t y = Eval(klo, x);368 const Float_t y = Eval(klo, x-klo);369 if (y > max)370 {371 max = y;372 maxpos = x;373 }374 }375 376 //377 // Second, try from time down to time-0.2 in steps of fResolution.378 //379 380 //381 // Test the possibility that the absolute maximum has not been found between382 // maxpos and maxpos+0.05, then we have to look between maxpos-0.05 and maxpos383 // which requires new setting of klocont and khicont384 //385 if (abmaxpos < klo + fResolution)386 klo--;387 388 for (int i=TMath::Nint(TMath::Ceil((abmaxpos-lo)/step))-1; i>=0; i--)389 {390 const Float_t x = abmaxpos - (i+1)*step;391 //const Float_t y = Eval(klo, x);392 const Float_t y = Eval(klo, x-klo);393 if (y > max)394 {395 max = y;396 maxpos = x;397 }398 }399 400 fTime = maxpos;401 fTimeDev = fResolution;402 fSignal = CalcIntegral(maxpos);403 fSignalDev = 0; // means: is valid404 405 return;406 */407 // --- Start NEW ---408 409 // This block extracts values very similar to the old algorithm...410 // for max>10411 /* Most accurate (old identical) version:412 413 Float_t xmax=maxpos, ymax=Eval(maxpos-1, 1);414 Int_t rc = GetMaxPos(maxpos-1, xmax, ymax);415 if (xmax==maxpos)416 {417 GetMaxPos(maxpos, xmax, ymax);418 419 Float_t y = Eval(maxpos, 1);420 if (y>ymax)421 {422 ymax = y;423 xmax = maxpos+1;424 }425 }*/426 240 427 241 Float_t maxpos; … … 461 275 fWidthDev = 0; 462 276 } 463 464 // 465 // Loop from the beginning of the slice upwards to reach the maxhalf: 466 // With means of bisection: 467 // 468 /* 469 static const Float_t sqrt2 = TMath::Sqrt(2.); 470 471 step = sqrt2*3*0.061;//fRiseTime; 472 Float_t x = maxpos-0.86-3*0.061;//fRiseTime*1.25; 473 474 // step = sqrt2*0.5;//fRiseTime; 475 // Float_t x = maxpos-1.25;//fRiseTime*1.25; 476 477 Int_t cnt =0; 478 while (cnt++<30) 479 { 480 const Float_t y=EvalAt(x); 481 482 if (TMath::Abs(y-maxval/2)<fResolution) 483 break; 484 485 step /= sqrt2; // /2 486 x += y>maxval/2 ? -step : +step; 487 } 488 */ 489 490 // 491 // Now integrate the whole thing! 492 // 493 // fTime = cnt==31 ? -1 : x; 494 // fTimeDev = fResolution; 495 // fSignal = cnt==31 ? CalcIntegral(x) : CalcIntegral(maxpos); 496 // fSignalDev = 0; // means: is valid 497 } 277 } -
trunk/MagicSoft/Mars/mextralgo/MExtralgoSpline.h
r8545 r8546 77 77 Double_t SearchY(Float_t maxpos, Float_t y) const; 78 78 Double_t SearchYup(Float_t maxpos, Float_t y) const; 79 /*80 // Evaluate first solution for a possible maximum (x|first deriv==0)81 inline Double_t EvalDerivEq0S1(const Int_t i) const82 {83 // return the x value [0;1[ at which the derivative is zero (solution1)84 85 Double_t sumder = fDer2[i]+fDer2[i+1];86 Double_t difder = fDer2[i]-fDer2[i+1];87 88 Double_t sqt1 = sumder*sumder - fDer2[i]*fDer2[i+1];89 Double_t sqt2 = difder*(fVal[i+1]-fVal[i]);90 91 Double_t x = 3*fDer2[i] - sqrt(3*sqt1 + 3*sqt2);92 93 Double_t denom = 3*(fDer2[i+1]-fDer2[i]);94 95 return -x/denom;96 }97 98 // Evaluate second solution for a possible maximum (x|first deriv==0)99 inline Double_t EvalDerivEq0S2(const Int_t i) const100 {101 // return the x value [0;1[ at which the derivative is zero (solution2)102 103 Double_t sumder = fDer2[i]+fDer2[i+1];104 Double_t difder = fDer2[i]-fDer2[i+1];105 106 Double_t sqt1 = sumder*sumder - fDer2[i]*fDer2[i+1];107 Double_t sqt2 = difder*(fVal[i+1]-fVal[i]);108 109 Double_t x = 3*fDer2[i] + sqrt(3*sqt1 + 3*sqt2);110 111 Double_t denom = 3*(fDer2[i+1]-fDer2[i]);112 113 return -x/denom;114 }115 */116 79 117 80 Int_t EvalDerivEq0(const Int_t i, Double_t &x1, Double_t &x2) const; … … 289 252 xmax = xmax2; 290 253 } 291 /*292 // Search real maximum in [i-0.5, i+1.5]293 Float_t xmax1, xmax2, xmax3;294 Float_t ymax1, ymax2, ymax3;295 296 Bool_t rc1 = i>0 && GetMax(i-1, xmax1, ymax1, 0.5, 1.0);297 Bool_t rc2 = GetMax(i, xmax2, ymax2, 0.0, 1.0);298 Bool_t rc3 = i<fNum-1 && GetMax(i+1, xmax3, ymax3, 0.0, 0.5);299 300 // In case the medium bin is the first or last bin301 // take the lower or upper edge of the region into account.302 if (i==0)303 {304 xmax1 = 0;305 ymax1 = Eval(0, 0);306 rc1 = kTRUE;307 }308 if (i==fNum-1)309 {310 xmax3 = fNum-1e-5;311 ymax3 = Eval(fNum-1, 1);312 rc3 = kTRUE;313 }314 315 // Take a real default in case no maximum is found316 xmax=i+0.5;317 ymax=Eval(i, 0.5);318 319 //if (!rc1 && !rc2 && !rc3)320 // cout << "!!!!!!!!!!!!!!!" << endl;321 322 if (rc1)323 {324 ymax = ymax1;325 xmax = xmax1;326 }327 else328 if (rc2)329 {330 ymax = ymax2;331 xmax = xmax2;332 }333 else334 if (rc3)335 {336 ymax = ymax3;337 xmax = xmax3;338 }339 340 if (rc2 && ymax2>ymax)341 {342 ymax = ymax2;343 xmax = xmax2;344 }345 if (rc3 && ymax3>ymax)346 {347 ymax = ymax3;348 xmax = xmax3;349 }350 */351 254 } 352 255 … … 359 262 return kFALSE; 360 263 361 // const Float_t x1 = EvalDerivEq0S1(i);362 // const Float_t x2 = EvalDerivEq0S2(i);363 364 264 const Bool_t ismax1 = x1>=min && x1<max && EvalDeriv2(x1, i)<0; 365 265 const Bool_t ismax2 = x2>=min && x2<max && EvalDeriv2(x2, i)<0; … … 384 284 // Somehting must be wrong... 385 285 return kFALSE; 386 /* 387 std::cout << "?????????????" << std::endl; 388 389 const Double_t y1 = Eval(i, x1); 390 const Double_t y2 = Eval(i, x2); 391 392 if (y1>y2) 393 { 394 xmax = i+x1; 395 ymax = Eval(i, x1); 396 return kTRUE; 397 } 398 else 399 { 400 xmax = i+x2; 401 ymax = Eval(i, x2); 402 return kTRUE; 403 } 404 405 return kFALSE;*/ 406 } 407 /* 408 inline Int_t GetMaxPos(Int_t i, Float_t &xmax, Float_t &ymax) const 409 { 410 Double_t x[3]; 411 412 x[0] = 0; 413 // x[1] = 1; // This means we miss a possible maximum at the 414 // upper edge of the last interval... 415 416 x[1] = EvalDerivEq0S1(i); 417 x[2] = EvalDerivEq0S2(i); 418 419 //y[0] = Eval(i, x[0]); 420 //y[1] = Eval(i, x[1]); 421 //y[1] = Eval(i, x[1]); 422 //y[2] = Eval(i, x[2]); 423 424 Int_t rc = 0; 425 Double_t max = Eval(i, x[0]); 426 427 for (Int_t j=1; j<3; j++) 428 { 429 if (x[j]<=0 || x[j]>=1) 430 continue; 431 432 const Float_t y = Eval(i, x[j]); 433 if (y>max) 434 { 435 max = y; 436 rc = j; 437 } 438 } 439 440 if (max>ymax) 441 { 442 xmax = x[rc]+i; 443 ymax = max; 444 } 445 446 return rc; 447 } 448 449 inline void GetMaxPos(Int_t min, Int_t max, Float_t &xmax, Float_t &ymax) const 450 { 451 Float_t xmax=-1; 452 Float_t ymax=-FLT_MAX; 453 454 for (int i=min; i<max; i++) 455 GetMaxPos(i, xmax, ymax); 456 457 for (int i=min+1; i<max; i++) 458 { 459 Float_t y = Eval(i, 0); 460 if (y>ymax) 461 { 462 ymax = y; 463 xmax = i; 464 } 465 } 466 467 }*/ 468 286 } 469 287 470 288 void InitDerivatives() const;
Note:
See TracChangeset
for help on using the changeset viewer.