const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxSpeed = 9.0;
const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxErr = 1.5;
const Int_t AliITSOnlineSDDInjectors::fgkDefaultPolOrder = 3;
-const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMin[kInjLines] = {20,90,170};
-const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {50,160,240};
+const Float_t AliITSOnlineSDDInjectors::fgkDefaultTimeStep = 50.;
+const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMin[kInjLines] = {10,50,100};
+const UShort_t AliITSOnlineSDDInjectors::fgkDefaultTbMax[kInjLines] = {20,70,120};
//______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fRMSTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
{
// default constructor
SetPositions();
SetDefaults();
+ SetTimeStep(fgkDefaultTimeStep);
}
//______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fRMSTbZero(0.),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
{
// standard constructor
SetPositions();
SetDefaults();
+ SetTimeStep(fgkDefaultTimeStep);
}
//______________________________________________________________________
AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
- //
- Float_t tzero=0.,intCont=0.;
+ // Get time zero from trigger signal
+ Float_t tzero=0.,intCont=0.,rmsPeak=0.;
+ Bool_t isTbUsed[256];
+ Int_t nTbUsed=0;
+ for(Int_t i=0;i<256;i++) isTbUsed[i]=0;
for(Int_t ian=0;ian<fgkNAnodes;ian++){
for(Int_t itb=1;itb<fTbMin[0];itb++){
Float_t cont=fHisto->GetBinContent(itb,ian+1);
+ Float_t contm1=fHisto->GetBinContent(itb+1,ian+1);
+ Float_t contp1=fHisto->GetBinContent(itb-1,ian+1);
if(cont>fLowThreshold){
- tzero+=cont*float(itb);
- intCont+=cont;
+ if(contm1>fHighThreshold || cont>fHighThreshold || contp1>fHighThreshold){
+ tzero+=cont*float(itb);
+ rmsPeak+=cont*float(itb)*float(itb);
+ intCont+=cont;
+ if(!isTbUsed[itb]){
+ isTbUsed[itb]=1;
+ ++nTbUsed;
+ }
+ }
}
}
}
- if(intCont>0) fTbZero=tzero/intCont;
+ if(intCont>0){
+ fTbZero=tzero/intCont;
+ fRMSTbZero=TMath::Sqrt(rmsPeak/intCont-fTbZero*fTbZero);
+ }
+ if(nTbUsed==1) fRMSTbZero=0.5;
}
//______________________________________________________________________
void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){
mat[k1][k2]=0;
}
}
+ Int_t npts = 0;
for(Int_t k1=0;k1<kNn;k1++){
for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
Float_t x=(Float_t)GetAnodeNumber(jpad);
if(fDriftSpeed[jpad]>0 && GetInjPadStatus(jpad)>fPadStatusCutForFit){
vect[k1]+=fDriftSpeed[jpad]*TMath::Power(x,k1)/TMath::Power(fDriftSpeedErr[jpad],2);
+ if(k1==0) npts++;
for(Int_t k2=0;k2<kNn;k2++){
-
mat[k1][k2]+=TMath::Power(x,k1+k2)/TMath::Power(fDriftSpeedErr[jpad],2);
}
}
}
}
- Int_t *iPivot = new Int_t[kNn];
- Int_t *indxR = new Int_t[kNn];
- Int_t *indxC = new Int_t[kNn];
- for(Int_t i=0;i<kNn;i++) iPivot[i]=0;
- Int_t iCol=-1,iRow=-1;
- for(Int_t i=0;i<kNn;i++){
- Float_t big=0.;
- for(Int_t j=0;j<kNn;j++){
- if(iPivot[j]!=1){
- for(Int_t k=0;k<kNn;k++){
- if(iPivot[k]==0){
- if(TMath::Abs(mat[j][k])>=big){
- big=TMath::Abs(mat[j][k]);
- iRow=j;
- iCol=k;
- }
+ if(npts<fPolOrder+1){
+ if(fParam) delete [] fParam;
+ fParam=new Float_t[kNn];
+ for(Int_t i=0; i<kNn;i++)fParam[i]=0;
+ }else{
+ Int_t *iPivot = new Int_t[kNn];
+ Int_t *indxR = new Int_t[kNn];
+ Int_t *indxC = new Int_t[kNn];
+ for(Int_t i=0;i<kNn;i++) iPivot[i]=0;
+ Int_t iCol=-1,iRow=-1;
+ for(Int_t i=0;i<kNn;i++){
+ Float_t big=0.;
+ for(Int_t j=0;j<kNn;j++){
+ if(iPivot[j]!=1){
+ for(Int_t k=0;k<kNn;k++){
+ if(iPivot[k]==0){
+ if(TMath::Abs(mat[j][k])>=big){
+ big=TMath::Abs(mat[j][k]);
+ iRow=j;
+ iCol=k;
+ }
+ }
}
}
}
- }
- iPivot[iCol]++;
- Float_t aux;
- if(iRow!=iCol){
- for(Int_t l=0;l<kNn;l++){
- aux=mat[iRow][l];
- mat[iRow][l]=mat[iCol][l];
- mat[iCol][l]=aux;
+ iPivot[iCol]++;
+ Float_t aux;
+ if(iRow!=iCol){
+ for(Int_t l=0;l<kNn;l++){
+ aux=mat[iRow][l];
+ mat[iRow][l]=mat[iCol][l];
+ mat[iCol][l]=aux;
+ }
+ aux=vect[iRow];
+ vect[iRow]=vect[iCol];
+ vect[iCol]=aux;
}
- aux=vect[iRow];
- vect[iRow]=vect[iCol];
- vect[iCol]=aux;
+ indxR[i]=iRow;
+ indxC[i]=iCol;
+ if(mat[iCol][iCol]==0) break;
+ Float_t pivinv=1./mat[iCol][iCol];
+ mat[iCol][iCol]=1;
+ for(Int_t l=0;l<kNn;l++) mat[iCol][l]*=pivinv;
+ vect[iCol]*=pivinv;
+ for(Int_t m=0;m<kNn;m++){
+ if(m!=iCol){
+ aux=mat[m][iCol];
+ mat[m][iCol]=0;
+ for(Int_t n=0;n<kNn;n++) mat[m][n]-=mat[iCol][n]*aux;
+ vect[m]-=vect[iCol]*aux;
+ }
+ }
}
- indxR[i]=iRow;
- indxC[i]=iCol;
- if(mat[iCol][iCol]==0) break;
- Float_t pivinv=1./mat[iCol][iCol];
- mat[iCol][iCol]=1;
- for(Int_t l=0;l<kNn;l++) mat[iCol][l]*=pivinv;
- vect[iCol]*=pivinv;
- for(Int_t m=0;m<kNn;m++){
- if(m!=iCol){
- aux=mat[m][iCol];
- mat[m][iCol]=0;
- for(Int_t n=0;n<kNn;n++) mat[m][n]-=mat[iCol][n]*aux;
- vect[m]-=vect[iCol]*aux;
- }
- }
+ delete [] iPivot;
+ delete [] indxR;
+ delete [] indxC;
+
+
+ if(fParam) delete [] fParam;
+ fParam=new Float_t[kNn];
+ for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
}
- delete [] iPivot;
- delete [] indxR;
- delete [] indxC;
-
- if(fParam) delete [] fParam;
- fParam=new Float_t[kNn];
- for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
for(Int_t i=0; i < kNn; i++) delete [] mat[i];
delete [] mat;
sumXY+=fPosition[i]*y[i]/ey[i]/ey[i];
sumWEI+=1./ey[i]/ey[i];
tzero=fTbZero/ey[i]/ey[i];
- erry=ey[i];
+ erry=ey[i]/ey[i]/ey[i];
npt++;
}
}
- Float_t vel=0,evel=0;
+ Float_t slope=0.,eslope=0.;
+ if(npt==1){
+ slope=(sumY-tzero)/sumX;
+ eslope=erry/sumX;
+ }
if(npt>1){
- Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
- Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
- if(slope!=0){
- vel=1./slope*10000./25.;// micron/ns
- evel=eslope/slope/slope*10000./25.;// micron/ns
+ if(fUseTimeZeroSignal){
+ sumY+=fTbZero/fRMSTbZero/fRMSTbZero;
+ sumX+=0.;
+ sumXX+=0.;
+ sumYY+=fTbZero*fTbZero/fRMSTbZero/fRMSTbZero;
+ sumXY+=0.;
+ sumWEI+=1./fRMSTbZero/fRMSTbZero;
}
+ slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
+ eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
}
- if(npt==1){
- Float_t slope=(sumY-tzero)/sumX;
- Float_t eslope=erry/sumX;
- if(slope!=0){
- vel=1./slope*10000./25.;// micron/ns
- evel=eslope/slope/slope*10000./25.;// micron/ns
- }
+
+ Float_t vel=0,evel=0;
+ if(slope!=0. && fTimeStep>0.){
+ vel=1./slope*10000./fTimeStep;// micron/ns
+ evel=eslope/slope/slope*10000./fTimeStep;// micron/ns
}
if(vel>fMaxDriftSpeed||vel<fMinDriftSpeed || evel>fMaxDriftSpeedErr){
vel=0.;
}
//______________________________________________________________________
Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjPad) const{
- //
+ // Injectors location along anodes:
+ // Side left (UP) - channel 0: injectors on anodes 0,7,15,...,247,255
+ // Side right (DOWN) - channel 1: injectors on anodes 0,8,16,...,248,255
Int_t ian=-1;
if(iInjPad>=kInjPads) return ian;
- if(!fSide){
+ if(fSide==1){ // right side
ian=iInjPad*8;
if(iInjPad==32) ian--;
- }else{
+ }else{ // left side
ian=iInjPad*8-1;
if(iInjPad==0) ian=0;
}
Int_t AliITSOnlineSDDInjectors::GetInjPadNumberFromAnode(Int_t nAnode) const{
//
Int_t iInjPad=-1;
- if(!fSide){
+ if(fSide==1){ // right side
if(nAnode%8==0) iInjPad=nAnode/8;
if(nAnode==255) iInjPad=32;
- }else{
+ }else{ // left side
if(nAnode%8==7) iInjPad=1+nAnode/8;
if(nAnode==0) iInjPad=0;
}
for(Int_t jjj=fTbMin[jlin];jjj<fTbMax[jlin];jjj++){
Float_t c1=fHisto->GetBinContent(jjj,ian+1);
Float_t c2=fHisto->GetBinContent(jjj+1,ian+1);
- Float_t c3=fHisto->GetBinContent(jjj+2,ian+1);
- if(c1>fLowThreshold && c2>fHighThreshold && c3>fLowThreshold){
- fGoodInj[jpad][jlin]=1;
- break;
+ // Float_t c3=fHisto->GetBinContent(jjj+2,ian+1);
+ if(c1>fLowThreshold && c2>fLowThreshold){
+ if(c1>fHighThreshold || c2>fHighThreshold){
+ fGoodInj[jpad][jlin]=1;
+ break;
+ }
}
}
}
if(cont<fLowThreshold) break;
if(cont<fgkSaturation){
fCentroid[jpad][jlin]+=cont*(Float_t)jjj;
- fRMSCentroid[jpad][jlin]+=cont*TMath::Power((Float_t)jjj,2);
+ fRMSCentroid[jpad][jlin]+=cont*(Float_t)jjj*(Float_t)jjj;
intCont+=cont;
}
jjj--;
if(cont<fLowThreshold) break;
if(cont<fgkSaturation){
fCentroid[jpad][jlin]+=cont*float(jjj);
- fRMSCentroid[jpad][jlin]+=cont*TMath::Power((Float_t)jjj,2);
+ fRMSCentroid[jpad][jlin]+=cont*(Float_t)jjj*(Float_t)jjj;
intCont+=cont;
}
jjj++;