]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSOnlineSDDInjectors.cxx
Added protections to avoid crashes with bad modules
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDInjectors.cxx
index 47387b4dcf199c1619b0aeed44603f3488f9b17b..5c082dceae1ef8e8d6085733e88c5a911a19cc07 100644 (file)
@@ -17,6 +17,8 @@
 #include <TGraphErrors.h>
 #include <TMath.h>
 
+/* $Id$ */
+
 ///////////////////////////////////////////////////////////////////
 //                                                               //
 // Implementation of the class used for SDD injector analysis    //
 ClassImp(AliITSOnlineSDDInjectors)
 
 const Float_t AliITSOnlineSDDInjectors::fgkSaturation = 1008.;
-const Float_t AliITSOnlineSDDInjectors::fgkJitterTB = 8.;
 
 //______________________________________________________________________
-  AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.),fTimeDiffTB()
 {
   // default constructor
   SetMinDriftVel();
@@ -41,10 +42,12 @@ const Float_t AliITSOnlineSDDInjectors::fgkJitterTB = 8.;
   SetPositions();
   SetPolOrder();
   SetThreshold();
+  SetTimeDiffTB();
 }
 //______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t mod, Int_t sid):AliITSOnlineSDD(mod,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.)
-{ // standard constructor
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fParam(),fPolOrder(0),fMinDriftVel(0.),fMaxDriftVel(0.),fThreshold(0.),fTimeDiffTB()
+{ 
+// standard constructor
   SetMinDriftVel();
   SetMaxDriftVel();
   SetRangeLine1();
@@ -53,6 +56,7 @@ AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t mod, Int_t sid):AliITSO
   SetPositions();
   SetPolOrder();
   SetThreshold();
+  SetTimeDiffTB();
 }
 //______________________________________________________________________
 AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
@@ -72,6 +76,7 @@ void AliITSOnlineSDDInjectors::SetPositions(){
 }
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::Reset(){
+  //
   for(Int_t i=0;i<kNInjectors;i++){ 
     fDriftVel[i]=0.;
     fSigmaDriftVel[i]=0.;
@@ -96,7 +101,7 @@ void AliITSOnlineSDDInjectors::AnalyzeEvent(TH2F* his){
   FitDriftVelocityVsAnode();
 }
 //______________________________________________________________________
-TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin){
+TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin) const{
   // 
   Float_t x[4],y[4],ex[4],ey[4];
   x[0]=0.;
@@ -114,14 +119,14 @@ TGraphErrors* AliITSOnlineSDDInjectors::GetLineGraph(Int_t jlin){
 }
 //______________________________________________________________________
 Float_t AliITSOnlineSDDInjectors::GetDriftCoordinate(Float_t cAnode, Float_t cTimeBin){
+  //
   Float_t vel=0;
   for(Int_t i=0;i<=fPolOrder;i++) vel+=fParam[i]*TMath::Power(cAnode,(Float_t)i);
-  return vel*(cTimeBin-(fTbZero-fgkJitterTB))*25/1000.; 
+  return vel*(cTimeBin-(fTbZero-fTimeDiffTB))*25/1000.; 
 }
 //______________________________________________________________________
-TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph(){
+TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph() const{
   // 
-
   Int_t ipt=0;
   TGraphErrors *g=new TGraphErrors(0);
   for(Int_t i=0;i<kNInjectors;i++){
@@ -135,6 +140,7 @@ TGraphErrors* AliITSOnlineSDDInjectors::GetDriftVelocityGraph(){
 }
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
+  //
   Float_t tzero=0.,intCont=0.;
   for(Int_t ian=0;ian<fgkNAnodes;ian++){
     for(Int_t itb=1;itb<fTbMin[0];itb++){
@@ -149,13 +155,14 @@ void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
 }
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
-  const Int_t nn=fPolOrder+1;
-  Float_t **mat = new Float_t*[nn];
-  for(Int_t i=0; i < nn; i++) mat[i] = new Float_t[nn];
-  Float_t *vect = new Float_t[nn];
-  for(Int_t k1=0;k1<nn;k1++){
+  // fits the anode dependence of drift velocity with a polynomial
+  const Int_t kNn=fPolOrder+1;
+  Float_t **mat = new Float_t*[kNn];
+  for(Int_t i=0; i < kNn; i++) mat[i] = new Float_t[kNn];
+  Float_t *vect = new Float_t[kNn];
+  for(Int_t k1=0;k1<kNn;k1++){
     vect[k1]=0;
-    for(Int_t k2=0;k2<nn;k2++){
+    for(Int_t k2=0;k2<kNn;k2++){
       mat[k1][k2]=0;
       for(Int_t n=0; n<kNInjectors;n++){
        Float_t x=(Float_t)GetAnodeNumber(n);
@@ -163,22 +170,22 @@ void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
       }
     }
   }
-  for(Int_t k1=0;k1<nn;k1++){
+  for(Int_t k1=0;k1<kNn;k1++){
     for(Int_t n=0; n<kNInjectors;n++){
       Float_t x=(Float_t)GetAnodeNumber(n);
       if(fDriftVel[n]>0) vect[k1]+=fDriftVel[n]*TMath::Power(x,k1)/TMath::Power(fSigmaDriftVel[n],2);
     }
   }
-  Int_t *iPivot = new Int_t[nn];
-  Int_t *indxR = new Int_t[nn];
-  Int_t *indxC = new Int_t[nn];
-  for(Int_t i=0;i<nn;i++) iPivot[i]=0;
+  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<nn;i++){
+  for(Int_t i=0;i<kNn;i++){
     Float_t big=0.;
-    for(Int_t j=0;j<nn;j++){
+    for(Int_t j=0;j<kNn;j++){
       if(iPivot[j]!=1){
-       for(Int_t k=0;k<nn;k++){
+       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]);
@@ -192,7 +199,7 @@ void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
     iPivot[iCol]++;
     Float_t aux;
     if(iRow!=iCol){
-      for(Int_t l=0;l<nn;l++){
+      for(Int_t l=0;l<kNn;l++){
        aux=mat[iRow][l];
        mat[iRow][l]=mat[iCol][l];
        mat[iCol][l]=aux;
@@ -206,13 +213,13 @@ void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
     if(mat[iCol][iCol]==0) break;
     Float_t pivinv=1./mat[iCol][iCol];
     mat[iCol][iCol]=1;
-    for(Int_t l=0;l<nn;l++) mat[iCol][l]*=pivinv;
+    for(Int_t l=0;l<kNn;l++) mat[iCol][l]*=pivinv;
     vect[iCol]*=pivinv;
-    for(Int_t m=0;m<nn;m++){
+    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<nn;n++) mat[m][n]-=mat[iCol][n]*aux;
+       for(Int_t n=0;n<kNn;n++) mat[m][n]-=mat[iCol][n]*aux;
        vect[m]-=vect[iCol]*aux;
       }
     }    
@@ -222,10 +229,10 @@ void AliITSOnlineSDDInjectors::FitDriftVelocityVsAnode(){
   delete [] indxC;
 
   if(fParam) delete [] fParam;
-  fParam=new Float_t[nn];
-  for(Int_t i=0; i<nn;i++)fParam[i]=vect[i];
+  fParam=new Float_t[kNn];
+  for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
 
-  for(Int_t i=0; i < nn; i++) delete [] mat[i];
+  for(Int_t i=0; i < kNn; i++) delete [] mat[i];
   delete [] mat;
   delete [] vect;
 }
@@ -241,7 +248,7 @@ void AliITSOnlineSDDInjectors::CalcDriftVelocity(Int_t jlin){
     ey[i]=fRMSCentroid[jlin][i];
   }
   for(Int_t i=0;i<3;i++){
-    if(fGoodInj[jlin][i]){
+    if(fGoodInj[jlin][i] && ey[i]!=0){
       sumY+=y[i]/ey[i]/ey[i];
       sumX+=fPosition[i]/ey[i]/ey[i];
       sumXX+=fPosition[i]*fPosition[i]/ey[i]/ey[i];
@@ -257,14 +264,18 @@ void AliITSOnlineSDDInjectors::CalcDriftVelocity(Int_t jlin){
   if(npt>1){ 
     Float_t slope=(sumWEI*sumXY-sumY*sumX)/(sumWEI*sumXX-sumX*sumX);
     Float_t eslope=TMath::Sqrt(sumWEI/(sumWEI*sumXX-sumX*sumX));
-    vel=1./slope*10000./25.;// micron/ns
-    evel=eslope/slope/slope*10000./25.;// micron/ns
+    if(slope!=0){
+      vel=1./slope*10000./25.;// micron/ns
+      evel=eslope/slope/slope*10000./25.;// micron/ns
+    }
   }
   if(npt==1){
     Float_t slope=(sumY-tzero)/sumX;
     Float_t eslope=erry/sumX;
-    vel=1./slope*10000./25.;// micron/ns    
-    evel=eslope/slope/slope*10000./25.;// micron/ns
+    if(slope!=0){
+      vel=1./slope*10000./25.;// micron/ns    
+      evel=eslope/slope/slope*10000./25.;// micron/ns
+    }
   }
   if(vel>fMaxDriftVel||vel<fMinDriftVel){ 
     vel=0.;
@@ -274,7 +285,8 @@ void AliITSOnlineSDDInjectors::CalcDriftVelocity(Int_t jlin){
   fSigmaDriftVel[jlin]=evel;
 }
 //______________________________________________________________________
-Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine){
+Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine) const{
+  //
   Int_t ian=-1;
   if(iInjLine>32) return ian;
   if(!fSide){
@@ -286,7 +298,30 @@ Int_t AliITSOnlineSDDInjectors::GetAnodeNumber(Int_t iInjLine){
   }
   return ian;
 }
-
+//______________________________________________________________________
+Int_t AliITSOnlineSDDInjectors::GetLineNumberFromAnode(Int_t nAnode) const{
+  //
+  Int_t iLine=-1;
+  if(!fSide){
+    if(nAnode%8==0) iLine=nAnode/8;
+    if(nAnode==255) iLine=32;
+  }else{
+    if(nAnode%8==7) iLine=1+nAnode/8;
+    if(nAnode==0) iLine=0;
+  }
+  if(nAnode>=256) iLine=-1;
+  return iLine;
+}
+//______________________________________________________________________
+Int_t AliITSOnlineSDDInjectors::GetAnodeStatus(Int_t nAnode) const{
+  //
+  Int_t iii=GetLineNumberFromAnode(nAnode);
+  Int_t istatus=0;
+  if(iii>=0){
+    for(Int_t ninj=0;ninj<3;ninj++) istatus+=fGoodInj[iii][ninj]<<ninj;
+  }
+  return istatus;
+}
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::FindGoodInjectors(){
   // 
@@ -360,6 +395,7 @@ void AliITSOnlineSDDInjectors::FindCentroids(){
        fRMSCentroid[iii][ninj]=0.;
        fGoodInj[iii][ninj]=0;
       }
+      if(fRMSCentroid[iii][ninj]==0) fGoodInj[iii][ninj]=0;
     }
   }
 }
@@ -378,11 +414,17 @@ void AliITSOnlineSDDInjectors::PrintCentroids(){
   }
 }
 //______________________________________________________________________
-void AliITSOnlineSDDInjectors::WriteToFXS(){
+void AliITSOnlineSDDInjectors::WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend){
   //
   Char_t outfilnam[100];
-  sprintf(outfilnam,"SDDinj_mod%03d_sid%d.data",fModuleId,fSide);
-  FILE* outf=fopen(outfilnam,"w");
+  sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);  
+  FILE* outf;
+  if(optAppend==0){ 
+    outf=fopen(outfilnam,"w");
+    fprintf(outf,"%d\n",fPolOrder);
+  }
+  else outf=fopen(outfilnam,"a");
+  fprintf(outf,"%d   %d   ",evNumb,timeStamp);
   for(Int_t ic=0;ic<fPolOrder+1;ic++){
     fprintf(outf,"%G ",fParam[ic]);
   }