Changeset 8154 for trunk/MagicSoft
- Timestamp:
- 10/24/06 09:26:10 (18 years ago)
- Location:
- trunk/MagicSoft/Mars
- Files:
-
- 3 added
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/Makefile
r8032 r8154 45 45 mhist \ 46 46 manalysis \ 47 mextralgo \ 47 48 msignal \ 48 49 mbadpixels \ -
trunk/MagicSoft/Mars/mextralgo/MExtralgoDigitalFilter.cc
r8072 r8154 38 38 } 39 39 40 // ----------------------------------------------------------------------------- 41 // 42 // Calculates the chi2 of the fit, once the weights have been iterated. 43 // Argument: time, obtained after a call to EvalDigitalFilterHiGain 44 // 45 Float_t MExtralgoDigitalFilter::GetChisq(const Int_t maxp, const Int_t frac, const Float_t sum) const 46 { 47 /* 48 TMatrix g (windowh,1); 49 TMatrix gt(windowh,1); 50 TMatrix y (windowh,1); 51 52 const Float_t etau = fFineAdjustHi*sumhi; 53 const Float_t t_fine = TMath::Abs(fFineAdjustHi)< 1./fBinningResolutionHiGain ? -fFineAdjustHi : 0.; 54 55 // if (t_fine==0.) 56 // return -1.; 57 58 if (fDebug) 59 gLog << all << " fMaxPHi: " << fMaxPHi << " fIterPHi " << fIterPHi << " t_fine: " << t_fine << endl; 60 61 // 62 // Slide with a window of size windowh over the sample 63 // and calculate the arrays by interpolating the pulse shape using the 64 // fine-tuned time information. 65 // 66 for (Int_t sample=0; sample < windowh; sample++) 67 { 68 const Int_t idx = fArrBinningResHalfHiGain[sample] + fIterPHi; 69 const Int_t ids = fMaxPHi + sample; 70 71 y [sample][0] = fHiGainSignalDF[ids]; 72 g [sample][0] = t_fine >= 0 73 ? (fPulseShapeHiGain[idx] + t_fine*(fPulseShapeHiGain[idx+1] -fPulseShapeHiGain[idx]) )*sumhi 74 : (fPulseShapeHiGain[idx] + t_fine*(fPulseShapeHiGain[idx] -fPulseShapeHiGain[idx-1]))*sumhi; 75 gt[sample][0] = t_fine >= 0 76 ? (fPulseShapeDotHiGain[idx] + t_fine*(fPulseShapeDotHiGain[idx+1]-fPulseShapeDotHiGain[idx]) )*etau 77 : (fPulseShapeDotHiGain[idx] + t_fine*(fPulseShapeDotHiGain[idx] -fPulseShapeDotHiGain[idx-1]) )*etau; 78 } 79 80 TMatrix second = y - g - gt; 81 TMatrix first(TMatrix::kTransposed,second); 82 TMatrix chisq = first * ((*fBHiInv)*second); 83 84 return chisq[0][0]/(windowh-2); 85 */ 86 /* 87 88 TMatrix S(fWindowSize, 1); // Signal (start==start of window) 89 for (int i=0; i<fWindowSize; i++) 90 S[i][0] = fVal[i+maxp]; 91 92 TMatrix g(fWindowSize, 1); 93 //TMatrix gT(fWindowSize, 1); 94 95 for (int i=0; i<fWindowSize; i++) 96 { 97 Int_t idx = fWeightsPerBin*i + frac; 98 99 // FIXME: Maybe we could do an interpolation on time-fineadj? 100 //Float_t slope = fPulseShapeHiGain[idx+1] -fPulseShapeHiGain[idx]; 101 //Float_t slopet = fPulseShapeDotHiGain[idx+1]-fPulseShapeDotHiGain[idx]; 102 103 g[i][0] = fPulseShapeHiGain[idx] *sumhi; 104 //gT[i][0] = fPulseShapeHiGainDot[idx]*tau; 105 } 106 107 TMatrix Ainv; // Autocorrelation Matrix (inverted) 108 109 TMatrix m = S - g;// - gT; 110 TMatrix mT(TMatrix::kTransposed, m); 111 112 TMatrix chisq = mT * (Ainv*m); 113 114 return chisq[0][0]/(fWindowSize-2); 115 */ 116 117 Double_t sumc = 0; 118 119 TMatrix d(fWindowSize, 1); // Signal (start==start of window) 120 for (int i=0; i<fWindowSize; i++) 121 { 122 d[i][0] = fVal[i+maxp]/sum - fPulseShape[fWeightsPerBin*i + frac]; 123 sumc += d[i][0]*d[i][0]; 124 } 125 126 /* 127 TMatrix Ainv; // Autocorrelation Matrix (inverted) 128 129 TMatrix dT(TMatrix::kTransposed, d); 130 131 TMatrix chisq = dT * (*fAinv*d); 132 */ 133 return sumc;//chisq[0][0]/(fWindowSize-2); 134 } 135 40 136 #include <iostream> 41 void MExtralgoDigitalFilter::Extract( )137 void MExtralgoDigitalFilter::Extract(Int_t maxpos) 42 138 { 43 139 fSignal = 0; // default is: no pulse found … … 54 150 // Calculate the sum of the first fWindowSize slices 55 151 // 56 57 // For the case of an even numberof weights/bin there is 152 // For the case of an even number of weights/bin there is 58 153 // no central bin.So we create an artificial central bin. 59 154 for (Int_t i=0; i<fNum-fWindowSize+1; i++) … … 66 161 } 67 162 } 163 164 /* 165 // This could be for a fast but less accurate extraction.... 166 maxamp = Eval(fWeightsAmp, maxpos-fWindowSize/2); 167 maxp = maxpos-fWindowSize/2; 168 */ 169 68 170 // The number of available slices were smaller than the 69 171 // extraction window size of the extractor … … 136 238 fTime -= timefineadjust; 137 239 } 240 138 241 139 242 #include <TH1.h> … … 145 248 #include <TProfile.h> 146 249 147 Bool_t MExtralgoDigitalFilter::CalculateWeights(TH1 &shape, const TH2 &autocorr, TArrayF &weightsamp, TArrayF &weightstime, Int_t wpb)250 Int_t MExtralgoDigitalFilter::CalculateWeights(TH1 &shape, const TH2 &autocorr, TArrayF &weightsamp, TArrayF &weightstime, Int_t wpb) 148 251 { 149 252 const Int_t weightsperbin = wpb<=0?shape.GetNbinsX()/autocorr.GetNbinsX():wpb; … … 154 257 cout << " Shape: " << shape.GetNbinsX() << endl; 155 258 cout << " ACorr: " << autocorr.GetNbinsX() << endl; 156 return kFALSE;259 return -1; 157 260 } 158 261 … … 180 283 // FIXME: DELETE!!! 181 284 TH1 &derivative = *static_cast<TH1*>(shape.Clone()); 285 derivative.SetDirectory(0); 182 286 derivative.Reset(); 183 287 … … 233 337 { 234 338 cout << "ERROR - Division by zero: denom[0][0]==0 for i=" << i << "." << endl; 235 return kFALSE;339 return -1; 236 340 } 237 341 … … 248 352 } 249 353 250 return kTRUE;354 return first*weightsperbin; 251 355 } 252 356 253 void MExtralgoDigitalFilter::CalculateWeights2(TH1F &shape, const TH2F&autocorr, TArrayF &weightsamp, TArrayF &weightstime, Int_t wpb)357 Int_t MExtralgoDigitalFilter::CalculateWeights2(TH1 &shape, const TH2 &autocorr, TArrayF &weightsamp, TArrayF &weightstime, Int_t wpb) 254 358 { 255 359 const Int_t weightsperbin = wpb<=0?shape.GetNbinsX()/autocorr.GetNbinsX():wpb; … … 260 364 cout << " Shape: " << shape.GetNbinsX() << endl; 261 365 cout << " ACorr: " << autocorr.GetNbinsX() << endl; 262 return ;366 return -1; 263 367 } 264 368 … … 282 386 TSpline5 val("Signal", &gr); 283 387 284 TH1F derivative(shape); 388 // FIXME: DELETE!!! 389 TH1 &derivative = *static_cast<TH1*>(shape.Clone()); 390 derivative.SetDirectory(0); 285 391 derivative.Reset(); 286 392 … … 331 437 const TMatrixD denom = (gT*(B*g))*(dT*(B*d)) - (dT*(B*g))*(dT*(B*g)); 332 438 439 if (denom[0][0]==0) 440 { 441 cout << "ERROR - Division by zero: denom[0][0]==0 for i=" << i << "." << endl; 442 return -1; 443 } 444 333 445 const TMatrixD w_amp = (dT*(B*d))*(gT*B) - (gT*(B*d))*(dT*B); 334 446 const TMatrixD w_time = (gT*(B*g))*(dT*B) - (gT*(B*d))*(gT*B); … … 342 454 } 343 455 } 456 return first*weightsperbin; 344 457 } 345 /*346 Int_t start = fBinningResolutionHiGain*(fSignalStartBinHiGain + 1);347 for (Int_t i = -fBinningResolutionHiGain/2+1; i<=fBinningResolutionHiGain/2; i++)348 {349 // i = -4...5350 for (Int_t count=0; count < fWindowSizeHiGain; count++)351 {352 // count=0: pos=10*(start+0) + 10 + i353 // count=1: pos=10*(start+1) + 10 + i354 // count=2: pos=10*(start+2) + 10 + i355 // count=3: pos=10*(start+3) + 10 + i356 }357 358 for (Int_t count=0; count < fWindowSizeHiGain; count++)359 {360 // count=0: pos = 10*0 + 5 +i-1361 // count=1: pos = 10*1 + 5 +i-1362 // count=2: pos = 10*2 + 5 +i-1363 // count=3: pos = 10*3 + 5 +i-1364 }365 }366 367 Int_t start = fBinningResolutionLoGain*fSignalStartBinLoGain + fBinningResolutionLoGain/2;368 for (Int_t i = -fBinningResolutionLoGain/2+1; i<=fBinningResolutionLoGain/2; i++)369 {370 // i=-4..5371 for (Int_t count=0; count < fWindowSizeLoGain; count++)372 {373 // count=0: pos = 10*(start+0) + 5 + i374 // count=1: pos = 10*(start+1) + 5 + i375 // count=2: pos = 10*(start+2) + 5 + i376 // count=3: pos = 10*(start+3) + 5 + i377 }378 379 for (Int_t count=0; count < fWindowSizeLoGain; count++)380 {381 // count=0: pos = 10*0 + 5 +i-1382 // count=1: pos = 10*1 + 5 +i-1383 // count=2: pos = 10*2 + 5 +i-1384 // count=3: pos = 10*3 + 5 +i-1385 }386 }387 */ -
trunk/MagicSoft/Mars/mextralgo/MExtralgoDigitalFilter.h
r8072 r8154 2 2 #define MARS_MExtralgoDigitalFilter 3 3 4 #ifndef ROOT_T ROOT5 #include <T ROOT.h>4 #ifndef ROOT_TMatrix 5 #include <TMatrix.h> 6 6 #endif 7 7 … … 12 12 class TArrayF; 13 13 14 //#include <TMatrix.h> 15 14 16 class MExtralgoDigitalFilter 15 17 { 16 18 private: 17 19 // Input 18 Float_t *fVal;19 Int_t 20 const Float_t *fVal; 21 Int_t fNum; 20 22 21 23 Float_t const *fWeightsAmp; 22 24 Float_t const *fWeightsTime; 25 Float_t const *fPulseShape; 26 27 const TMatrix *fAinv; 23 28 24 29 const Int_t fWeightsPerBin; // Number of weights per data bin … … 30 35 Float_t fSignal; 31 36 Float_t fSignalDev; 37 38 Float_t GetChisq(const Int_t maxp, const Int_t frac, const Float_t sum) const; 39 40 inline Double_t ChiSq(const Double_t sum, const Int_t startv, const Int_t startw=0) const 41 { 42 // 43 // Slide with a window of size windowsize over the sample 44 // and multiply the entries with the corresponding weights 45 // 46 Double_t chisq = 0; 47 48 // Shift the start of the weight to the center of sample 0 49 Float_t const *w = fPulseShape + startw; 50 51 const Float_t *beg = fVal+startv; 52 for (Float_t const *pex=beg; pex<beg+fWindowSize; pex++) 53 { 54 const Double_t c = *w - *pex/sum; 55 chisq += c*c; 56 w += fWeightsPerBin; 57 } 58 return chisq; 59 } 32 60 33 61 // Weights: Weights to evaluate … … 45 73 Float_t const *w = weights + startw; 46 74 47 Float_t *constbeg = fVal+startv;75 const Float_t *beg = fVal+startv; 48 76 for (Float_t const *pex=beg; pex<beg+fWindowSize; pex++) 49 77 { … … 115 143 116 144 public: 117 MExtralgoDigitalFilter(Int_t res, Int_t windowsize, Float_t *wa, Float_t *wt )145 MExtralgoDigitalFilter(Int_t res, Int_t windowsize, Float_t *wa, Float_t *wt, Float_t *ps=0, TMatrix *ainv=0) 118 146 : fVal(0), fNum(0), fWeightsAmp(wa+res/2), fWeightsTime(wt+res/2), 119 f WeightsPerBin(res), fWindowSize(windowsize),147 fPulseShape(ps), fAinv(ainv), fWeightsPerBin(res), fWindowSize(windowsize), 120 148 fTime(0), fTimeDev(-1), fSignal(0), fSignalDev(-1) 121 149 { 122 150 } 123 151 124 void SetData(Int_t n, Float_t *val) { fNum=n; fVal=val; }152 void SetData(Int_t n, Float_t const *val) { fNum=n; fVal=val; } 125 153 126 154 Float_t GetTime() const { return fTime; } … … 134 162 135 163 Float_t ExtractNoise(Int_t iter) const; 136 void Extract( );164 void Extract(Int_t maxpos=-1); 137 165 138 static Bool_t CalculateWeights(TH1 &shape, const TH2 &autocorr, TArrayF &wa, TArrayF &wt, Int_t wpb=-1);139 static void CalculateWeights2(TH1F &shape, const TH2F&autocorr, TArrayF &wa, TArrayF &wt, Int_t wpb=-1);166 static Int_t CalculateWeights(TH1 &shape, const TH2 &autocorr, TArrayF &wa, TArrayF &wt, Int_t wpb=-1); 167 static Int_t CalculateWeights2(TH1 &shape, const TH2 &autocorr, TArrayF &wa, TArrayF &wt, Int_t wpb=-1); 140 168 }; 141 169 -
trunk/MagicSoft/Mars/mextralgo/MExtralgoSpline.cc
r7999 r8154 207 207 } 208 208 209 #include <TRandom.h> 209 210 Float_t MExtralgoSpline::ExtractNoise(Int_t iter) 210 211 { 211 const Float_t nsx = iter * fResolution;212 const Float_t nsx = gRandom->Uniform(); //iter * fResolution; 212 213 213 214 if (fExtractionType == kAmplitude) … … 223 224 fSignalDev = -1; 224 225 fTimeDev = -1; 225 226 /* 226 227 // 227 228 // Allow no saturated slice and … … 229 230 // 230 231 231 /*232 232 const Bool_t limlo = maxbin < TMath::Ceil(fRiseTime); 233 233 const Bool_t limup = maxbin > fNum-TMath::Ceil(fFallTime)-1; … … 248 248 return; 249 249 } 250 */251 252 fTimeDev = fResolution;253 250 254 251 // … … 256 253 // 257 254 258 259 /*260 255 Float_t step = 0.2; // start with step size of 1ns and loop again with the smaller one 261 256 … … 346 341 } 347 342 } 348 */ 349 343 344 fTime = maxpos; 345 fTimeDev = fResolution; 346 fSignal = CalcIntegral(maxpos); 347 fSignalDev = 0; // means: is valid 348 349 return; 350 */ 350 351 // --- Start NEW --- 351 352 … … 369 370 370 371 Float_t maxpos, maxval; 372 // FIXME: Check the dfeault if no maximum found!!! 371 373 GetMaxAroundI(maxbin, maxpos, maxval); 372 374 … … 376 378 { 377 379 fTime = maxpos; 380 fTimeDev = fResolution; 378 381 fSignal = maxval; 379 382 fSignalDev = 0; // means: is valid … … 381 384 } 382 385 383 //384 // Loop from the beginning of the slice upwards to reach the maxhalf:385 // With means of bisection:386 //387 /*388 static const Float_t sqrt2 = TMath::Sqrt(2.);389 390 step = sqrt2*3*0.061;//fRiseTime;391 Float_t x = maxpos-0.86-3*0.061;//fRiseTime*1.25;392 393 // step = sqrt2*0.5;//fRiseTime;394 // Float_t x = maxpos-1.25;//fRiseTime*1.25;395 396 Int_t cnt =0;397 while (cnt++<30)398 {399 const Float_t y=EvalAt(x);400 401 if (TMath::Abs(y-maxval/2)<fResolution)402 break;403 404 step /= sqrt2; // /2405 x += y>maxval/2 ? -step : +step;406 }407 */408 409 386 // Search downwards for maxval/2 410 387 // By doing also a search upwards we could extract the pulse width … … 412 389 413 390 fTime = x1; 391 fTimeDev = fResolution; 414 392 fSignal = CalcIntegral(maxpos); 415 393 fSignalDev = 0; // means: is valid 416 394 417 //if (fSignal>100) 418 // cout << "V=" << maxpos-x1 << endl; 395 // 396 // Loop from the beginning of the slice upwards to reach the maxhalf: 397 // With means of bisection: 398 // 399 /* 400 static const Float_t sqrt2 = TMath::Sqrt(2.); 401 402 step = sqrt2*3*0.061;//fRiseTime; 403 Float_t x = maxpos-0.86-3*0.061;//fRiseTime*1.25; 404 405 // step = sqrt2*0.5;//fRiseTime; 406 // Float_t x = maxpos-1.25;//fRiseTime*1.25; 407 408 Int_t cnt =0; 409 while (cnt++<30) 410 { 411 const Float_t y=EvalAt(x); 412 413 if (TMath::Abs(y-maxval/2)<fResolution) 414 break; 415 416 step /= sqrt2; // /2 417 x += y>maxval/2 ? -step : +step; 418 } 419 */ 419 420 420 421 // … … 422 423 // 423 424 // fTime = cnt==31 ? -1 : x; 425 // fTimeDev = fResolution; 424 426 // fSignal = cnt==31 ? CalcIntegral(x) : CalcIntegral(maxpos); 425 427 // fSignalDev = 0; // means: is valid -
trunk/MagicSoft/Mars/mextralgo/MExtralgoSpline.h
r7999 r8154 21 21 22 22 // Input 23 Float_t *fVal;24 Int_t fNum;23 Float_t const *fVal; 24 const Int_t fNum; 25 25 26 26 Float_t *fDer1; … … 238 238 239 239 // Take a default in case no maximum is found 240 // FIXME: Check THIS!!! 240 241 xmax=i; 241 242 ymax=fVal[i]; … … 438 439 439 440 public: 440 MExtralgoSpline( Float_t *val, Int_t n, Float_t *der1, Float_t *der2)441 MExtralgoSpline(const Float_t *val, Int_t n, Float_t *der1, Float_t *der2) 441 442 : fExtractionType(kIntegral), fVal(val), fNum(n), fDer1(der1), fDer2(der2), fTime(0), fTimeDev(-1), fSignal(0), fSignalDev(-1) 442 443 { -
trunk/MagicSoft/Mars/mjobs/MJCalibrateSignal.cc
r8141 r8154 94 94 #include "MFTriggerPattern.h" 95 95 #include "MGeomApply.h" 96 #include "MPedestalSubtract.h" 96 97 //#include "MMcPedestalCopy.h" 97 98 #include "MPointingPosCalc.h" … … 450 451 MContinue conttp(&ftp, "ContTrigPattern"); 451 452 453 // Create the pedestal subtracted raw-data 454 MPedestalSubtract pedsub; 455 pedsub.SetPedestalCam(&pedcamab); 456 452 457 // Do signal and pedestal calculation 453 458 MPedCalcFromLoGain pedlo1("MPedCalcFundamental"); … … 471 476 extractor1->SetPedestals(&pedcamab); 472 477 478 // Setup to use the hi-gain extraction window in the lo-gain 479 // range (the start of the lo-gain range is added automatically 480 // by MPedCalcFromLoGain) 481 // 482 // The window size of the extractor is not yet initialized, 483 // so we have to stick to the extraction range 484 const Int_t f = extractor1->GetHiGainFirst(); 485 const Int_t l = extractor1->GetHiGainLast(); 486 const Int_t w = (l-f+1)&~1; 487 488 pedlo1.SetExtractWindow(f, w); 489 473 490 if (extractor1->InheritsFrom("MExtractTimeAndCharge")) 474 491 { 475 492 pedlo2.SetExtractor((MExtractTimeAndCharge*)extractor1); 476 493 pedlo3.SetExtractor((MExtractTimeAndCharge*)extractor1); 494 /* 477 495 const Int_t win = ((MExtractTimeAndCharge*)extractor1)->GetWindowSizeHiGain(); 478 496 pedlo1.SetExtractWindow(15, win); 479 pedlo2.SetExtractWindow(15, win/*obsolete*/); 480 pedlo3.SetExtractWindow(15, win/*obsolete*/); 497 pedlo2.SetExtractWindow(15, win//obsolete//); 498 pedlo3.SetExtractWindow(15, win//obsolete//); 499 */ 481 500 } 482 501 else 483 502 { 503 /* 484 504 // FIXME: How to get the fixed value 15 automatically? 485 505 const Int_t f = (Int_t)(15.5+extractor1->GetHiGainFirst()); … … 488 508 pedlo2.SetExtractWindow(f, n); 489 509 pedlo3.SetExtractWindow(f, n); 510 */ 511 pedlo2.SetExtractWindow(f, w); 512 pedlo3.SetExtractWindow(f, w); 513 490 514 } 491 515 } … … 657 681 tlist2.AddToList(&apply); 658 682 tlist2.AddToList(&merge); 683 tlist2.AddToList(&pedsub); 659 684 tlist2.AddToList(&pedlo1); 660 685 tlist2.AddToList(&pedlo2); -
trunk/MagicSoft/Mars/mjobs/MJCalibration.cc
r8141 r8154 154 154 #include "MRawFileRead.h" 155 155 #include "MGeomApply.h" 156 #include "MPedestalSubtract.h" 156 157 #include "MTaskEnv.h" 157 158 #include "MBadPixelsMerge.h" … … 1907 1908 tlist.AddToList(&apply); 1908 1909 1909 MPedCalcPedRun pedcalc; 1910 pedcalc.SetExtractWindow(fExtractor->GetHiGainFirst(),TMath::Nint(fExtractor->GetNumHiGainSamples())); 1910 // Produce pedestal subtracted raw-data 1911 MPedestalSubtract pedsub; 1912 pedsub.SetPedestalCam(fExtractor->GetPedestals()); 1913 tlist.AddToList(&pedsub); 1914 1915 // Setup to use the hi-gain extraction window in the lo-gain 1916 // range (the start of the lo-gain range is added automatically 1917 // by MPedCalcFromLoGain) 1918 // 1919 // The window size of the extractor is not yet initialized, 1920 // so we have to stick to the extraction range 1921 const Int_t f = fExtractor->GetHiGainFirst(); 1922 const Int_t l = fExtractor->GetHiGainLast(); 1923 const Int_t w = (l-f+1)&~1; 1924 1925 MPedCalcPedRun pedcalc; 1926 pedcalc.SetExtractWindow(f, w); 1911 1927 1912 1928 if (IsIntensity()) -
trunk/MagicSoft/Mars/mjobs/MJPedestal.cc
r7739 r8154 82 82 #include "MRawEvtData.h" 83 83 #include "MGeomApply.h" 84 #include "MPedestalSubtract.h" 84 85 #include "MTriggerPatternDecode.h" 85 86 #include "MBadPixelsMerge.h" … … 1064 1065 // 1065 1066 if (!fBadPixelsFile.IsNull()) 1066 1067 { 1067 1068 *fLog << inf << "Excluding: " << fBadPixelsFile << endl; 1068 ifstream fin(fBadPixelsFile .Data());1069 fBadPixels.AsciiRead( (istream&)fin);1070 1069 ifstream fin(fBadPixelsFile); 1070 fBadPixels.AsciiRead(fin); 1071 } 1071 1072 1072 1073 MGeomApply geomapl; … … 1074 1075 1075 1076 MPedCalcPedRun pedcalc; 1076 pedcalc.SetPedestalUpdate(kFALSE);1077 //pedcalc.SetPedestalUpdate(kFALSE); 1077 1078 1078 1079 MPedCalcFromLoGain pedlogain; … … 1132 1133 tlist.AddToList(&fillpul); 1133 1134 } 1135 1136 // produce pedestal subtracted raw-data 1137 MPedestalSubtract pedsub; 1138 if (fExtractor && fExtractionType!=kFundamental) 1139 pedsub.SetPedestalCam(&fPedestalCamIn); 1140 else 1141 pedsub.SetNamePedestalCam(""); // Only copy hi- and lo-gain together! 1142 tlist.AddToList(&pedsub); 1134 1143 1135 1144 // ---------------------------------------------------------------------- … … 1186 1195 if (fExtractor) 1187 1196 { 1188 fExtractor->SetPedestals(&fPedestalCamIn);1189 1190 if (fExtractionType!=kFundamental)1197 fExtractor->SetPedestals(&fPedestalCamIn); 1198 1199 if (fExtractionType!=kFundamental) 1191 1200 { 1192 pedcalc.SetRandomCalculation(fExtractionType==kWithExtractorRndm);1193 pedlogain.SetRandomCalculation(fExtractionType==kWithExtractorRndm);1194 1195 pedcalc.SetExtractor((MExtractTimeAndCharge*)fExtractor);1196 pedlogain.SetExtractor((MExtractTimeAndCharge*)fExtractor);1201 pedcalc.SetRandomCalculation(fExtractionType==kWithExtractorRndm); 1202 pedlogain.SetRandomCalculation(fExtractionType==kWithExtractorRndm); 1203 1204 pedcalc.SetExtractor((MExtractTimeAndCharge*)fExtractor); 1205 pedlogain.SetExtractor((MExtractTimeAndCharge*)fExtractor); 1197 1206 } 1198 1199 if (fExtractor->InheritsFrom("MExtractTimeAndCharge")) 1207 else 1200 1208 { 1201 1202 const Float_t f = 0.1+fExtractor->GetHiGainFirst(); 1203 const Int_t win = ((MExtractTimeAndCharge*)fExtractor)->GetWindowSizeHiGain(); 1204 pedcalc.SetExtractWindow((Int_t)f, win); 1205 pedlogain.SetExtractWindow((Int_t)(15+f), win); 1206 1209 // The window size of the extractor is not yet initialized, 1210 // so we have to stick to the extraction range 1211 const Int_t f = fExtractor->GetHiGainFirst(); 1212 const Int_t l = fExtractor->GetHiGainLast(); 1213 const Int_t w = (l-f+1)&~1; 1214 1215 // Setup to use the hi-gain extraction window in the lo-gain 1216 // range (the start of the lo-gain range is added automatically 1217 // by MPedCalcFromLoGain) 1218 pedcalc.SetExtractWindow(f, w); 1219 pedlogain.SetExtractWindow(f, w); 1207 1220 } 1208 else 1221 1222 if (!fExtractor->InheritsFrom("MExtractTimeAndCharge") && fExtractionType!=kFundamental) 1209 1223 { 1210 const Float_t f = 0.1+fExtractor->GetHiGainFirst(); 1211 const Float_t n = 0.1+fExtractor->GetNumHiGainSamples(); 1212 pedcalc.SetExtractWindow((Int_t)f, (Int_t)n); 1213 pedlogain.SetExtractWindow((Int_t)(15+f), (Int_t)n); 1214 1215 if (fExtractionType!=kFundamental) 1216 { 1217 *fLog << inf; 1218 *fLog << "Signal extractor doesn't inherit from MExtractTimeAndCharge..." << endl; 1219 *fLog << " --> falling back to fundamental pedestal extraction." << endl; 1220 fExtractionType=kFundamental; 1221 } 1224 *fLog << inf; 1225 *fLog << "Signal extractor doesn't inherit from MExtractTimeAndCharge..." << endl; 1226 *fLog << " --> falling back to fundamental pedestal extraction." << endl; 1227 fExtractionType=kFundamental; 1222 1228 } 1223 1229 } -
trunk/MagicSoft/Mars/mpedestal/MPedestalSubtract.cc
r8153 r8154 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: MPedestalSubtract.cc,v 1.2 2006-10-24 08:18:07 tbretz Exp $ 3 ! -------------------------------------------------------------------------- 2 4 ! 3 5 ! * -
trunk/MagicSoft/Mars/mpedestal/Makefile
r8151 r8154 42 42 MHPedestalCor.cc \ 43 43 MPedestalSubtract.cc \ 44 MPedestalSubtractedEvt.cc \ 45 MPedCalcFromData.cc 44 MPedestalSubtractedEvt.cc 46 45 47 46 ############################################################ -
trunk/MagicSoft/Mars/mpedestal/PedestalLinkDef.h
r8151 r8154 19 19 #pragma link C++ class MPedestalSubtract+; 20 20 #pragma link C++ class MPedestalSubtractedEvt+; 21 #pragma link C++ class MPedCalcFromData+;22 21 23 22 #pragma link C++ class MHPedestalCor+; -
trunk/MagicSoft/Mars/msignal/MExtractTime.cc
r8144 r8154 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: MExtractTime.cc,v 1.22 2006-10-24 08:24:52 tbretz Exp $ 3 ! -------------------------------------------------------------------------- 2 4 ! 3 5 ! * … … 17 19 ! 18 20 ! Author(s): Markus Gaug, 04/2004 <mailto:markus@ifae.es> 19 ! 20 ! Copyright: MAGIC Software Development, 2000-2004 21 ! Author(s): Thomas Bretz, 04/2004 <mailto:tbretz@astro.uni-wuerzburg.de> 22 ! 23 ! Copyright: MAGIC Software Development, 2000-2006 21 24 ! 22 25 ! … … 137 140 // - MArrivalTimeCam::SetUsedFADCSlices(fHiGainFirst, fHiGainLast, fNumHiGainSamples, 138 141 // fLoGainFirst, fLoGainLast, fNumLoGainSamples); 139 / /142 /* 140 143 Bool_t MExtractTime::ReInit(MParList *pList) 141 144 { … … 148 151 return kTRUE; 149 152 } 150 153 */ 151 154 // -------------------------------------------------------------------------- 152 155 // 153 156 // Calculate the integral of the FADC time slices and store them as a new 154 157 // pixel in the MArrivalTimeCam container. 155 / /158 /* 156 159 Int_t MExtractTime::Process() 157 160 { … … 183 186 pix.SetGainSaturation(sathi, satlo); 184 187 185 } /* while (pixel.Next()) */188 } 186 189 187 190 fArrTime->SetReadyToSave(); 188 191 189 192 return kTRUE; 190 } 193 }*/ 191 194 192 195 void MExtractTime::Print(Option_t *o) const 193 196 { 194 if (IsA()==MExtractTime::Class()) 195 *fLog << GetDescriptor() << ":" << endl; 197 // if (IsA()==MExtractTime::Class()) 198 // *fLog << GetDescriptor() << ":" << endl; 199 MExtractor::Print(o); 196 200 *fLog << " Offset Lo-Gain: " << fOffsetLoGain << endl; 197 MExtractor::Print(o); 198 } 201 } -
trunk/MagicSoft/Mars/msignal/MExtractTime.h
r7091 r8154 17 17 18 18 MArrivalTimeCam *fArrTime; //! Container with the photons arrival times 19 19 /* 20 20 virtual void FindTimeHiGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 21 21 Byte_t &sat, const MPedestalPix &ped) const {} 22 22 virtual void FindTimeLoGain(Byte_t *firstused, Float_t &time, Float_t &dtime, 23 23 Byte_t &sat, const MPedestalPix &ped) const {} 24 24 */ 25 25 Int_t PreProcess( MParList *pList ); 26 Bool_t ReInit ( MParList *pList );27 Int_t Process ();26 // Bool_t ReInit ( MParList *pList ); 27 // Int_t Process (); 28 28 29 29 public: -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.cc
r7900 r8154 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: MExtractTimeAndCharge.cc,v 1.55 2006-10-24 08:24:52 tbretz Exp $ 3 ! -------------------------------------------------------------------------- 2 4 ! 3 5 ! * … … 17 19 ! 18 20 ! Author(s): Markus Gaug, 05/2004 <mailto:markus@ifae.es> 21 ! Author(s): Thomas Bretz, 05/2004 <mailto:tbretz@astro.uni-wuerzburg.de> 19 22 ! 20 ! Copyright: MAGIC Software Development, 2000-200 423 ! Copyright: MAGIC Software Development, 2000-2006 21 24 ! 22 25 ! … … 60 63 // MExtractedSignalCam 61 64 // 65 // For weired events check: Run 94127 Event 672, 1028 66 // 62 67 ////////////////////////////////////////////////////////////////////////////// 63 68 #include "MExtractTimeAndCharge.h" … … 70 75 #include "MParList.h" 71 76 72 #include "MRawEvtData.h" 77 //#include "MArrayB.h" 78 //#include "MArrayF.h" 79 80 //#include "MRawEvtData.h" 73 81 #include "MRawEvtPixelIter.h" 74 #include "MRawRunHeader.h" 75 76 #include "MPedestalCam.h" 77 #include "MPedestalPix.h" 82 //#include "MRawRunHeader.h" 83 84 //#include "MPedestalCam.h" 85 //#include "MPedestalPix.h" 86 #include "MPedestalSubtractedEvt.h" 78 87 79 88 #include "MArrivalTimeCam.h" … … 87 96 using namespace std; 88 97 89 const Float_t MExtractTimeAndCharge::fgLoGainStartShift = - 3.5;90 const Byte_t MExtractTimeAndCharge::fgLoGainSwitch = 120;98 const Float_t MExtractTimeAndCharge::fgLoGainStartShift = -6.0; 99 const Byte_t MExtractTimeAndCharge::fgLoGainSwitch = 120; 91 100 92 101 // -------------------------------------------------------------------------- … … 95 104 // 96 105 // Sets: 97 // - fLoGainFirstSave to 098 106 // - fWindowSizeHiGain and fWindowSizeLoGain to 0 99 107 // - fLoGainStartShift to fgLoGainStartShift+fgOffsetLoGain … … 101 109 // 102 110 MExtractTimeAndCharge::MExtractTimeAndCharge(const char *name, const char *title) 103 : fLoGainFirstSave(0),fWindowSizeHiGain(0), fWindowSizeLoGain(0)111 : /*fLoGainFirstSave(0),*/ fWindowSizeHiGain(0), fWindowSizeLoGain(0) 104 112 { 105 113 fName = name ? name : "MExtractTimeAndCharge"; … … 157 165 158 166 if (fSignals) 159 fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast +fHiLoLast, fNumHiGainSamples,167 fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast/*+fHiLoLast*/, fNumHiGainSamples, 160 168 fLoGainFirst, fLoGainLast, fNumLoGainSamples); 161 162 169 163 170 return kTRUE; … … 175 182 Int_t MExtractTimeAndCharge::Process() 176 183 { 177 178 MRawEvtPixelIter pixel(fRawEvt); 179 180 while (pixel.Next()) 181 { 182 // COPY HERE PRODUCING ARRAY WITH SAMPLES 183 184 /* 185 const MPedestalPix &ped = (*fPedestals)[pixidx]; 186 187 const Float_t pedes = ped.GetPedestal(); 188 const Float_t ABoffs = ped.GetPedestalABoffset(); 189 190 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 191 192 const Int_t num = pixel.GetNumHiGainSamples()+pixel.GetNumLoGainSamples(); 193 194 MArrayF sample(num); 195 196 const Int_t abflag = pixel.HasABFlag() ? 1 : 0; 197 const Int_t ids0 = fHiGainFirst + abflag; 198 199 Int_t ids = ids0; 200 201 Float_t null = 0; // Starting value for maxpos 202 Float_t *maxpos = &null; // Position of maximum 203 Float_t *sat1 = 0; // First saturating slice 204 Float_t *sat2 = 0; // Last saturating slice 205 206 const Float_t *beg = sample.GetArray(); 207 const Float_t *end = beg + num; 208 209 Float_t *ptr = beg; 210 while (ptr<end) 211 { 212 *sample++ = (Float_t)*ptr - pedmean[ids++&0x1]; 213 214 // This extraction must be done independant for lo- and hi-gain 215 // if (*ptr > *maxpos) 216 // maxpos = ptr; 217 // 218 // if (*ptr >= fSaturationLimit) 219 // { 220 // sat2 = ptr; 221 // if (!sat1) 222 // sat1 = ptr; 223 // } 224 // 225 // ptr++; 184 MRawEvtPixelIter pixel(fRawEvt); 185 186 while (pixel.Next()) 187 { 188 const Int_t pixidx = pixel.GetPixelId(); 189 190 // 191 // Preparations for the pedestal subtraction (with AB-noise correction) 192 // 193 Float_t *sig = fSignal->GetSamples(pixidx); 194 195 // ==================================================================== 196 // MOVE THIS TO MExtractTimeAndCharge 197 // ==================================================================== 198 // number of hi- and lo-gains 199 const Int_t numh = pixel.GetNumHiGainSamples(); 200 const Int_t numl = pixel.GetNumLoGainSamples(); 201 /* 202 // COPY HERE PRODUCING ARRAY WITH SAMPLES 203 static MArrayB sample; 204 sample.Set(numh+numl); 205 206 if (numl>0) 207 { 208 memcpy(sample.GetArray(), pixel.GetHiGainSamples(), numh); 209 memcpy(sample.GetArray()+numh, pixel.GetLoGainSamples(), numl); 226 210 } 227 */ 228 229 // 230 // Find signal in hi- and lo-gain 231 // 232 Float_t sumhi =0., deltasumhi =0; // Set hi-gain of MExtractedSignalPix valid 233 Float_t timehi=0., deltatimehi=0; // Set hi-gain of MArrivalTimePix valid 234 Byte_t sathi=0; 235 236 // Initialize fMaxBinContent for the case, it gets not set by the derived class 237 fMaxBinContent = fLoGainSwitch + 1; 238 239 const Int_t pixidx = pixel.GetPixelId(); 240 const MPedestalPix &ped = (*fPedestals)[pixidx]; 241 const Bool_t higainabflag = pixel.HasABFlag(); 242 243 FindTimeAndChargeHiGain(pixel.GetHiGainSamples()+fHiGainFirst, pixel.GetLoGainSamples(), 244 sumhi, deltasumhi, timehi, deltatimehi, 245 sathi, ped, higainabflag); 246 247 // Make sure that in cases the time couldn't be correctly determined 248 // more meaningfull default values are assigned 249 if (timehi<=0 || timehi>pixel.GetNumHiGainSamples()) 250 timehi = gRandom->Uniform(pixel.GetNumHiGainSamples()); 251 252 Float_t sumlo =0., deltasumlo =-1.; // invalidate logain of MExtractedSignalPix 253 Float_t timelo=0., deltatimelo=-1; // invalidate logain of MArrivalTimePix 254 Byte_t satlo=0; 255 256 // 257 // Adapt the low-gain extraction range from the obtained high-gain time 258 // 259 260 // IN THIS CASE THE PIXEL SHOULD BE MARKED BAD!!!! 261 // MEANS: Hi gain has saturated, but it is too early to extract 262 // the lo-gain properly 263 // THIS produces pulse positions ~= -1 264 // The signal might be handled in MCalibrateData, but hwat's about 265 // the arrival times in MCalibrateRelTime 266 if (sathi && fMaxBinContent<=fLoGainSwitch) 267 deltasumlo=deltasumhi=deltatimelo=deltatimehi=-1; 268 269 // FIXME: What to do with the pixel if it saturates too early??? 270 if (pixel.HasLoGain() && (fMaxBinContent > fLoGainSwitch /*|| sathi>0*/) ) 271 { 272 fLoGainFirstSave = fLoGainFirst; 273 274 // sathi is the number (not index!) of the first saturating slice 275 // 0 indicates that no saturation was found 276 // FIMXME: Is 3 an accurate value? 277 278 const Float_t pos = sathi==0 ? timehi : (int)(sathi)-3; 279 280 if (pos+fLoGainStartShift>0) 281 fLoGainFirst = (Byte_t)(pos + fLoGainStartShift); 282 283 if (fLoGainFirst<fLoGainFirstSave) 284 fLoGainFirst = fLoGainFirstSave; 285 286 if (fLoGainLast-fLoGainFirst >= fWindowSizeLoGain) 287 { 288 deltasumlo = 0; // make logain of MExtractedSignalPix valid 289 deltatimelo = 0; // make logain of MArrivalTimePix valid 290 291 const Bool_t logainabflag = (higainabflag + pixel.GetNumHiGainSamples()) & 0x1; 292 FindTimeAndChargeLoGain(pixel.GetLoGainSamples()+fLoGainFirst, 293 sumlo, deltasumlo, timelo, deltatimelo, 294 satlo, ped, logainabflag); 295 296 if (satlo>6) 297 deltasumlo=deltatimelo=-1; 298 } 299 fLoGainFirst = fLoGainFirstSave; 300 301 // Make sure that in cases the time couldn't be correctly determined 302 // more meaningfull default values are assigned 303 if (timelo<=0 || timelo>pixel.GetNumLoGainSamples()) 304 timelo = gRandom->Uniform(pixel.GetNumLoGainSamples()); 305 } 306 307 MExtractedSignalPix &pix = (*fSignals)[pixidx]; 308 MArrivalTimePix &tix = (*fArrTime)[pixidx]; 309 pix.SetExtractedSignal(sumhi, deltasumhi, sumlo, deltasumlo); 310 pix.SetGainSaturation(sathi, satlo); 311 312 tix.SetArrivalTime(timehi, deltatimehi, timelo-fOffsetLoGain, deltatimelo); 313 tix.SetGainSaturation(sathi, satlo); 314 211 212 // get pedestal information 213 const MPedestalPix &pedpix = (*fPedestals)[pixidx]; 214 215 // pedestal information 216 const Int_t ab = pixel.HasABFlag() ? 1 : 0; 217 const Float_t ped = pedpix.GetPedestal(); 218 219 // destination array 220 static MArrayF sig; 221 sig.Set(numh+numl); 222 223 // start of destination array, end of hi-gain destination array 224 // and start of hi-gain samples 225 Float_t *beg = sig.GetArray(); 226 Float_t *end = beg + sig.GetSize(); 227 228 // determine with which pedestal (+/- AB offset) to start 229 const Bool_t noswap = (ab&1)==((beg-beg)&1); 230 const Float_t offh = noswap ? pedpix.GetPedestalABoffset() : -pedpix.GetPedestalABoffset(); 231 const Float_t mean[2] = { ped + offh, ped - offh }; 232 233 //const Int_t rangeh = fHiGainLast - fHiGainFirst + 1 + fHiLoLast; 234 //const Int_t rangel = fLoGainLast - fLoGainFirst + 1; 235 236 const Byte_t *src = numl>0 ? sample.GetArray() : pixel.GetHiGainSamples(); 237 //const Byte_t *src = sample.GetArray(); 238 239 // Copy hi-gains into array and substract pedestal 240 // FIXME: Shell we really subtract the pedestal from saturating slices??? 241 for (Float_t *ptr=beg; ptr<end; ptr++) 242 *ptr = (Float_t)*src++ - mean[(ptr-beg)&1]; 243 244 // Determin saturation of hi-gains 245 Byte_t *p0 = fSignal->GetSamplesRaw(pixidx); //numl>0 ? sample.GetArray() : pixel.GetHiGainSamples(); 246 // Byte_t *p0 = sample.GetArray(); 247 248 Byte_t maxcont = 0; 249 Int_t maxposhi = -1; 250 251 Byte_t *sathi0 = 0; // first saturating hi-gain slice 252 Byte_t *sathi1 = 0; // last saturating hi-gain slice 253 for (Byte_t *ptr=p0+fHiGainFirst; ptr<p0+fHiGainLast+fHiLoLast+1; ptr++) 254 { 255 // Get hi-gain maxbincontent 256 // Put this into its own function and loop? 257 if (*ptr>maxcont) 258 { 259 // ORGINAL: 260 //Int_t range = (fHiGainLast - fHiGainFirst + 1 + fHiLoLast) - fWindowSizeHiGain + 1; 261 // maxpos>1 && maxpos<=range 262 263 // This is a strange workaround to fit the previous 264 // Spline setup: TO BE CHECKED! 265 const Int_t pos = ptr-p0; 266 if (pos<fHiGainLast+1) 267 { 268 maxposhi = pos-fHiGainFirst; 269 270 if (maxposhi>1 && maxposhi<fHiGainLast-fHiGainFirst*//*+1 -fWindowSizeHiGain+1*//*+fHiLoLast*//*) 271 maxcont = *ptr; 272 } 273 } 274 275 // FIXME: Do we also have to really COUNT the number 276 // of saturating slices, eg. for crosschecks? 277 if (*ptr>=fSaturationLimit) 278 { 279 sathi1 = ptr; 280 if (!sathi0) 281 sathi0 = ptr; 282 } 283 } 284 */ 285 Int_t sathi0 = fHiGainFirst; // First slice to extract and first saturating slice 286 Int_t sathi1 = fHiGainLast/*+fHiLoLast*/; // Last slice to extract and last saturating slice 287 288 Int_t maxcont; 289 Int_t maxposhi = fSignal->GetMax(pixidx, sathi0, sathi1, maxcont); 290 // Would it be better to take lastsat-firstsat? 291 Int_t numsathi = fSignal->GetSaturation(pixidx, fSaturationLimit, sathi0, sathi1); 292 /* 293 // sathi2 is the number (not the index) of first saturating slice 294 // const Byte_t sathi2 = sathi0<0 ? 0 : sathi0+1; 295 296 // Number (not index) of first saturating slice 297 // const Byte_t sathi2 = sathi0==0 ? 0 : sathi0-p0+1; 298 // const Byte_t numsathi = sathi0==0 ? 0 : sathi1-sathi0+1; 299 300 // Int_t maxb = maxcont; 301 302 // ==================================================================== 303 // FIXME: Move range out of the extractors... 304 305 // Initialize maxcont for the case, it gets not set by the derived class 306 Float_t sumhi2 =0., deltasumhi2 =-1; // Set hi-gain of MExtractedSignalPix valid 307 Float_t timehi2=0., deltatimehi2=-1; // Set hi-gain of MArrivalTimePix valid 308 */ 309 Float_t sumhi =0., deltasumhi =-1; // Set hi-gain of MExtractedSignalPix valid 310 Float_t timehi=0., deltatimehi=-1; // Set hi-gain of MArrivalTimePix valid 311 if (numsathi<1) 312 { 313 314 const Int_t rangehi = fHiGainLast - fHiGainFirst + 1/* + fHiLoLast*/; 315 FindTimeAndChargeHiGain2(sig/*.GetArray()*/+fHiGainFirst, rangehi, 316 sumhi, deltasumhi, timehi, deltatimehi, 317 numsathi, maxposhi); 318 319 timehi += fHiGainFirst; 320 } 321 /* 322 Float_t sumhi = sumhi2; 323 Float_t deltasumhi = deltasumhi2; 324 Float_t timehi = timehi2; 325 Float_t deltatimehi=deltatimehi2; 326 // Byte_t sathi = sathi2; 327 328 329 // 330 // Find signal in hi- and lo-gain 331 // 332 Float_t sumhi =0., deltasumhi =-1; // Set hi-gain of MExtractedSignalPix valid 333 Float_t timehi=0., deltatimehi=-1; // Set hi-gain of MArrivalTimePix valid 334 Byte_t sathi=0; 335 336 // Initialize maxcont for the case, it gets not set by the derived class 337 maxcont = fLoGainSwitch + 1; 338 339 //const Int_t pixidx = pixel.GetPixelId(); 340 //const MPedestalPix &ped = (*fPedestals)[pixidx]; 341 const Bool_t higainabflag = pixel.HasABFlag(); 342 FindTimeAndChargeHiGain(pixel.GetHiGainSamples()+fHiGainFirst, pixel.GetLoGainSamples(), 343 sumhi, deltasumhi, timehi, deltatimehi, 344 sathi, pedpix, higainabflag); 345 timehi += fHiGainFirst; 346 347 */ 348 // Make sure that in cases the time couldn't be correctly determined 349 // more meaningfull default values are assigned 350 if (timehi<=fHiGainFirst || timehi>=fHiGainLast) 351 timehi = gRandom->Uniform(fHiGainLast-fHiGainFirst)+fHiGainFirst; 352 353 Float_t sumlo =0., deltasumlo =-1.; // invalidate logain of MExtractedSignalPix 354 Float_t timelo=0., deltatimelo=-1; // invalidate logain of MArrivalTimePix 355 Byte_t satlo=0; 356 Int_t numsatlo=0; 357 358 // 359 // Adapt the low-gain extraction range from the obtained high-gain time 360 // 361 362 // IN THIS CASE THE PIXEL SHOULD BE MARKED BAD!!!! 363 // MEANS: Hi gain has saturated, but the signal is to dim 364 // to extract the lo-gain properly 365 // THIS produces pulse positions ~= -1 366 // The signal might be handled in MCalibrateData, but hwat's about 367 // the arrival times in MCalibrateRelTime 368 if (numsathi>0 && maxcont<=fLoGainSwitch) 369 deltasumlo=deltasumhi=deltatimelo=deltatimehi=-1; 370 371 // If more than 8 hi-gain slices have saturated this is 372 // no physical event. We just assume that something with 373 // the extraction is wrong 374 if (numsathi>8) // FIXME: Should be something like 2? 375 deltasumhi=deltatimehi=-1; 376 377 // FIXME: What to do with the pixel if it saturates too early??? 378 if (pixel.HasLoGain() && (maxcont > fLoGainSwitch /*|| sathi>0*/) ) 379 { 380 // To determin the window in which the lo-gain is extracted 381 // clearly more information about the relation between the 382 // extraction window and the reslting time is necessary. 383 //fLoGainStartShift = -6.0; 384 385 const Byte_t fLoGainFirstSave = fLoGainFirst; 386 387 // sathi is the number (not index!) of the first saturating slice 388 // 0 indicates that no saturation was found 389 // FIXME: Is 0.5 should be expressed by the rise time of 390 // the hi-gain signal! 391 const Float_t pos = numsathi==0 ? timehi : sathi0-0.5; 392 393 const Int_t lostart = TMath::FloorNint(pos+6); 394 395 const Int_t newfirst = TMath::FloorNint(pos+fLoGainStartShift); 396 fLoGainFirst = newfirst>fLoGainFirstSave ? newfirst : fLoGainFirstSave; 397 398 // if (fLoGainLast-fLoGainFirst >= fWindowSizeLoGain) 399 { 400 /* 401 Float_t sumlo2 =0., deltasumlo2 =-1.; // invalidate logain of MExtractedSignalPix 402 Float_t timelo2=0., deltatimelo2=-1.; // invalidate logain of MArrivalTimePix 403 404 // Determin saturation in lo-gains 405 Byte_t *satlo0 = 0; // first saturating hi-gain slice 406 Byte_t *satlo1 = 0; // last saturating hi-gain slice 407 Int_t maxposlo = -1; 408 Byte_t maxlo = 0; 409 410 Byte_t *p0 = fSignal->GetSamplesRaw(pixidx); 411 for (Byte_t *ptr=p0+numh+fLoGainFirst; ptr<p0+numh+fLoGainLast+1; ptr++) 412 { 413 if (*ptr>maxlo) 414 { 415 // This is a strange workaround to fit the previous 416 // Spline setup: TO BE CHECKED! 417 const Int_t ipos = ptr-p0-numh; 418 if (ipos>=fLoGainFirst && ipos<=fLoGainLast) 419 { 420 maxposlo = ipos-fLoGainFirst; 421 maxlo = *ptr; 422 } 423 } 424 if (*ptr>=fSaturationLimit) 425 { 426 satlo1 = ptr; 427 if (!satlo0) 428 satlo0 = ptr; 429 } 430 // FIXME: Do we also have to really COUNT the number 431 // of saturating slices, eg. for crosschecks? 432 } 433 434 // Number of saturating lo-gain slices (this is not necessary 435 // identical to a counter counting the number of saturating 436 // slices!) 437 const Byte_t numsatlo = satlo0==0 ? 0 : satlo1-satlo0+1; 438 */ 439 440 Int_t satlo0 = numh+fLoGainFirst; // First slice to extract and first saturating slice 441 Int_t satlo1 = numh+fLoGainLast; // Last slice to extract and last saturating slice 442 443 // Would it be better to take lastsat-firstsat? 444 Int_t maxlo; 445 Int_t maxposlo = fSignal->GetMax(pixidx, satlo0, satlo1, maxlo); 446 numsatlo = fSignal->GetSaturation(pixidx, fSaturationLimit, satlo0, satlo1); 447 448 // const Byte_t satlo2 = numsatlo; 449 450 const Int_t rangelo = fLoGainLast - fLoGainFirst + 1; 451 FindTimeAndChargeLoGain2(sig/*.GetArray()*/+numh+fLoGainFirst, rangelo, 452 sumlo, deltasumlo, timelo, deltatimelo, 453 numsatlo, maxposlo); 454 timelo += fLoGainFirst; 455 456 // sumlo =sumlo2, deltasumlo=deltasumlo2; // invalidate logain of MExtractedSignalPix 457 // timelo=timelo2, deltatimelo=deltatimelo2; // invalidate logain of MArrivalTimePix 458 // satlo = satlo2; 459 460 /* 461 // THIS IS NOW THE JOB OF THE EXTRACTOR! 462 //deltasumlo = 0; // make logain of MExtractedSignalPix valid 463 //deltatimelo = 0; // make logain of MArrivalTimePix valid 464 465 const Bool_t logainabflag = (higainabflag + pixel.GetNumHiGainSamples()) & 0x1; 466 FindTimeAndChargeLoGain(pixel.GetLoGainSamples()+fLoGainFirst, 467 sumlo, deltasumlo, timelo, deltatimelo, 468 satlo, pedpix, logainabflag); 469 timelo += fLoGainFirst; 470 */ 471 472 473 // If more than 6 lo-gain slices have saturated this is 474 // no physical event. We just assume that something with 475 // the extraction is wrong 476 if (numsatlo>6) 477 deltasumlo=deltatimelo=-1; 478 } 479 fLoGainFirst = fLoGainFirstSave; 480 481 // Make sure that in cases the time couldn't be correctly determined 482 // more meaningfull default values are assigned 483 if (timelo<=fLoGainFirst || timelo>=fLoGainLast) 484 timelo = gRandom->Uniform(fLoGainLast-fLoGainFirst)+fLoGainFirst; 485 } 486 487 MExtractedSignalPix &pix = (*fSignals)[pixidx]; 488 MArrivalTimePix &tix = (*fArrTime)[pixidx]; 489 pix.SetExtractedSignal(sumhi, deltasumhi, sumlo, deltasumlo); 490 pix.SetGainSaturation(numsathi, numsatlo); 491 // pix.SetGainSaturation(sathi, satlo); 492 493 tix.SetArrivalTime(timehi, deltatimehi, timelo-fOffsetLoGain, deltatimelo); 494 tix.SetGainSaturation(numsathi, numsatlo); 495 // tix.SetGainSaturation(sathi, satlo); 315 496 } /* while (pixel.Next()) */ 316 497 317 fArrTime->SetReadyToSave();318 fSignals->SetReadyToSave();319 320 return kTRUE;498 fArrTime->SetReadyToSave(); 499 fSignals->SetReadyToSave(); 500 501 return kTRUE; 321 502 } 322 503 … … 352 533 void MExtractTimeAndCharge::Print(Option_t *o) const 353 534 { 354 if (IsA()==Class()) 355 *fLog << GetDescriptor() << ":" << endl; 535 MExtractTime::Print(o); 536 // if (IsA()==Class()) 537 // *fLog << GetDescriptor() << ":" << endl; 356 538 357 539 *fLog << dec; 358 *fLog << " Taking " << fWindowSizeHiGain359 << " HiGain samples from slice " << (Int_t)fHiGainFirst360 << " to " << (Int_t)(fHiGainLast+fHiLoLast) << " incl" << endl;361 *fLog << " Taking " << fWindowSizeLoGain362 << " LoGain samples from slice " << (Int_t)fLoGainFirst363 << " to " << (Int_t)fLoGainLast << " incl" << endl;364 540 //*fLog << " Taking " << fWindowSizeHiGain 541 // << " HiGain samples from slice " << (Int_t)fHiGainFirst 542 // << " to " << (Int_t)(fHiGainLast/*+fHiLoLast*/) << " incl" << endl; 543 //*fLog << " Taking " << fWindowSizeLoGain 544 // << " LoGain samples from slice " << (Int_t)fLoGainFirst 545 // << " to " << (Int_t)fLoGainLast << " incl" << endl; 546 // 365 547 *fLog << " LoGainStartShift: " << fLoGainStartShift << endl; 366 548 *fLog << " LoGainSwitch: " << (Int_t)fLoGainSwitch << endl; 367 MExtractTime::Print(o);368 549 } -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndCharge.h
r7091 r8154 14 14 static const Byte_t fgLoGainSwitch; //! Default for fLoGainSwitch (now set to: 100) 15 15 16 pr otected:16 private: 17 17 18 Byte_t fLoGainFirstSave; //! Temporary variable to store the original position of low-gain start slice18 // Byte_t fLoGainFirstSave; //! Temporary variable to store the original position of low-gain start slice 19 19 Float_t fLoGainStartShift; // Shift to start searching the low-gain signal obtained from the high-gain times. 20 20 21 21 Byte_t fLoGainSwitch; // Limit for max. bin content before the low-gain gets extracted 22 22 23 protected: 24 23 25 Int_t fWindowSizeHiGain; // Window Size High-Gain 24 26 Int_t fWindowSizeLoGain; // Window Size Low-Gain 25 27 26 Byte_t fMaxBinContent; // Maximum bin content27 28 28 Int_t PreProcess(MParList *pList); 29 29 Int_t Process(); 30 Bool_t ReInit(MParList *pList);31 32 30 Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print); 33 31 … … 47 45 virtual void SetWindowSize(Int_t windowh, Int_t windowl) { fWindowSizeHiGain = windowh; 48 46 fWindowSizeLoGain = windowl; } 47 48 Bool_t ReInit(MParList *pList); 49 49 50 50 virtual Bool_t InitArrays() { return kTRUE; } 51 51 /* 52 52 virtual void FindTimeAndChargeHiGain(Byte_t *firstused, Byte_t *logain, Float_t &sum, Float_t &dsum, 53 53 Float_t &time, Float_t &dtime, … … 57 57 Float_t &time, Float_t &dtime, 58 58 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag) { } 59 */ 60 virtual void FindTimeAndChargeHiGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 61 Float_t &time, Float_t &dtime, 62 Byte_t sat, Int_t maxpos) { } 63 64 virtual void FindTimeAndChargeLoGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 65 Float_t &time, Float_t &dtime, 66 Byte_t sat, Int_t maxpos) { } 67 68 // For MExtractPedestal 59 69 60 70 ClassDef(MExtractTimeAndCharge, 2) // Time And Charge Extractor Base Class -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeDigitalFilter.cc
r8129 r8154 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: MExtractTimeAndChargeDigitalFilter.cc,v 1.73 2006-10-24 08:24:52 tbretz Exp $ 3 ! -------------------------------------------------------------------------- 2 4 ! 3 5 ! * … … 72 74 #include "MCalibrationPattern.h" 73 75 #include "MExtractedSignalCam.h" 76 #include "MExtralgoDigitalFilter.h" 74 77 75 78 #include "MPedestalPix.h" … … 83 86 const Byte_t MExtractTimeAndChargeDigitalFilter::fgLoGainFirst = 1; 84 87 const Byte_t MExtractTimeAndChargeDigitalFilter::fgLoGainLast = 14; 85 const Int_t MExtractTimeAndChargeDigitalFilter::fgWindowSizeHiGain = 4;86 const Int_t MExtractTimeAndChargeDigitalFilter::fgWindowSizeLoGain = 6;88 //const Int_t MExtractTimeAndChargeDigitalFilter::fgWindowSizeHiGain = 4; 89 //const Int_t MExtractTimeAndChargeDigitalFilter::fgWindowSizeLoGain = 6; 87 90 const Int_t MExtractTimeAndChargeDigitalFilter::fgBinningResolutionHiGain = 10; 88 91 const Int_t MExtractTimeAndChargeDigitalFilter::fgBinningResolutionLoGain = 10; … … 90 93 const Int_t MExtractTimeAndChargeDigitalFilter::fgSignalStartBinLoGain = 4; 91 94 const Float_t MExtractTimeAndChargeDigitalFilter::fgOffsetLoGain = 0.95; 92 const Float_t MExtractTimeAndChargeDigitalFilter::fgLoGainStartShift = -1.8;95 //const Float_t MExtractTimeAndChargeDigitalFilter::fgLoGainStartShift = -1.8; 93 96 94 97 // -------------------------------------------------------------------------- … … 104 107 // 105 108 MExtractTimeAndChargeDigitalFilter::MExtractTimeAndChargeDigitalFilter(const char *name, const char *title) 106 : fTimeShiftHiGain(0.), fTimeShiftLoGain(0.), fAutomaticWeights(kTRUE), fRandomIter(0) 109 : fBinningResolutionHiGain(fgBinningResolutionHiGain), 110 fBinningResolutionLoGain(fgBinningResolutionLoGain), 111 fAutomaticWeights(kTRUE), fRandomIter(0) 107 112 { 108 113 fName = name ? name : "MExtractTimeAndChargeDigitalFilter"; … … 110 115 111 116 SetRange(fgHiGainFirst, fgHiGainLast, fgLoGainFirst, fgLoGainLast); 112 SetWindowSize( );113 SetBinningResolution();114 SetSignalStartBin();117 SetWindowSize(3, 5); 118 // SetBinningResolution(); 119 // SetSignalStartBin(); 115 120 116 121 SetOffsetLoGain(fgOffsetLoGain); // Order between both 117 SetLoGainStartShift(fgLoGainStartShift); // is important122 // SetLoGainStartShift(fgLoGainStartShift); // is important 118 123 } 119 124 … … 121 126 // 122 127 // Checks: 123 // - if a window is bigger than the one defined by the ranges, set it to the available range 128 // - if a window is bigger than the one defined by the ranges, set it 129 // to the available range 124 130 // 125 131 // Sets: 126 132 // - fNumHiGainSamples to: (Float_t)fWindowSizeHiGain 127 133 // - fNumLoGainSamples to: (Float_t)fWindowSizeLoGain 128 // 134 // 135 // This function might be used to turn the digital filter into a 136 // sliding window extractor by setting the filename to NULL 137 // 129 138 void MExtractTimeAndChargeDigitalFilter::SetWindowSize(Int_t windowh, Int_t windowl) 130 139 { 131 132 if (windowh != fgWindowSizeHiGain)133 *fLog << warn << GetDescriptor()134 << ": ATTENTION!!! If you are not Hendrik Bartko, do NOT use a different window size than the default." << endl;135 if (windowl != fgWindowSizeLoGain)136 *fLog << warn << GetDescriptor()137 << ": ATTENTION!!! If you are not Hendrik Bartko, do NOT use a different window size than the default" << endl;138 139 140 fWindowSizeHiGain = windowh; 140 141 fWindowSizeLoGain = windowl; … … 184 185 // size of 6. The exact numbers have to be found still. 185 186 // 186 fNumHiGainSamples = fAmpWeightsHiGain.GetSum()/fBinningResolutionHiGain;187 fNumLoGainSamples = fAmpWeightsLoGain.GetSum()/fBinningResolutionLoGain;187 fNumHiGainSamples = fWindowSizeHiGain; 188 fNumLoGainSamples = fWindowSizeLoGain; 188 189 fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples); 189 190 fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples); … … 191 192 } 192 193 194 193 195 // -------------------------------------------------------------------------- 194 196 // … … 213 215 // 214 216 // If new weights are set 215 // fTimeShiftHiGain216 // fTimeShiftLoGain217 217 // fNumHiGainSamples 218 218 // fNumLoGainSamples … … 234 234 235 235 // 236 // shift the times back to the right reference (start counting from 0) 236 // We need here the effective number of samples. In pricipal the number 237 // is different depending on the weights used and must be set 238 // event by event. 237 239 // 238 // The high-gain has the extraction offset (fHiGainFirst) already included 239 // here for speed reason. The low-gain has a changing extraction offset, 240 // so it will be added at every event (in FindTimeAndChargeLoGain) 241 fTimeShiftHiGain = 0.5 + 1./fBinningResolutionHiGain; 242 fTimeShiftLoGain = 0.5 + 1./fBinningResolutionLoGain; 243 244 // 245 // We need here the effective number of samples which is about 2.5 in the case of a window 246 // size of 6. The exact numbers have to be found still. 247 // 248 fNumHiGainSamples = (Float_t)fWindowSizeHiGain/2.4; 249 fNumLoGainSamples = (Float_t)fWindowSizeLoGain/2.4; 240 fNumHiGainSamples = fAmpWeightsHiGain.GetSum()/fBinningResolutionHiGain; 241 fNumLoGainSamples = fAmpWeightsLoGain.GetSum()/fBinningResolutionLoGain; 250 242 fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples); 251 243 fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples); … … 253 245 // From MExtractTimeAndCharge::ReInit 254 246 if (fSignals) 255 fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast +fHiLoLast, fNumHiGainSamples,247 fSignals->SetUsedFADCSlices(fHiGainFirst, fHiGainLast/*+fHiLoLast*/, fNumHiGainSamples, 256 248 fLoGainFirst, fLoGainLast, fNumLoGainSamples); 257 249 return kTRUE; … … 269 261 return kFALSE; 270 262 271 const Int_t rangehi = (Int_t)(fHiGainLast - fHiGainFirst + 1 + fHiLoLast); 272 const Int_t rangelo = (Int_t)(fLoGainLast - fLoGainFirst + 1); 273 274 fHiGainSignal.Set(rangehi); 275 fLoGainSignal.Set(rangelo); 263 //const Int_t rangehi = (Int_t)(fHiGainLast - fHiGainFirst + 1 + fHiLoLast); 264 //const Int_t rangelo = (Int_t)(fLoGainLast - fLoGainFirst + 1); 265 266 //cout << "ARRAYS INITIALIZED TO : " << rangehi << " " << rangelo << endl; 267 268 //fHiGainSignal.Set(rangehi); 269 //fLoGainSignal.Set(rangelo); 276 270 277 271 return GetWeights(); … … 295 289 } 296 290 297 void MExtractTimeAndChargeDigitalFilter::CalcBinningResArrays()298 {299 300 fArrBinningResHiGain.Set(fWindowSizeHiGain);301 fArrBinningResHalfHiGain.Set(fWindowSizeHiGain);302 303 for (int i=0; i<fWindowSizeHiGain; i++)304 {305 fArrBinningResHiGain[i] = fBinningResolutionHiGain*i;306 fArrBinningResHalfHiGain[i] = fArrBinningResHiGain[i] + fBinningResolutionHalfHiGain;307 }308 309 fArrBinningResLoGain.Set(fWindowSizeLoGain);310 fArrBinningResHalfLoGain.Set(fWindowSizeLoGain);311 312 for (int i=0; i<fWindowSizeLoGain; i++)313 {314 fArrBinningResLoGain[i] = fBinningResolutionLoGain*i;315 fArrBinningResHalfLoGain[i] = fArrBinningResLoGain[i] + fBinningResolutionHalfLoGain;316 }317 }318 319 291 // -------------------------------------------------------------------------- 320 292 // 321 293 // Apply the digital filter algorithm to the high-gain slices. 322 294 // 323 void MExtractTimeAndChargeDigitalFilter::FindTimeAndChargeHiGain(Byte_t *ptr, Byte_t *logain, Float_t &sum, Float_t &dsum, 295 void MExtractTimeAndChargeDigitalFilter::FindTimeAndChargeHiGain2(const Float_t *ptr, Int_t num, 296 Float_t &sum, Float_t &dsum, 297 Float_t &time, Float_t &dtime, 298 Byte_t sat, Int_t maxpos) 299 { 300 // Do some handling if maxpos is last slice! 301 302 MExtralgoDigitalFilter df(fBinningResolutionHiGain, fWindowSizeHiGain, 303 fAmpWeightsHiGain.GetArray(), 304 fTimeWeightsHiGain.GetArray(), 305 fPulseHiGain.GetArray()); 306 df.SetData(num, ptr); 307 308 if (IsNoiseCalculation()) 309 { 310 if (fRandomIter == fBinningResolutionHiGain) 311 fRandomIter = 0; 312 313 sum = df.ExtractNoise(fRandomIter); 314 fRandomIter++; 315 return; 316 } 317 318 df.Extract(/*maxpos*/); 319 df.GetSignal(sum, dsum); 320 df.GetTime(time, dtime); 321 } 322 323 void MExtractTimeAndChargeDigitalFilter::FindTimeAndChargeLoGain2(const Float_t *ptr, Int_t num, 324 Float_t &sum, Float_t &dsum, 325 Float_t &time, Float_t &dtime, 326 Byte_t sat, Int_t maxpos) 327 { 328 MExtralgoDigitalFilter df(fBinningResolutionLoGain, fWindowSizeLoGain, 329 fAmpWeightsLoGain.GetArray(), 330 fTimeWeightsLoGain.GetArray(), 331 fPulseLoGain.GetArray()); 332 333 df.SetData(num, ptr); 334 335 if (IsNoiseCalculation()) 336 { 337 if (fRandomIter == fBinningResolutionLoGain) 338 fRandomIter = 0; 339 340 sum = df.ExtractNoise(fRandomIter); 341 return; 342 } 343 344 df.Extract(/*maxpos*/); 345 df.GetSignal(sum, dsum); 346 df.GetTime(time, dtime); 347 } 348 349 /* 350 // -------------------------------------------------------------------------- 351 // 352 // Apply the digital filter algorithm to the high-gain slices. 353 // 354 void MExtractTimeAndChargeDigitalFilter::FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum, 324 355 Float_t &time, Float_t &dtime, 325 356 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag) 326 357 { 327 328 Int_t range = fHiGainLast - fHiGainFirst + 1; 329 330 const Byte_t *end = ptr + range; 331 Byte_t *p = ptr; 332 333 // 334 // Preparations for the pedestal subtraction (with AB-noise correction) 335 // 336 const Float_t pedes = ped.GetPedestal(); 337 const Float_t ABoffs = ped.GetPedestalABoffset(); 338 339 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 340 341 range += fHiLoLast; 342 fMaxBinContent = 0; 343 // 344 // Check for saturation in all other slices 345 // 346 Int_t ids = fHiGainFirst; 347 Float_t *sample = fHiGainSignal.GetArray(); 348 while (p<end) 349 { 350 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 351 352 if (*p > fMaxBinContent) 353 { 354 Byte_t maxpos = p-ptr; 355 356 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 357 if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 358 fMaxBinContent = *p; 359 } 360 361 if (*p++ >= fSaturationLimit) 362 if (!sat) 363 sat = ids-fHiGainFirst; 364 } 365 366 // 367 // Slide with a window of size fWindowSizeHiGain over the sample 368 // and multiply the entries with the corresponding weights 369 // 370 if (IsNoiseCalculation()) 371 { 372 if (fRandomIter == fBinningResolutionHiGain) 373 fRandomIter = 0; 374 for (Int_t ids=0; ids < fWindowSizeHiGain; ids++) 358 Int_t range = fHiGainLast - fHiGainFirst + 1; 359 const Byte_t *end = first + range; 360 Byte_t *p = first; 361 362 const Float_t pedes = ped.GetPedestal(); 363 const Float_t ABoffs = ped.GetPedestalABoffset(); 364 365 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 366 367 Byte_t maxcont = 0; 368 Int_t maxpos = 0; // obsolete for Digital Filter (used in spline!) 369 sat = 0; 370 371 // 372 // Check for saturation in all other slices 373 // 374 Int_t ids = fHiGainFirst; 375 Float_t *sample = fHiGainSignal.GetArray(); 376 377 while (p<end) 378 { 379 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 380 381 if (*p > maxcont) 375 382 { 376 const Int_t idx = fArrBinningResHiGain[ids] + fRandomIter; 377 sum += fAmpWeightsHiGain [idx]*fHiGainSignal[ids]; 383 maxpos = ids-fHiGainFirst-1; 384 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 385 //if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 386 if (maxpos > 1 && maxpos < (range-1*//* - fWindowSizeHiGain + 1*//*)) 387 maxcont = *p; 378 388 } 379 fRandomIter++; 380 return; 381 } 382 383 if (fHiLoLast != 0) 384 { 385 386 end = logain + fHiLoLast; 387 388 while (logain<end) 389 390 if (*p++ >= fSaturationLimit) 391 if (!sat) 392 sat = ids-fHiGainFirst; 393 } 394 395 if (fHiLoLast != 0) 396 { 397 end = logain + fHiLoLast; 398 399 while (logain<end) 389 400 { 390 391 *sample++ = (Float_t)*logain - pedmean[(ids++ + abflag) & 0x1]; 392 393 if (*logain++ >= fSaturationLimit) 394 if (!sat) 395 sat = ids-fHiGainFirst; 401 *sample++ = (Float_t)*logain - pedmean[(ids++ + abflag) & 0x1]; 402 403 if (*logain > maxcont) 404 { 405 maxpos = ids-fHiGainFirst-1; 406 407 // FIXME!!! MUST BE THERE! 408 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 409 //if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 410 // maxcont = *logain; 411 } 412 413 if (*logain++ >= fSaturationLimit) 414 if (!sat) 415 sat = ids-fHiGainFirst; 416 417 range++; 396 418 } 397 419 } 398 420 399 // 400 // allow no saturated slice 401 // 402 // if (sat > 0) 403 // return; 404 405 Float_t time_sum = 0.; 406 Float_t fmax = -FLT_MAX; 407 Float_t ftime_max = 0.; 408 Int_t max_p = -1; 409 410 // 411 // Calculate the sum of the first fWindowSize slices 412 // 413 for (Int_t i=0;i<range-fWindowSizeHiGain+1;i++) 414 { 415 sum = 0.; 416 time_sum = 0.; 417 418 // 419 // Slide with a window of size fWindowSizeHiGain over the sample 420 // and multiply the entries with the corresponding weights 421 // 422 for (Int_t sample=0; sample < fWindowSizeHiGain; sample++) 423 { 424 const Int_t idx = fBinningResolutionHiGain*sample+fBinningResolutionHalfHiGain; 425 const Float_t pex = fHiGainSignal[sample+i]; 426 sum += fAmpWeightsHiGain [idx]*pex; 427 time_sum += fTimeWeightsHiGain[idx]*pex; 428 } 429 430 if (sum>fmax) 431 { 432 fmax = sum; 433 ftime_max = time_sum; 434 max_p = i; 435 } 436 } /* for (Int_t i=0;i<range-fWindowSizeHiGain+1;i++) */ 437 438 if (max_p<0) 439 { 440 sum = 0; 441 time = -1; 442 dsum = -1; 443 dtime = -1; 444 return; 445 } 446 447 if (fmax==0) 448 { 449 sum = 0; 450 time = -1; 451 dsum = 0; 452 dtime = 0; 453 return; 454 } 455 456 ftime_max /= fmax; 457 Int_t t_iter = Int_t(ftime_max*fBinningResolutionHiGain); 458 Int_t sample_iter = 0; 459 460 while ( t_iter > fBinningResolutionHalfHiGain-1 || t_iter < -fBinningResolutionHalfHiGain ) 461 { 462 if (t_iter > fBinningResolutionHalfHiGain-1) 463 { 464 t_iter -= fBinningResolutionHiGain; 465 max_p--; 466 sample_iter--; 467 } 468 if (t_iter < -fBinningResolutionHalfHiGain) 469 { 470 t_iter += fBinningResolutionHiGain; 471 max_p++; 472 sample_iter++; 473 } 474 } 475 476 sum = 0.; 477 time_sum = 0.; 478 if (max_p < 0) 479 max_p = 0; 480 if (max_p+fWindowSizeHiGain > range) 481 max_p = range-fWindowSizeHiGain; 482 // 483 // Slide with a window of size fWindowSizeHiGain over the sample 484 // and multiply the entries with the corresponding weights 485 // 486 for (Int_t sample=0; sample < fWindowSizeHiGain; sample++) 487 { 488 const Int_t idx = fArrBinningResHalfHiGain[sample] + t_iter; 489 const Int_t ids = max_p + sample; 490 const Float_t pex = fHiGainSignal[ids]; 491 sum += fAmpWeightsHiGain [idx]*pex; 492 time_sum += fTimeWeightsHiGain[idx]*pex; 493 } 494 495 if (sum == 0) 496 { 497 time = -1; 498 dsum = 0; 499 dtime = 0; 500 return; 501 } 502 503 // here, the first high-gain slice is already included in the fTimeShiftHiGain 504 // time = fTimeShiftHiGain + max_p - Float_t(t_iter)/fBinningResolutionHiGain; 505 time = max_p + fTimeShiftHiGain + (Float_t)fHiGainFirst /* this shifts the time to the start of the rising edge */ 506 - ((Float_t)t_iter)/fBinningResolutionHiGain; 507 508 const Float_t timefineadjust = time_sum/sum; 509 510 if (TMath::Abs(timefineadjust) < 4./fBinningResolutionHiGain) 511 time -= timefineadjust; 512 421 FindTimeAndChargeHiGain2(fHiGainSignal.GetArray(), range, 422 sum, dsum, time, dtime, 423 sat, 0); 513 424 } 514 425 … … 521 432 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag) 522 433 { 523 524 const Int_t range = fLoGainLast - fLoGainFirst + 1; 525 526 const Byte_t *end = ptr + range; 527 Byte_t *p = ptr; 528 // 529 // Prepare the low-gain pedestal 530 // 531 const Float_t pedes = ped.GetPedestal(); 532 const Float_t ABoffs = ped.GetPedestalABoffset(); 533 534 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 535 536 // 537 // Check for saturation in all other slices 538 // 539 Float_t *sample = fLoGainSignal.GetArray(); 540 Int_t ids = fLoGainFirst; 541 while (p<end) 542 { 543 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 544 545 if (*p++ >= fSaturationLimit) 546 sat++; 547 } 548 549 // 550 // Slide with a window of size fWindowSizeLoGain over the sample 551 // and multiply the entries with the corresponding weights 552 // 553 if (IsNoiseCalculation()) 554 { 555 if (fRandomIter == fBinningResolutionLoGain) 556 fRandomIter = 0; 557 for (Int_t ids=0; ids < fWindowSizeLoGain; ids++) 558 { 559 const Int_t idx = fArrBinningResLoGain[ids] + fRandomIter; 560 sum += fAmpWeightsLoGain [idx]*fLoGainSignal[ids]; 561 } 562 return; 563 } 564 565 Float_t time_sum = 0.; 566 Float_t fmax = -FLT_MAX; 567 Float_t ftime_max = 0.; 568 Int_t max_p = -1; 569 570 // 571 // Calculate the sum of the first fWindowSize slices 572 // 573 for (Int_t i=0;i<range-fWindowSizeLoGain+1;i++) 574 { 575 sum = 0.; 576 time_sum = 0.; 577 578 // 579 // Slide with a window of size fWindowSizeLoGain over the sample 580 // and multiply the entries with the corresponding weights 581 // 582 for (Int_t sample=0; sample < fWindowSizeLoGain; sample++) 583 { 584 const Int_t idx = fArrBinningResHalfLoGain[sample]; 585 const Float_t pex = fLoGainSignal[sample+i]; 586 sum += fAmpWeightsLoGain [idx]*pex; 587 time_sum += fTimeWeightsLoGain[idx]*pex; 588 } 589 590 if (sum>fmax) 591 { 592 fmax = sum; 593 ftime_max = time_sum; 594 max_p = i; 595 } 596 } /* for (Int_t i=0;i<range-fWindowSizeLoGain+1;i++) */ 597 598 if (max_p<0) 599 { 600 sum = 0; 601 time = -1; 602 dsum = -1; 603 dtime = -1; 604 return; 605 } 606 607 if (fmax==0) 608 { 609 sum = 0; 610 time = -1; 611 dsum = 0; 612 dtime = 0; 613 return; 614 } 615 616 ftime_max /= fmax; 617 Int_t t_iter = Int_t(ftime_max*fBinningResolutionLoGain); 618 Int_t sample_iter = 0; 619 620 while ( t_iter > fBinningResolutionHalfLoGain-1 || t_iter < -fBinningResolutionHalfLoGain ) 621 { 622 if (t_iter > fBinningResolutionHalfLoGain-1) 623 { 624 t_iter -= fBinningResolutionLoGain; 625 max_p--; 626 sample_iter--; 627 } 628 if (t_iter < -fBinningResolutionHalfLoGain) 629 { 630 t_iter += fBinningResolutionLoGain; 631 max_p++; 632 sample_iter++; 633 } 634 } 635 636 sum = 0.; 637 time_sum = 0.; 638 639 // 640 // Slide with a window of size fWindowSizeLoGain over the sample 641 // and multiply the entries with the corresponding weights 642 // 643 for (Int_t sample=0; sample < fWindowSizeLoGain; sample++) 644 { 645 const Int_t idx = fArrBinningResHalfLoGain[sample] + t_iter; 646 const Int_t ids = max_p + sample; 647 const Float_t pex = ids < 0 ? 0. : ( ids >= range ? 0. : fLoGainSignal[ids]); 648 sum += fAmpWeightsLoGain [idx]*pex; 649 time_sum += fTimeWeightsLoGain[idx]*pex; 650 } 651 652 if (sum == 0) 653 { 654 time = -1; 655 dsum = 0; 656 dtime = 0; 657 return; 658 } 659 660 time = max_p + fTimeShiftLoGain + (Float_t)fLoGainFirst /* this shifts the time to the start of the rising edge */ 661 - ((Float_t)t_iter)/fBinningResolutionLoGain; 662 663 const Float_t timefineadjust = time_sum/sum; 664 665 if (TMath::Abs(timefineadjust) < 4./fBinningResolutionLoGain) 666 time -= timefineadjust; 667 668 } 669 434 const Int_t range = fLoGainLast - fLoGainFirst + 1; 435 436 const Byte_t *end = ptr + range; 437 Byte_t *p = ptr; 438 439 // 440 // Prepare the low-gain pedestal 441 // 442 const Float_t pedes = ped.GetPedestal(); 443 const Float_t ABoffs = ped.GetPedestalABoffset(); 444 445 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 446 447 // 448 // Check for saturation in all other slices 449 // 450 Float_t *sample = fLoGainSignal.GetArray(); 451 Int_t ids = fLoGainFirst; 452 453 while (p<end) 454 { 455 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 456 457 if (*p++ >= fSaturationLimit) 458 sat++; 459 } 460 461 FindTimeAndChargeLoGain2(fLoGainSignal.GetArray(), range, 462 sum, dsum, time, dtime, 463 sat, 0); 464 465 } 466 */ 670 467 // -------------------------------------------------------------------------- 671 468 // … … 681 478 { 682 479 683 Byte_t hw = fWindowSizeHiGain;684 Byte_t lw = fWindowSizeLoGain;685 480 Bool_t rc = kFALSE; 686 481 … … 690 485 rc = kTRUE; 691 486 } 487 /* 488 Byte_t hw = fWindowSizeHiGain; 489 Byte_t lw = fWindowSizeLoGain; 692 490 693 491 if (IsEnvDefined(env, prefix, "WindowSizeHiGain", print)) … … 704 502 if (rc) 705 503 SetWindowSize(hw, lw); 706 504 707 505 Bool_t rc2 = kFALSE; 708 506 Int_t brh = fBinningResolutionHiGain; … … 725 523 rc = kTRUE; 726 524 } 727 525 */ 728 526 if (IsEnvDefined(env, prefix, "WeightsFile", print)) 729 527 { … … 823 621 } 824 622 825 if (2!=sscanf(str.Data(), "# High Gain Weights: %2i %2i", &fWindowSizeHiGain, &fBinningResolutionHiGain))623 if (2!=sscanf(str.Data(), "# High Gain Weights: %2i %2i", &fWindowSizeHiGain, &fBinningResolutionHiGain)) 826 624 { 827 625 *fLog << err << "ERROR - Wrong number of arguments in line #" << line << ":" << endl; … … 833 631 fAmpWeightsHiGain .Set(len); 834 632 fTimeWeightsHiGain.Set(len); 633 fPulseHiGain.Set(len); 835 634 hi = kTRUE; 836 635 continue; … … 845 644 } 846 645 847 if (2!=sscanf(str.Data(),"# Low Gain Weights: %2i %2i", &fWindowSizeLoGain, &fBinningResolutionLoGain))646 if (2!=sscanf(str.Data(),"# Low Gain Weights: %2i %2i", &fWindowSizeLoGain, &fBinningResolutionLoGain)) 848 647 { 849 648 *fLog << err << "ERROR - Wrong number of arguments in line #" << line << ":" << endl; … … 855 654 fAmpWeightsLoGain .Set(len); 856 655 fTimeWeightsLoGain.Set(len); 656 fPulseLoGain.Set(len); 857 657 lo = kTRUE; 858 658 continue; … … 867 667 continue; 868 668 869 if ( 2!=sscanf(str.Data(), "%f %f",669 if (3!=sscanf(str.Data(), "%f %f %f", 870 670 lo ? &fAmpWeightsLoGain [cnt] : &fAmpWeightsHiGain [cnt], 871 lo ? &fTimeWeightsLoGain[cnt] : &fTimeWeightsHiGain[cnt])) 671 lo ? &fTimeWeightsLoGain[cnt] : &fTimeWeightsHiGain[cnt], 672 lo ? &fPulseLoGain[cnt] : &fPulseHiGain[cnt])) 872 673 { 873 674 *fLog << err << "ERROR - Wrong number of arguments in line #" << line << ":" << endl; … … 903 704 *fLog << "with a resolution of " << fBinningResolutionLoGain << endl; 904 705 905 CalcBinningResArrays();706 //CalcBinningResArrays(); 906 707 907 708 switch (fWindowSizeHiGain) … … 1058 859 return ReadWeightsFile(name, path); 1059 860 } 1060 861 /* 1061 862 //---------------------------------------------------------------------------- 1062 863 // … … 1125 926 Int_t start = fBinningResolutionHiGain*(fSignalStartBinHiGain + 1); 1126 927 1127 for (Int_t i = -fBinningResolutionH alfHiGain+1; i<=fBinningResolutionHalfHiGain; i++)928 for (Int_t i = -fBinningResolutionHiGain/2+1; i<=fBinningResolutionHiGain/2; i++) 1128 929 { 1129 930 … … 1178 979 for (Int_t count=0; count < fWindowSizeHiGain; count++) 1179 980 { 1180 const Int_t idx = i+fBinningResolutionH alfHiGain+fBinningResolutionHiGain*count-1;981 const Int_t idx = i+fBinningResolutionHiGain/2+fBinningResolutionHiGain*count-1; 1181 982 fAmpWeightsHiGain [idx] = w_amp [0][count]; 1182 983 fTimeWeightsHiGain[idx] = w_time[0][count]; … … 1246 1047 // Loop over relative time in one BinningResolution interval 1247 1048 // 1248 Int_t start = fBinningResolutionLoGain*fSignalStartBinLoGain + fBinningResolution HalfLoGain;1249 1250 for (Int_t i = -fBinningResolution HalfLoGain+1; i<=fBinningResolutionHalfLoGain; i++)1049 Int_t start = fBinningResolutionLoGain*fSignalStartBinLoGain + fBinningResolutionLoGain/2; 1050 1051 for (Int_t i = -fBinningResolutionLoGain/2+1; i<=fBinningResolutionLoGain/2; i++) 1251 1052 { 1252 1053 … … 1301 1102 for (Int_t count=0; count < fWindowSizeLoGain; count++) 1302 1103 { 1303 const Int_t idx = i+fBinningResolution HalfLoGain+fBinningResolutionLoGain*count-1;1104 const Int_t idx = i+fBinningResolutionLoGain/2+fBinningResolutionLoGain*count-1; 1304 1105 fAmpWeightsLoGain [idx] = w_amp [0][count]; 1305 1106 fTimeWeightsLoGain[idx] = w_time[0][count]; … … 1329 1130 return kTRUE; 1330 1131 } 1331 1132 */ 1332 1133 void MExtractTimeAndChargeDigitalFilter::Print(Option_t *o) const 1333 1134 { … … 1336 1137 1337 1138 MExtractTimeAndCharge::Print(o); 1338 *fLog << " Time Shift HiGain: " << fTimeShiftHiGain << " LoGain: " << fTimeShiftLoGain << endl;1339 1139 *fLog << " Window Size HiGain: " << fWindowSizeHiGain << " LoGain: " << fWindowSizeLoGain << endl; 1340 1140 *fLog << " Binning Res HiGain: " << fBinningResolutionHiGain << " LoGain: " << fBinningResolutionHiGain << endl; -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeDigitalFilter.h
r7194 r8154 22 22 { 23 23 private: 24 static const Byte_t fgHiGainFirst; //! Default for fHiGainFirst (now set to: 0)25 static const Byte_t fgHiGainLast; //! Default for fHiGainLast (now set to:14)26 static const Byte_t fgLoGainFirst; //! Default for fLoGainFirst (now set to: 3)27 static const Byte_t fgLoGainLast; //! Default for fLoGainLast (now set to:14)28 static const Int_t fgWindowSizeHiGain; //! Default for fWindowSizeHiGain (now set to: 6)29 static const Int_t fgWindowSizeLoGain; //! Default for fWindowSizeLoGain (now set to: 6)30 static const Int_t fgBinningResolutionHiGain; //! Default for fBinningResolutionHiGain (now set to: 10)31 static const Int_t fgBinningResolutionLoGain; //! Default for fBinningResolutionLoGain (now set to: 10)32 static const Int_t fgSignalStartBinHiGain; //! Default for fSignalStartBinHiGain (now set to: 4)33 static const Int_t fgSignalStartBinLoGain; //! Default for fSignalStartBinLoGain (now set to: 4)34 static const TString fgNameWeightsFile; //! "cosmics_weights.dat"35 static const Float_t fgOffsetLoGain; //! Default for fOffsetLoGain (now set to 1.7)36 static const Float_t fgLoGainStartShift; //! Default for fLoGainStartShift (now set to -1.8)24 static const Byte_t fgHiGainFirst; //! Default for fHiGainFirst (now set to: 0) 25 static const Byte_t fgHiGainLast; //! Default for fHiGainLast (now set to:14) 26 static const Byte_t fgLoGainFirst; //! Default for fLoGainFirst (now set to: 3) 27 static const Byte_t fgLoGainLast; //! Default for fLoGainLast (now set to:14) 28 // static const Int_t fgWindowSizeHiGain; //! Default for fWindowSizeHiGain (now set to: 6) 29 // static const Int_t fgWindowSizeLoGain; //! Default for fWindowSizeLoGain (now set to: 6) 30 static const Int_t fgBinningResolutionHiGain; //! Default for fBinningResolutionHiGain (now set to: 10) 31 static const Int_t fgBinningResolutionLoGain; //! Default for fBinningResolutionLoGain (now set to: 10) 32 static const Int_t fgSignalStartBinHiGain; //! Default for fSignalStartBinHiGain (now set to: 4) 33 static const Int_t fgSignalStartBinLoGain; //! Default for fSignalStartBinLoGain (now set to: 4) 34 static const TString fgNameWeightsFile; //! "cosmics_weights.dat" 35 static const Float_t fgOffsetLoGain; //! Default for fOffsetLoGain (now set to 1.7) 36 // static const Float_t fgLoGainStartShift; //! Default for fLoGainStartShift (now set to -1.8) 37 37 38 MCalibrationPattern *fCalibPattern; //! Calibration DM pattern 39 40 MArrayF fHiGainSignal; //! Need fast access to the signals in a float way 41 MArrayF fLoGainSignal; //! Store them in separate arrays 38 MCalibrationPattern *fCalibPattern; //! Calibration DM pattern 42 39 43 MArrayI fArrBinningResHiGain; //! helping arrays to hold binningres * i 44 MArrayI fArrBinningResLoGain; //! helping arrays to hold binningres * i 45 MArrayI fArrBinningResHalfHiGain; //! helping arrays to hold binningres * i + binningreshalf 46 MArrayI fArrBinningResHalfLoGain; //! helping arrays to hold binningres * i + binningreshalf 47 48 Float_t fTimeShiftHiGain; // Time shift from when on to apply the filter 49 Float_t fTimeShiftLoGain; // Time shift from when on to apply the filter 50 51 Int_t fSignalStartBinHiGain; //! Start bin from when on to apply weights 52 Int_t fSignalStartBinLoGain; //! Start bin from when on to apply weights 40 // MArrayF fHiGainSignal; //! Need fast access to the signals in a float way 41 // MArrayF fLoGainSignal; //! Store them in separate arrays 53 42 54 Int_t fBinningResolutionHiGain; // Number of weights per bin High-Gain 55 Int_t fBinningResolutionHalfHiGain; // Half Number of weights per bin High-Gain 56 Int_t fBinningResolutionLoGain; // Number of weights per bin Low-Gain 57 Int_t fBinningResolutionHalfLoGain; // Half Number of weights per bin Low-Gain 58 59 MArrayF fAmpWeightsHiGain; //! Amplitude weights High-Gain (from weights file) 60 MArrayF fTimeWeightsHiGain; //! Time weights High-Gain (from weights file) 61 MArrayF fAmpWeightsLoGain; //! Amplitude weights Low-Gain (from weights file) 62 MArrayF fTimeWeightsLoGain; //! Time weights Low-Gain (from weights file) 43 // Int_t fSignalStartBinHiGain; //! Start bin from when on to apply weights 44 // Int_t fSignalStartBinLoGain; //! Start bin from when on to apply weights 63 45 64 TString fNameWeightsFile; // Name of the weights file 65 Bool_t fAutomaticWeights; // Flag whether weight should be determined automatically 66 TString fNameWeightsFileSet; //! Flag if weights have alreayd been set 67 Int_t fRandomIter; //! Counter used to randomize weights for noise calculation 46 Int_t fBinningResolutionHiGain; // Number of weights per bin High-Gain 47 Int_t fBinningResolutionLoGain; // Number of weights per bin Low-Gain 68 48 69 // MExtractTimeAndChargeDigitalFilter 70 void CalcBinningResArrays(); 71 Int_t GetAutomaticWeights(); 72 Bool_t GetWeights(); 73 Int_t ReadWeightsFile(TString filename, TString path=""); 74 TString CompileWeightFileName(TString path, const TString &name) const; 49 MArrayF fAmpWeightsHiGain; //! Amplitude weights High-Gain (from weights file) 50 MArrayF fTimeWeightsHiGain; //! Time weights High-Gain (from weights file) 51 MArrayF fAmpWeightsLoGain; //! Amplitude weights Low-Gain (from weights file) 52 MArrayF fTimeWeightsLoGain; //! Time weights Low-Gain (from weights file) 75 53 76 // MExtractTimeAndCharge77 Bool_t InitArrays();54 MArrayF fPulseHiGain; //! 55 MArrayF fPulseLoGain; //! 78 56 79 // MTask 80 Int_t PreProcess(MParList *pList); 81 Int_t Process(); 57 TString fNameWeightsFile; // Name of the weights file 58 Bool_t fAutomaticWeights; // Flag whether weight should be determined automatically 59 TString fNameWeightsFileSet; //! Flag if weights have alreayd been set 60 Int_t fRandomIter; //! Counter used to randomize weights for noise calculation 61 62 // MExtractTimeAndChargeDigitalFilter 63 void CalcBinningResArrays(); 64 Int_t GetAutomaticWeights(); 65 Bool_t GetWeights(); 66 Int_t ReadWeightsFile(TString filename, TString path=""); 67 TString CompileWeightFileName(TString path, const TString &name) const; 68 69 70 // MExtractTimeAndCharge 71 Bool_t InitArrays(); 72 73 // MTask 74 Int_t PreProcess(MParList *pList); 75 Int_t Process(); 82 76 83 77 protected: 84 // MParContainer85 Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print);78 // MParContainer 79 Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print); 86 80 87 81 public: 88 MExtractTimeAndChargeDigitalFilter(const char *name=NULL, const char *title=NULL); 89 ~MExtractTimeAndChargeDigitalFilter() { } 82 MExtractTimeAndChargeDigitalFilter(const char *name=NULL, const char *title=NULL); 83 ~MExtractTimeAndChargeDigitalFilter() { } 84 /* 85 Bool_t WriteWeightsFile(TString filename, 86 TH1F *shapehi, TH2F *autocorrhi, 87 TH1F *shapelo=NULL, TH2F *autocorrlo=NULL ); 90 88 91 Bool_t WriteWeightsFile(TString filename, 92 TH1F *shapehi, TH2F *autocorrhi, 93 TH1F *shapelo=NULL, TH2F *autocorrlo=NULL ); 89 */ 90 void SetNameWeightsFile(TString s="") 91 { 92 s.ReplaceAll("\015", ""); // This is a fix for TEnv files edited with windows editors 93 fNameWeightsFile = s; 94 fNameWeightsFileSet=""; 95 } 94 96 97 void EnableAutomaticWeights(Bool_t b=kTRUE) { fAutomaticWeights = b; } 95 98 96 void SetNameWeightsFile(TString s="") { s.ReplaceAll("\015", ""); // This is a fix for TEnv files edited with windows editors 97 fNameWeightsFile = s; fNameWeightsFileSet=""; } 98 void EnableAutomaticWeights(Bool_t b=kTRUE) { fAutomaticWeights = b; } 99 void SetBinningResolution(const Int_t rh=fgBinningResolutionHiGain, const Int_t rl=fgBinningResolutionLoGain) 100 { 101 fBinningResolutionHiGain = rh & ~1; 102 fBinningResolutionLoGain = rl & ~1; 103 } 104 /* 105 void SetSignalStartBin( const Int_t sh=fgSignalStartBinHiGain, const Int_t sl=fgSignalStartBinLoGain) 106 { 107 fSignalStartBinHiGain = sh; 108 fSignalStartBinLoGain = sl; 109 } 99 110 100 void SetBinningResolution(const Int_t rh=fgBinningResolutionHiGain, const Int_t rl=fgBinningResolutionLoGain) { 101 fBinningResolutionHiGain = rh & ~1; 102 fBinningResolutionHalfHiGain = fBinningResolutionHiGain/2; 103 fBinningResolutionLoGain = rl & ~1; 104 fBinningResolutionHalfLoGain = fBinningResolutionLoGain/2; 105 } 106 107 void SetSignalStartBin( const Int_t sh=fgSignalStartBinHiGain, const Int_t sl=fgSignalStartBinLoGain) { 108 fSignalStartBinHiGain = sh; 109 fSignalStartBinLoGain = sl; 110 } 111 */ 112 void SetWindowSize( Int_t windowh, Int_t windowl); 113 const char* GetNameWeightsFile() const { return fNameWeightsFile.Data(); } 111 114 112 void SetWindowSize( Int_t windowh=fgWindowSizeHiGain, Int_t windowl=fgWindowSizeLoGain); 115 void Print(Option_t *o="") const; //*MENU* 116 /* 117 void FindTimeAndChargeHiGain(Byte_t *firstused, Byte_t *logain, Float_t &sum, Float_t &dsum, 118 Float_t &time, Float_t &dtime, 119 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 120 void FindTimeAndChargeLoGain(Byte_t *firstused, Float_t &sum, Float_t &dsum, 121 Float_t &time, Float_t &dtime, 122 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 123 */ 124 void FindTimeAndChargeHiGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 125 Float_t &time, Float_t &dtime, 126 Byte_t sat, Int_t maxpos); 113 127 114 const char* GetNameWeightsFile() const { return fNameWeightsFile.Data(); } 128 void FindTimeAndChargeLoGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 129 Float_t &time, Float_t &dtime, 130 Byte_t sat, Int_t maxpos); 115 131 116 void Print(Option_t *o="") const; //*MENU* 117 118 void FindTimeAndChargeHiGain(Byte_t *firstused, Byte_t *logain, Float_t &sum, Float_t &dsum, 119 Float_t &time, Float_t &dtime, 120 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 121 void FindTimeAndChargeLoGain(Byte_t *firstused, Float_t &sum, Float_t &dsum, 122 Float_t &time, Float_t &dtime, 123 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 124 125 ClassDef(MExtractTimeAndChargeDigitalFilter, 2) // Hendrik's digital filter 132 ClassDef(MExtractTimeAndChargeDigitalFilter, 2) // Hendrik's digital filter 126 133 }; 127 134 -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.cc
r7930 r8154 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: MExtractTimeAndChargeSpline.cc,v 1.61 2006-10-24 08:24:52 tbretz Exp $ 3 ! -------------------------------------------------------------------------- 2 4 ! 3 5 ! * … … 15 17 ! * 16 18 ! 17 ! Author(s): Markus Gaug 09/2004 <mailto:markus@ifae.es> 19 ! Author(s): Thomas Bretz <mailto:tbretz@astro.uni-wuerzbrug.de> 20 ! Author(s): Markus Gaug 09/2004 <mailto:markus@ifae.es> 18 21 ! 19 ! Copyright: MAGIC Software Development, 2002-200 422 ! Copyright: MAGIC Software Development, 2002-2006 20 23 ! 21 24 ! … … 142 145 #include "MExtractTimeAndChargeSpline.h" 143 146 147 #include "MExtralgoSpline.h" 148 144 149 #include "MPedestalPix.h" 145 150 … … 156 161 const Byte_t MExtractTimeAndChargeSpline::fgLoGainLast = 14; 157 162 const Float_t MExtractTimeAndChargeSpline::fgResolution = 0.05; 158 const Float_t MExtractTimeAndChargeSpline::fgRiseTimeHiGain = 0. 5;159 const Float_t MExtractTimeAndChargeSpline::fgFallTimeHiGain = 0.5;163 const Float_t MExtractTimeAndChargeSpline::fgRiseTimeHiGain = 0.7; 164 const Float_t MExtractTimeAndChargeSpline::fgFallTimeHiGain = 1.0; 160 165 const Float_t MExtractTimeAndChargeSpline::fgLoGainStretch = 1.5; 161 166 const Float_t MExtractTimeAndChargeSpline::fgOffsetLoGain = 1.3; 162 const Float_t MExtractTimeAndChargeSpline::fgLoGainStartShift = -2.4;167 //const Float_t MExtractTimeAndChargeSpline::fgLoGainStartShift = -2.4; 163 168 164 169 // -------------------------------------------------------------------------- … … 177 182 // 178 183 MExtractTimeAndChargeSpline::MExtractTimeAndChargeSpline(const char *name, const char *title) 179 : fAbMax(0.), fAbMaxPos(0.), fHalfMax(0.), 180 fRandomIter(0), fExtractionType(kIntegral) 184 : fRandomIter(0), fExtractionType(kIntegral) 181 185 { 182 186 … … 187 191 SetLoGainStretch(); 188 192 SetOffsetLoGain(fgOffsetLoGain); 189 SetLoGainStartShift(fgLoGainStartShift);193 // SetLoGainStartShift(fgLoGainStartShift); 190 194 191 195 SetRiseTimeHiGain(); … … 310 314 { 311 315 312 Int_t range = fHiGainLast - fHiGainFirst + 1 + fHiLoLast;313 314 fHiGainSignal .Set(range);316 Int_t range = fHiGainLast - fHiGainFirst + 1;// + fHiLoLast; 317 318 // fHiGainSignal .Set(range); 315 319 fHiGainFirstDeriv .Set(range); 316 320 fHiGainSecondDeriv.Set(range); … … 318 322 range = fLoGainLast - fLoGainFirst + 1; 319 323 320 fLoGainSignal .Set(range);324 // fLoGainSignal .Set(range); 321 325 fLoGainFirstDeriv .Set(range); 322 326 fLoGainSecondDeriv.Set(range); 323 327 324 fHiGainSignal .Reset();328 // fHiGainSignal .Reset(); 325 329 fHiGainFirstDeriv .Reset(); 326 330 fHiGainSecondDeriv.Reset(); 327 331 328 fLoGainSignal .Reset();332 // fLoGainSignal .Reset(); 329 333 fLoGainFirstDeriv .Reset(); 330 334 fLoGainSecondDeriv.Reset(); … … 361 365 } 362 366 367 void MExtractTimeAndChargeSpline::FindTimeAndChargeHiGain2(const Float_t *ptr, Int_t num, 368 Float_t &sum, Float_t &dsum, 369 Float_t &time, Float_t &dtime, 370 Byte_t sat, Int_t maxpos) 371 { 372 // const Int_t range = fHiGainLast - fHiGainFirst + 1 + fHiLoLast; 373 374 // Do some handling if maxpos is last slice! 375 376 MExtralgoSpline s(ptr, num, fHiGainFirstDeriv.GetArray(), fHiGainSecondDeriv.GetArray()); 377 378 s.SetRiseFallTime(fRiseTimeHiGain, fFallTimeHiGain); 379 s.SetResolution(fResolution); 380 381 if (IsNoiseCalculation()) 382 { 383 if (fRandomIter == int(1./fResolution)) 384 fRandomIter = 0; 385 386 sum = s.ExtractNoise(fRandomIter); 387 fRandomIter++; 388 return; 389 } 390 391 s.Extract(sat, maxpos); 392 s.GetTime(time, dtime); 393 s.GetSignal(sum, dsum); 394 } 395 396 void MExtractTimeAndChargeSpline::FindTimeAndChargeLoGain2(const Float_t *ptr, Int_t num, 397 Float_t &sum, Float_t &dsum, 398 Float_t &time, Float_t &dtime, 399 Byte_t sat, Int_t maxpos) 400 { 401 MExtralgoSpline s(ptr, num, fLoGainFirstDeriv.GetArray(), fLoGainSecondDeriv.GetArray()); 402 403 s.SetRiseFallTime(fRiseTimeLoGain, fFallTimeLoGain); 404 s.SetResolution(fResolution); 405 406 if (IsNoiseCalculation()) 407 { 408 if (fRandomIter == int(1./fResolution)) 409 fRandomIter = 0; 410 411 sum = s.ExtractNoise(fRandomIter); 412 return; 413 } 414 415 s.Extract(sat, maxpos); 416 s.GetTime(time, dtime); 417 s.GetSignal(sum, dsum); 418 } 419 363 420 // -------------------------------------------------------------------------- 364 421 // 365 // Calculates the arrival time and charge for each pixel 366 // 367 void MExtractTimeAndChargeSpline::FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum, 422 // Calculates the arrival time and charge for each pixel 423 // 424 /* 425 void MExtractTimeAndChargeSpline::FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum, 368 426 Float_t &time, Float_t &dtime, 369 427 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag) 370 428 { 371 Int_t range = fHiGainLast - fHiGainFirst + 1; 372 const Byte_t *end = first + range; 373 Byte_t *p = first; 374 375 sat = 0; 376 dsum = 0; // In all cases the extracted signal is valid 377 378 const Float_t pedes = ped.GetPedestal(); 379 const Float_t ABoffs = ped.GetPedestalABoffset(); 380 381 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 382 383 fAbMax = 0.; 384 fAbMaxPos = 0.; 385 fHalfMax = 0.; 386 fMaxBinContent = 0; 387 Int_t maxpos = 0; 388 389 // 390 // Check for saturation in all other slices 391 // 392 Int_t ids = fHiGainFirst; 393 Float_t *sample = fHiGainSignal.GetArray(); 394 while (p<end) 395 { 396 397 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 398 399 if (*p > fMaxBinContent) 429 Int_t range = fHiGainLast - fHiGainFirst + 1; 430 const Byte_t *end = first + range; 431 Byte_t *p = first; 432 433 const Float_t pedes = ped.GetPedestal(); 434 const Float_t ABoffs = ped.GetPedestalABoffset(); 435 436 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 437 438 Byte_t maxcont = 0; 439 Int_t maxpos = 0; 440 sat = 0; 441 442 // 443 // Check for saturation in all other slices 444 // 445 Int_t ids = fHiGainFirst; 446 Float_t *sample = fHiGainSignal.GetArray(); 447 while (p<end) 448 { 449 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 450 451 if (*p > maxcont) 400 452 { 401 maxpos = ids-fHiGainFirst-1; 402 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 403 if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 404 fMaxBinContent = *p; 453 maxpos = ids-fHiGainFirst-1; 454 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 455 //if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 456 if (maxpos > 1 && maxpos < (range-1*//* - fWindowSizeHiGain + 1*//*)) 457 maxcont = *p; 405 458 } 406 459 407 if (*p++ >= fSaturationLimit) 408 if (!sat) 409 sat = ids-fHiGainFirst; 410 411 } 412 413 if (fHiLoLast != 0) 414 { 415 416 end = logain + fHiLoLast; 417 418 while (logain<end) 460 if (*p++ >= fSaturationLimit) 461 if (!sat) 462 sat = ids-fHiGainFirst; 463 } 464 465 if (fHiLoLast != 0) 466 { 467 end = logain + fHiLoLast; 468 469 while (logain<end) 419 470 { 420 421 *sample++ = (Float_t)*logain - pedmean[(ids++ + abflag) & 0x1]; 422 423 if (*logain > fMaxBinContent) 424 { 471 *sample++ = (Float_t)*logain - pedmean[(ids++ + abflag) & 0x1]; 472 473 if (*logain > maxcont) 474 { 425 475 maxpos = ids-fHiGainFirst-1; 476 477 // FIXME!!! MUST BE THERE! 426 478 // range-fWindowSizeHiGain+1 == fHiLoLast isn't it? 427 479 //if (maxpos > 1 && maxpos < (range - fWindowSizeHiGain + 1)) 428 // fMaxBinContent = *logain;480 // maxcont = *logain; 429 481 } 430 431 if (*logain++ >= fSaturationLimit)432 if (!sat)433 sat = ids-fHiGainFirst;434 435 range++;482 483 if (*logain++ >= fSaturationLimit) 484 if (!sat) 485 sat = ids-fHiGainFirst; 486 487 range++; 436 488 } 437 489 } 438 490 439 fAbMax = fHiGainSignal[maxpos]; 440 441 fHiGainSecondDeriv[0] = 0.; 442 fHiGainFirstDeriv[0] = 0.; 443 444 for (Int_t i=1;i<range-1;i++) 445 { 446 const Float_t pp = fHiGainSecondDeriv[i-1] + 4.; 447 fHiGainSecondDeriv[i] = -1.0/pp; 448 fHiGainFirstDeriv [i] = fHiGainSignal[i+1] - 2*fHiGainSignal[i] + fHiGainSignal[i-1]; 449 fHiGainFirstDeriv [i] = (6.0*fHiGainFirstDeriv[i]-fHiGainFirstDeriv[i-1])/pp; 450 } 451 452 fHiGainSecondDeriv[range-1] = 0.; 453 454 for (Int_t k=range-2;k>=0;k--) 455 fHiGainSecondDeriv[k] = fHiGainSecondDeriv[k]*fHiGainSecondDeriv[k+1] + fHiGainFirstDeriv[k]; 456 for (Int_t k=range-2;k>=0;k--) 457 fHiGainSecondDeriv[k] /= 6.; 458 459 if (IsNoiseCalculation()) 460 { 461 462 if (fRandomIter == int(1./fResolution)) 463 fRandomIter = 0; 464 465 const Float_t nsx = fRandomIter * fResolution; 466 467 if (fExtractionType == kAmplitude) 468 { 469 const Float_t b = nsx; 470 const Float_t a = 1. - nsx; 471 472 sum = a*fHiGainSignal[1] 473 + b*fHiGainSignal[2] 474 + (a*a*a-a)*fHiGainSecondDeriv[1] 475 + (b*b*b-b)*fHiGainSecondDeriv[2]; 476 } 477 else 478 sum = CalcIntegralHiGain(2. + nsx, range); 479 480 fRandomIter++; 481 return; 482 } 483 484 // 485 // Allow no saturated slice and 486 // Don't start if the maxpos is too close to the limits. 487 // 488 const Bool_t limlo = maxpos < TMath::Ceil(fRiseTimeHiGain); 489 const Bool_t limup = maxpos > range-TMath::Ceil(fFallTimeHiGain)-1; 490 if (sat || limlo || limup) 491 { 492 dtime = 1.0; 493 if (fExtractionType == kAmplitude) 494 { 495 sum = fAbMax; 496 time = (Float_t)(fHiGainFirst + maxpos); 497 return; 498 } 499 500 sum = CalcIntegralHiGain(limlo ? 0 : range, range); 501 time = (Float_t)(fHiGainFirst + maxpos - 1); 502 return; 503 } 504 505 dtime = fResolution; 506 507 // 508 // Now find the maximum 509 // 510 Float_t step = 0.2; // start with step size of 1ns and loop again with the smaller one 511 Float_t lower = -1. + maxpos; 512 Float_t upper = (Float_t)maxpos; 513 fAbMaxPos = upper; 514 Float_t x = lower; 515 Float_t y = 0.; 516 Float_t a = 1.; 517 Float_t b = 0.; 518 Int_t klo = maxpos-1; 519 Int_t khi = maxpos; 520 521 // 522 // Search for the maximum, starting in interval maxpos-1 in steps of 0.2 till maxpos-0.2. 523 // If no maximum is found, go to interval maxpos+1. 524 // 525 while ( x < upper - 0.3 ) 526 { 527 528 x += step; 529 a -= step; 530 b += step; 531 532 y = a*fHiGainSignal[klo] 533 + b*fHiGainSignal[khi] 534 + (a*a*a-a)*fHiGainSecondDeriv[klo] 535 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 536 537 if (y > fAbMax) 538 { 539 fAbMax = y; 540 fAbMaxPos = x; 541 } 542 543 } 544 545 // 546 // Search for the absolute maximum from maxpos to maxpos+1 in steps of 0.2 547 // 548 if (fAbMaxPos > upper-0.1) 549 { 550 upper = 1. + maxpos; 551 lower = (Float_t)maxpos; 552 x = lower; 553 a = 1.; 554 b = 0.; 555 khi = maxpos+1; 556 klo = maxpos; 557 558 while (x<upper-0.3) 559 { 560 561 x += step; 562 a -= step; 563 b += step; 564 565 y = a*fHiGainSignal[klo] 566 + b*fHiGainSignal[khi] 567 + (a*a*a-a)*fHiGainSecondDeriv[klo] 568 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 569 570 if (y > fAbMax) 571 { 572 fAbMax = y; 573 fAbMaxPos = x; 574 } 575 } 576 } 577 // 578 // Now, the time, abmax and khicont and klocont are set correctly within the previous precision. 579 // Try a better precision. 580 // 581 const Float_t up = fAbMaxPos+step - 3.0*fResolution; 582 const Float_t lo = fAbMaxPos-step + 3.0*fResolution; 583 const Float_t maxpossave = fAbMaxPos; 584 585 x = fAbMaxPos; 586 a = upper - x; 587 b = x - lower; 588 589 step = 2.*fResolution; // step size of 0.1 FADC slices 590 591 while (x<up) 592 { 593 594 x += step; 595 a -= step; 596 b += step; 597 598 y = a*fHiGainSignal[klo] 599 + b*fHiGainSignal[khi] 600 + (a*a*a-a)*fHiGainSecondDeriv[klo] 601 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 602 603 if (y > fAbMax) 604 { 605 fAbMax = y; 606 fAbMaxPos = x; 607 } 608 } 609 610 // 611 // Second, try from time down to time-0.2 in steps of fResolution. 612 // 613 x = maxpossave; 614 615 // 616 // Test the possibility that the absolute maximum has not been found between 617 // maxpos and maxpos+0.05, then we have to look between maxpos-0.05 and maxpos 618 // which requires new setting of klocont and khicont 619 // 620 if (x < lower + fResolution) 621 { 622 klo--; 623 khi--; 624 upper -= 1.; 625 lower -= 1.; 626 } 627 628 a = upper - x; 629 b = x - lower; 630 631 while (x>lo) 632 { 633 634 x -= step; 635 a += step; 636 b -= step; 637 638 y = a*fHiGainSignal[klo] 639 + b*fHiGainSignal[khi] 640 + (a*a*a-a)*fHiGainSecondDeriv[klo] 641 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 642 643 if (y > fAbMax) 644 { 645 fAbMax = y; 646 fAbMaxPos = x; 647 } 648 } 649 650 if (fExtractionType == kAmplitude) 651 { 652 time = fAbMaxPos + (Int_t)fHiGainFirst; 653 sum = fAbMax; 654 return; 655 } 656 657 fHalfMax = fAbMax/2.; 658 659 // 660 // Now, loop from the maximum bin leftward down in order to find the position of the half maximum. 661 // First, find the right FADC slice: 662 // 663 klo = maxpos; 664 while (klo > 0) 665 { 666 if (fHiGainSignal[--klo] < fHalfMax) 667 break; 668 } 669 670 khi = klo+1; 671 // 672 // Loop from the beginning of the slice upwards to reach the fHalfMax: 673 // With means of bisection: 674 // 675 x = (Float_t)klo; 676 a = 1.; 677 b = 0.; 678 679 step = 0.5; 680 Bool_t back = kFALSE; 681 682 Int_t maxcnt = 20; 683 Int_t cnt = 0; 684 685 while (TMath::Abs(y-fHalfMax) > fResolution) 686 { 687 688 if (back) 689 { 690 x -= step; 691 a += step; 692 b -= step; 693 } 694 else 695 { 696 x += step; 697 a -= step; 698 b += step; 699 } 700 701 y = a*fHiGainSignal[klo] 702 + b*fHiGainSignal[khi] 703 + (a*a*a-a)*fHiGainSecondDeriv[klo] 704 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 705 706 back = y > fHalfMax; 707 708 if (++cnt > maxcnt) 709 break; 710 711 step /= 2.; 712 } 713 714 // 715 // Now integrate the whole thing! 716 // 717 time = (Float_t)fHiGainFirst + x; 718 sum = CalcIntegralHiGain(fAbMaxPos - fRiseTimeHiGain, range); 719 } 720 491 FindTimeAndChargeHiGain2(fHiGainSignal.GetArray(), range, 492 sum, dsum, time, dtime, 493 sat, maxpos); 494 } 721 495 722 496 // -------------------------------------------------------------------------- … … 728 502 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag) 729 503 { 730 Int_t range = fLoGainLast - fLoGainFirst + 1; 731 const Byte_t *end = first + range; 732 Byte_t *p = first; 733 734 const Float_t pedes = ped.GetPedestal(); 735 const Float_t ABoffs = ped.GetPedestalABoffset(); 736 737 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 738 739 fAbMax = 0.; 740 fAbMaxPos = 0.; 741 Int_t maxpos = 0; 742 Int_t max = -9999; 743 744 dsum = 0; // In all cases the extracted signal is valid 745 746 // 747 // Check for saturation in all other slices 748 // 749 Int_t ids = fLoGainFirst; 750 Float_t *sample = fLoGainSignal.GetArray(); 751 while (p<end) 752 { 753 754 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 755 756 if (*p > max) 504 Int_t range = fLoGainLast - fLoGainFirst + 1; 505 const Byte_t *end = first + range; 506 Byte_t *p = first; 507 508 const Float_t pedes = ped.GetPedestal(); 509 const Float_t ABoffs = ped.GetPedestalABoffset(); 510 511 const Float_t pedmean[2] = { pedes + ABoffs, pedes - ABoffs }; 512 513 Int_t maxpos = 0; 514 Int_t max = -9999; 515 516 // 517 // Check for saturation in all other slices 518 // 519 Int_t ids = fLoGainFirst; 520 Float_t *sample = fLoGainSignal.GetArray(); 521 while (p<end) 522 { 523 *sample++ = (Float_t)*p - pedmean[(ids++ + abflag) & 0x1]; 524 525 if (*p > max) 757 526 { 758 maxpos = ids-fLoGainFirst-1;759 max = *p;527 maxpos = ids-fLoGainFirst-1; 528 max = *p; 760 529 } 761 530 762 if (*p++ >= fSaturationLimit) 763 sat++; 764 } 765 766 fAbMax = fLoGainSignal[maxpos]; 767 768 fLoGainSecondDeriv[0] = 0.; 769 fLoGainFirstDeriv[0] = 0.; 770 771 for (Int_t i=1;i<range-1;i++) 772 { 773 const Float_t pp = fLoGainSecondDeriv[i-1] + 4.; 774 fLoGainSecondDeriv[i] = -1.0/pp; 775 fLoGainFirstDeriv [i] = fLoGainSignal[i+1] - 2*fLoGainSignal[i] + fLoGainSignal[i-1]; 776 fLoGainFirstDeriv [i] = (6.0*fLoGainFirstDeriv[i]-fLoGainFirstDeriv[i-1])/pp; 777 } 778 779 fLoGainSecondDeriv[range-1] = 0.; 780 781 for (Int_t k=range-2;k>=0;k--) 782 fLoGainSecondDeriv[k] = fLoGainSecondDeriv[k]*fLoGainSecondDeriv[k+1] + fLoGainFirstDeriv[k]; 783 for (Int_t k=range-2;k>=0;k--) 784 fLoGainSecondDeriv[k] /= 6.; 785 786 if (IsNoiseCalculation()) 787 { 788 if (fRandomIter == int(1./fResolution)) 789 fRandomIter = 0; 790 791 const Float_t nsx = fRandomIter * fResolution; 792 793 if (fExtractionType == kAmplitude) 794 { 795 const Float_t b = nsx; 796 const Float_t a = 1. - nsx; 797 798 sum = a*fLoGainSignal[1] 799 + b*fLoGainSignal[2] 800 + (a*a*a-a)*fLoGainSecondDeriv[1] 801 + (b*b*b-b)*fLoGainSecondDeriv[2]; 802 } 803 else 804 sum = CalcIntegralLoGain(2. + nsx, range); 805 806 fRandomIter++; 807 return; 808 } 809 // 810 // Allow no saturated slice and 811 // Don't start if the maxpos is too close to the limits. 812 // 813 const Bool_t limlo = maxpos < TMath::Ceil(fRiseTimeLoGain); 814 const Bool_t limup = maxpos > range-TMath::Ceil(fFallTimeLoGain)-1; 815 if (sat || limlo || limup) 816 { 817 dtime = 1.0; 818 if (fExtractionType == kAmplitude) 819 { 820 time = (Float_t)(fLoGainFirst + maxpos); 821 sum = fAbMax; 822 return; 823 } 824 825 sum = CalcIntegralLoGain(limlo ? 0 : range, range); 826 time = (Float_t)(fLoGainFirst + maxpos - 1); 827 return; 828 } 829 830 dtime = fResolution; 831 832 // 833 // Now find the maximum 834 // 835 Float_t step = 0.2; // start with step size of 1ns and loop again with the smaller one 836 Float_t lower = -1. + maxpos; 837 Float_t upper = (Float_t)maxpos; 838 fAbMaxPos = upper; 839 Float_t x = lower; 840 Float_t y = 0.; 841 Float_t a = 1.; 842 Float_t b = 0.; 843 Int_t klo = maxpos-1; 844 Int_t khi = maxpos; 845 846 // 847 // Search for the maximum, starting in interval maxpos-1 in steps of 0.2 till maxpos-0.2. 848 // If no maximum is found, go to interval maxpos+1. 849 // 850 while ( x < upper - 0.3 ) 851 { 852 853 x += step; 854 a -= step; 855 b += step; 856 857 y = a*fLoGainSignal[klo] 858 + b*fLoGainSignal[khi] 859 + (a*a*a-a)*fLoGainSecondDeriv[klo] 860 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 861 862 if (y > fAbMax) 863 { 864 fAbMax = y; 865 fAbMaxPos = x; 866 } 867 868 } 869 870 // 871 // Test the possibility that the absolute maximum has not been found before the 872 // maxpos and search from maxpos to maxpos+1 in steps of 0.2 873 // 874 if (fAbMaxPos > upper-0.1) 875 { 876 877 upper = 1. + maxpos; 878 lower = (Float_t)maxpos; 879 x = lower; 880 a = 1.; 881 b = 0.; 882 khi = maxpos+1; 883 klo = maxpos; 884 885 while (x<upper-0.3) 886 { 887 888 x += step; 889 a -= step; 890 b += step; 891 892 y = a*fLoGainSignal[klo] 893 + b*fLoGainSignal[khi] 894 + (a*a*a-a)*fLoGainSecondDeriv[klo] 895 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 896 897 if (y > fAbMax) 898 { 899 fAbMax = y; 900 fAbMaxPos = x; 901 } 902 } 903 } 904 905 906 // 907 // Now, the time, abmax and khicont and klocont are set correctly within the previous precision. 908 // Try a better precision. 909 // 910 const Float_t up = fAbMaxPos+step - 3.0*fResolution; 911 const Float_t lo = fAbMaxPos-step + 3.0*fResolution; 912 const Float_t maxpossave = fAbMaxPos; 913 914 x = fAbMaxPos; 915 a = upper - x; 916 b = x - lower; 917 918 step = 2.*fResolution; // step size of 0.1 FADC slice 919 920 while (x<up) 921 { 922 923 x += step; 924 a -= step; 925 b += step; 926 927 y = a*fLoGainSignal[klo] 928 + b*fLoGainSignal[khi] 929 + (a*a*a-a)*fLoGainSecondDeriv[klo] 930 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 931 932 if (y > fAbMax) 933 { 934 fAbMax = y; 935 fAbMaxPos = x; 936 } 937 } 938 939 // 940 // Second, try from time down to time-0.2 in steps of 0.025. 941 // 942 x = maxpossave; 943 944 // 945 // Test the possibility that the absolute maximum has not been found between 946 // maxpos and maxpos+0.05, then we have to look between maxpos-0.05 and maxpos 947 // which requires new setting of klocont and khicont 948 // 949 if (x < lower + fResolution) 950 { 951 klo--; 952 khi--; 953 upper -= 1.; 954 lower -= 1.; 955 } 956 957 a = upper - x; 958 b = x - lower; 959 960 while (x>lo) 961 { 962 963 x -= step; 964 a += step; 965 b -= step; 966 967 y = a*fLoGainSignal[klo] 968 + b*fLoGainSignal[khi] 969 + (a*a*a-a)*fLoGainSecondDeriv[klo] 970 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 971 972 if (y > fAbMax) 973 { 974 fAbMax = y; 975 fAbMaxPos = x; 976 } 977 } 978 979 if (fExtractionType == kAmplitude) 980 { 981 time = fAbMaxPos + (Int_t)fLoGainFirst; 982 sum = fAbMax; 983 return; 984 } 985 986 fHalfMax = fAbMax/2.; 987 988 // 989 // Now, loop from the maximum bin leftward down in order to find the position of the half maximum. 990 // First, find the right FADC slice: 991 // 992 klo = maxpos; 993 while (klo > 0) 994 { 995 klo--; 996 if (fLoGainSignal[klo] < fHalfMax) 997 break; 998 } 999 1000 khi = klo+1; 1001 // 1002 // Loop from the beginning of the slice upwards to reach the fHalfMax: 1003 // With means of bisection: 1004 // 1005 x = (Float_t)klo; 1006 a = 1.; 1007 b = 0.; 1008 1009 step = 0.5; 1010 Bool_t back = kFALSE; 1011 1012 Int_t maxcnt = 20; 1013 Int_t cnt = 0; 1014 1015 while (TMath::Abs(y-fHalfMax) > fResolution) 1016 { 1017 1018 if (back) 1019 { 1020 x -= step; 1021 a += step; 1022 b -= step; 1023 } 1024 else 1025 { 1026 x += step; 1027 a -= step; 1028 b += step; 1029 } 1030 1031 y = a*fLoGainSignal[klo] 1032 + b*fLoGainSignal[khi] 1033 + (a*a*a-a)*fLoGainSecondDeriv[klo] 1034 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 1035 1036 back = y > fHalfMax; 1037 1038 if (++cnt > maxcnt) 1039 break; 1040 1041 step /= 2.; 1042 } 1043 1044 // 1045 // Now integrate the whole thing! 1046 // 1047 time = x + (Int_t)fLoGainFirst; 1048 sum = CalcIntegralLoGain(fAbMaxPos - fRiseTimeLoGain, range); 1049 } 1050 1051 Float_t MExtractTimeAndChargeSpline::CalcIntegralHiGain(Float_t start, Float_t range) const 1052 { 1053 // The number of steps is calculated directly from the integration 1054 // window. This is the only way to ensure we are not dealing with 1055 // numerical rounding uncertanties, because we always get the same 1056 // value under the same conditions -- it might still be different on 1057 // other machines! 1058 const Float_t step = 0.2; 1059 const Float_t width = fRiseTimeHiGain+fFallTimeHiGain; 1060 const Float_t max = range-1 - (width+step); 1061 const Int_t num = TMath::Nint(width/step); 1062 1063 // The order is important. In some cases (limlo-/limup-check) it can 1064 // happen than max<0. In this case we start at 0 1065 if (start > max) 1066 start = max; 1067 if (start < 0) 1068 start = 0; 1069 1070 start += step/2; 1071 1072 Double_t sum = 0.; 1073 for (Int_t i=0; i<num; i++) 1074 { 1075 const Float_t x = start+i*step; 1076 const Int_t klo = (Int_t)TMath::Floor(x); 1077 const Int_t khi = klo + 1; 1078 // Note: if x is close to one integer number (= a FADC sample) 1079 // we get the same result by using that sample as klo, and the 1080 // next one as khi, or using the sample as khi and the previous 1081 // one as klo (the spline is of course continuous). So we do not 1082 // expect problems from rounding issues in the argument of 1083 // Floor() above (we have noticed differences in roundings 1084 // depending on the compilation options). 1085 1086 const Float_t a = khi - x; // Distance from x to next FADC sample 1087 const Float_t b = x - klo; // Distance from x to previous FADC sample 1088 1089 sum += a*fHiGainSignal[klo] 1090 + b*fHiGainSignal[khi] 1091 + (a*a*a-a)*fHiGainSecondDeriv[klo] 1092 + (b*b*b-b)*fHiGainSecondDeriv[khi]; 1093 1094 // FIXME? Perhaps the integral should be done analitically 1095 // between every two FADC slices, instead of numerically 1096 } 1097 1098 sum *= step; // Transform sum in integral 1099 return sum; 1100 } 1101 1102 Float_t MExtractTimeAndChargeSpline::CalcIntegralLoGain(Float_t start, Float_t range) const 1103 { 1104 // The number of steps is calculated directly from the integration 1105 // window. This is the only way to ensure we are not dealing with 1106 // numerical rounding uncertanties, because we always get the same 1107 // value under the same conditions -- it might still be different on 1108 // other machines! 1109 const Float_t step = 0.2; 1110 const Float_t width = fRiseTimeLoGain+fFallTimeLoGain; 1111 const Float_t max = range-1 - (width+step); 1112 const Int_t num = TMath::Nint(width/step); 1113 1114 // The order is important. In some cases (limlo-/limup-check) it can 1115 // happen that max<0. In this case we start at 0 1116 if (start > max) 1117 start = max; 1118 if (start < 0) 1119 start = 0; 1120 1121 start += step/2; 1122 1123 Double_t sum = 0.; 1124 for (Int_t i=0; i<num; i++) 1125 { 1126 const Float_t x = start+i*step; 1127 const Int_t klo = (Int_t)TMath::Floor(x); 1128 const Int_t khi = klo + 1; 1129 // Note: if x is close to one integer number (= a FADC sample) 1130 // we get the same result by using that sample as klo, and the 1131 // next one as khi, or using the sample as khi and the previous 1132 // one as klo (the spline is of course continuous). So we do not 1133 // expect problems from rounding issues in the argument of 1134 // Floor() above (we have noticed differences in roundings 1135 // depending on the compilation options). 1136 1137 const Float_t a = khi - x; // Distance from x to next FADC sample 1138 const Float_t b = x - klo; // Distance from x to previous FADC sample 1139 1140 sum += a*fLoGainSignal[klo] 1141 + b*fLoGainSignal[khi] 1142 + (a*a*a-a)*fLoGainSecondDeriv[klo] 1143 + (b*b*b-b)*fLoGainSecondDeriv[khi]; 1144 1145 // FIXME? Perhaps the integral should be done analitically 1146 // between every two FADC slices, instead of numerically 1147 } 1148 sum *= step; // Transform sum in integral 1149 return sum; 1150 } 531 if (*p++ >= fSaturationLimit) 532 sat++; 533 } 534 535 FindTimeAndChargeLoGain2(fLoGainSignal.GetArray(), range, 536 sum, dsum, time, dtime, 537 sat, maxpos); 538 } 539 */ 1151 540 1152 541 // -------------------------------------------------------------------------- … … 1198 587 1199 588 return MExtractTimeAndCharge::ReadEnv(env, prefix, print) ? kTRUE : rc; 1200 1201 } 1202 1203 589 } -
trunk/MagicSoft/Mars/msignal/MExtractTimeAndChargeSpline.h
r7491 r8154 11 11 12 12 class MPedestalPix; 13 13 14 class MExtractTimeAndChargeSpline : public MExtractTimeAndCharge 14 15 { 16 private: 17 static const Byte_t fgHiGainFirst; //! Default for fHiGainFirst (now set to: 2) 18 static const Byte_t fgHiGainLast; //! Default for fHiGainLast (now set to: 14) 19 static const Byte_t fgLoGainFirst; //! Default for fLoGainFirst (now set to: 2) 20 static const Byte_t fgLoGainLast; //! Default for fLoGainLast (now set to: 14) 21 static const Float_t fgResolution; //! Default for fResolution (now set to: 0.003) 22 static const Float_t fgRiseTimeHiGain; //! Default for fRiseTime (now set to: 1.5) 23 static const Float_t fgFallTimeHiGain; //! Default for fFallTime (now set to: 4.5) 24 static const Float_t fgLoGainStretch; //! Default for fLoGainStretch (now set to: 1.5) 25 static const Float_t fgOffsetLoGain; //! Default for fOffsetLoGain (now set to 1.7) 26 // static const Float_t fgLoGainStartShift; //! Default for fLoGainStartShift (now set to -1.6) 27 28 // MArrayF fHiGainSignal; //! Need fast access to the signals in a float way 29 // MArrayF fLoGainSignal; //! Store them in separate arrays 30 MArrayF fHiGainFirstDeriv; //! High-gain discretized first derivatives 31 MArrayF fLoGainFirstDeriv; //! Low-gain discretized first derivatives 32 MArrayF fHiGainSecondDeriv; //! High-gain discretized second derivatives 33 MArrayF fLoGainSecondDeriv; //! Low-gain discretized second derivatives 34 35 Float_t fResolution; // The time resolution in FADC units 36 37 Float_t fRiseTimeHiGain; // The usual rise time of the pulse in the high-gain 38 Float_t fFallTimeHiGain; // The usual fall time of the pulse in the high-gain 39 Float_t fRiseTimeLoGain; // The usual rise time of the pulse in the low-gain 40 Float_t fFallTimeLoGain; // The usual fall time of the pulse in the low-gain 41 42 Float_t fLoGainStretch; // The stretch of the low-gain w.r.t. the high-gain pulse 43 44 Int_t fRandomIter; //! Counter used to randomize weights for noise calculation 45 46 Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print); 47 Bool_t InitArrays(); 48 49 public: 50 enum ExtractionType_t { kAmplitude, kIntegral }; //! Possible time and charge extraction types 15 51 16 52 private: 17 18 static const Byte_t fgHiGainFirst; //! Default for fHiGainFirst (now set to: 2) 19 static const Byte_t fgHiGainLast; //! Default for fHiGainLast (now set to: 14) 20 static const Byte_t fgLoGainFirst; //! Default for fLoGainFirst (now set to: 2) 21 static const Byte_t fgLoGainLast; //! Default for fLoGainLast (now set to: 14) 22 static const Float_t fgResolution; //! Default for fResolution (now set to: 0.003) 23 static const Float_t fgRiseTimeHiGain; //! Default for fRiseTime (now set to: 1.5) 24 static const Float_t fgFallTimeHiGain; //! Default for fFallTime (now set to: 4.5) 25 static const Float_t fgLoGainStretch; //! Default for fLoGainStretch (now set to: 1.5) 26 static const Float_t fgOffsetLoGain; //! Default for fOffsetLoGain (now set to 1.7) 27 static const Float_t fgLoGainStartShift; //! Default for fLoGainStartShift (now set to -1.6) 28 29 MArrayF fHiGainSignal; //! Need fast access to the signals in a float way 30 MArrayF fLoGainSignal; //! Store them in separate arrays 31 MArrayF fHiGainFirstDeriv; //! High-gain discretized first derivatives 32 MArrayF fLoGainFirstDeriv; //! Low-gain discretized first derivatives 33 MArrayF fHiGainSecondDeriv; //! High-gain discretized second derivatives 34 MArrayF fLoGainSecondDeriv; //! Low-gain discretized second derivatives 35 36 Float_t fAbMax; //! Current maximum of the spline 37 Float_t fAbMaxPos; //! Current position of the maximum of the spline 38 Float_t fHalfMax; //! Current half maximum of the spline 39 40 Float_t fResolution; // The time resolution in FADC units 41 42 Float_t fRiseTimeHiGain; // The usual rise time of the pulse in the high-gain 43 Float_t fFallTimeHiGain; // The usual fall time of the pulse in the high-gain 44 Float_t fRiseTimeLoGain; // The usual rise time of the pulse in the low-gain 45 Float_t fFallTimeLoGain; // The usual fall time of the pulse in the low-gain 46 47 Float_t fLoGainStretch; // The stretch of the low-gain w.r.t. the high-gain pulse 48 49 Int_t fRandomIter; //! Counter used to randomize weights for noise calculation 50 51 Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print); 52 53 Bool_t InitArrays(); 54 55 Float_t CalcIntegralHiGain(Float_t start, Float_t range) const; 56 Float_t CalcIntegralLoGain(Float_t start, Float_t range) const; 57 58 public: 59 enum ExtractionType_t { kAmplitude, kIntegral }; //! Possible time and charge extraction types 60 61 private: 62 63 ExtractionType_t fExtractionType; 53 ExtractionType_t fExtractionType; 64 54 65 55 public: 56 MExtractTimeAndChargeSpline(const char *name=NULL, const char *title=NULL); 57 ~MExtractTimeAndChargeSpline() {} 66 58 67 MExtractTimeAndChargeSpline(const char *name=NULL, const char *title=NULL);68 ~MExtractTimeAndChargeSpline() {}59 Float_t GetRiseTimeHiGain() const { return fRiseTimeHiGain; } 60 Float_t GetFallTimeHiGain() const { return fFallTimeHiGain; } 69 61 70 Float_t GetRiseTimeHiGain() const { return fRiseTimeHiGain; } 71 Float_t GetFallTimeHiGain() const { return fFallTimeHiGain; } 62 void SetRange(Byte_t hifirst=0, Byte_t hilast=0, Byte_t lofirst=0, Byte_t lolast=0 ); 72 63 73 void SetRange ( Byte_t hifirst=0, Byte_t hilast=0, Byte_t lofirst=0, Byte_t lolast=0 );74 void SetResolution ( const Float_t f=fgResolution ) { fResolution = f; } 75 void SetRiseTimeHiGain( const Float_t f=fgRiseTimeHiGain)64 void SetResolution(const Float_t f=fgResolution) { fResolution = f; } 65 66 void SetRiseTimeHiGain(const Float_t f=fgRiseTimeHiGain) 76 67 { 77 fRiseTimeHiGain = f;78 fRiseTimeLoGain = f*fLoGainStretch;79 fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples);80 fWindowSizeHiGain = TMath::Nint(fRiseTimeHiGain + fFallTimeHiGain);68 fRiseTimeHiGain = f; 69 fRiseTimeLoGain = f*fLoGainStretch; 70 fSqrtHiGainSamples = TMath::Sqrt(fNumHiGainSamples); 71 fWindowSizeHiGain = TMath::Nint(fRiseTimeHiGain + fFallTimeHiGain); 81 72 } 82 void SetFallTimeHiGain( const Float_t f=fgFallTimeHiGain)73 void SetFallTimeHiGain(const Float_t f=fgFallTimeHiGain) 83 74 { 84 fFallTimeHiGain = f;85 fFallTimeLoGain = f*fLoGainStretch;86 fNumHiGainSamples = fRiseTimeHiGain + fFallTimeHiGain;87 fNumLoGainSamples = fLoGainLast ? fRiseTimeLoGain + fFallTimeLoGain : 0.;88 fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples);89 fWindowSizeLoGain = TMath::Nint(fRiseTimeLoGain + fFallTimeLoGain);75 fFallTimeHiGain = f; 76 fFallTimeLoGain = f*fLoGainStretch; 77 fNumHiGainSamples = fRiseTimeHiGain + fFallTimeHiGain; 78 fNumLoGainSamples = fLoGainLast ? fRiseTimeLoGain + fFallTimeLoGain : 0.; 79 fSqrtLoGainSamples = TMath::Sqrt(fNumLoGainSamples); 80 fWindowSizeLoGain = TMath::Nint(fRiseTimeLoGain + fFallTimeLoGain); 90 81 } 91 82 92 void SetLoGainStretch ( const Float_t f=fgLoGainStretch ) { fLoGainStretch = f; } 93 94 void SetChargeType ( const ExtractionType_t typ=kIntegral); 95 96 void FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum, 97 Float_t &time, Float_t &dtime, 98 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 99 void FindTimeAndChargeLoGain(Byte_t *first, Float_t &sum, Float_t &dsum, 100 Float_t &time, Float_t &dtime, 101 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 83 void SetLoGainStretch(const Float_t f=fgLoGainStretch) { fLoGainStretch = f; } 102 84 103 ClassDef(MExtractTimeAndChargeSpline, 4) // Task to Extract Arrival Times and Charges using a Cubic Spline 85 void SetChargeType(const ExtractionType_t typ=kIntegral); 86 /* 87 void FindTimeAndChargeHiGain(Byte_t *first, Byte_t *logain, Float_t &sum, Float_t &dsum, 88 Float_t &time, Float_t &dtime, 89 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 90 void FindTimeAndChargeLoGain(Byte_t *first, Float_t &sum, Float_t &dsum, 91 Float_t &time, Float_t &dtime, 92 Byte_t &sat, const MPedestalPix &ped, const Bool_t abflag); 93 */ 94 void FindTimeAndChargeHiGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 95 Float_t &time, Float_t &dtime, 96 Byte_t sat, Int_t maxpos); 97 98 void FindTimeAndChargeLoGain2(const Float_t *firstused, Int_t num, Float_t &sum, Float_t &dsum, 99 Float_t &time, Float_t &dtime, 100 Byte_t sat, Int_t maxpos); 101 102 ClassDef(MExtractTimeAndChargeSpline, 4) // Task to Extract Arrival Times and Charges using a Cubic Spline 104 103 }; 105 104 106 105 #endif 107 108 109 -
trunk/MagicSoft/Mars/msignal/MExtractedSignalPix.h
r7876 r8154 15 15 Float_t fExtractedSignalLoGainError; // error of the mean value of the extracted signal 16 16 17 Byte_t fNumHiGainSaturated; // Number of first hi-gain slice which has saturated (could be negative if already the first slice saturates) 18 Byte_t fNumLoGainSaturated; // Number of first lo-gain slices which have saturated 17 Byte_t fNumHiGainSaturated; // Number of how many hi-gain slices saturated 18 Byte_t fNumLoGainSaturated; // Number of how many lo-gain slices saturated 19 20 Byte_t GetNumHiGainSaturated() const { return fNumHiGainSaturated; } 21 Byte_t GetNumLoGainSaturated() const { return fNumLoGainSaturated; } 19 22 20 23 public: … … 36 39 Float_t GetExtractedSignalLoGainError() const { return fExtractedSignalLoGainError; } 37 40 38 Byte_t GetNumHiGainSaturated() const { return fNumHiGainSaturated; }39 Byte_t GetNumLoGainSaturated() const { return fNumLoGainSaturated; }40 41 41 Bool_t IsHiGainSaturated() const { return fNumHiGainSaturated>0; } 42 42 Bool_t IsLoGainSaturated() const { return fNumLoGainSaturated>0; } -
trunk/MagicSoft/Mars/msignal/MExtractor.cc
r7881 r8154 93 93 #include "MPedestalCam.h" 94 94 #include "MPedestalPix.h" 95 //#include "MPedestalSubtractEvt.h" 95 96 96 97 #include "MExtractedSignalCam.h" … … 101 102 using namespace std; 102 103 103 const Byte_t MExtractor::fgSaturationLimit = 2 50;104 const Byte_t MExtractor::fgSaturationLimit = 245; 104 105 const TString MExtractor::fgNamePedestalCam = "MPedestalCam"; 105 106 const TString MExtractor::fgNameSignalCam = "MExtractedSignalCam"; … … 123 124 MExtractor::MExtractor(const char *name, const char *title) 124 125 : fResolutionPerPheHiGain(0), fResolutionPerPheLoGain(0), 125 fPedestals(NULL), fSignals(NULL), fRawEvt(NULL), fRunHeader(NULL), 126 fHiLoLast(0), fNumHiGainSamples(0), fNumLoGainSamples(0) 126 fPedestals(NULL), fSignals(NULL), fRawEvt(NULL), fRunHeader(NULL), 127 fSignal(NULL), 128 /*fHiLoLast(0),*/ fNumHiGainSamples(0), fNumLoGainSamples(0) 127 129 { 128 130 fName = name ? name : "MExtractor"; … … 172 174 { 173 175 *fLog << err << AddSerialNumber("MRawRunHeader") << " not found... aborting." << endl; 176 return kFALSE; 177 } 178 179 fSignal = (MPedestalSubtractedEvt*)pList->FindObject(AddSerialNumber("MPedestalSubtractedEvt")); 180 if (!fSignal) 181 { 182 *fLog << err << AddSerialNumber("MPedestalSubtractedEvt") << " not found... aborting." << endl; 174 183 return kFALSE; 175 184 } … … 231 240 Bool_t MExtractor::ReInit(MParList *pList) 232 241 { 233 242 const Int_t numl = fRunHeader->GetNumSamplesLoGain(); 243 const Int_t numh = fRunHeader->GetNumSamplesHiGain(); 244 const Int_t num = numh+numl; 245 246 if (fHiGainLast>=num) 247 { 248 *fLog << err << "ERROR - Last hi-gain slice must not exceed " << num-1 << endl; 249 return kFALSE; 250 } 251 if (fLoGainLast>=num) 252 { 253 *fLog << err << "ERROR - Last lo-gain slice must not exceed " << num-1 << endl; 254 return kFALSE; 255 } 256 257 /* 234 258 const Int_t logainsamples = fRunHeader->GetNumSamplesLoGain(); 235 259 … … 289 313 } 290 314 291 return kTRUE; 315 */ 316 return kTRUE; 292 317 } 293 318 … … 431 456 *fLog << " Hi Gain Range: " << Form("%2d %2d", fHiGainFirst, fHiGainLast) << endl; 432 457 *fLog << " Lo Gain Range: " << Form("%2d %2d", fLoGainFirst, fLoGainLast) << endl; 433 *fLog << " Gain Overlap to Lo: " << Form("%2d", fHiLoLast) << endl;458 // *fLog << " Gain Overlap to Lo: " << Form("%2d", fHiLoLast) << endl; 434 459 *fLog << " Saturation Lim: " << Form("%3d", fSaturationLimit) << endl; 435 460 *fLog << " Num Samples Hi/Lo: " << Form("%2.1f %2.1f", fNumHiGainSamples, fNumLoGainSamples) << endl; -
trunk/MagicSoft/Mars/msignal/MExtractor.h
r7804 r8154 18 18 19 19 class MPedestalCam; 20 class MPedestalSubtractedEvt; 20 21 class MExtractedSignalCam; 21 22 … … 42 43 MRawEvtData *fRawEvt; //! Raw event data (time slices) 43 44 MRawRunHeader *fRunHeader; //! RunHeader information 45 46 MPedestalSubtractedEvt *fSignal; //! 44 47 45 48 Byte_t fHiGainFirst; // First FADC slice nr. to extract the High Gain signal … … 48 51 Byte_t fLoGainLast; // Last FADC slice nr. to extract the Low Gain signal 49 52 50 Byte_t fHiLoLast; // Number of slices in fLoGainSamples counted for the High-Gain signal53 // Byte_t fHiLoLast; // Number of slices in fLoGainSamples counted for the High-Gain signal 51 54 52 55 Float_t fNumHiGainSamples; // Number High Gain FADC slices used to extract the signal … … 91 94 Float_t GetResolutionPerPheHiGain() const { return fResolutionPerPheHiGain; } 92 95 Float_t GetResolutionPerPheLoGain() const { return fResolutionPerPheLoGain; } 96 Byte_t GetSaturationLimit() const { return fSaturationLimit; } 93 97 94 98 Bool_t IsNoiseCalculation () const { return fNoiseCalculation; } … … 107 111 108 112 void SetPedestals (MPedestalCam *pedcam) { fPedestals = pedcam; } 113 MPedestalCam *GetPedestals() { return fPedestals; } 109 114 110 115 // TObject 111 116 void Clear(Option_t *o="") 112 117 { 113 fHiGainFirst = fHiGainLast = fLoGainFirst = fLoGainLast = fHiLoLast =0;118 fHiGainFirst = fHiGainLast = fLoGainFirst = fLoGainLast = /*fHiLoLast =*/ 0; 114 119 } 115 120 -
trunk/MagicSoft/Mars/msignal/Makefile
r7897 r8154 21 21 INCLUDES = -I. -I../mbase -I../mgui -I../mraw -I../manalysis \ 22 22 -I../mgeom -I../mtools -I../mpedestal -I../mbadpixels \ 23 -I../mcalib 23 -I../mcalib -I../mextralgo 24 24 25 25 # mgui (MCamEvent): MExtractSignalCam -
trunk/MagicSoft/Mars/msignal/calibration_weights_UV46.dat
r6870 r8154 1 1 # High Gain Weights: 4 10 2 2 # (Amplitude) (Time) 3 -0.735581 -0.673266 4 -0.800386 -0.47606 5 -0.902801 -0.192719 6 -0.945945 0.237423 7 -0.851618 0.770424 8 -0.598107 1.28444 9 -0.290663 1.69546 10 0.0967702 1.89144 11 0.362204 1.98161 12 0.610111 2.06506 13 0.919902 2.20752 14 1.12282 1.94486 15 1.46305 1.70309 16 1.85728 1.58904 17 2.19155 1.21011 18 2.37154 0.603168 19 2.37187 0.000360131 20 2.25639 -0.535921 21 2.12495 -0.948388 22 1.97328 -1.286 23 1.72155 -1.70358 24 1.55218 -1.75991 25 1.21489 -1.86382 26 0.759117 -2.09403 27 0.266577 -2.03167 28 -0.102906 -1.60487 29 -0.284545 -1.16641 30 -0.367327 -0.679947 31 -0.376403 -0.3943 32 -0.379568 -0.229929 33 -0.218954 0.0443019 34 -0.22659 0.163101 35 -0.195144 0.249649 36 -0.136182 0.328464 37 -0.0541723 0.334035 38 -0.00249719 0.207255 39 0.00794832 0.102902 40 0.00785676 0.0396167 41 0.00459524 0.0111356 42 0.00887564 0.0405 3 -0.735581 -0.673266 0 4 -0.800386 -0.47606 0 5 -0.902801 -0.192719 0 6 -0.945945 0.237423 0 7 -0.851618 0.770424 0 8 -0.598107 1.28444 0 9 -0.290663 1.69546 0 10 0.0967702 1.89144 0 11 0.362204 1.98161 0 12 0.610111 2.06506 0 13 0.919902 2.20752 0 14 1.12282 1.94486 0 15 1.46305 1.70309 0 16 1.85728 1.58904 0 17 2.19155 1.21011 0 18 2.37154 0.603168 0 19 2.37187 0.000360131 0 20 2.25639 -0.535921 0 21 2.12495 -0.948388 0 22 1.97328 -1.286 0 23 1.72155 -1.70358 0 24 1.55218 -1.75991 0 25 1.21489 -1.86382 0 26 0.759117 -2.09403 0 27 0.266577 -2.03167 0 28 -0.102906 -1.60487 0 29 -0.284545 -1.16641 0 30 -0.367327 -0.679947 0 31 -0.376403 -0.3943 0 32 -0.379568 -0.229929 0 33 -0.218954 0.0443019 0 34 -0.22659 0.163101 0 35 -0.195144 0.249649 0 36 -0.136182 0.328464 0 37 -0.0541723 0.334035 0 38 -0.00249719 0.207255 0 39 0.00794832 0.102902 0 40 0.00785676 0.0396167 0 41 0.00459524 0.0111356 0 42 0.00887564 0.0405 0 43 43 # Low Gain Weights: 6 10 44 44 # (Amplitude) (Time) 45 0.0446612 -0.385273 46 0.038191 -0.00418687 47 0.0386966 0.0212324 48 0.0402881 0.0744799 49 0.0415794 0.229615 50 0.0598731 0.44332 51 0.0758477 0.661518 52 0.101509 1.10641 53 0.159323 1.64997 54 0.497256 2.83685 55 0.245087 3.27499 56 0.140546 2.46177 57 0.58086 2.2849 58 0.632721 2.45587 59 0.72819 2.52835 60 0.889583 2.48099 61 0.980812 2.50031 62 1.09885 2.55892 63 1.21374 2.78769 64 1.61928 3.08069 65 1.38544 1.95583 66 1.31998 1.1792 67 1.50633 0.591226 68 1.50916 0.0793899 69 1.5008 -0.33188 70 1.47339 -0.575386 71 1.45362 -0.915309 72 1.40214 -1.31593 73 1.34175 -1.77904 74 1.0661 -2.05471 75 1.31087 -1.49798 76 1.33793 -1.34758 77 1.10172 -1.21719 78 1.08133 -1.09356 79 1.04007 -0.981455 80 0.976745 -1.08299 81 0.930979 -1.14774 82 0.874203 -1.18348 83 0.816708 -1.20126 84 0.587354 -1.92869 85 0.783078 -1.89621 86 0.792771 -1.03439 87 0.622278 -0.781807 88 0.61184 -0.745831 89 0.578792 -0.683741 90 0.537336 -0.596328 91 0.51443 -0.592858 92 0.482294 -0.560586 93 0.462351 -0.827587 94 0.317989 -1.05649 95 0.459672 -0.775035 96 0.468287 -0.619961 97 0.374182 -0.31635 98 0.376946 -0.225242 99 0.367075 -0.347444 100 0.340737 -0.393231 101 0.321054 -0.187384 102 0.320654 -0.225558 103 0.302148 -0.399499 104 0.232954 -0.607578 45 0.0446612 -0.385273 0 46 0.038191 -0.00418687 0 47 0.0386966 0.0212324 0 48 0.0402881 0.0744799 0 49 0.0415794 0.229615 0 50 0.0598731 0.44332 0 51 0.0758477 0.661518 0 52 0.101509 1.10641 0 53 0.159323 1.64997 0 54 0.497256 2.83685 0 55 0.245087 3.27499 0 56 0.140546 2.46177 0 57 0.58086 2.2849 0 58 0.632721 2.45587 0 59 0.72819 2.52835 0 60 0.889583 2.48099 0 61 0.980812 2.50031 0 62 1.09885 2.55892 0 63 1.21374 2.78769 0 64 1.61928 3.08069 0 65 1.38544 1.95583 0 66 1.31998 1.1792 0 67 1.50633 0.591226 0 68 1.50916 0.0793899 0 69 1.5008 -0.33188 0 70 1.47339 -0.575386 0 71 1.45362 -0.915309 0 72 1.40214 -1.31593 0 73 1.34175 -1.77904 0 74 1.0661 -2.05471 0 75 1.31087 -1.49798 0 76 1.33793 -1.34758 0 77 1.10172 -1.21719 0 78 1.08133 -1.09356 0 79 1.04007 -0.981455 0 80 0.976745 -1.08299 0 81 0.930979 -1.14774 0 82 0.874203 -1.18348 0 83 0.816708 -1.20126 0 84 0.587354 -1.92869 0 85 0.783078 -1.89621 0 86 0.792771 -1.03439 0 87 0.622278 -0.781807 0 88 0.61184 -0.745831 0 89 0.578792 -0.683741 0 90 0.537336 -0.596328 0 91 0.51443 -0.592858 0 92 0.482294 -0.560586 0 93 0.462351 -0.827587 0 94 0.317989 -1.05649 0 95 0.459672 -0.775035 0 96 0.468287 -0.619961 0 97 0.374182 -0.31635 0 98 0.376946 -0.225242 0 99 0.367075 -0.347444 0 100 0.340737 -0.393231 0 101 0.321054 -0.187384 0 102 0.320654 -0.225558 0 103 0.302148 -0.399499 0 104 0.232954 -0.607578 0 -
trunk/MagicSoft/Mars/msignal/cosmics_weights46.dat
r6870 r8154 1 1 # High Gain Weights: 4 10 2 2 # (Amplitude) (Time) 3 -0.637443 -0.648763 4 -0.707555 -0.610204 5 -0.772465 -0.469694 6 -0.896081 -0.305143 7 -1.02783 0.00696361 8 -1.03684 0.731979 9 -0.73698 1.49428 10 -0.23419 1.57509 11 0.12767 1.83675 12 0.441087 1.70526 13 0.639658 1.50546 14 0.806192 1.58667 15 0.966865 1.41151 16 1.24058 1.34506 17 1.58293 1.39453 18 2.02092 1.46038 19 2.31508 0.8539 20 2.31705 0.051831 21 2.18497 -0.493294 22 2.01129 -0.749924 23 1.8675 -0.959329 24 1.75322 -1.25026 25 1.60962 -1.37231 26 1.3216 -1.58832 27 0.880364 -1.9924 28 0.219661 -2.50675 29 -0.35077 -1.96955 30 -0.553454 -0.855454 31 -0.491715 -0.387673 32 -0.38701 -0.0297507 33 -0.293549 0.092153 34 -0.278646 0.194742 35 -0.263716 0.25195 36 -0.221238 0.323789 37 -0.121941 0.381038 38 0.00379863 0.393009 39 0.0805122 0.201843 40 0.0443888 -0.0531952 41 -0.0199606 -0.175625 42 -0.0809393 -0.21419 3 -0.637443 -0.648763 0 4 -0.707555 -0.610204 0 5 -0.772465 -0.469694 0 6 -0.896081 -0.305143 0 7 -1.02783 0.00696361 0 8 -1.03684 0.731979 0 9 -0.73698 1.49428 0 10 -0.23419 1.57509 0 11 0.12767 1.83675 0 12 0.441087 1.70526 0 13 0.639658 1.50546 0 14 0.806192 1.58667 0 15 0.966865 1.41151 0 16 1.24058 1.34506 0 17 1.58293 1.39453 0 18 2.02092 1.46038 0 19 2.31508 0.8539 0 20 2.31705 0.051831 0 21 2.18497 -0.493294 0 22 2.01129 -0.749924 0 23 1.8675 -0.959329 0 24 1.75322 -1.25026 0 25 1.60962 -1.37231 0 26 1.3216 -1.58832 0 27 0.880364 -1.9924 0 28 0.219661 -2.50675 0 29 -0.35077 -1.96955 0 30 -0.553454 -0.855454 0 31 -0.491715 -0.387673 0 32 -0.38701 -0.0297507 0 33 -0.293549 0.092153 0 34 -0.278646 0.194742 0 35 -0.263716 0.25195 0 36 -0.221238 0.323789 0 37 -0.121941 0.381038 0 38 0.00379863 0.393009 0 39 0.0805122 0.201843 0 40 0.0443888 -0.0531952 0 41 -0.0199606 -0.175625 0 42 -0.0809393 -0.21419 0 43 43 # Low Gain Weights: 6 10 44 44 # (Amplitude) (Time) 45 0.0446612 -0.385273 46 0.038191 -0.00418687 47 0.0386966 0.0212324 48 0.0402881 0.0744799 49 0.0415794 0.229615 50 0.0598731 0.44332 51 0.0758477 0.661518 52 0.101509 1.10641 53 0.159323 1.64997 54 0.497256 2.83685 55 0.245087 3.27499 56 0.140546 2.46177 57 0.58086 2.2849 58 0.632721 2.45587 59 0.72819 2.52835 60 0.889583 2.48099 61 0.980812 2.50031 62 1.09885 2.55892 63 1.21374 2.78769 64 1.61928 3.08069 65 1.38544 1.95583 66 1.31998 1.1792 67 1.50633 0.591226 68 1.50916 0.0793899 69 1.5008 -0.33188 70 1.47339 -0.575386 71 1.45362 -0.915309 72 1.40214 -1.31593 73 1.34175 -1.77904 74 1.0661 -2.05471 75 1.31087 -1.49798 76 1.33793 -1.34758 77 1.10172 -1.21719 78 1.08133 -1.09356 79 1.04007 -0.981455 80 0.976745 -1.08299 81 0.930979 -1.14774 82 0.874203 -1.18348 83 0.816708 -1.20126 84 0.587354 -1.92869 85 0.783078 -1.89621 86 0.792771 -1.03439 87 0.622278 -0.781807 88 0.61184 -0.745831 89 0.578792 -0.683741 90 0.537336 -0.596328 91 0.51443 -0.592858 92 0.482294 -0.560586 93 0.462351 -0.827587 94 0.317989 -1.05649 95 0.459672 -0.775035 96 0.468287 -0.619961 97 0.374182 -0.31635 98 0.376946 -0.225242 99 0.367075 -0.347444 100 0.340737 -0.393231 101 0.321054 -0.187384 102 0.320654 -0.225558 103 0.302148 -0.399499 104 0.232954 -0.607578 45 0.0446612 -0.385273 0 46 0.038191 -0.00418687 0 47 0.0386966 0.0212324 0 48 0.0402881 0.0744799 0 49 0.0415794 0.229615 0 50 0.0598731 0.44332 0 51 0.0758477 0.661518 0 52 0.101509 1.10641 0 53 0.159323 1.64997 0 54 0.497256 2.83685 0 55 0.245087 3.27499 0 56 0.140546 2.46177 0 57 0.58086 2.2849 0 58 0.632721 2.45587 0 59 0.72819 2.52835 0 60 0.889583 2.48099 0 61 0.980812 2.50031 0 62 1.09885 2.55892 0 63 1.21374 2.78769 0 64 1.61928 3.08069 0 65 1.38544 1.95583 0 66 1.31998 1.1792 0 67 1.50633 0.591226 0 68 1.50916 0.0793899 0 69 1.5008 -0.33188 0 70 1.47339 -0.575386 0 71 1.45362 -0.915309 0 72 1.40214 -1.31593 0 73 1.34175 -1.77904 0 74 1.0661 -2.05471 0 75 1.31087 -1.49798 0 76 1.33793 -1.34758 0 77 1.10172 -1.21719 0 78 1.08133 -1.09356 0 79 1.04007 -0.981455 0 80 0.976745 -1.08299 0 81 0.930979 -1.14774 0 82 0.874203 -1.18348 0 83 0.816708 -1.20126 0 84 0.587354 -1.92869 0 85 0.783078 -1.89621 0 86 0.792771 -1.03439 0 87 0.622278 -0.781807 0 88 0.61184 -0.745831 0 89 0.578792 -0.683741 0 90 0.537336 -0.596328 0 91 0.51443 -0.592858 0 92 0.482294 -0.560586 0 93 0.462351 -0.827587 0 94 0.317989 -1.05649 0 95 0.459672 -0.775035 0 96 0.468287 -0.619961 0 97 0.374182 -0.31635 0 98 0.376946 -0.225242 0 99 0.367075 -0.347444 0 100 0.340737 -0.393231 0 101 0.321054 -0.187384 0 102 0.320654 -0.225558 0 103 0.302148 -0.399499 0 104 0.232954 -0.607578 0
Note:
See TracChangeset
for help on using the changeset viewer.