63 #include "AliTPCreco.h" 64 #include "TClonesArray.h" 69 #include "TFormulaPrimitive.h" 79 void SetParam(Float_t mnprim, Float_t diff, Float_t diffL, Int_t padrow, Float_t y, Float_t z, Float_t ky, Float_t kz, Float_t yCenter, Float_t zCenter);
82 Double_t
GetQtot(Float_t gain,Float_t thr, Float_t noise, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE);
83 Double_t
GetQmax(Float_t gain,Float_t thr, Float_t noise, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE);
85 Double_t
GetQtotCorr(Float_t rmsy0, Float_t rmsz0, Float_t gain, Float_t thr);
86 Double_t
GetClusterProperties(TVectorF ¶m, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE, Int_t skipSample=0);
87 Double_t
GetCOG(Int_t returnType, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE,Int_t skipSample=0);
89 Float_t
UnfoldCluster(Float_t & meani, Float_t & meanj, Float_t & sumu, Float_t & overlap, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE,Int_t skipSample=0);
90 Float_t
GetCOGUnfolded(Int_t returnType, Int_t addOverlap=kTRUE, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE,Int_t skipSample=0);
92 Bool_t
MakeDigitization(Int_t addOverlap, Float_t gain, Float_t thr, Float_t noise, Bool_t rounding, Bool_t addPedestal,Int_t skipSample);
107 static Double_t
GaussConvolution(Double_t x0, Double_t x1, Double_t k0, Double_t k1, Double_t s0, Double_t s1);
109 static Double_t
GaussGamma4(Double_t x, Double_t s0, Double_t p1);
110 static Double_t
Gamma4(Double_t x, Double_t p0, Double_t p1);
112 static Double_t
GEMPRF(Double_t x, Double_t sigma);
167 static void Simul(
const char*
simul, Int_t ntracks, Double_t diff, Bool_t simulOverlap=kTRUE);
168 Double_t CookdEdxNtot(Double_t f0,Float_t f1);
169 Double_t CookdEdxQtot(Double_t f0,Float_t f1);
170 Double_t CookdEdxNtotThr(Double_t f0,Float_t f1, Double_t thr, Int_t dEdxMode);
171 Double_t CookdEdxQtotThr(Double_t f0,Float_t f1, Double_t thr, Int_t dEdxMode);
173 Double_t CookdEdxDtot(Double_t f0,Float_t f1, Float_t gain,Float_t thr, Float_t noise, Bool_t corr, Int_t dEdxMode);
174 Double_t CookdEdxDmax(Double_t f0,Float_t f1,Float_t gain,Float_t thr, Float_t noise, Bool_t corr, Int_t dEdxMode);
176 Double_t CookdEdx(Int_t
npoints, Double_t *amp, Double_t f0,Float_t f1, Int_t dEdxMode);
251 if (!fCl) fCl =
new TClonesArray(
"AliTPCclusterFast",159);
255 for (Int_t irow=0;irow<fN;irow++){
263 for (Int_t irow=0;irow<fN;irow++){
265 Double_t tY = fTY+tX*fTAngleY;
266 Double_t tZ = fTZ+tX*fTAngleZ;
279 Double_t tYBin=tY/padWidth;
280 Double_t tZBin=tZ/zWidth;
282 if (drift<0) drift=0;
283 Double_t driftFactor= TMath::Sqrt(drift/100.);
284 Double_t fDiffBin=
fDiff*driftFactor/padWidth;
285 Double_t fDiffLongBin=
fDiffLong*driftFactor/padLength;
286 Double_t fAngleYBin=fTAngleY*padLength/padWidth;
287 Double_t fAngleZBin=fTAngleZ*padLength/zWidth;
289 Float_t yCenterBin= TMath::Nint(tYBin);
290 Float_t zCenterBin= TMath::Nint(tZBin*0.5)*2;
291 Double_t posYBin = tYBin-yCenterBin;
292 Double_t posZBin = tZBin-zCenterBin;
295 cluster->
SetParam(
fMNprim*padLength,fDiffBin, fDiffLongBin, irow, posYBin,posZBin,fAngleYBin,fAngleZBin,yCenterBin,zCenterBin);
300 if (clusterOverlap==NULL){
304 clusterOverlap->
Init();
305 Double_t posYOverlapBin=posYBin+(fDYOverlap+tX*fDAngleYOverlap)/padWidth;
306 Double_t posZOverlapBin=posZBin+(fDZOverlap+tX*fDAngleZOverlap)/padLength;
307 clusterOverlap->
SetParam(fMNprimOverlap*padLength,fDiffBin, fDiffLongBin, irow,posYOverlapBin,posZOverlapBin,fAngleYBin+fDAngleYOverlap/padWidth,fAngleZBin+fDAngleZOverlap/zWidth,yCenterBin,zCenterBin); clusterOverlap->
GenerElectrons(clusterOverlap, 0, 0);
313 for (Int_t i=0;i<fN;i++){
325 for (Int_t i=0;i<fN;i++){
327 amp[i]=cluster->
fNtot;
329 return CookdEdx(fN,amp,f0,f1,0);
336 for (Int_t i=0;i<fN;i++){
338 amp[i]=cluster->
fQtot;
340 return CookdEdx(fN,amp,f0,f1,0);
352 Double_t minAbove=-1;
353 for (Int_t i=0;i<fN;i++){
355 Double_t clQ= cluster->
fNtot;
360 if (minAbove<0) minAbove=clQ;
361 if (minAbove>clQ) minAbove=clQ;
364 if (dEdxMode==-1)
return Double_t(nBellow)/Double_t(fN);
366 for (Int_t i=0;i<fN;i++){
368 Double_t clQ= cluster->
fNtot;
370 if (dEdxMode==0) amp[i]=clQ;
373 if (dEdxMode==1 && clQ>thr) amp[i]=clQ;
374 if (dEdxMode==1 && clQ<thr) amp[i]=0;
377 if (dEdxMode==2 && clQ>thr) amp[i]=clQ;
378 if (dEdxMode==2 && clQ<thr) amp[i]=0;
381 if (dEdxMode==3) amp[i]=(clQ>thr)?clQ:thr;
382 if (dEdxMode==4) amp[i]=(clQ>thr)?clQ:minAbove;
384 return CookdEdx(fN,amp,f0,f1, dEdxMode);
398 Double_t minAbove=-1;
399 for (Int_t i=0;i<fN;i++){
401 Double_t clQ= cluster->
fQtot;
406 if (minAbove<0) minAbove=clQ;
407 if (minAbove>clQ) minAbove=clQ;
410 if (dEdxMode==-1)
return Double_t(nBellow)/Double_t(fN);
412 for (Int_t i=0;i<fN;i++){
414 Double_t clQ= cluster->
fQtot;
416 if (dEdxMode==0) amp[i]=clQ;
419 if (dEdxMode==1 && clQ>thr) amp[i]=clQ;
420 if (dEdxMode==1 && clQ<thr) amp[i]=0;
423 if (dEdxMode==2 && clQ>thr) amp[i]=clQ;
424 if (dEdxMode==2 && clQ<thr) amp[i]=0;
427 if (dEdxMode==3) amp[i]=(clQ>thr)?clQ:thr;
428 if (dEdxMode==4) amp[i]=(clQ>thr)?clQ:minAbove;
430 return CookdEdx(fN,amp,f0,f1, dEdxMode);
444 for (Int_t i=0;i<fN;i++){
447 if (dEdxMode==0) camp = cluster->
GetQtot(gain,0,noise);
449 camp = cluster->
GetQtot(gain,thr,noise);
451 if (doCorr) corr = cluster->
GetQtotCorr(0.5,0.5,gain,thr);
455 if (minAmp <0) minAmp=camp;
456 if (minAmp >camp) minAmp=camp;
459 if (dEdxMode==3)
for (Int_t i=0;i<fN;i++)
if (amp[i]<=0) amp[i]=thr;
460 if (dEdxMode==4)
for (Int_t i=0;i<fN;i++)
if (amp[i]<=0) amp[i]=minAmp;
461 return CookdEdx(fN,amp,f0,f1, dEdxMode);
473 for (Int_t i=0;i<fN;i++){
476 if (dEdxMode==0) camp = cluster->
GetQmax(gain,0,noise);
478 camp = cluster->
GetQmax(gain,thr,noise);
484 if (minAmp <0) minAmp=camp;
485 if (minAmp >camp) minAmp=camp;
488 if (dEdxMode==3)
for (Int_t i=0;i<fN;i++)
if (amp[i]<=0) amp[i]=thr;
489 if (dEdxMode==4)
for (Int_t i=0;i<fN;i++)
if (amp[i]<=0) amp[i]=minAmp;
490 return CookdEdx(fN,amp,f0,f1, dEdxMode);
510 TMath::Sort(npoints,amp,index,kFALSE);
514 Float_t sum0=0, sum1=0,sum2=0;
517 for (Int_t i=0;i<npoints;i++) if (amp[index[i]]>0) above++;
521 if (dEdxMode==1 && amp[index[i]]==0) {
524 if (accepted<npoints*f0)
continue;
525 if (accepted>npoints*f1)
continue;
527 sum1+= amp[index[i]];
528 sum2+= amp[index[i]];
531 if (dEdxMode==-1)
return 1-Double_t(above)/Double_t(npoints);
532 if (sum0<=0)
return 0;
551 for (Int_t itr=0; itr<ntracks; itr++){
553 fast.
fMNprim=(13.+100*gRandom->Rndm());
554 if (gRandom->Rndm()>0.5) fast.
fMNprim=1./(0.00001+gRandom->Rndm()*0.1);
556 fast.
fDiff =0.22*(1+0.2*(gRandom->Rndm()-0.5));
560 fast.
fTY=gRandom->Gaus(0,0.01);
561 fast.
fTZ=gRandom->Gaus(0,7);
562 if (gRandom->Rndm()>0.5) {
563 fast.
fTY=gRandom->Gaus(0,20);
564 fast.
fTZ=gRandom->Gaus(0,20);
567 fast.
fTAngleY = 4.0*(gRandom->Rndm()-0.5);
568 if (gRandom->Rndm()<0.2) fast.
fTAngleY = (gRandom->Rndm()-0.5)*TMath::Pi()/9.;
569 fast.
fTAngleZ = 3.0*(gRandom->Rndm()-0.5);
582 if (itr%100==0)
printf(
"%d\n",itr);
583 (*pcstream)<<
"simulTrack"<<
607 const Int_t knMax=10000;
617 fPosY.ResizeTo(knMax);
618 fPosZ.ResizeTo(knMax);
619 fGain.ResizeTo(knMax);
620 fSec.ResizeTo(knMax);
623 for (Int_t i=0; i<knMax; i++){
645 void AliTPCclusterFast::SetParam(Float_t mnprim, Float_t diff, Float_t diffL, Int_t padrow, Float_t y, Float_t z, Float_t ky, Float_t kz, Float_t yCenter, Float_t zCenter){
660 const Double_t FPOT=20.77E-9, EEND=10E-6, EEXPO=2.2;
661 const Double_t XEXPO=-EEXPO+1, YEXPO=1/XEXPO;
662 const Double_t W=20.77E-9;
663 Float_t RAN = gRandom->Rndm();
667 return TMath::Nint(TMath::Power((TMath::Power(FPOT,XEXPO)*(1-RAN)+TMath::Power(EEND,XEXPO)*RAN),YEXPO)/W);
674 const Int_t knMax=1000;
687 for (Int_t iprim=0; iprim<cl0->
fNprim;iprim++){
690 Double_t rc = (gRandom->Rndm()-0.5);
694 for (Int_t isec=0;isec<=dN;isec++){
697 Double_t y = gRandom->Gaus(0,cl0->
fDiff)+yc;
699 Double_t r = gRandom->Gaus(0,cl0->
fDiffLong)+rc;
702 if (r<-0.5 &&clm) cl=clm;
703 if (r>0.5 &&clp) cl=clp;
705 Double_t gg = -TMath::Log(gRandom->Rndm());
713 if (cl->
fNtot>=knMax)
continue;
715 if (cl0->
fNtot>=knMax)
break;
722 for (Int_t i=0; i<5;i++)
723 for (Int_t j=0; j<7;j++){
730 for (Int_t iel = 0; iel<
fNtot; iel++){
731 Double_t gg=
fGain[iel];
732 Double_t y=
fPosY[iel];
733 Double_t z=
fPosZ[iel];
740 for (Int_t di=-2; di<=2;di++)
741 for (Int_t dj=-3; dj<=3;dj++){
742 Float_t fac =
fPRF->Eval(di-y)*
fTRF->Eval(dj-z);
757 for (Int_t ip=0;ip<5;ip++){
758 Float_t pedestal=gRandom->Rndm()-0.5;
759 for (Int_t it=0;it<7;it++){
760 Float_t amp = gain*
fDigits(ip,it)+gRandom->Gaus()*noise;
761 if (baddPedestal) amp+=pedestal;
762 if (brounding) amp=TMath::Nint(amp);
763 if (amp>thr) sum+=amp;
773 for (Int_t ip=0;ip<5;ip++){
774 Float_t pedestal=gRandom->Rndm()-0.5;
775 for (Int_t it=0;it<7;it++){
776 Float_t amp = gain*
fDigits(ip,it)+gRandom->Gaus()*noise;
777 if (baddPedestal) amp+=pedestal;
778 if (brounding) amp=TMath::Nint(amp);
779 if (amp>max && amp>thr) max=amp;
793 Double_t sy = TMath::Sqrt(rmsy0*rmsy0+
fDiff*
fDiff);
794 Double_t sz = TMath::Sqrt(rmsz0*rmsz0+fDiff*fDiff);
803 Double_t sy = TMath::Sqrt(rmsy0*rmsy0+
fDiff*
fDiff);
804 Double_t sz = TMath::Sqrt(rmsz0*rmsz0+fDiff*fDiff);
805 Double_t sumAll=0,sumThr=0;
806 Double_t qtot =
GetQtot(gain,thr,0);
807 Double_t qmax =
GetQmax(gain,thr,0);
811 for (Int_t iter=0;iter<2;iter++){
812 for (Int_t iy=-2;iy<=2;iy++)
813 for (Int_t iz=-2;iz<=2;iz++){
815 Double_t qlocal =TMath::Nint(qnorm*val);
816 if (qlocal>thr) sumThr+=qlocal;
819 if (sumAll>0&&sumThr>0) corr=(sumThr)/sumAll;
822 if (corr>0) qnorm=qtot/corr;
839 for (Int_t iy=-2;iy<=2;iy++)
840 for (Int_t jz=-2;jz<=2;jz+=1+skipSample){
842 if (skipSample>0) iz=jz/(1+skipSample);
843 Double_t val = gain*
fDigits(iy+2,jz+3);
847 val+=noise*gRandom->Gaus();
848 if (addPedestal) val+=gRandom->Rndm()-0.5;
870 param[3]=TMath::Sqrt(sumY2W-sumYW*sumYW);
871 param[4]=TMath::Sqrt(sumZ2W-sumZW*sumZW);
875 for (Int_t iy=-2;iy<=2;iy++)
876 for (Int_t iz=-2;iz<=2;iz++){
877 Double_t val =
fDigits(iy+2,iz+3);
882 if (addPedestal) val+=gRandom->Rndm()-0.5;
884 Double_t dy=iy-param[1];
885 Double_t dz=iz-param[2];
886 sumY3W+=dy*dy*dy*val;
887 sumZ3W+=dz*dz*dz*val;
891 param[5]=sumY3W/sumW;
892 param[6]=sumZ3W/sumW;
910 Double_t
AliTPCclusterFast::GetCOG(Int_t returnType, Int_t addOverlap, Float_t gain, Float_t thr, Float_t noise, Bool_t rounding, Bool_t addPedestal, Int_t skipSample){
914 TVectorF properties(20);
916 return properties(returnType);
923 if (returnType==0)
return fStatY[0];
925 if (returnType==1)
return meanY;
927 if (returnType==2)
return meanZ;
929 if (returnType==3)
return (
fStatY[0]>0) ? TMath::Sqrt(
fStatY[2]/
fStatY[0]-meanY*meanY):0;
930 if (returnType==4)
return (
fStatZ[0]>0) ? TMath::Sqrt(
fStatZ[2]/
fStatZ[0]-meanZ*meanZ):0;
945 if ((TMath::Abs(k0)+TMath::Abs(k1))<kEpsilon*(s0+s1)){
947 Double_t val = (TMath::Gaus(x0,0,s0)*TMath::Gaus(x1,0,s1))/(s0*s1*2.*TMath::Pi());
951 Double_t sigma2 = k1*k1*s0*s0+k0*k0*s1*s1;
952 Double_t exp0 = TMath::Exp(-(k1*x0-k0*x1)*(k1*x0-k0*x1)/(2*sigma2));
954 Double_t sigmaErf = 2*s0*s1*TMath::Sqrt(2*sigma2);
955 Double_t erf0 = TMath::Erf( (k0*s1*s1*(k0-2*x0)+k1*s0*s0*(k1-2*x1))/sigmaErf);
956 Double_t erf1 = TMath::Erf( (k0*s1*s1*(k0+2*x0)+k1*s0*s0*(k1+2*x1))/sigmaErf);
957 Double_t norm = 1./TMath::Sqrt(sigma2);
958 norm/=2.*TMath::Sqrt(2.*TMath::Pi());
959 Double_t val = norm*exp0*(erf0+erf1);
972 Double_t exp1 = (s0*s0*t1-2*x0)*t1/2.;
973 exp1 = TMath::Exp(exp1);
974 Double_t erf = 1+TMath::Erf((-s0*s0*t1+x0)/(s0*TMath::Sqrt(2.)));
975 Double_t val = exp1*erf;
981 Double_t
Gamma4(Double_t *x, Double_t *param){
984 if (x[0]<0)
return 0;
985 Double_t g1 = TMath::Exp(-4.*x[0]/param[1]);
986 Double_t g2 = TMath::Power(x[0]/param[1],4);
987 return param[0]*g1*g2;
996 Double_t g1 = TMath::Exp(-4.*x/p1);
997 Double_t g2 = TMath::Power(x/p1,4);
1018 if (x<0)
return (1+TMath::Erf((x+0.5)/sigma))*0.5;
1019 if (x>0)
return (1+TMath::Erf(-(x-0.5)/sigma))*0.5;
1028 Double_t exp1 = (8*s0*s0-4.*p1*x)/(p1*p1);
1029 exp1 = TMath::Exp(exp1);
1030 Double_t erf1 = 1+TMath::Erf((-4*s0/p1+x/s0)/TMath::Sqrt(2));
1040 Float_t meani, meanj, sumu,overlap;
1041 UnfoldCluster(meani, meanj, sumu,overlap,addOverlap, gain,thr,noise,rounding,addPedestal,skipSample);
1042 if (returnType==-1)
return overlap;
1043 if (returnType==0)
return sumu;
1044 if (returnType==1)
return meani;
1045 if (returnType==2)
return meanj;
1065 for (Int_t i=0; i<5; i++){
1066 for (Int_t j=0; j<7; j++){
1070 Float_t cNoise=gRandom->Gaus();
1071 value+=noise*cNoise;
1072 if (addPedestal) value+=gRandom->Rndm()-0.5;
1073 if (rounding) value=TMath::Nint(value);
1074 if (value<thr) value=0;
1075 if (skipSample==0) {
1077 if ((value+kEpsilon*cNoise)>=maxValue && TMath::Abs(i-2)<=1 && TMath::Abs(j-3)<=(1+skipSample)){
1078 maxValue=value+kEpsilon*cNoise;
1083 if (skipSample==1 && (j%2)==1 && TMath::Abs(i-2)<=1 && TMath::Abs(j-3)<=(1+skipSample) ) {
1085 if (value+kEpsilon*cNoise>=maxValue){
1086 maxValue=value+kEpsilon*cNoise;
1097 TMatrixF tmpDigits(5,7);
1098 for (Int_t i=0; i<5; i++)
1099 for (Int_t j=0; j<7; j++)
1106 static Int_t dumpCounter=0;
1109 ::Info(
"AliTPCclusterFast::MakeDigitization",
"fYMaxBin\t%d fZMaxBin\t%d",
fYMaxBin,
fZMaxBin);
1118 Float_t
AliTPCclusterFast::UnfoldCluster(Float_t & meani, Float_t & meanj, Float_t & sumu, Float_t & overlap, Int_t addOverlap, Float_t gain, Float_t thr, Float_t noise, Bool_t rounding, Bool_t addPedestal,Int_t skipSample){
1124 Float_t sum3i[7] = {0,0,0,0,0,0,0};
1125 Float_t sum3j[7] = {0,0,0,0,0,0,0};
1132 MakeDigitization(addOverlap, gain, thr, noise,rounding, addPedestal, skipSample);
1135 for (Int_t k =0;k<7;k++)
1136 for (Int_t l = -1; l<=1;l++){
1140 if (sum3i[3]<=3 || sum3j[3]<=3)
return 0;
1143 Float_t mratio[3][3]={{1,1,1},{1,1,1},{1,1,1}};
1147 Float_t sum3wio = 0;
1149 for (Int_t dk=-1;dk<=1;dk++){
1150 sum3wio+=sum3i[dk+3];
1152 sum3wi+=sum3i[dk+3];
1156 if ( ( ((sum3i[dk+3]+3)/(sum3i[3]-3))+1 < (sum3i[2*dk+3]-3)/(sum3i[dk+3]+3))||
1157 (sum3i[dk+3]<=sum3i[2*dk+3] && sum3i[dk+3]>2 )){
1158 Float_t xm2 = sum3i[-dk+3];
1159 Float_t xm1 = sum3i[+3];
1160 Float_t x1 = sum3i[2*dk+3];
1161 Float_t x2 = sum3i[3*dk+3];
1162 Float_t w11 = TMath::Max((Float_t)(4.*xm1-xm2),(Float_t)0.000001);
1163 Float_t w12 = TMath::Max((Float_t)(4 *x1 -x2),(Float_t)0.);
1164 ratio = w11/(w11+w12);
1165 for (Int_t dl=-1;dl<=1;dl++)
1166 mratio[dk+1][dl+1] *= ratio;
1168 Float_t amp = sum3i[dk+3]*ratio;
1173 meani = sum3iw/sum3wi;
1174 Float_t overlapi = (sum3wio-sum3wi)/sum3wio;
1177 Float_t sum3wjo = 0;
1179 for (Int_t dk=-1;dk<=1;dk++){
1180 sum3wjo+=sum3j[dk+3];
1182 sum3wj+=sum3j[dk+3];
1186 if ( ( ((sum3j[dk+3]+3)/(sum3j[3]-3))+1 < (sum3j[2*dk+3]-3)/(sum3j[dk+3]+3)) ||
1187 (sum3j[dk+3]<=sum3j[2*dk+3] && sum3j[dk+3]>2)){
1188 Float_t xm2 = sum3j[-dk+3];
1189 Float_t xm1 = sum3j[+3];
1190 Float_t x1 = sum3j[2*dk+3];
1191 Float_t x2 = sum3j[3*dk+3];
1192 Float_t w11 = TMath::Max((Float_t)(4.*xm1-xm2),(Float_t)0.000001);
1193 Float_t w12 = TMath::Max((Float_t)(4 *x1 -x2),(Float_t)0.);
1194 ratio = w11/(w11+w12);
1195 for (Int_t dl=-1;dl<=1;dl++)
1196 mratio[dl+1][dk+1] *= ratio;
1198 Float_t amp = sum3j[dk+3]*ratio;
1203 meanj = sum3jw/sum3wj;
1204 Float_t overlapj = (sum3wjo-sum3wj)/sum3wjo;
1205 overlap = Int_t(100*TMath::Max(overlapi,overlapj)+3);
1206 sumu = (sum3wj+sum3wi)/2.;
1213 ::Info(
"AliTPCclusterFast::UnitTest",
"Test BEGIN");
1216 testTree->SetAlias(
"IsMaxOK",
"((fCl.GetRawDigit(2,3)>=fCl.GetRawDigit(1,3))&&(fCl.GetRawDigit(2,3)>=fCl.GetRawDigit(4,3)))!=0");
1217 testTree->Draw(
"IsMaxOK==0",
"fCl.GetCOGUnfolded(1, 0, 1, 0.0 , 0.0, 0, 0, 0)!=0",
"goff",1000);
1219 if (TMath::Abs(mean)<0.001){
1220 ::Info(
"AliTPCclusterFast::UnitTest",
"MaxTest OK");
1222 ::Error(
"AliTPCclusterFast::UnitTest",
"MaxTest FAILED");
1230 tree->SetAlias(
"deltaYHit",
"(fCl.GetCOGHit(1)-fY-0)");
1231 tree->SetAlias(
"errYHit",
"sqrt(2.*fCl.fDiff**2/fCl.fQtot+(2*fCl.fAngleY**2)/(12.*sqrt(fCl.fNprim)))");
1232 tree->SetAlias(
"errYMWPC",
"sqrt(0.2**2+2.*fCl.fDiff**2/fCl.fQtot+(2*fCl.fAngleY**2)/(12.*sqrt(fCl.fNprim)))");
1234 tree->SetAlias(
"deltaYUnfoldedDefault",
"(GetCOGUnfolded(1, 1, 0.8, 2, 0.6, 1, 1, 0)+fCl.GetYMaxBin()-fY)");
1235 tree->SetAlias(
"deltaYNoOverlapDefault",
"(fCl.GetCOG(1, 0, 0.8, 2, 0.6, 1, 1, 0)-fY-0)");
1236 tree->SetAlias(
"deltaYOverlapDefault",
"(fCl.GetCOG(1, 1, 0.8, 2, 0.6, 1, 1, 0)-fY-0)");
1237 tree->SetAlias(
"padrow",
"Iteration$");
1239 tree->SetAlias(
"IROC",
"padrow<63");
1240 tree->SetAlias(
"OROCMedium",
"padrow>63&&padrow<127");
1241 tree->SetAlias(
"OROCLong",
"padrow>127");
1242 tree->SetAlias(
"padLength",
"((IROC)*0.75+(OROCMedium)*1+(OROCLong*1.5))");
1243 tree->SetAlias(
"padWidth",
"((IROC)*0.4+(padrow>63)*0.6)");
1244 tree->SetAlias(
"driftLength",
"250-abs(fZCenterBin*0.25)");
1265 TStatToolkit::AddMetadata(tree,
"deltaYNoOverlapDefault.Comment",
"#Delta_{rphi} no overlap (10 MHz) \n (fCl.GetCOG(1, 0, 0.8, 2, 0.6, 1, 1, 0)-fY)");
1268 TStatToolkit::AddMetadata(tree,
"deltaYUnfoldedDefault.Title",
"(GetCOGUnfolded(1, 1, 0.8, 2, 0.6, 1, 1, 0)+fCl.GetYMaxBin()-fY)");
1270 TStatToolkit::AddMetadata(tree,
"deltaYUnfoldedDefault.Comment",
"#Delta_{rphi} unfolded (10 MHz). Default digitization parameters. \n Sampling rate 10 MHz.\n Alias: (GetCOGUnfolded(1, 1, 0.8, 2, 0.6, 1, 1, 0)+fCl.GetYMaxBin()-fY)");
Bool_t fInit
initialization flag
static Double_t GaussConvolution(Double_t x0, Double_t x1, Double_t k0, Double_t k1, Double_t s0, Double_t s1)
Float_t GetPadPitchLength(Int_t isector=0, Int_t padrow=0) const
TVectorF fPosY
position y for each electron
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
Int_t fNtot
total number of electrons
Double_t GetClusterProperties(TVectorF ¶m, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE, Int_t skipSample=0)
Double_t CookdEdxQtot(Double_t f0, Float_t f1)
Int_t fZMaxBin
y maximum position as position as calculated in the MakeDigitization (should be 0 in mean ) ...
static Double_t Gamma4(Double_t x, Double_t p0, Double_t p1)
Manager and of geomety classes for set: TPC.
Int_t fPadRow
cluster pad row number
static Double_t GaussExpConvolution(Double_t x0, Double_t s0, Double_t t1)
Float_t fAngleY
z maximum position as position as calculated in the MakeDigitization (should be 0 in mean ) ...
Float_t GetCOGUnfolded(Int_t returnType, Int_t addOverlap=kTRUE, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE, Int_t skipSample=0)
Float_t fMNprimOverlap
mean number of primary electrons for overlap track
Double_t GetCOGHit(Int_t returnType)
static void Simul(const char *simul, Int_t ntracks, Double_t diff, Bool_t simulOverlap=kTRUE)
Float_t fDZOverlap
delta z position of overlap track at row 0 in dz/dx
TClonesArray * fCl
array of clusters
virtual ~AliTPCclusterFast()
AliTPCclusterFast * fOverlapCluster
static Double_t GaussGamma4(Double_t x, Double_t s0, Double_t p1)
Float_t fDiff
diffusion sigma
Float_t fDYOverlap
delta y position of overlap track at row 0 in dy/dx
TMatrixF fDigits
response matrix (ideal signal without noise, trheshold rounding, pile-up)
TTreeSRedirector * pcstream
Double_t CookdEdxNtotThr(Double_t f0, Float_t f1, Double_t thr, Int_t dEdxMode)
Float_t fAngleZ
z angle - tan z
Float_t fDiffLong
diffusion sigma longitudinal direction
Float_t GetPadRowRadiiLow(Int_t irow) const
Float_t GetPadPitchWidth(Int_t isector=0) const
static void GenerElectrons(AliTPCclusterFast *cl0, AliTPCclusterFast *clm, AliTPCclusterFast *clp)
Float_t GetDigit(Int_t i, Int_t j)
Float_t fY
y ideal position - center bin
Double_t GetExpectedRMS(Int_t dim)
Bool_t fBOverlap
flag generate overlap track
Float_t fYCenterBin
y center bin
static TF1 * fTRF
Time response function.
Float_t fDAngleYOverlap
y angle - tan(y) for overlap track in cm
static Double_t GEMPRF(Double_t x, Double_t sigma)
static Double_t Gamma4Norm(Double_t x)
static Float_t fgZSamplingFactor
TMatrixF * GetRawDigits()
Double_t CookdEdxNtot(Double_t f0, Float_t f1)
Int_t fNprim
mean number of primary electrons
Double_t GetQmaxCorr(Float_t rmsy0, Float_t rmsz0)
static Int_t fgDebugLevel
Double_t GetQtot(Float_t gain, Float_t thr, Float_t noise, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE)
Float_t fTRFRMS
pad respons function width
Float_t GetZWidth() const
Float_t GetDigitsRawMax()
Float_t UnfoldCluster(Float_t &meani, Float_t &meanj, Float_t &sumu, Float_t &overlap, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE, Int_t skipSample=0)
Float_t GetRawDigit(Int_t i, Int_t j)
Float_t fDiffLong
diffusion sigma longitudinal direction
void simul(Int_t npoints, Double_t diffFactor)
Float_t fDiff
diffusion in mm/sqrt(m) - nominal is 2.2 mm/sqrt(m)
Float_t fDAngleZOverlap
z angle - tan z for overlap track in cm
Float_t fTZ
track Z at the vertex in (cm)
Float_t fTAngleY
y angle - tan(y) - dy/dx (cm/cm)
Double_t CookdEdxDtot(Double_t f0, Float_t f1, Float_t gain, Float_t thr, Float_t noise, Bool_t corr, Int_t dEdxMode)
Float_t fZ
z ideal position - center bin
Float_t fQtot
total charge - Gas gain flucuation taken into account
Float_t fPRFRMS
"on the fly caclualted digits matrix" for current version of setup - gain, noise, thr...
Float_t fTY
track Y at the vertex in (cm)
Double_t GetQmax(Float_t gain, Float_t thr, Float_t noise, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE)
Int_t GetNRow(Int_t isec) const
Double_t CookdEdxQtotThr(Double_t f0, Float_t f1, Double_t thr, Int_t dEdxMode)
Float_t GetPadRowRadiiUp(Int_t irow) const
TVectorF fPosZ
position z for each electron
static void SetMetadata(TTree *tree)
Bool_t MakeDigitization(Int_t addOverlap, Float_t gain, Float_t thr, Float_t noise, Bool_t rounding, Bool_t addPedestal, Int_t skipSample)
void SetParam(Float_t mnprim, Float_t diff, Float_t diffL, Int_t padrow, Float_t y, Float_t z, Float_t ky, Float_t kz, Float_t yCenter, Float_t zCenter)
AliTPCTrackHits * MakeTrack(TClonesArray *arr, TClonesArray *arrp, AliTPCTrackHits *myhits)
static void InitFormulas()
Float_t fMNprim
mean number of primary electrons per cm
Int_t fN
number of clusters simulated
Double_t GetCOG(Int_t returnType, Int_t addOverlap, Float_t gain=0.8, Float_t thr=2, Float_t noise=0.7, Bool_t rounding=kTRUE, Bool_t addPedestal=kTRUE, Int_t skipSample=0)
TVectorF fGain
gg for each electron
Double_t GetQtotCorr(Float_t rmsy0, Float_t rmsz0, Float_t gain, Float_t thr)
static TF1 * fPRF
time rsponsefunction width
TVectorF fSec
number of secondary electrons
Double_t CookdEdx(Int_t npoints, Double_t *amp, Double_t f0, Float_t f1, Int_t dEdxMode)
Float_t GetZLength(Int_t sector=0) const
Float_t fZCenterBin
z center bin
Float_t fTAngleZ
z angle - tan(z) - dy/dx (cm/cm)
Float_t fMNprim
mean number of primary electrons
Double_t CookdEdxDmax(Double_t f0, Float_t f1, Float_t gain, Float_t thr, Float_t noise, Bool_t corr, Int_t dEdxMode)