]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSsimulationSDD.cxx
- fixing warnings/coverity
[u/mrichter/AliRoot.git] / ITS / AliITSsimulationSDD.cxx
index bd5f7fc3e2aec9eb105ec16424df3c0322528d09..3c06b4dd8a26f00e332b321c4e387c727f716e77 100644 (file)
@@ -35,7 +35,7 @@
 #include "AliITShit.h"
 #include "AliITSpList.h"
 #include "AliITSCalibrationSDD.h"
-#include "AliITSsegmentationSDD.h"
+#include "AliITSresponseSDD.h"
 #include "AliITSsimulationSDD.h"
 #include "AliLog.h"
 #include "AliRun.h"
@@ -70,7 +70,6 @@ fNofMaps(0),
 fMaxNofSamples(0),
 fScaleSize(0){
     // Default constructor
-    SetScaleFourier();
     SetPerpendTracksFlag();
     SetCrosstalkFlag();
     SetDoFFT();
@@ -145,13 +144,12 @@ fScaleSize(0){
 void AliITSsimulationSDD::Init(){
     // Standard Constructor
 
-    SetScaleFourier();
+    AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
+    fScaleSize = ScaleFourier(seg);
     SetPerpendTracksFlag();
     SetCrosstalkFlag();
     SetDoFFT();
 
-    AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
-    if(seg->Npx()==128) fScaleSize=8;
     AliITSSimuParam* simpar = fDetType->GetSimuParam();
     fpList = new AliITSpList( seg->Npz(),
                               fScaleSize*seg->Npx() );
@@ -168,9 +166,8 @@ void AliITSsimulationSDD::Init(){
     Double_t timeStep  = (Double_t)seg->Dpx(0);
 
     if(anodePitch*(fNofMaps/2) > sddWidth) {
-        Warning("AliITSsimulationSDD",
-                "Too many anodes %d or too big pitch %f \n",
-                fNofMaps/2,anodePitch);
+      AliWarning(Form("Too many anodes %d or too big pitch %f ",
+                fNofMaps/2,anodePitch));
     } // end if
 
 
@@ -391,7 +388,6 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
   //    Int_t      arg[6]   = {0,0,0,0,0,0};
   Int_t     nofAnodes  = fNofMaps/2;
   Double_t  sddLength  = seg->Dx();
-  Double_t  sddWidth   = seg->Dz();
   Double_t  anodePitch = seg->Dpz(0);
   Double_t  timeStep   = seg->Dpx(0);
   Double_t  driftSpeed ;  // drift velocity (anode dependent)
@@ -403,7 +399,10 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
   Double_t  nsigma     = simpar->GetNSigmaIntegration(); //
   Int_t     nlookups   = simpar->GetGausNLookUp();       //
   Float_t   jitter     = simpar->GetSDDJitterError(); // 
-  
+  Float_t   trigDelay  = simpar->GetSDDTrigDelay(); // compensation for MC time zero
+  if(res->IsAMAt20MHz()) trigDelay+=12.5; // compensation for discretization step
+  Float_t   timeZero=fDetType->GetResponseSDD()->GetTimeZero(fModule);
+
   // Piergiorgio's part (apart for few variables which I made float
   // when i thought that can be done
   // Fill detector maps with GEANT hits
@@ -458,7 +457,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
     zAnode=seg->GetAnodeFromLocal(xloc,zloc); // anode number in the range 0.-511.
     driftSpeed = res->GetDriftSpeedAtAnode(zAnode);
     if(timeStep*fMaxNofSamples < sddLength/driftSpeed) {
-      AliWarning("Time Interval > Allowed Time Interval\n");
+      AliWarning("Time Interval > Allowed Time Interval");
     }
     depEnergy  *= kconv;
     if (!depEnergy) {
@@ -472,9 +471,11 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
      
     tof=0.;
     AliITShit* h=(AliITShit*)hits->At(ii);
-    if(h) tof=h->GetTOF()*1E9; 
-    AliDebug(1,Form("TOF for hit %d on mod %d (particle %d)=%g\n",ii,fModule,h->Track(),tof));
-   
+    if(h){ 
+      tof=h->GetTOF()*1E9; 
+      AliDebug(1,Form("TOF for hit %d on mod %d (particle %d)=%g",ii,fModule,h->Track(),tof));
+    }
+
     xL[0] += 0.0001*gRandom->Gaus( 0, jitter ); //
     pathInSDD = TMath::Sqrt(dxL[0]*dxL[0]+dxL[1]*dxL[1]+dxL[2]*dxL[2]);
     
@@ -521,23 +522,11 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
       sigT       = sigA/driftSpeed;
 
       drTime+=tof; // take into account Time Of Flight from production point
-      timeSample = (Int_t) (fScaleSize*drTime/timeStep + 1); // time bin in range 1-256 !!!
-      if(timeSample > fScaleSize*fMaxNofSamples) {
-       AliWarning(Form("Wrong Time Sample: %e",timeSample));
-       continue;
-      } // end if timeSample > fScaleSize*fMaxNofSamples
+      drTime-=trigDelay;
+      drTime+=timeZero;
+      timeSample = (Int_t) (fScaleSize*drTime/timeStep + 1.001); // time bin in range 1-256 !!!
       if(zAnode>nofAnodes) zAnode-=nofAnodes;  // to have the anode number between 0. and 256.
-      if(zAnode*anodePitch > sddWidth || zAnode*anodePitch < 0.) 
-       AliWarning(Form("Exceeding sddWidth=%e Z = %e",sddWidth,zAnode*anodePitch));
-      iAnode = (Int_t) (1.+zAnode); // iAnode in range 1-256 !!!!
-      if(iAnode < 1 || iAnode > nofAnodes) {
-       AliWarning(Form("Wrong iAnode: 1<%d>%d  (xanode=%e)",iAnode,nofAnodes, zAnode));
-       continue;
-      } // end if iAnode < 1 || iAnode > nofAnodes
-      
-       // store straight away the particle position in the array
-       // of particles and take idhit=ii only when part is entering (this
-       // requires FillModules() in the macro for analysis) :
+      iAnode = (Int_t) (1.001+zAnode); // iAnode in range 1-256 !!!!
       
        // Peak amplitude in nanoAmpere
       amplitude  = fScaleSize*160.*depEnergy/
@@ -556,16 +545,30 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
       anodeWindow = (Int_t)(nsigma*sigA/anodePitch+1);
       timeWindow  = (Int_t) (fScaleSize*nsigma*sigT/timeStep+1.);
       jamin = (iAnode - anodeWindow - 2)*nsplitAn+1;
-      jamax = (iAnode + anodeWindow + 2)*nsplitAn;
       if(jamin <= 0) jamin = 1;
-      if(jamax > nofAnodes*nsplitAn) 
-       jamax = nofAnodes*nsplitAn;
-      // jtmin and jtmax are Hard-wired
+      if(jamin > nofAnodes*nsplitAn){ 
+       AliDebug(1,Form("Energy deposition completely outside anode acceptance: anode min=%d",jamin));
+       continue;
+      }
+      jamax = (iAnode + anodeWindow + 2)*nsplitAn;
+      if(jamax > nofAnodes*nsplitAn) jamax = nofAnodes*nsplitAn;
+      if(jamax <=0){ 
+       AliDebug(1,Form("Energy deposition completely outside anode acceptance: anode max=%d",jamax));
+       continue;
+      }
       jtmin = (Int_t)(timeSample-timeWindow-2)*nsplitTb+1;
-      jtmax = (Int_t)(timeSample+timeWindow+2)*nsplitTb;
       if(jtmin <= 0) jtmin = 1;
-      if(jtmax > fScaleSize*fMaxNofSamples*nsplitTb) 
-       jtmax = fScaleSize*fMaxNofSamples*nsplitTb;
+      if(jtmin > fScaleSize*fMaxNofSamples*nsplitTb){ 
+       AliDebug(1,Form("Energy deposition completely outside time acceptance: time sample min=%d  tof=%f",jtmin,tof));
+       continue; 
+      }
+      jtmax = (Int_t)(timeSample+timeWindow+2)*nsplitTb;
+      if(jtmax > fScaleSize*fMaxNofSamples*nsplitTb) jtmax = fScaleSize*fMaxNofSamples*nsplitTb;
+      if(jtmax <= 0){
+       AliDebug(1,Form("Energy deposition completely outside time acceptance: time sample max=%d  tof=%f",jtmax,tof));
+       continue; 
+      }
+
       // Spread the charge in the anode-time window
       for(ka=jamin; ka <=jamax; ka++) {          
        ia = (ka-1)/nsplitAn + 1;
@@ -672,7 +675,7 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd
     if( !fAnodeFire[i] ) continue;
     baseline = res->GetBaseline(i);
     noise = res->GetNoise(i);
-    gain = res->GetChannelGain(i);
+    gain = res->GetChannelGain(i)/fDetType->GetAverageGainSDD();
     if(res->IsBad()) gain=0.;
     if( res->IsChipBad(res->GetChip(i)) )gain=0.;
     for(k=0; k<fScaleSize*fMaxNofSamples; k++) {
@@ -695,7 +698,7 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd
        newcont = maxcont;
        if (newcont >= maxadc) newcont = maxadc -1;
        if(newcont >= baseline){
-         Warning("","newcont=%d>=baseline=%d",newcont,baseline);
+         Warning("","newcont=%f>=baseline=%f",newcont,baseline);
        } // end if
          // back to analog: ?
        fHitMap2->SetHit(i,k,newcont);
@@ -732,10 +735,6 @@ void AliITSsimulationSDD::ApplyCrosstalk(Int_t mod) {
   
     // create and inizialice crosstalk map
     Float_t* ctk = new Float_t[fNofMaps*fMaxNofSamples+1];
-    if( ctk == NULL ) {
-        Error( "ApplyCrosstalk", "no memory for temporal map: exit \n" );
-        return;
-    }
     memset( ctk, 0, sizeof(Float_t)*(fNofMaps*fMaxNofSamples+1) );
     AliITSCalibrationSDD* calibr = (AliITSCalibrationSDD*)GetCalibrationModel(mod);
     for( Int_t z=0; z<fNofMaps; z++ ) {
@@ -764,11 +763,6 @@ void AliITSsimulationSDD::ApplyCrosstalk(Int_t mod) {
                         // make smooth derivative
                         Float_t* dev = new Float_t[fMaxNofSamples+1];
                         memset( dev, 0, sizeof(Float_t)*(fMaxNofSamples+1) );
-                        if( ctk == NULL ) {
-                            Error( "ApplyCrosstalk", 
-                                   "no memory for temporal array: exit \n" );
-                            return;
-                        }
                         for( Int_t i=tstart; i<tstop; i++ ) {   
                             if( i > 2 && i < fMaxNofSamples-2 )
                                 dev[i] = -0.2*fHitMap2->GetSignal( z,i-2 ) 
@@ -876,12 +870,12 @@ void AliITSsimulationSDD::Compress2D(){
        if(sS>tL) nLow++;
        if(sS>tH) nHigh++;
        
-       if(nLow>=3 && nHigh>=1){
+       if(nLow>=2 && nHigh>=1){
          Int_t signal=(Int_t)cC;
          Int_t signalc = Convert10to8(signal);
          Int_t signale = Convert8to10(signalc);
          signalc-=tL; // subtract low threshold after 10 to 8 bit compression
-         AddDigit(ian,itb,signalc,signale);  // store C 
+         if(signalc>=4) AddDigit(ian,itb,signalc,signale);  // store C 
        }
       }
     }
@@ -903,18 +897,16 @@ void AliITSsimulationSDD::StoreAllDigits(){
 } 
 //______________________________________________________________________
 void AliITSsimulationSDD::CreateHistograms(Int_t scale){
-    // Creates histograms of maps for debugging
-    Int_t i;
-
-    fHis=new TObjArray(fNofMaps);
-    for (i=0;i<fNofMaps;i++) {
-        TString sddName("sdd_");
-        Char_t candNum[4];
-        sprintf(candNum,"%d",i+1);
-        sddName.Append(candNum);
-        fHis->AddAt(new TH1F(sddName.Data(),"SDD maps",scale*fMaxNofSamples,
-                             0.,(Float_t) scale*fMaxNofSamples), i);
-    } // end for i
+  // Creates histograms of maps for debugging
+  Int_t i;
+  
+  fHis=new TObjArray(fNofMaps);
+  for (i=0;i<fNofMaps;i++) {
+    TString sddName;
+    sddName.Form("sdd_%d",i+1);
+    fHis->AddAt(new TH1F(sddName.Data(),"SDD maps",scale*fMaxNofSamples,
+                        0.,(Float_t) scale*fMaxNofSamples), i);
+  } // end for i
 }
 //______________________________________________________________________
 void AliITSsimulationSDD::FillHistograms(){