]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSOnlineSDDInjectors.cxx
Fixes for Coverity warnings
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDInjectors.cxx
index 4e8bae94197cbd5b28792da49a4e7af347bb1618..29ef7f6c87ab093894d46ff5ddbb3f50f34abc84 100644 (file)
 #include "AliITSOnlineSDDInjectors.h"
 #include "AliLog.h"
 #include <TH2F.h>
+#include <TF1.h>
 #include <TGraphErrors.h>
 #include <TMath.h>
+#include <TString.h>
 
 /* $Id$ */
 
@@ -36,26 +38,42 @@ const Float_t AliITSOnlineSDDInjectors::fgkDefaultHThreshold = 25.;
 const Float_t AliITSOnlineSDDInjectors::fgkDefaultMinSpeed = 5.5;
 const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxSpeed = 9.0;
 const Float_t AliITSOnlineSDDInjectors::fgkDefaultMaxErr = 1.5;
-const Int_t   AliITSOnlineSDDInjectors::fgkDefaultPolOrder = 3;
+const Int_t   AliITSOnlineSDDInjectors::fgkDefaultPolDegree = 3;
 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.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors():AliITSOnlineSDD(),fHisto(),fTbZero(0.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolDegree(0),fActualPolDegree(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);
+  for(Int_t i=0;i<kInjPads;i++){ 
+    fSumDriftSpeed[i]=0.;
+    fSumSqDriftSpeed[i]=0.;
+    fSumPadStatus[i]=0;
+    fSumPadStatusCut[i]=0;
+    fNEventsInPad[i]=0;
+  }
+  Reset();
 }
 //______________________________________________________________________
-AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolOrder(0),fMinDriftSpeed(0.),fMaxDriftSpeed(0.),fMaxDriftSpeedErr(0.),fLowThreshold(0.),fHighThreshold(0.),fFirstPadForFit(0),fLastPadForFit(0),fPadStatusCutForFit(0),fTimeStep(0.),fUseTimeZeroSignal(kFALSE)
+AliITSOnlineSDDInjectors::AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid):AliITSOnlineSDD(nddl,ncarlos,sid),fHisto(),fTbZero(0.),fRMSTbZero(0.),fNEvents(0),fParam(),fPolDegree(0),fActualPolDegree(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);
+  for(Int_t i=0;i<kInjPads;i++){ 
+    fSumDriftSpeed[i]=0.;
+    fSumSqDriftSpeed[i]=0.;
+    fSumPadStatus[i]=0;
+    fSumPadStatusCut[i]=0;
+    fNEventsInPad[i]=0;
+  }
+  Reset();
 }
 //______________________________________________________________________
 AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
@@ -67,10 +85,12 @@ AliITSOnlineSDDInjectors::~AliITSOnlineSDDInjectors(){
 }
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::SetDefaults(){
-  for(Int_t i=0;i<kInjLines;i++) 
+  for(Int_t i=0;i<kInjLines;i++) {
     SetInjLineRange(i,fgkDefaultTbMin[i],fgkDefaultTbMax[i]);
+    SetUseLine(i,kTRUE);
+  }
   SetThresholds(fgkDefaultLThreshold,fgkDefaultHThreshold);
-  SetPolOrder(fgkDefaultPolOrder);
+  SetPolDegree(fgkDefaultPolDegree);
   SetMinDriftSpeed(fgkDefaultMinSpeed);
   SetMaxDriftSpeed(fgkDefaultMaxSpeed);
   SetMaxDriftSpeedErr(fgkDefaultMaxErr);
@@ -115,6 +135,9 @@ void AliITSOnlineSDDInjectors::AddEvent(TH2F* his){
     for(Int_t i=0;i<kInjPads;i++){ 
       fSumDriftSpeed[i]=0.;
       fSumSqDriftSpeed[i]=0.;
+      fSumPadStatus[i]=0;
+      fSumPadStatusCut[i]=0;
+      fNEventsInPad[i]=0;
     }
   }
   Reset();
@@ -124,17 +147,23 @@ void AliITSOnlineSDDInjectors::AddEvent(TH2F* his){
   CalcTimeBinZero();
   for(Int_t j=0;j<kInjPads;j++){ 
     CalcDriftSpeed(j);
-    fSumDriftSpeed[j]+=fDriftSpeed[j];
-    fSumSqDriftSpeed[j]+=fDriftSpeed[j]*fDriftSpeed[j];
+    Int_t padStatus=GetInjPadStatus(j);
+    fSumPadStatus[j]+=padStatus;
+    if(padStatus>fPadStatusCutForFit){
+      fSumDriftSpeed[j]+=fDriftSpeed[j];
+      fSumSqDriftSpeed[j]+=fDriftSpeed[j]*fDriftSpeed[j];
+      fSumPadStatusCut[j]+=padStatus;
+      fNEventsInPad[j]++;
+    }
   }
   ++fNEvents;
 }
 //______________________________________________________________________
 Double_t AliITSOnlineSDDInjectors::GetRMSDriftSpeed(Int_t ipad) const {
   // 
-  if(fNEvents<=1) return 0.;
-  Double_t mean=fSumDriftSpeed[ipad]/(Double_t)fNEvents;
-  Double_t diff=fSumSqDriftSpeed[ipad]/(Double_t)fNEvents-mean*mean;
+  if(fNEventsInPad[ipad]<=1) return 0.;
+  Double_t mean=fSumDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad];
+  Double_t diff=fSumSqDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad]-mean*mean;
   if(diff<0.) diff=0.;
   return TMath::Sqrt(diff);
 }
@@ -145,12 +174,20 @@ void AliITSOnlineSDDInjectors::FitMeanDriftSpeedVsAnode(){
   if(fNEvents==0) return;
   for(Int_t i=0;i<kInjPads;i++){ 
     fDriftSpeed[i]=GetMeanDriftSpeed(i);
-    if(fNEvents>1){
+    Int_t padStatusCut=(Int_t)(GetMeanPadStatusCut(i)+0.5);
+    for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=(padStatusCut&1<<ilin)>>ilin;
+    if(fNEventsInPad[i]>1){
       Double_t rms=GetRMSDriftSpeed(i);
-      if(rms>0.) fDriftSpeedErr[i]=rms/TMath::Sqrt(fNEvents);
+      if(rms>0.) fDriftSpeedErr[i]=rms/TMath::Sqrt(fNEventsInPad[i]);
+    }else{
+      for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=0;
     }
   }
   FitDriftSpeedVsAnode();
+  for(Int_t i=0;i<kInjPads;i++){ 
+    Int_t padStatus=(Int_t)(GetMeanPadStatusCut(i)+0.5);
+    for(Int_t ilin=0; ilin<kInjLines ; ilin++) fGoodInj[i][ilin]=(padStatus&1<<ilin)>>ilin;
+  }
 }
 //______________________________________________________________________
 TGraphErrors* AliITSOnlineSDDInjectors::GetTimeVsDistGraph(Int_t jpad) const{
@@ -231,10 +268,61 @@ void AliITSOnlineSDDInjectors::CalcTimeBinZero(){
   }
   if(nTbUsed==1) fRMSTbZero=0.5; 
 }
+
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){
+  // fits the anode dependence of drift speed
+
+  Float_t rangeForMax[2]={78.,178.};
+  PolyFit(fPolDegree);
+  fActualPolDegree=fPolDegree;
+  if(fPolDegree==3){
+    Double_t deltasq=fParam[2]*fParam[2]-3*fParam[1]*fParam[3];
+    Double_t zero1=-999.;
+    Double_t zero2=-999.;
+    if(deltasq>=0. && TMath::Abs(fParam[3])>0.){
+      Double_t delta=TMath::Sqrt(deltasq);
+      zero1=(-fParam[2]+delta)/3./fParam[3];
+      zero2=(-fParam[2]-delta)/3./fParam[3];
+    }
+    Bool_t twoZeroes=kFALSE;
+    Bool_t oneZero=kFALSE;
+    if(zero1>0. && zero1<256. && zero2>0. && zero2<256.) twoZeroes=kTRUE;
+    if(zero1>rangeForMax[0] && zero1<rangeForMax[1]) oneZero=kTRUE;
+    if(zero2>rangeForMax[0] && zero2<rangeForMax[1]) oneZero=kTRUE;
+    if(!oneZero || twoZeroes){
+      PolyFit(2);
+      Double_t xmax=-999.;
+      if(fParam[2]<0.) xmax=-fParam[1]/2./fParam[2];
+      if(xmax>rangeForMax[0] && xmax<rangeForMax[1]){
+       fActualPolDegree=2;
+      }else{
+       Double_t averSpeed=0.;
+       Double_t sumWei=0.;
+       Int_t nUsedPts=0;
+       for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
+         if(fDriftSpeed[jpad]>0 && GetInjPadStatus(jpad)>fPadStatusCutForFit){
+           Double_t wei=1./fDriftSpeedErr[jpad]/fDriftSpeedErr[jpad];
+           averSpeed+=wei*fDriftSpeed[jpad];
+           sumWei+=wei;
+           nUsedPts++;
+         }
+       }
+       if(sumWei>0.) averSpeed/=sumWei;
+       if(nUsedPts<fPolDegree+1) averSpeed=0;
+       fParam[0]=averSpeed;
+       for(Int_t i=1; i < fPolDegree+1; i++) fParam[i]=0.;
+       fActualPolDegree=0;
+      }
+    }
+  }
+}
+//______________________________________________________________________
+void AliITSOnlineSDDInjectors::PolyFit(Int_t degree){
   // fits the anode dependence of drift speed with a polynomial function
-  const Int_t kNn=fPolOrder+1;
+  const Int_t kNn=degree+1;
+  const Int_t kDimens=fPolDegree+1;
+
   Double_t **mat = new Double_t*[kNn];
   for(Int_t i=0; i < kNn; i++) mat[i] = new Double_t[kNn];
   Double_t *vect = new Double_t[kNn];
@@ -250,18 +338,18 @@ void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){
     for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
       Double_t x=(Double_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);
-         }
+       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);
+       }
       }
     }
   }
-  if(npts<fPolOrder+1){ 
+  if(npts<fPolDegree+1){ 
     if(fParam) delete [] fParam;
-    fParam=new Double_t[kNn];
-    for(Int_t i=0; i<kNn;i++)fParam[i]=0;
+    fParam=new Double_t[kDimens];
+    for(Int_t i=0; i<kDimens;i++)fParam[i]=0;
   }else{
     Int_t *iPivot = new Int_t[kNn];
     Int_t *indxR = new Int_t[kNn];
@@ -317,8 +405,9 @@ void AliITSOnlineSDDInjectors::FitDriftSpeedVsAnode(){
     
   
     if(fParam) delete [] fParam;
-    fParam=new Double_t[kNn];
+    fParam=new Double_t[kDimens];
     for(Int_t i=0; i<kNn;i++)fParam[i]=vect[i];
+    if(degree<fPolDegree) for(Int_t i=kNn; i<kDimens;i++)fParam[i]=0.;
   }
 
   for(Int_t i=0; i < kNn; i++) delete [] mat[i];
@@ -337,6 +426,7 @@ void AliITSOnlineSDDInjectors::CalcDriftSpeed(Int_t jpad){
     ey[i]=fRMSCentroid[jpad][i];
   }
   for(Int_t i=0;i<kInjLines;i++){
+    if(!fUseLine[i]) continue;
     if(fGoodInj[jpad][i] && ey[i]!=0){
       sumY+=y[i]/ey[i]/ey[i];
       sumX+=fPosition[i]/ey[i]/ey[i];
@@ -512,32 +602,48 @@ void AliITSOnlineSDDInjectors::PrintCentroids(){
 //______________________________________________________________________
 void AliITSOnlineSDDInjectors::WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend){
   //
-  Char_t outfilnam[100];
-  sprintf(outfilnam,"SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);  
+  TString outfilnam;
+  outfilnam.Form("SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);  
   FILE* outf;
   if(optAppend==0){ 
-    outf=fopen(outfilnam,"w");
-    fprintf(outf,"%d\n",fPolOrder);
+    outf=fopen(outfilnam.Data(),"w");
+    fprintf(outf,"%d\n",fActualPolDegree);
   }
-  else outf=fopen(outfilnam,"a");
+  else outf=fopen(outfilnam.Data(),"a");
   fprintf(outf,"%d   %d   ",evNumb,timeStamp);
-  for(Int_t ic=0;ic<fPolOrder+1;ic++){
+  for(Int_t ic=0;ic<fPolDegree+1;ic++){
     fprintf(outf,"%G ",fParam[ic]);
   }
   fprintf(outf,"\n");
   fclose(outf);  
 }
 //______________________________________________________________________
+TH1F* AliITSOnlineSDDInjectors::GetMeanDriftSpeedVsPadHisto() const{
+  TString hisnam;
+  hisnam.Form("hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
+  TH1F* h=new TH1F(hisnam.Data(),"",kInjPads,-0.5,kInjPads-0.5);
+  if(fNEvents>0){
+    for(Int_t i=0;i<kInjPads;i++){ 
+      h->SetBinContent(i+1,GetMeanDriftSpeed(i));    
+      Double_t rms=GetRMSDriftSpeed(i);
+      Double_t err=0.;
+      if(rms>0.) err=rms/TMath::Sqrt(fNEventsInPad[i]);
+      h->SetBinError(i+1,err);
+    }
+  }
+  return h;
+}
+//______________________________________________________________________
 Bool_t AliITSOnlineSDDInjectors::WriteToROOT(TFile *fil) const {
   //
   if(fil==0){ 
     AliWarning("Invalid pointer to ROOT file");
     return kFALSE;    
   }  
-  Char_t hisnam[20];
+  TString hisnam;
   fil->cd();
-  sprintf(hisnam,"hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
-  TH1F hdsp(hisnam,"",kInjPads,-0.5,kInjPads-0.5);
+  hisnam.Form("hdrsp%02dc%02ds%d",fDDL,fCarlos,fSide);
+  TH1F hdsp(hisnam.Data(),"",kInjPads,-0.5,kInjPads-0.5);
   if(fNEvents==0){
     AliWarning("Zero analyzed events");
     return kFALSE;    
@@ -547,9 +653,34 @@ Bool_t AliITSOnlineSDDInjectors::WriteToROOT(TFile *fil) const {
     hdsp.SetBinContent(i+1,GetMeanDriftSpeed(i));    
     Double_t rms=GetRMSDriftSpeed(i);
     Double_t err=0.;
-    if(rms>0.) err=rms/TMath::Sqrt(fNEvents);
+    if(rms>0.) err=rms/TMath::Sqrt(fNEventsInPad[i]);
     hdsp.SetBinError(i+1,err);
   }
   hdsp.Write();
   return kTRUE;    
 }
+//______________________________________________________________________
+void AliITSOnlineSDDInjectors::WriteInjectorStatusToASCII(){
+  // dump status of injectors encoded into UInt_t
+  // 5 bits (value 0-31) to store number of pads with given status
+  TString outfilnam;
+  outfilnam.Form("SDDinj_ddl%02dc%02d_sid%d.data",fDDL,fCarlos,fSide);  
+  FILE* outf=fopen(outfilnam.Data(),"a");
+  Int_t n[8]={0,0,0,0,0,0,0,0};
+  for(Int_t jpad=fFirstPadForFit; jpad<=fLastPadForFit; jpad++){
+    Int_t statusPad=GetInjPadStatus(jpad);
+    ++n[statusPad];
+  }
+  UInt_t statusInj=0;
+  statusInj+=(n[7]&0x1F)<<25; // bits 25-29: n. of pads with status 7
+  statusInj+=(n[6]&0x1F)<<20; // bits 20-24: n. of pads with status 6
+  statusInj+=(n[5]&0x1F)<<15; // bits 15-19: n. of pads with status 5
+  statusInj+=(n[4]&0x1F)<<10; // bits 10-14: n. of pads with status 4
+  statusInj+=(n[3]&0x1F)<<5;  // bits  5- 9: n. of pads with status 3
+  statusInj+=(n[2]&0x1F);     // bits  0- 4: n. of pads with status 2
+
+  fprintf(outf,"-99 %u\n",statusInj); // -99 used in preprocessor to find line
+                                      // with injector status info
+  fclose(outf);  
+  
+}