+//__________________________________________________________________
+Double_t AliEMCAL::RawResponseFunction(Double_t *x, Double_t *par)
+{
+ // Shape of the electronics raw reponse:
+ // 1. the signal rises linearly from par[4] to par[1] to reach the maximu par[3]
+ // 2. the signal decays with a gaussian shape for par[4]+par[1] with a sigma of par[2]
+
+ Float_t xx = x[0] ;
+
+ Double_t signal = 0. ;
+
+ if (xx < par[4] + par[1]) // signal is rising
+ signal = (gRandom->Rndm() + par[3]) * (xx - par[4]) / (par[1] - par[4]) ;
+ else // signal is decaying
+ signal = (gRandom->Rndm() + par[3]) * TMath::Gaus(xx, par[4] + par[1], par[2]) ;
+
+ return signal < 0. ? 0. : signal ;
+}
+
+//__________________________________________________________________
+Bool_t AliEMCAL::RawSampledResponse(const Float_t dtime, const Int_t damp, Int_t * adcH, Int_t * adcL) const
+{
+ // for a start time dtime and an amplitude damp given by digit,
+ // calculates the raw sampled response
+
+ const Int_t kRawSignalOverflow = 0x3FF ;
+ Bool_t highGain = kFALSE ;
+
+ TF1 f1("signal", RawResponseFunction, 0, fkTimeBins, 5);
+
+ f1.SetParNames("Time Max", "Peaking time", "Decay width", "Amp max", "Start time") ;
+ f1.SetParameter(0, fTimeMax) ;
+ f1.SetParameter(1, fTimePeak) ;
+ f1.SetParameter(2, fTimeRes) ;
+ f1.SetParameter(3, damp) ;
+ f1.SetParameter(4, dtime) ;
+
+ for (Int_t iTime = 0; iTime < fkTimeBins; iTime++) {
+ Double_t time = iTime * fTimeMax/fkTimeBins;
+ Double_t signal = f1.Eval(time) ;
+ adcL[iTime] = static_cast<Int_t>(signal + 0.5) ;
+ if ( adcL[iTime] > kRawSignalOverflow) // larger than 10 bits
+ adcL[iTime] = kRawSignalOverflow ;
+ adcH[iTime] = static_cast<Int_t>(0.5 + (signal / fHighGainFactor)) ;
+ if (adcH[iTime] > 0)
+ highGain = kTRUE;
+ }
+ return highGain ;
+}
+