#include "TBranch.h"
#include "TClonesArray.h"
#include "TObjArray.h"
#include "TTree.h"
#include "AliRun.h"
#include "AliCDBManager.h"
#include "AliCDBId.h"
#include "AliCDBStorage.h"
#include "AliCDBEntry.h"
#include "AliCDBMetaData.h"
#include "AliITSdigit.h"
#include "AliITSdigitSPD.h"
#include "AliITSdigitSDD.h"
#include "AliITSdigitSSD.h"
#include "AliITSgeom.h"
#include "AliITSDetTypeSim.h"
#include "AliITSpListItem.h"
#include "AliITSCalibration.h"
#include "AliITSCalibrationSDD.h"
#include "AliITSMapSDD.h"
#include "AliITSCorrMapSDD.h"
#include "AliITSDriftSpeedArraySDD.h"
#include "AliITSDriftSpeedSDD.h"
#include "AliITSCalibrationSSD.h"
#include "AliITSNoiseSSDv2.h"
#include "AliITSGainSSDv2.h"
#include "AliITSBadChannelsSSDv2.h"
#include "AliITSNoiseSSD.h"
#include "AliITSGainSSD.h"
#include "AliITSBadChannelsSSD.h"
#include "AliITSCalibrationSSD.h"
#include "AliITSsegmentationSPD.h"
#include "AliITSsegmentationSDD.h"
#include "AliITSsegmentationSSD.h"
#include "AliITSsimulation.h"
#include "AliITSsimulationSPD.h"
#include "AliITSsimulationSDD.h"
#include "AliITSsimulationSSD.h"
#include "AliITSresponseSDD.h"
#include "AliITSDDLModuleMapSDD.h"
#include "AliITSTriggerConditions.h"
#include "AliBaseLoader.h"
const Int_t AliITSDetTypeSim::fgkNdettypes = 3;
const Int_t AliITSDetTypeSim::fgkDefaultNModulesSPD = 240;
const Int_t AliITSDetTypeSim::fgkDefaultNModulesSDD = 260;
const Int_t AliITSDetTypeSim::fgkDefaultNModulesSSD = 1698;
using std::endl;
using std::cout;
ClassImp(AliITSDetTypeSim)
AliITSDetTypeSim::AliITSDetTypeSim():
TObject(),
fSimulation(),
fSegmentation(),
fCalibration(),
fSSDCalibration(0),
fSPDNoisy(0),
fSPDSparseDead(0),
fNSDigits(0),
fSDigits("AliITSpListItem",1000),
fNDigits(0),
fRunNumber(0),
fDigits(),
fSimuPar(0),
fDDLMapSDD(0),
fRespSDD(0),
fAveGainSDD(0),
fkDigClassName(),
fLoader(0),
fFirstcall(kTRUE),
fFOGenerator(),
fTriggerConditions(NULL)
{
fSimulation = new TObjArray(fgkNdettypes);
fSegmentation = new TObjArray(fgkNdettypes);
fSegmentation->SetOwner(kTRUE);
fDigits = new TObjArray(fgkNdettypes);
fNDigits = new Int_t[fgkNdettypes];
fDDLMapSDD=new AliITSDDLModuleMapSDD();
fSimuPar= new AliITSSimuParam();
fSSDCalibration=new AliITSCalibrationSSD();
SetRunNumber();
}
AliITSDetTypeSim::~AliITSDetTypeSim(){
if(fSimulation){
fSimulation->Delete();
delete fSimulation;
}
fSimulation = 0;
if(fSegmentation){
fSegmentation->Delete();
delete fSegmentation;
}
fSegmentation = 0;
if(fCalibration && fRunNumber<0){
fCalibration->Delete();
delete fCalibration;
}
fCalibration = 0;
if(fSSDCalibration) {
if(!(AliCDBManager::Instance()->GetCacheFlag())) {
delete fSSDCalibration;
fSSDCalibration = NULL;
}
}
if(fSPDNoisy){
if(!(AliCDBManager::Instance()->GetCacheFlag())) {
fSPDNoisy->Delete();
delete fSPDNoisy;
fSPDNoisy = 0;
}
}
if(fSPDSparseDead){
if(!(AliCDBManager::Instance()->GetCacheFlag())) {
fSPDSparseDead->Delete();
delete fSPDSparseDead;
fSPDSparseDead = 0;
}
}
if(fSimuPar) delete fSimuPar;
if(fRespSDD){
if(!(AliCDBManager::Instance()->GetCacheFlag())){
delete fRespSDD;
fRespSDD=0;
}
}
if(fDDLMapSDD) delete fDDLMapSDD;
if(fNDigits) delete [] fNDigits;
fNDigits = 0;
if (fLoader)fLoader->GetModulesFolder()->Remove(this);
fLoader = 0;
fSDigits.Delete();
if (fDigits) {
fDigits->Delete();
delete fDigits;
}
fDigits=0;
}
void AliITSDetTypeSim::SetITSgeom(AliITSgeom *geom){
if(!fLoader){
Error("SetITSgeom","No pointer to loader - nothing done");
return;
}
else {
fLoader->SetITSgeom(geom);
}
}
void AliITSDetTypeSim::SetLoader(AliITSLoader *loader){
if(fLoader==loader) return;
if(fLoader){
Error("SetLoader",
"Already have an exisiting loader ptr=%p Nothing done",
fLoader);
}
fLoader = loader;
}
void AliITSDetTypeSim::SetSimulationModel(Int_t dettype,AliITSsimulation *sim){
if(fSimulation==0) fSimulation = new TObjArray(fgkNdettypes);
fSimulation->AddAt(sim,dettype);
}
AliITSsimulation* AliITSDetTypeSim::GetSimulationModel(Int_t dettype) const {
if(fSimulation==0) {
Warning("GetSimulationModel","fSimulation is 0!");
return 0;
}
return (AliITSsimulation*)(fSimulation->At(dettype));
}
AliITSsimulation* AliITSDetTypeSim::GetSimulationModelByModule(Int_t module) const {
if(GetITSgeom()==0) {
Warning("GetSimulationModelByModule","GetITSgeom() is 0!");
return 0;
}
return GetSimulationModel(GetITSgeom()->GetModuleType(module));
}
void AliITSDetTypeSim::SetDefaultSegmentation(Int_t idet){
AliITSsegmentation *seg;
if(fSegmentation==0x0){
fSegmentation = new TObjArray(fgkNdettypes);
fSegmentation->SetOwner(kTRUE);
}
if(GetSegmentationModel(idet))
delete (AliITSsegmentation*)fSegmentation->At(idet);
if(idet==0){
seg = new AliITSsegmentationSPD();
}else if(idet==1){
seg = new AliITSsegmentationSDD();
AliITSCalibrationSDD* cal=(AliITSCalibrationSDD*)GetCalibrationModel(fgkDefaultNModulesSPD+1);
if(cal->IsAMAt20MHz()){
seg->SetPadSize(seg->Dpz(0),20.);
seg->SetNPads(seg->Npz()/2,128);
}
}else {
seg = new AliITSsegmentationSSD();
}
SetSegmentationModel(idet,seg);
}
void AliITSDetTypeSim::SetSegmentationModel(Int_t dettype,
AliITSsegmentation *seg){
if(fSegmentation==0x0){
fSegmentation = new TObjArray(fgkNdettypes);
fSegmentation->SetOwner(kTRUE);
}
fSegmentation->AddAt(seg,dettype);
}
AliITSsegmentation* AliITSDetTypeSim::GetSegmentationModel(Int_t dettype) const{
if(fSegmentation==0) {
Warning("GetSegmentationModel","fSegmentation is 0!");
return 0;
}
return (AliITSsegmentation*)(fSegmentation->At(dettype));
}
AliITSsegmentation* AliITSDetTypeSim::GetSegmentationModelByModule(Int_t module) const{
if(GetITSgeom()==0){
Warning("GetSegmentationModelByModule","GetITSgeom() is 0!");
return 0;
}
return GetSegmentationModel(GetITSgeom()->GetModuleType(module));
}
void AliITSDetTypeSim::CreateCalibrationArray() {
if (fCalibration) {
Warning("CreateCalibration","pointer to calibration object exists\n");
fCalibration->Delete();
delete fCalibration;
}
Int_t nModTot = GetITSgeom()->GetIndexMax();
fCalibration = new TObjArray(nModTot);
fCalibration->SetOwner(kTRUE);
fCalibration->Clear();
}
void AliITSDetTypeSim::SetCalibrationModel(Int_t iMod, AliITSCalibration *resp){
if (fCalibration==0) CreateCalibrationArray();
if (fCalibration->At(iMod)!=0)
delete (AliITSCalibration*) fCalibration->At(iMod);
fCalibration->AddAt(resp, iMod);
}
void AliITSDetTypeSim::SetSPDNoisyModel(Int_t iMod, AliITSCalibration *cal){
if (fSPDNoisy==0) {
fSPDNoisy = new TObjArray(fgkDefaultNModulesSPD);
fSPDNoisy->SetOwner(kTRUE);
fSPDNoisy->Clear();
}
if (fSPDNoisy->At(iMod) != 0)
delete (AliITSCalibration*) fSPDNoisy->At(iMod);
fSPDNoisy->AddAt(cal,iMod);
}
void AliITSDetTypeSim::SetSPDSparseDeadModel(Int_t iMod, AliITSCalibration *cal){
if (fSPDSparseDead==0) {
fSPDSparseDead = new TObjArray(fgkDefaultNModulesSPD);
fSPDSparseDead->SetOwner(kTRUE);
fSPDSparseDead->Clear();
}
if (fSPDNoisy->At(iMod) != 0)
delete (AliITSCalibration*) fSPDNoisy->At(iMod);
fSPDNoisy->AddAt(cal,iMod);
}
void AliITSDetTypeSim::ResetCalibrationArray(){
if(fCalibration && fRunNumber<0){
fCalibration->Clear();
}else if (fCalibration && fRunNumber>=0){
fCalibration->Clear();
}
}
void AliITSDetTypeSim::ResetSegmentation(){
if(fSegmentation) fSegmentation->Clear();
}
AliITSCalibration* AliITSDetTypeSim::GetCalibrationModel(Int_t iMod) const {
if(fCalibration==0) {
AliError("fCalibration is 0!");
return 0;
}
if(iMod<fgkDefaultNModulesSPD+fgkDefaultNModulesSDD){
return (AliITSCalibration*)fCalibration->At(iMod);
}else{
Int_t i=iMod-(fgkDefaultNModulesSPD+fgkDefaultNModulesSDD);
fSSDCalibration->SetModule(i);
return (AliITSCalibration*)fSSDCalibration;
}
}
AliITSCalibration* AliITSDetTypeSim::GetSPDNoisyModel(Int_t iMod) const {
if(fSPDNoisy==0) {
AliWarning("fSPDNoisy is 0!");
return 0;
}
return (AliITSCalibration*)fSPDNoisy->At(iMod);
}
void AliITSDetTypeSim::SetDefaults(){
if(GetITSgeom()==0){
Warning("SetDefaults","GetITSgeom() is 0!");
return;
}
if (fCalibration==0) {
CreateCalibrationArray();
}
ResetSegmentation();
if(!GetCalibration()){AliFatal("Exit"); exit(0);}
SetDigitClassName(0,"AliITSdigitSPD");
SetDigitClassName(1,"AliITSdigitSDD");
SetDigitClassName(2,"AliITSdigitSSD");
for(Int_t idet=0;idet<fgkNdettypes;idet++){
if(!GetSegmentationModel(idet)) SetDefaultSegmentation(idet);
}
}
Bool_t AliITSDetTypeSim::GetCalibration() {
if(!fFirstcall){
AliITSCalibration* cal = GetCalibrationModel(0);
if(cal)return kTRUE;
}
else {
fFirstcall = kFALSE;
}
SetRunNumber((Int_t)AliCDBManager::Instance()->GetRun());
Int_t run=GetRunNumber();
Bool_t origCacheStatus = AliCDBManager::Instance()->GetCacheFlag();
Bool_t isCacheActive = kTRUE;
if(GetRunNumber()<0){
isCacheActive=kFALSE;
fCalibration->SetOwner(kTRUE);
}
else{
fCalibration->SetOwner(kFALSE);
}
AliCDBManager::Instance()->SetCacheFlag(isCacheActive);
AliCDBEntry *deadSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDDead", run);
AliCDBEntry *noisySPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDNoisy", run);
AliCDBEntry *foEffSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDFOEfficiency", run);
AliCDBEntry *foNoiSPD = AliCDBManager::Instance()->Get("ITS/Calib/SPDFONoise", run);
AliCDBEntry *entrySDD = AliCDBManager::Instance()->Get("ITS/Calib/CalibSDD", run);
AliCDBEntry *entry2SDD = AliCDBManager::Instance()->Get("ITS/Calib/RespSDD");
AliCDBEntry *drSpSDD = AliCDBManager::Instance()->Get("ITS/Calib/DriftSpeedSDD",run);
AliCDBEntry *ddlMapSDD = AliCDBManager::Instance()->Get("ITS/Calib/DDLMapSDD",run);
AliCDBEntry *mapTSDD = AliCDBManager::Instance()->Get("ITS/Calib/MapsTimeSDD",run);
AliCDBEntry *entryNoiseSSD = AliCDBManager::Instance()->Get("ITS/Calib/NoiseSSD");
AliCDBEntry *entryGainSSD = AliCDBManager::Instance()->Get("ITS/Calib/GainSSD");
AliCDBEntry *entryBadChannelsSSD = AliCDBManager::Instance()->Get("ITS/Calib/BadChannelsSSD");
if(!deadSPD || !noisySPD || !foEffSPD || !foNoiSPD
|| !entrySDD || !entry2SDD || !entryNoiseSSD || !entryGainSSD || !entryBadChannelsSSD
|| !drSpSDD || !ddlMapSDD || !mapTSDD){
AliFatal("Calibration object retrieval failed! ");
return kFALSE;
}
TObjArray *calDeadSPD = (TObjArray*) deadSPD->GetObject();
if (!isCacheActive) deadSPD->SetObject(NULL);
deadSPD->SetOwner(kTRUE);
TObjArray *calNoisySPD = (TObjArray*) noisySPD->GetObject();
if (!isCacheActive) noisySPD->SetObject(NULL);
noisySPD->SetOwner(kTRUE);
AliITSFOEfficiencySPD *calFoEffSPD = (AliITSFOEfficiencySPD*) foEffSPD->GetObject();
if (!isCacheActive) foEffSPD->SetObject(NULL);
foEffSPD->SetOwner(kTRUE);
AliITSFONoiseSPD *calFoNoiSPD = (AliITSFONoiseSPD*) foNoiSPD->GetObject();
if (!isCacheActive) foNoiSPD->SetObject(NULL);
foNoiSPD->SetOwner(kTRUE);
TObjArray *calSDD = (TObjArray *)entrySDD->GetObject();
if(!isCacheActive)entrySDD->SetObject(NULL);
entrySDD->SetOwner(kTRUE);
AliITSresponseSDD *pSDD = (AliITSresponseSDD*)entry2SDD->GetObject();
if(!isCacheActive)entry2SDD->SetObject(NULL);
entry2SDD->SetOwner(kTRUE);
TObjArray *drSp = (TObjArray *)drSpSDD->GetObject();
if(!isCacheActive)drSpSDD->SetObject(NULL);
drSpSDD->SetOwner(kTRUE);
AliITSDDLModuleMapSDD *ddlsdd=(AliITSDDLModuleMapSDD*)ddlMapSDD->GetObject();
if(!isCacheActive)ddlMapSDD->SetObject(NULL);
ddlMapSDD->SetOwner(kTRUE);
TObjArray *mapT = (TObjArray *)mapTSDD->GetObject();
if(!isCacheActive)mapTSDD->SetObject(NULL);
mapTSDD->SetOwner(kTRUE);
TObject *emptyssd = 0; TString ssdobjectname;
AliITSNoiseSSDv2 *noiseSSD = NULL;
emptyssd = (TObject *)entryNoiseSSD->GetObject();
ssdobjectname = emptyssd->GetName();
if(ssdobjectname=="TObjArray") {
noiseSSD = new AliITSNoiseSSDv2();
TObjArray *noiseSSDOld = (TObjArray *)entryNoiseSSD->GetObject();
ReadOldSSDNoise(noiseSSDOld, noiseSSD);
}
else if(ssdobjectname=="AliITSNoiseSSDv2")
noiseSSD = (AliITSNoiseSSDv2 *)entryNoiseSSD->GetObject();
if(!isCacheActive)entryNoiseSSD->SetObject(NULL);
entryNoiseSSD->SetOwner(kTRUE);
AliITSGainSSDv2 *gainSSD = NULL;
emptyssd = (TObject *)entryGainSSD->GetObject();
ssdobjectname = emptyssd->GetName();
if(ssdobjectname=="Gain") {
TObjArray *gainSSDOld = (TObjArray *)entryGainSSD->GetObject();
gainSSD = new AliITSGainSSDv2();
ReadOldSSDGain(gainSSDOld, gainSSD);
}
else if(ssdobjectname=="AliITSGainSSDv2")
gainSSD = (AliITSGainSSDv2 *)entryGainSSD->GetObject();
if(!isCacheActive)entryGainSSD->SetObject(NULL);
entryGainSSD->SetOwner(kTRUE);
AliITSBadChannelsSSDv2 *badChannelsSSD = NULL;
emptyssd = (TObject *)entryBadChannelsSSD->GetObject();
ssdobjectname = emptyssd->GetName();
if(ssdobjectname=="TObjArray") {
TObjArray *badChannelsSSDOld = (TObjArray *)entryBadChannelsSSD->GetObject();
badChannelsSSD = new AliITSBadChannelsSSDv2();
ReadOldSSDBadChannels(badChannelsSSDOld, badChannelsSSD);
}
else if(ssdobjectname=="AliITSBadChannelsSSDv2")
badChannelsSSD = (AliITSBadChannelsSSDv2*)entryBadChannelsSSD->GetObject();
if(!isCacheActive)entryBadChannelsSSD->SetObject(NULL);
entryBadChannelsSSD->SetOwner(kTRUE);
if(!isCacheActive){
delete deadSPD;
delete noisySPD;
delete foEffSPD;
delete foNoiSPD;
delete entrySDD;
delete entry2SDD;
delete entryNoiseSSD;
delete entryGainSSD;
delete entryBadChannelsSSD;
delete mapTSDD;
delete drSpSDD;
delete ddlMapSDD;
}
AliCDBManager::Instance()->SetCacheFlag(origCacheStatus);
if ((!calDeadSPD) || (!calNoisySPD) || (!calFoEffSPD) || (!calFoNoiSPD)
|| (!calSDD) || (!pSDD)|| (!drSp) || (!ddlsdd)
|| (!mapT) || (!noiseSSD)|| (!gainSSD)|| (!badChannelsSSD)) {
AliWarning("Can not get calibration from calibration database !");
return kFALSE;
}
Int_t nmods0 = calDeadSPD->GetEntries();
Int_t nmods1 = calSDD->GetEntries();
AliDebug(1,Form("%i SPD, %i SDD and %i SSD in calibration database",
nmods0,nmods1,fgkDefaultNModulesSSD));
AliITSCalibration* cal;
for (Int_t i=0; i<nmods0; i++) {
cal = (AliITSCalibration*) calDeadSPD->At(i);
SetCalibrationModel(i, cal);
cal = (AliITSCalibration*) calNoisySPD->At(i);
SetSPDNoisyModel(i, cal);
}
fFOGenerator.SetEfficiency(calFoEffSPD);
fFOGenerator.SetNoise(calFoNoiSPD);
fDDLMapSDD->SetDDLMap(ddlsdd);
fRespSDD=pSDD;
Float_t avegain=0.;
Float_t nGdAnodes=0;
Bool_t oldMapFormat=kFALSE;
TObject* objmap=(TObject*)mapT->At(0);
TString cname(objmap->ClassName());
if(cname.CompareTo("AliITSMapSDD")==0){
oldMapFormat=kTRUE;
AliInfo("SDD Maps converted to new format");
}
for (Int_t i=0; i<fgkDefaultNModulesSDD; i++) {
Int_t iddl,icarlos;
Int_t iMod = i + fgkDefaultNModulesSPD;
fDDLMapSDD->FindInDDLMap(iMod,iddl,icarlos);
if(iddl<0){
AliITSCalibrationSDD* calsdddead=new AliITSCalibrationSDD();
calsdddead->SetBad();
AliITSDriftSpeedSDD* driftspdef = new AliITSDriftSpeedSDD();
AliITSDriftSpeedArraySDD* arrdrsp=new AliITSDriftSpeedArraySDD(1);
arrdrsp->AddDriftSpeed(driftspdef);
calsdddead->SetDriftSpeed(0,arrdrsp);
calsdddead->SetDriftSpeed(1,arrdrsp);
SetCalibrationModel(iMod, calsdddead);
AliWarning(Form("SDD module %d not present in DDL map: set it as dead",iMod));
}else{
cal = (AliITSCalibration*) calSDD->At(i);
for(Int_t iAnode=0;iAnode< ((AliITSCalibrationSDD*)cal)->NOfAnodes(); iAnode++){
if(((AliITSCalibrationSDD*)cal)->IsBadChannel(iAnode)) continue;
avegain+= ((AliITSCalibrationSDD*)cal)->GetChannelGain(iAnode);
nGdAnodes++;
}
Int_t i0=2*i;
Int_t i1=1+2*i;
AliITSDriftSpeedArraySDD* arr0 = (AliITSDriftSpeedArraySDD*) drSp->At(i0);
AliITSDriftSpeedArraySDD* arr1 = (AliITSDriftSpeedArraySDD*) drSp->At(i1);
AliITSCorrMapSDD* mt0 = 0;
AliITSCorrMapSDD* mt1 = 0;
if(oldMapFormat){
AliITSMapSDD* oldmap0=(AliITSMapSDD*)mapT->At(i0);
AliITSMapSDD* oldmap1=(AliITSMapSDD*)mapT->At(i1);
mt0=oldmap0->ConvertToNewFormat();
mt1=oldmap1->ConvertToNewFormat();
}else{
mt0=(AliITSCorrMapSDD*)mapT->At(i0);
mt1=(AliITSCorrMapSDD*)mapT->At(i1);
}
cal->SetDriftSpeed(0,arr0);
cal->SetDriftSpeed(1,arr1);
cal->SetMapT(0,mt0);
cal->SetMapT(1,mt1);
SetCalibrationModel(iMod, cal);
}
}
if(nGdAnodes) fAveGainSDD=avegain/nGdAnodes;
AliDebug(3,Form("SDD average gain=%f\n",fAveGainSDD));
fSSDCalibration->SetNoise(noiseSSD);
fSSDCalibration->SetGain(gainSSD);
fSSDCalibration->SetBadChannels(badChannelsSSD);
return kTRUE;
}
void AliITSDetTypeSim::SetDefaultSimulation(){
if(GetITSgeom()==0){
Warning("SetDefaultSimulation","GetITSgeom() is 0!");
return;
}
if(fCalibration==0){
Warning("SetDefaultSimulation","fCalibration is 0!");
return;
}
if(fSegmentation==0){
Warning("SetDefaultSimulation","fSegmentation is 0!");
for(Int_t i=0;i<fgkNdettypes;i++) SetDefaultSegmentation(i);
}else for(Int_t i=0;i<fgkNdettypes;i++) if(!GetSegmentationModel(i)){
Warning("SetDefaultSimulation",
"Segmentation not defined for det %d - Default taken\n!",i);
SetDefaultSegmentation(i);
}
AliITSsimulation* sim;
for(Int_t idet=0;idet<fgkNdettypes;idet++){
if(idet==0){
sim = GetSimulationModel(idet);
if(!sim){
sim = new AliITSsimulationSPD(this);
SetSimulationModel(idet,sim);
}
}
if(idet==1){
sim = GetSimulationModel(idet);
if(!sim){
sim = new AliITSsimulationSDD(this);
SetSimulationModel(idet,sim);
}
}
if(idet==2){
sim = GetSimulationModel(idet);
if(!sim){
sim = new AliITSsimulationSSD(this);
SetSimulationModel(idet,sim);
}
}
}
}
void AliITSDetTypeSim::SetTreeAddressS(TTree* treeS, const Char_t* name){
if(!treeS){
return;
}
TBranch *branch;
branch = treeS->GetBranch(name);
TClonesArray *sdigi = &fSDigits;
if (branch) branch->SetAddress(&sdigi);
}
void AliITSDetTypeSim::SetTreeAddressD(TTree* treeD, const Char_t* name){
const char *det[3] = {"SPD","SDD","SSD"};
TBranch *branch;
TString branchname;
if(!treeD){
return;
}
if(!fDigits){
fDigits = new TObjArray(fgkNdettypes);
}
for(Int_t i=0;i<fgkNdettypes;i++){
const Char_t* digclass = GetDigitClassName(i);
if(digclass==0x0){
if(i==0) SetDigitClassName(i,"AliITSdigitSPD");
if(i==1) SetDigitClassName(i,"AliITSdigitSDD");
if(i==2) SetDigitClassName(i,"AliITSdigitSSD");
digclass = GetDigitClassName(i);
}
TString classn = digclass;
if(!(fDigits->At(i))){
fDigits->AddAt(new TClonesArray(classn.Data(),1000),i);
}else{
ResetDigits(i);
}
if(fgkNdettypes==3) branchname.Form("%sDigits%s",name,det[i]);
else branchname.Form("%sDigits%d",name,i+1);
branch = treeD->GetBranch(branchname.Data());
if(branch) branch->SetAddress(&((*fDigits)[i]));
}
}
void AliITSDetTypeSim::ResetDigits(){
if(!fDigits){
Error("ResetDigits","fDigits is null!");
return;
}
for(Int_t i=0;i<fgkNdettypes;i++){
ResetDigits(i);
}
}
void AliITSDetTypeSim::ResetDigits(Int_t branch){
if(fDigits->At(branch)){
((TClonesArray*)fDigits->At(branch))->Clear();
}
if(fNDigits) fNDigits[branch]=0;
}
void AliITSDetTypeSim::SDigitsToDigits(Option_t* opt, Char_t* name){
if(!GetITSgeom()){
Warning("SDigitsToDigits","GetITSgeom() is null!!");
return;
}
const char *all = strstr(opt,"All");
const char *det[3] = {strstr(opt,"SPD"),strstr(opt,"SDD"),
strstr(opt,"SSD")};
if(!all && !det[0] && !det[1] && !det[2] ) all = "All";
static Bool_t setDef = kTRUE;
if(setDef) SetDefaultSimulation();
setDef = kFALSE;
AliITSsimulation *sim =0;
TTree* trees = fLoader->TreeS();
if( !(trees && GetSDigits()) ){
Error("SDigits2Digits","Error: No trees or SDigits. Returning.");
return;
}
TBranch* brchSDigits = trees->GetBranch(name);
Int_t id;
for(Int_t module=0;module<GetITSgeom()->GetIndexMax();module++){
id = GetITSgeom()->GetModuleType(module);
if (!all && !det[id]) continue;
sim = (AliITSsimulation*)GetSimulationModel(id);
if(!sim){
Error("SDigit2Digits","The simulation class was not "
"instanciated for module %d type %s!",module,
GetITSgeom()->GetModuleTypeName(module));
exit(1);
}
sim->InitSimulationModule(module,gAlice->GetEvNumber());
fSDigits.Clear();
brchSDigits->GetEvent(module);
sim->AddSDigitsToModule(&fSDigits,0);
sim->FinishSDigitiseModule();
fLoader->TreeD()->Fill();
ResetDigits();
}
WriteFOSignals();
fLoader->TreeD()->GetEntries();
fLoader->TreeD()->AutoSave();
fLoader->TreeD()->Reset();
}
void AliITSDetTypeSim::AddSumDigit(AliITSpListItem &sdig){
new(fSDigits[fNSDigits++]) AliITSpListItem(sdig);
}
void AliITSDetTypeSim::AddSimDigit(Int_t branch, const AliITSdigit* d){
TClonesArray &ldigits = *((TClonesArray*)fDigits->At(branch));
switch(branch){
case 0:
new(ldigits[fNDigits[branch]++]) AliITSdigitSPD(*((AliITSdigitSPD*)d));
break;
case 1:
new(ldigits[fNDigits[branch]++]) AliITSdigitSDD(*((AliITSdigitSDD*)d));
break;
case 2:
new(ldigits[fNDigits[branch]++]) AliITSdigitSSD(*((AliITSdigitSSD*)d));
break;
}
}
void AliITSDetTypeSim::AddSimDigit(Int_t branch,Float_t phys,Int_t *digits,
Int_t *tracks,Int_t *hits,Float_t *charges,
Int_t sigexpanded){
TClonesArray &ldigits = *((TClonesArray*)fDigits->At(branch));
switch(branch){
case 0:
new(ldigits[fNDigits[branch]++]) AliITSdigitSPD(digits,tracks,hits);
break;
case 1:
new(ldigits[fNDigits[branch]++]) AliITSdigitSDD(phys,digits,tracks,
hits,charges,sigexpanded);
break;
case 2:
new(ldigits[fNDigits[branch]++]) AliITSdigitSSD(digits,tracks,hits);
break;
}
}
void AliITSDetTypeSim::ReadOldSSDNoise(const TObjArray *array,
AliITSNoiseSSDv2 *noiseSSD) {
const Int_t fgkSSDSTRIPSPERMODULE = 1536;
const Int_t fgkSSDPSIDESTRIPSPERMODULE = 768;
Int_t gNMod = array->GetEntries();
cout<<"Converting old calibration object for noise..."<<endl;
Double_t noise = 0.0;
for (Int_t iModule = 0; iModule < gNMod; iModule++) {
AliITSNoiseSSD *noiseModule = (AliITSNoiseSSD*) (array->At(iModule));
for(Int_t iStrip = 0; iStrip < fgkSSDSTRIPSPERMODULE; iStrip++) {
noise = (iStrip < fgkSSDPSIDESTRIPSPERMODULE) ? noiseModule->GetNoiseP(iStrip) : noiseModule->GetNoiseN(1535 - iStrip);
if(iStrip < fgkSSDPSIDESTRIPSPERMODULE)
noiseSSD->AddNoiseP(iModule,iStrip,noise);
if(iStrip >= fgkSSDPSIDESTRIPSPERMODULE)
noiseSSD->AddNoiseN(iModule,1535 - iStrip,noise);
}
}
}
void AliITSDetTypeSim::ReadOldSSDBadChannels(const TObjArray *array,
AliITSBadChannelsSSDv2 *badChannelsSSD) {
Int_t nMod = array->GetEntries();
cout<<"Converting old calibration object for bad channels..."<<endl;
for (Int_t iModule = 0; iModule < nMod; iModule++) {
AliITSBadChannelsSSD *bad = (AliITSBadChannelsSSD*) (array->At(iModule));
TArrayI arrayPSide = bad->GetBadPChannelsList();
for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++)
badChannelsSSD->AddBadChannelP(iModule,
iPCounter,
(Char_t)arrayPSide.At(iPCounter));
TArrayI arrayNSide = bad->GetBadNChannelsList();
for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++)
badChannelsSSD->AddBadChannelN(iModule,
iNCounter,
(Char_t)arrayNSide.At(iNCounter));
}
}
void AliITSDetTypeSim::ReadOldSSDGain(const TObjArray *array,
AliITSGainSSDv2 *gainSSD) {
Int_t nMod = array->GetEntries();
cout<<"Converting old calibration object for gain..."<<endl;
for (Int_t iModule = 0; iModule < nMod; iModule++) {
AliITSGainSSD *gainModule = (AliITSGainSSD*) (array->At(iModule));
TArrayF arrayPSide = gainModule->GetGainP();
for(Int_t iPCounter = 0; iPCounter < arrayPSide.GetSize(); iPCounter++)
gainSSD->AddGainP(iModule,
iPCounter,
arrayPSide.At(iPCounter));
TArrayF arrayNSide = gainModule->GetGainN();
for(Int_t iNCounter = 0; iNCounter < arrayNSide.GetSize(); iNCounter++)
gainSSD->AddGainN(iModule,
iNCounter,
arrayNSide.At(iNCounter));
}
}
void AliITSDetTypeSim::ProcessSPDDigitForFastOr(UInt_t module, UInt_t colM, UInt_t rowM) {
fFOGenerator.ProcessPixelHitM(module,colM,rowM);
}
AliITSTriggerConditions* AliITSDetTypeSim::GetTriggerConditions() {
if (fTriggerConditions==NULL) {
fRunNumber = ((Int_t)AliCDBManager::Instance()->GetRun());
Bool_t origCacheStatus = AliCDBManager::Instance()->GetCacheFlag();
Bool_t isCacheActive;
if (fRunNumber<0) isCacheActive=kFALSE;
else isCacheActive=kTRUE;
AliCDBManager::Instance()->SetCacheFlag(isCacheActive);
AliCDBEntry *pitCond = AliCDBManager::Instance()->Get("TRIGGER/SPD/PITConditions", fRunNumber);
if (!pitCond) {
AliError("Trigger conditions retrieval failed! ");
return NULL;
}
fTriggerConditions = (AliITSTriggerConditions*) pitCond->GetObject();
if (!isCacheActive) pitCond->SetObject(NULL);
pitCond->SetOwner(kTRUE);
if (!isCacheActive) {
delete pitCond;
}
AliCDBManager::Instance()->SetCacheFlag(origCacheStatus);
if (fTriggerConditions==NULL) {
AliWarning("fTriggerConditions is NULL!");
}
}
return fTriggerConditions;
}
void AliITSDetTypeSim::WriteFOSignals() {
if (!fLoader) {
AliError("ITS loader is NULL.");
return;
}
if(!fLoader->TreeD()){
AliError("No TreeD available");
return;
}
TTree *tree = fLoader->TreeD();
AliITSFOSignalsSPD *foSignals = new AliITSFOSignalsSPD(*GetFOSignals());
tree->GetUserInfo()->Add(foSignals);
fFOGenerator.ResetSignals();
}
AliITSDetTypeSim.cxx:1000 AliITSDetTypeSim.cxx:1001 AliITSDetTypeSim.cxx:1002 AliITSDetTypeSim.cxx:1003 AliITSDetTypeSim.cxx:1004 AliITSDetTypeSim.cxx:1005 AliITSDetTypeSim.cxx:1006 AliITSDetTypeSim.cxx:1007 AliITSDetTypeSim.cxx:1008 AliITSDetTypeSim.cxx:1009 AliITSDetTypeSim.cxx:1010 AliITSDetTypeSim.cxx:1011 AliITSDetTypeSim.cxx:1012 AliITSDetTypeSim.cxx:1013 AliITSDetTypeSim.cxx:1014 AliITSDetTypeSim.cxx:1015 AliITSDetTypeSim.cxx:1016 AliITSDetTypeSim.cxx:1017 AliITSDetTypeSim.cxx:1018 AliITSDetTypeSim.cxx:1019 AliITSDetTypeSim.cxx:1020 AliITSDetTypeSim.cxx:1021 AliITSDetTypeSim.cxx:1022 AliITSDetTypeSim.cxx:1023 AliITSDetTypeSim.cxx:1024 AliITSDetTypeSim.cxx:1025 AliITSDetTypeSim.cxx:1026 AliITSDetTypeSim.cxx:1027 AliITSDetTypeSim.cxx:1028 AliITSDetTypeSim.cxx:1029 AliITSDetTypeSim.cxx:1030 AliITSDetTypeSim.cxx:1031 AliITSDetTypeSim.cxx:1032 AliITSDetTypeSim.cxx:1033 AliITSDetTypeSim.cxx:1034 AliITSDetTypeSim.cxx:1035 AliITSDetTypeSim.cxx:1036 AliITSDetTypeSim.cxx:1037 AliITSDetTypeSim.cxx:1038 AliITSDetTypeSim.cxx:1039 AliITSDetTypeSim.cxx:1040 AliITSDetTypeSim.cxx:1041 AliITSDetTypeSim.cxx:1042 AliITSDetTypeSim.cxx:1043 AliITSDetTypeSim.cxx:1044 AliITSDetTypeSim.cxx:1045 AliITSDetTypeSim.cxx:1046 AliITSDetTypeSim.cxx:1047 AliITSDetTypeSim.cxx:1048 AliITSDetTypeSim.cxx:1049 AliITSDetTypeSim.cxx:1050 AliITSDetTypeSim.cxx:1051 AliITSDetTypeSim.cxx:1052 AliITSDetTypeSim.cxx:1053 AliITSDetTypeSim.cxx:1054 AliITSDetTypeSim.cxx:1055 AliITSDetTypeSim.cxx:1056 AliITSDetTypeSim.cxx:1057 AliITSDetTypeSim.cxx:1058 AliITSDetTypeSim.cxx:1059 AliITSDetTypeSim.cxx:1060 AliITSDetTypeSim.cxx:1061 AliITSDetTypeSim.cxx:1062 AliITSDetTypeSim.cxx:1063 AliITSDetTypeSim.cxx:1064 AliITSDetTypeSim.cxx:1065 AliITSDetTypeSim.cxx:1066 AliITSDetTypeSim.cxx:1067