#include "AliLog.h"
#include "AliRun.h"
#include "AliMagF.h"
+#include "AliMathBase.h"
//#define DEBUG
} else {
fCoupling=1;
} // end if
- //SetLorentzDrift(kTRUE);
- if (fLorentz) SetTanLorAngle();
+ SetLorentzDrift(simpar->GetSPDLorentzDrift());
+ if (fLorentz) SetTanLorAngle(simpar->GetSPDLorentzHoleWeight());
//SetStrobeGeneration(kFALSE);
if (fStrobe) GenerateStrobePhase();
}
}
Double_t WeightEle=1.-WeightHole;
AliITSSimuParam* simpar = fDetType->GetSimuParam();
- Double_t pos[3]={0.,0.,0.};
- Double_t B[3]={0.,0.,0.};
- TGeoGlobalMagField::Instance()->Field(pos,B);
- fTanLorAng = TMath::Tan(WeightHole*simpar->LorentzAngleHole(B[2]) +
- WeightEle*simpar->LorentzAngleElectron(B[2]));
- fTanLorAng*=-1.; // this only for the old geometry
- // comment the upper line for the new geometry
+ AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+ if (!fld) AliFatal("The field is not initialized");
+ Double_t bz = fld->SolenoidField();
+ fTanLorAng = TMath::Tan(WeightHole*simpar->LorentzAngleHole(bz) +
+ WeightEle*simpar->LorentzAngleElectron(bz));
return kTRUE;
}
//______________________________________________________________________
InitSimulationModule( GetModuleNumber() , event );
// HitToSDigit(mod);
HitToSDigitFast(mod);
- RemoveDeadPixels(mod);
+ if (fDetType->GetSimuParam()->GetSPDAddNoisyFlag()) AddNoisyPixels();
+ if (fDetType->GetSimuParam()->GetSPDRemoveDeadFlag()) RemoveDeadPixels();
+
// cout << "After Remove in SDigitiseModule !!!!!" << endl; // dom
// cout << "Module " << mod->GetIndex() << " Event " << event << endl; // dom
WriteSDigits();
// none.
if (fStrobe) if(event != GetEventNumber()) GenerateStrobePhase();
- AliDebug(1,Form("(mod=%p,,)",mod));
+ AliDebug(1,Form("(mod=%p,,0)",mod));
// HitToSDigit(mod);
InitSimulationModule( mod->GetIndex(), event );
HitToSDigitFast(mod);
- RemoveDeadPixels(mod);
+
+ if (fDetType->GetSimuParam()->GetSPDAddNoisyFlag()) AddNoisyPixels();
+ if (fDetType->GetSimuParam()->GetSPDRemoveDeadFlag()) RemoveDeadPixels();
// cout << "After Remove in DigitiseModule in module " << mod->GetIndex() << endl; // dom
FrompListToDigits();
ClearMap();
z1 -= z0; // Distance from where track traveled
z2 -= z0; // Distance from where track traveled
s = 0.25; // Correction based on definision of Erfc
- s *= TMath::Erfc(sp*x1) - TMath::Erfc(sp*x2);
+ s *= AliMathBase::ErfcFast(sp*x1) - AliMathBase::ErfcFast(sp*x2);
if(GetDebug(3)){
cout <<"el="<<el<<" ix0="<<ix0<<" ix="<<ix<<" x0="<<x<<
" iz0="<<iz0<<" iz="<<iz<<" z0="<<z<<
" sp*x1="<<sp*x1<<" sp*x2="<<sp*x2<<" s="<<s;
} // end if GetDebug
- s *= TMath::Erfc(sp*z1) - TMath::Erfc(sp*z2);
+ s *= AliMathBase::ErfcFast(sp*z1) - AliMathBase::ErfcFast(sp*z2);
if(GetDebug(3)){
cout<<" sp*z1="<<sp*z1<<" sp*z2="<<sp*z2<<" s="<<s<< endl;
} // end if GetDebug
if(GetDebug(4)) Info("SpreadChargeAsym","(x0=%e,z0=%e,ix0=%d,iz0=%d,el=%e,"
- "sig=%e,t=%d,i=%d)",x0,z0,ix0,iz0,el,sigx,sigz,t,hi);
+ "sigx=%e, sigz=%e, t=%d,i=%d)",x0,z0,ix0,iz0,el,sigx,sigz,t,hi);
if(sigx<=0.0 || sigz<=0.0) { // if sig<=0 No diffusion to simulate.
GetMap()->AddSignal(iz0,ix0,t,hi,GetModuleNumber(),el);
if(GetDebug(2)){
z1 -= z0; // Distance from where track traveled
z2 -= z0; // Distance from where track traveled
s = 0.25; // Correction based on definision of Erfc
- s *= TMath::Erfc(spx*x1) - TMath::Erfc(spx*x2);
+ s *= AliMathBase::ErfcFast(spx*x1) - AliMathBase::ErfcFast(spx*x2);
if(GetDebug(3)){
cout <<"el="<<el<<" ix0="<<ix0<<" ix="<<ix<<" x0="<<x<<
" iz0="<<iz0<<" iz="<<iz<<" z0="<<z<<
" spx*x1="<<spx*x1<<" spx*x2="<<spx*x2<<" s="<<s;
} // end if GetDebug
- s *= TMath::Erfc(spz*z1) - TMath::Erfc(spz*z2);
+ s *= AliMathBase::ErfcFast(spz*z1) - AliMathBase::ErfcFast(spz*z2);
if(GetDebug(3)){
cout<<" spz*z1="<<spz*z1<<" spz*z2="<<spz*z2<<" s="<<s<< endl;
} // end if GetDebug
} // end for ix, iz
}
//______________________________________________________________________
-void AliITSsimulationSPD::RemoveDeadPixels(AliITSmodule *mod){
- // Removes dead pixels on each module (ladder)
- // Inputs:
- // Module Index (0,239)
- // Outputs:
- // none.
- // Return:
- // none.
+void AliITSsimulationSPD::RemoveDeadPixels(){
+ // Removes dead pixels on each module (ladder)
+ // This should be called before going from sdigits to digits (FrompListToDigits)
+ Int_t mod = GetModuleNumber();
+ AliITSCalibrationSPD* calObj = (AliITSCalibrationSPD*) fDetType->GetCalibrationModel(mod);
- Int_t moduleNr = mod->GetIndex();
- AliITSCalibrationSPD* calObj = (AliITSCalibrationSPD*) GetCalibrationModel(moduleNr);
+ Int_t nrDead = calObj->GetNrBad();
+ for (Int_t i=0; i<nrDead; i++) {
+ GetMap()->DeleteHit(calObj->GetBadColAt(i), calObj->GetBadRowAt(i));
+ }
+}
+//______________________________________________________________________
+void AliITSsimulationSPD::AddNoisyPixels() {
+ // Adds noisy pixels on each module (ladder)
+ // This should be called before going from sdigits to digits (FrompListToDigits)
+ Int_t mod = GetModuleNumber();
+ AliITSCalibrationSPD* calObj = (AliITSCalibrationSPD*) fDetType->GetSPDNoisyModel(mod);
- Int_t nrDead = calObj->GetNrBad();
-// cout << "Module --> " << moduleNr << endl; // dom
-// cout << "nr of dead " << nrDead << endl; // dom
- for (Int_t i=0; i<nrDead; i++) {
- GetMap()->DeleteHit(calObj->GetBadColAt(i),calObj->GetBadRowAt(i));
-// cout << "dead index " << i << endl; // dom
-// cout << "col row --> " << calObj->GetDeadColAt(i) << " " << calObj->GetDeadRowAt(i) << endl; // dom
- }
+ Int_t nrNoisy = calObj->GetNrBad();
+ for (Int_t i=0; i<nrNoisy; i++) {
+ // adding 10 times the threshold will for sure make this pixel fire...
+ GetMap()->AddNoise(calObj->GetBadColAt(i), calObj->GetBadRowAt(i), mod, 10*GetThreshold());
+ }
}
//______________________________________________________________________
void AliITSsimulationSPD::FrompListToDigits(){
cout<<sig<<"+"<<electronics<<">threshold("<<ix<<","<<iz
<<")="<<GetThreshold() <<endl;
} // end if GetDebug
- if (sig+electronics <= GetThreshold()) continue;
+ // if (sig+electronics <= GetThreshold()) continue;
+ if (GetMap()->GetSignal(iz,ix) <= GetThreshold()) continue;
dig.SetCoord1(iz);
dig.SetCoord2(ix);
dig.SetSignal(1);
cout<<iz<<","<<ix<<","<<*(GetMap()->GetpListItem(iz,ix))<<endl;
} // end if GetDebug
aliITS->AddSimDigit(0,&dig);
+ // simulate fo signal response for this pixel hit:
+ fDetType->ProcessSPDDigitForFastOr(fModule, dig.GetCoord1(), dig.GetCoord2());
} // for ix/iz
}
//______________________________________________________________________
fSPDname="spd_";
for(Int_t i=0;i<GetNPixelsZ();i++) {
Char_t pixelz[4];
- sprintf(pixelz,"%d",i);
+ snprintf(pixelz,3,"%d",i);
fSPDname.Append(pixelz);
fHis->AddAt(new TH1F(fSPDname.Data(),"SPD maps",
GetNPixelsX(),0.,(Double_t)GetNPixelsX()),i);