#include "AliITShit.h"
#include "AliITSpList.h"
#include "AliITSCalibrationSDD.h"
-#include "AliITSsegmentationSDD.h"
+#include "AliITSresponseSDD.h"
#include "AliITSsimulationSDD.h"
#include "AliLog.h"
#include "AliRun.h"
fMaxNofSamples(0),
fScaleSize(0){
// Default constructor
- SetScaleFourier();
SetPerpendTracksFlag();
SetCrosstalkFlag();
SetDoFFT();
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 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
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) {
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]);
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/
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);
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
}
}
}
}
//______________________________________________________________________
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(){