]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSsimulationSDD.cxx
PWGPP-41 - function to generate pwd for QA
[u/mrichter/AliRoot.git] / ITS / AliITSsimulationSDD.cxx
index bd5f7fc3e2aec9eb105ec16424df3c0322528d09..6214c498502e81348065599bd40595e16f929663 100644 (file)
 #include <TROOT.h>
 #include "AliITS.h"
 #include "AliITSMapA2.h"
-#include "AliITSRawData.h"
 #include "AliITSdigitSPD.h"
 #include "AliITSetfSDD.h"
 #include "AliITSmodule.h"
 #include "AliITShit.h"
 #include "AliITSpList.h"
 #include "AliITSCalibrationSDD.h"
-#include "AliITSsegmentationSDD.h"
+#include "AliITSresponseSDD.h"
 #include "AliITSsimulationSDD.h"
 #include "AliLog.h"
 #include "AliRun.h"
 
+using std::endl;
+using std::cout;
 ClassImp(AliITSsimulationSDD)
 ////////////////////////////////////////////////////////////////////////
 // Version: 0                                                         //
@@ -70,54 +71,11 @@ fNofMaps(0),
 fMaxNofSamples(0),
 fScaleSize(0){
     // Default constructor
-    SetScaleFourier();
     SetPerpendTracksFlag();
     SetCrosstalkFlag();
     SetDoFFT();
 }
-//______________________________________________________________________
-AliITSsimulationSDD::AliITSsimulationSDD(const AliITSsimulationSDD &source) :
-    AliITSsimulation(source),
-fITS(source.fITS),
-fHitMap2(source.fHitMap2),
-fHitSigMap2(source.fHitSigMap2),
-fHitNoiMap2(source.fHitNoiMap2),
-fElectronics(source.fElectronics),
-fInZR(source.fInZR),
-fInZI(source.fInZI),
-fOutZR(source.fOutZR),
-fOutZI(source.fOutZI),
-fAnodeFire(source.fAnodeFire),
-fHis(source.fHis),
-fFlag(source.fFlag),
-fCrosstalkFlag(source.fCrosstalkFlag),
-fDoFFT(source.fDoFFT),
-fNofMaps(source.fNofMaps),
-fMaxNofSamples(source.fMaxNofSamples),
-fScaleSize(source.fScaleSize){
-    // Copy constructor to satify Coding roules only.
-
-}
-//______________________________________________________________________
-AliITSsimulationSDD& AliITSsimulationSDD::operator=(const AliITSsimulationSDD &src){
-    // Assignment operator to satify Coding roules only.
 
-    if(this==&src) return *this;
-    Error("AliITSsimulationSDD","Not allowed to make a = with "
-          "AliITSsimulationSDD Using default creater instead");
-    return *this ;
-}
-/*
-//______________________________________________________________________
-AliITSsimulation& AliITSsimulationSDD::operator=(const AliITSsimulation &src){
-    // Assignment operator to satify Coding roules only.
-
-    if(this==&src) return *this;
-    Error("AliITSsimulationSSD","Not allowed to make a = with "
-          "AliITSsimulationSDD Using default creater instead");
-    return *this ;
-}
-*/
 //______________________________________________________________________
 AliITSsimulationSDD::AliITSsimulationSDD(AliITSDetTypeSim* dettyp):
 AliITSsimulation(dettyp),
@@ -145,13 +103,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 +125,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 +347,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 +358,14 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
   Double_t  nsigma     = simpar->GetNSigmaIntegration(); //
   Int_t     nlookups   = simpar->GetGausNLookUp();       //
   Float_t   jitter     = simpar->GetSDDJitterError(); // 
-  
+  Float_t   mapsmear   = simpar->GetSDDCorrMapPrecision(); // 
+  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);
+  Float_t   adcscale   = fDetType->GetResponseSDD()->GetADCtokeV(fModule);
+  adcscale/=simpar->GetSDDkeVtoADC();
+
   // Piergiorgio's part (apart for few variables which I made float
   // when i thought that can be done
   // Fill detector maps with GEANT hits
@@ -451,14 +413,13 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
     if(!mod->LineSegmentL(ii,xL[0],dxL[0],xL[1],dxL[1],xL[2],dxL[2],
                          depEnergy,itrack)) continue;
     Float_t xloc=xL[0];
-    if(xloc>0) iWing=0; // left side, carlos channel 0
-    else iWing=1; // right side
-    
     Float_t zloc=xL[2]+0.5*dxL[2];
     zAnode=seg->GetAnodeFromLocal(xloc,zloc); // anode number in the range 0.-511.
     driftSpeed = res->GetDriftSpeedAtAnode(zAnode);
+    driftSpeed+= fDetType->GetResponseSDD()->GetDeltaVDrift(fModule,zAnode>255);
+
     if(timeStep*fMaxNofSamples < sddLength/driftSpeed) {
-      AliWarning("Time Interval > Allowed Time Interval\n");
+      AliWarning("Time Interval > Allowed Time Interval");
     }
     depEnergy  *= kconv;
     if (!depEnergy) {
@@ -472,17 +433,25 @@ 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));
+    }
+
+    Float_t corrx=0, corrz=0;
+    res->GetShiftsForSimulation(xL[2],xL[0],corrz,corrx,seg);
+    xL[2]-=corrz;
+    xL[0]-=corrx;
+    xL[0] += 0.0001*gRandom->Gaus( 0, mapsmear); //
     xL[0] += 0.0001*gRandom->Gaus( 0, jitter ); //
+
     pathInSDD = TMath::Sqrt(dxL[0]*dxL[0]+dxL[1]*dxL[1]+dxL[2]*dxL[2]);
     
     if (fFlag && pathInSDD) { depEnergy *= (0.03/pathInSDD); }
     drPath = TMath::Abs(10000.*(dxL[0]+2.*xL[0])*0.5);
     drPath = sddLength-drPath;
     if(drPath < 0) {
-      AliDebug(1, // this should be fixed at geometry level
+      AliInfo( // this should be fixed at geometry level
               Form("negative drift path drPath=%e sddLength=%e dxL[0]=%e xL[0]=%e",
                    drPath,sddLength,dxL[0],xL[0]));
       continue;
@@ -506,7 +475,11 @@ void AliITSsimulationSDD::HitsToAnalogDigits( AliITSmodule *mod ) {
       theSteps+=1.;
       theAverage+=avAnode;
       zAnode = seg->GetAnodeFromLocal(avDrft,avAnode);
+      //      if(avDrft*xloc<0) AliDebug(1,Form("Swap of side xloc_orig=%f  xloc_now=%f",xloc,avDrft));
+      iWing = seg->GetSideFromLocalX(avDrft);
+    
       driftSpeed = res->GetDriftSpeedAtAnode(zAnode);  
+      driftSpeed+= fDetType->GetResponseSDD()->GetDeltaVDrift(fModule,zAnode>255);
       driftPath = TMath::Abs(10000.*avDrft);
       driftPath = sddLength-driftPath;
       if(driftPath < 0) {
@@ -521,29 +494,18 @@ 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/
        (timeStep*eVpairs*2.*acos(-1.));
       chargeloss = 1.-cHloss*driftPath/1000.;
       amplitude *= chargeloss;
+      amplitude *= adcscale;
       width  = 2.*nsigma/(nlookups-1);
       // Spread the charge 
       nsplitAn = 4; 
@@ -556,16 +518,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 +648,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 +671,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 +708,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 +736,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 +843,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 +870,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(){
@@ -1010,3 +975,4 @@ void AliITSsimulationSDD::PrintStatus() const {
     cout << "Scale size factor: " << fScaleSize << endl;
     cout << "**************************************************" << endl;
 }
+