ROOT logo
/*
 Small macro for testing the raw response function used in
 AliEMCALRawUtils

 J.L. Klay (Cal Poly)

*/
const Double_t fgTimeTrigger = 1.5E-06;
const Double_t fTau = 2.35;
const Double_t fOrder = 2.;
const Double_t fgPedestal = 32;
const Double_t fTimeBinWidth = 100E-9;
const Int_t fgOverflow = 0x3FF;
const Double_t fHighLowGain = 16.;
const Double_t fRawFormatTimeMax = 256*fTimeBinWidth;
const Double_t fgFEENoise = 3.;


void testRRF(const Double_t damp = 20, const Double_t dtime = 1e-09) {

  TH1I* adcHigh = new TH1I("adcHigh","adcHigh",256,0,255);
  TH1I* adcLow = new TH1I("adcLow","adcLow",256,0,255);

  TF1* signalF = new TF1("signal",RawResponseFunction, 0, 256, 5);
  signalF->SetParameter(0,damp);
  signalF->SetParameter(1,(dtime+fgTimeTrigger)/fTimeBinWidth);
  signalF->SetParameter(2,fTau);
  signalF->SetParameter(3,fOrder);
  signalF->SetParameter(4,fgPedestal); 

  for(Int_t itime = 0; itime < 256; itime++) {
    Double_t signal = signalF->Eval(itime);

    Double_t noise = gRandom->Gaus(0.,fgFEENoise);
    signal = sqrt(signal*signal + noise*noise);

    cout << "itime = " << itime << " highgain = " << signal << " signalI = " << static_cast<Int_t>(signal +0.5);

    if(static_cast<Int_t>(signal +0.5) > fgOverflow) {
      adcHigh->SetBinContent(itime+1,fgOverflow);
    } else {
      adcHigh->SetBinContent(itime+1,static_cast<Int_t>(signal +0.5));
    }

    signal /= fHighLowGain;

    cout << " lowgain = " << signal << " signalI = " << static_cast<Int_t>(signal +0.5) << endl;

    if(static_cast<Int_t>(signal +0.5) > fgOverflow) {
      adcLow->SetBinContent(itime+1,fgOverflow);
    } else {
      adcLow->SetBinContent(itime+1,static_cast<Int_t>(signal +0.5));      
    }
  }
  
  TCanvas *c1 = new TCanvas("c1","c1",20,20,600,1000);
  c1->Divide(1,3);
  c1->cd(1);
  signalF->Draw();
  c1->cd(2);
  adcHigh->Draw();
  c1->cd(3);
  adcLow->Draw();
  
}

Double_t RawResponseFunction(Double_t *x, Double_t *par)
{
  Double_t signal ;
  Double_t tau =par[2];
  Double_t N =par[3];
  Double_t ped = par[4];
  Double_t xx = ( x[0] - par[1] + tau ) / tau ;

  if (xx <= 0)
    signal = ped ;
  else {
    signal = ped + par[0] * TMath::Power(xx , N) * TMath::Exp(N * (1 - xx )) ;
  }
  return signal ;
}
 testRRF.C:1
 testRRF.C:2
 testRRF.C:3
 testRRF.C:4
 testRRF.C:5
 testRRF.C:6
 testRRF.C:7
 testRRF.C:8
 testRRF.C:9
 testRRF.C:10
 testRRF.C:11
 testRRF.C:12
 testRRF.C:13
 testRRF.C:14
 testRRF.C:15
 testRRF.C:16
 testRRF.C:17
 testRRF.C:18
 testRRF.C:19
 testRRF.C:20
 testRRF.C:21
 testRRF.C:22
 testRRF.C:23
 testRRF.C:24
 testRRF.C:25
 testRRF.C:26
 testRRF.C:27
 testRRF.C:28
 testRRF.C:29
 testRRF.C:30
 testRRF.C:31
 testRRF.C:32
 testRRF.C:33
 testRRF.C:34
 testRRF.C:35
 testRRF.C:36
 testRRF.C:37
 testRRF.C:38
 testRRF.C:39
 testRRF.C:40
 testRRF.C:41
 testRRF.C:42
 testRRF.C:43
 testRRF.C:44
 testRRF.C:45
 testRRF.C:46
 testRRF.C:47
 testRRF.C:48
 testRRF.C:49
 testRRF.C:50
 testRRF.C:51
 testRRF.C:52
 testRRF.C:53
 testRRF.C:54
 testRRF.C:55
 testRRF.C:56
 testRRF.C:57
 testRRF.C:58
 testRRF.C:59
 testRRF.C:60
 testRRF.C:61
 testRRF.C:62
 testRRF.C:63
 testRRF.C:64
 testRRF.C:65
 testRRF.C:66
 testRRF.C:67
 testRRF.C:68
 testRRF.C:69
 testRRF.C:70
 testRRF.C:71
 testRRF.C:72
 testRRF.C:73
 testRRF.C:74
 testRRF.C:75
 testRRF.C:76
 testRRF.C:77
 testRRF.C:78
 testRRF.C:79
 testRRF.C:80
 testRRF.C:81
 testRRF.C:82