#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 //
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),
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() );
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
// 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)
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
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) {
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;
theAverage+=avAnode;
zAnode = seg->GetAnodeFromLocal(avDrft,avAnode);
driftSpeed = res->GetDriftSpeedAtAnode(zAnode);
+ driftSpeed+= fDetType->GetResponseSDD()->GetDeltaVDrift(fModule,zAnode>255);
driftPath = TMath::Abs(10000.*avDrft);
driftPath = sddLength-driftPath;
if(driftPath < 0) {
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;
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;
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++) {
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);
// 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++ ) {
// 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 )
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);
}
//______________________________________________________________________
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(){