]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSsimulationSDD.cxx
Getter added in SDD raw data reader
[u/mrichter/AliRoot.git] / ITS / AliITSsimulationSDD.cxx
index e8a9ff5609b630870e122e2e035baa6d71eb8699..469fb9831059c81194305f042f25b4697b3fafdf 100644 (file)
@@ -18,7 +18,7 @@
 #include <Riostream.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <string.h>
+#include <cstring>
 
 #include <TCanvas.h>
 #include <TF1.h>
@@ -33,7 +33,6 @@
 #include "AliITSetfSDD.h"
 #include "AliITSmodule.h"
 #include "AliITSpList.h"
-#include "AliITSresponseSDD.h"
 #include "AliITSCalibrationSDD.h"
 #include "AliITSsegmentationSDD.h"
 #include "AliITSsimulationSDD.h"
@@ -151,8 +150,8 @@ void AliITSsimulationSDD::Init(){
     SetDoFFT();
 
     AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
-    
-    AliITSresponseSDD* res = (AliITSresponseSDD*)fDetType->GetResponse(1);
+    if(seg->Npx()==128) fScaleSize=8;
+    AliITSSimuParam* simpar = fDetType->GetSimuParam();
     fpList = new AliITSpList( seg->Npz(),
                               fScaleSize*seg->Npx() );
     fHitSigMap2 = new AliITSMapA2(seg,fScaleSize,1);
@@ -175,10 +174,8 @@ void AliITSsimulationSDD::Init(){
 
 
     fElectronics = new AliITSetfSDD(timeStep/fScaleSize,
-                                    res->Electronics());
+                                    simpar->GetSDDElectronics());
 
-    char opt1[20], opt2[20];
-    res->ParamOptions(opt1,opt2);
 
     fITS       = (AliITS*)gAlice->GetModule("ITS");
  
@@ -254,7 +251,6 @@ void AliITSsimulationSDD::FastFourierTransform(Double_t *real,
         m /= 2;
         m2 += m2;
     } // end for i
-  
     for(j=0; j<samples; j++) {
         Int_t j1 = j;
         Int_t p = 0;
@@ -304,9 +300,9 @@ void AliITSsimulationSDD::SDigitiseModule(AliITSmodule *mod,Int_t md,Int_t ev){
 Bool_t AliITSsimulationSDD::AddSDigitsToModule(TClonesArray *pItemArray,
                                                Int_t mask ) {
     // Add Summable digits to module maps.
-   AliITSresponseSDD* res = (AliITSresponseSDD*)fDetType->GetResponse(1);
+    AliITSSimuParam* simpar = fDetType->GetSimuParam();
     Int_t    nItems = pItemArray->GetEntries();
-    Double_t maxadc = res->MaxAdc();
+    Double_t maxadc = simpar->GetSDDMaxAdc();
     Bool_t sig = kFALSE;
     
     // cout << "Adding "<< nItems <<" SDigits to module " << fModule << endl;
@@ -378,8 +374,8 @@ void AliITSsimulationSDD::FinishDigits() {
     if( fCrosstalkFlag ) ApplyCrosstalk(fModule);
 
     AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
-    const char *kopt = res->GetZeroSuppOption();
-    if (strstr(kopt,"ZS")) Compress2D();
+    Bool_t isZeroSupp = res->GetZeroSupp();
+    if (isZeroSupp) Compress2D();
     else StoreAllDigits();
 }
 //______________________________________________________________________
@@ -387,6 +383,8 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
     // create maps to build the lists of tracks for each digit
   AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
   AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
+  AliITSSimuParam* simpar = fDetType->GetSimuParam();
+
   TObjArray *hits     = mod->GetHits();
     Int_t      nhits    = hits->GetEntriesFast();
 
@@ -397,16 +395,15 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
     Double_t  anodePitch = seg->Dpz(0);
     Double_t  timeStep   = seg->Dpx(0);
     Double_t  driftSpeed ;  // drift velocity (anode dependent)
-    //Float_t   maxadc     = res->GetMaxAdc();    
-    //Float_t   topValue   = res->GetDynamicRange();
-    Double_t  norm       = res->GetMaxAdc()/res->GetDynamicRange(); //   maxadc/topValue;
-    Double_t  cHloss     = res->GetChargeLoss();
-    Float_t   dfCoeff, s1; res->DiffCoeff(dfCoeff,s1); // Signal 2d Shape
-    Double_t  eVpairs    = res->GetGeVToCharge()*1.0E9; // 3.6 eV by def.
-    Double_t  nsigma     = res->GetNSigmaIntegration(); //
-    Int_t     nlookups   = res->GetGausNLookUp();       //
-    Float_t   jitter     = res->GetJitterError(); // 
-
+    Double_t  norm       = simpar->GetSDDMaxAdc()/simpar->GetSDDDynamicRange(); //   maxadc/topValue;
+    Double_t  cHloss     = simpar->GetSDDChargeLoss();
+    Float_t   dfCoeff, s1; 
+    simpar->GetSDDDiffCoeff(dfCoeff,s1); // Signal 2d Shape
+    Double_t  eVpairs    = simpar->GetGeVToCharge()*1.0E9; // 3.6 eV by def.
+    Double_t  nsigma     = simpar->GetNSigmaIntegration(); //
+    Int_t     nlookups   = simpar->GetGausNLookUp();       //
+    Float_t   jitter     = simpar->GetSDDJitterError(); // 
+    
     // Piergiorgio's part (apart for few variables which I made float
     // when i thought that can be done
     // Fill detector maps with GEANT hits
@@ -521,8 +518,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
        if(timeSample > fScaleSize*fMaxNofSamples) {
          AliWarning(Form("Wrong Time Sample: %e",timeSample));
          continue;
-       } // end if timeSample > fScaleSize*fMaxNoofSamples
-       
+       } // end if timeSample > fScaleSize*fMaxNofSamples
        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));
@@ -542,7 +538,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
        // Peak amplitude in nanoAmpere
        amplitude  = fScaleSize*160.*depEnergy/
          (timeStep*eVpairs*2.*acos(-1.)*sigT*sigA);
-       amplitude *= timeStep/25.; // WARNING!!!!! Amplitude scaling to 
+       //amplitude *= timeStep/25.; // WARNING!!!!! Amplitude scaling to 
        // account for clock variations 
        // (reference value: 40 MHz)
        chargeloss = 1.-cHloss*driftPath/1000.;
@@ -589,7 +585,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
          if(TMath::Abs(aExpo) > nsigma)  anodeAmplitude = 0.;
          else {
            Int_t theBin = (Int_t) ((aExpo+nsigma)/width+0.5);
-           anodeAmplitude = amplitude*res->GetGausLookUp(theBin);
+           anodeAmplitude = amplitude*simpar->GetGausLookUp(theBin);
          } // end if TMath::Abs(aEspo) > nsigma
          // index starts from 0
          index = iWing*nofAnodes+ia-1;
@@ -606,7 +602,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
              if(TMath::Abs(tExpo) > nsigma) timeAmplitude = 0.;
              else {
                Int_t theBin = (Int_t) ((tExpo+nsigma)/width+0.5);
-               timeAmplitude = anodeAmplitude*res->GetGausLookUp(theBin);
+               timeAmplitude = anodeAmplitude*simpar->GetGausLookUp(theBin);
              } // end if TMath::Abs(tExpo) > nsigma
              // build the list of Sdigits for this module        
              //                    arg[0]     = index;
@@ -630,7 +626,7 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
 }
 
 //____________________________________________
-void AliITSsimulationSDD::AddDigit( Int_t i, Int_t j, Int_t signal ) {
+void AliITSsimulationSDD::AddDigit( Int_t i, Int_t j, Int_t signalc, Int_t signale) {
   // Adds a Digit.
   Int_t size = AliITSdigit::GetNTracks();
 
@@ -642,7 +638,7 @@ void AliITSsimulationSDD::AddDigit( Int_t i, Int_t j, Int_t signal ) {
 
   digits[0] = i;
   digits[1] = j;
-  digits[2] = signal;
+  digits[2] = signalc;
 
   AliITSpListItem *pItem = fpList->GetpListItem( i, j );
   if( pItem == 0 ) {
@@ -668,7 +664,7 @@ void AliITSsimulationSDD::AddDigit( Int_t i, Int_t j, Int_t signal ) {
     }// end for if
   }
 
-  fITS->AddSimDigit( 1, phys, digits, tracks, hits, charges ); 
+  fITS->AddSimDigit( 1, phys, digits, tracks, hits, charges, signale ); 
   delete [] tracks;
   delete [] hits;
   delete [] charges;
@@ -678,15 +674,14 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd
   // add baseline, noise, gain, electronics and ADC saturation effects
   // apply dead channels
 
-  char opt1[20], opt2[20];
   AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(mod);
-  res->GetParamOptions(opt1,opt2);
   Double_t baseline=0; 
   Double_t noise=0; 
   Double_t gain=0; 
   Float_t contrib=0;
   Int_t i,k,kk;
-  Float_t maxadc = res->GetMaxAdc();    
+  AliITSSimuParam* simpar = fDetType->GetSimuParam();
+  Float_t maxadc = simpar->GetSDDMaxAdc();    
 
   for (i=0;i<fNofMaps;i++) {
     if( !fAnodeFire[i] ) continue;
@@ -704,7 +699,7 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd
       }
       fInZI[k]  = 0.;
     } // end for k
-    if(!fDoFFT) {
+    if(!fDoFFT) {      
       for(k=0; k<fMaxNofSamples; k++) {
        Double_t newcont = 0.;
        Double_t maxcont = 0.;
@@ -749,11 +744,7 @@ void AliITSsimulationSDD::ChargeToSignal(Int_t mod,Bool_t bAddNoise, Bool_t bAdd
 void AliITSsimulationSDD::ApplyCrosstalk(Int_t mod) {
     // function add the crosstalk effect to signal
     // temporal function, should be checked...!!!
-    AliITSsegmentationSDD* seg = (AliITSsegmentationSDD*)GetSegmentationModel(1);
   
-    Int_t fNofMaps = seg->Npz();
-    Int_t fMaxNofSamples = seg->Npx();
-
     // create and inizialice crosstalk map
     Float_t* ctk = new Float_t[fNofMaps*fMaxNofSamples+1];
     if( ctk == NULL ) {
@@ -844,10 +835,30 @@ Int_t AliITSsimulationSDD::Convert10to8(Int_t signal) const {
     return 0;
 }
 //______________________________________________________________________
+Int_t AliITSsimulationSDD::Convert8to10(Int_t signal) const {
+  // Decompression from 8 to 10 bit
+
+  if (signal < 0 || signal > 255) {
+    AliWarning(Form("Signal value %d out of range",signal));
+    return 0;
+  } // end if signal <0 || signal >255
+
+  if (signal < 128) return signal;
+  if (signal < 192) {
+    if (TMath::Odd(signal)) return (128+((signal-128)<<1));
+    else  return (128+((signal-128)<<1)+1);
+  } // end if signal < 192
+  if (signal < 224) {
+    if (TMath::Odd(signal)) return (256+((signal-192)<<3)+3);
+    else  return (256+((signal-192)<<3)+4);
+  } // end if signal < 224
+  if (TMath::Odd(signal)) return (512+((signal-224)<<4)+7);
+  return (512+((signal-224)<<4)+8);
+}
+//______________________________________________________________________
 void AliITSsimulationSDD::Compress2D(){
   // 2D zero-suppression algorithm as described in ALICE-INT-1999-28 V10
   AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);  
-  Bool_t   do10to8=res->Do10to8();
   for (Int_t iWing=0; iWing<2; iWing++) {
     Int_t tL=res->GetZSLowThreshold(iWing);
     Int_t tH=res->GetZSHighThreshold(iWing);
@@ -855,26 +866,37 @@ void AliITSsimulationSDD::Compress2D(){
       Int_t ian=i+iWing*fNofMaps/2;
       if( !fAnodeFire[ian] ) continue;
       for (Int_t itb=0; itb<fMaxNofSamples; itb++) {
+       Int_t nLow=0, nHigh=0;      
        Float_t cC=fHitMap2->GetSignal(ian,itb);
        if(cC<=tL) continue;
+       nLow++; // cC is greater than tL
+       if(cC>tH) nHigh++;
        //                     N
        // Get "quintuple":   WCE
        //                     S
        Float_t wW=0.;
        if(itb>0) wW=fHitMap2->GetSignal(ian,itb-1);
+       if(wW>tL) nLow++;
+       if(wW>tH) nHigh++;
        Float_t eE=0.;
        if(itb<fMaxNofSamples-1) eE=fHitMap2->GetSignal(ian,itb+1);
+       if(eE>tL) nLow++;
+       if(eE>tH) nHigh++;
        Float_t nN=0.;
        if(i<(fNofMaps/2-1)) nN=fHitMap2->GetSignal(ian+1,itb);
+       if(nN>tL) nLow++;
+       if(nN>tH) nHigh++;
        Float_t sS=0.;
        if(i>0) sS=fHitMap2->GetSignal(ian-1,itb);
-       
-       Int_t thres=tH;  // another cell in quintuplet should pass high threshold
-       if(cC>tH) thres=tL; // another cell in quintuplet should pass low threshold
-       if(wW>thres || eE>thres || nN>thres || sS>thres){  
-         Int_t signal=(Int_t)(cC-tL);
-         if(do10to8) signal = Convert10to8(signal);
-         AddDigit(ian,itb,signal);  // store C (subtracting low threshold)
+       if(sS>tL) nLow++;
+       if(sS>tH) nHigh++;
+       
+       if(nLow>=3 && 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 
        }
       }
     }
@@ -884,22 +906,15 @@ void AliITSsimulationSDD::Compress2D(){
 
 //______________________________________________________________________
 void AliITSsimulationSDD::StoreAllDigits(){
-  // if non-zero-suppressed data
-  AliITSCalibrationSDD* res = (AliITSCalibrationSDD*)GetCalibrationModel(fModule);
-
-  Bool_t do10to8 = res->Do10to8();
-  Int_t i, j, digits[3];
-
-  for (i=0; i<fNofMaps; i++) {
-    for (j=0; j<fMaxNofSamples; j++) {
-      Int_t signal=(Int_t)(fHitMap2->GetSignal(i,j));
-      if(do10to8) signal = Convert10to8(signal);
-      digits[0] = i;
-      digits[1] = j;
-      digits[2] = signal;
-      fITS->AddRealDigit(1,digits);
-    } // end for j
-  } // end for i
+  // store digits for non-zero-suppressed data
+  for (Int_t ian=0; ian<fNofMaps; ian++) {
+    for (Int_t itb=0; itb<fMaxNofSamples; itb++){
+      Int_t signal=(Int_t)(fHitMap2->GetSignal(ian,itb));
+      Int_t signalc = Convert10to8(signal);
+      Int_t signale = Convert8to10(signalc);
+      AddDigit(ian,itb,signalc,signale);  
+    } 
+  }
 } 
 //______________________________________________________________________
 void AliITSsimulationSDD::CreateHistograms(Int_t scale){