#include <TClonesArray.h>
#include <TClass.h>
#include <TGeoManager.h>
#include <TTree.h>
#include "AliITSdigit.h"
#include "AliITSLoader.h"
#include "AliRunLoader.h"
#include "AliObjectLoader.h"
#include "AliITSInitGeometry.h"
#include "AliLog.h"
ClassImp(AliITSLoader)
AliITSLoader::AliITSLoader():AliLoader(),
fGeom(0){
}
AliITSLoader::AliITSLoader(const Char_t *name,const Char_t *topfoldername):
AliLoader(name,topfoldername),
fGeom(0){
AliDataLoader* rawClustersDataLoader = new AliDataLoader(
fDetectorName + ".RawCl.root",GetDefaultRawClustersContainerName(),
"Raw Clusters");
fDataLoaders->Add(rawClustersDataLoader);
rawClustersDataLoader->SetEventFolder(fEventFolder);
rawClustersDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* backTracksDataLoader = new AliDataLoader(
fDetectorName + ".BackTracks.root",GetDefaultBackTracksContainerName(),
"Back Propagated Tracks");
fDataLoaders->Add(backTracksDataLoader);
backTracksDataLoader->SetEventFolder(fEventFolder);
backTracksDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* vertexDataLoader = new AliDataLoader(
fDetectorName + ".Vertex.root",GetDefaultVerticesContainerName(),
"Primary Vertices","O");
fDataLoaders->Add(vertexDataLoader);
vertexDataLoader->SetEventFolder(fEventFolder);
vertexDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* v0DataLoader = new AliDataLoader(
fDetectorName + ".V0s.root",GetDefaultV0ContainerName(),"V0 Vertices");
fDataLoaders->Add(v0DataLoader);
v0DataLoader->SetEventFolder(fEventFolder);
v0DataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* cascadeDataLoader = new AliDataLoader(
fDetectorName + ".Cascades.root",GetDefaultCascadeContainerName(),
"Cascades");
fDataLoaders->Add(cascadeDataLoader);
cascadeDataLoader->SetEventFolder(fEventFolder);
cascadeDataLoader->SetFolder(GetDetectorDataFolder());
}
AliITSLoader::AliITSLoader(const Char_t *name,TFolder *topfolder):
AliLoader(name,topfolder),
fGeom(0){
AliDataLoader* rawClustersDataLoader = new AliDataLoader(
fDetectorName + ".RawCl.root",GetDefaultRawClustersContainerName(),
"Raw Clusters");
fDataLoaders->Add(rawClustersDataLoader);
rawClustersDataLoader->SetEventFolder(fEventFolder);
rawClustersDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* backTracksDataLoader = new AliDataLoader(
fDetectorName + ".BackTracks.root",GetDefaultBackTracksContainerName(),
"Back Propagated Tracks");
fDataLoaders->Add(backTracksDataLoader);
backTracksDataLoader->SetEventFolder(fEventFolder);
backTracksDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* vertexDataLoader = new AliDataLoader(
fDetectorName + ".Vertex.root",GetDefaultVerticesContainerName(),
"Primary Vertices","O");
fDataLoaders->Add(vertexDataLoader);
vertexDataLoader->SetEventFolder(fEventFolder);
vertexDataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* v0DataLoader = new AliDataLoader(
fDetectorName + ".V0.root",GetDefaultV0ContainerName(),"V0 Vertices");
fDataLoaders->Add(v0DataLoader);
v0DataLoader->SetEventFolder(fEventFolder);
v0DataLoader->SetFolder(GetDetectorDataFolder());
AliDataLoader* cascadeDataLoader = new AliDataLoader(
fDetectorName + ".Cascade.root",GetDefaultCascadeContainerName(),
"Cascades");
fDataLoaders->Add(cascadeDataLoader);
cascadeDataLoader->SetEventFolder(fEventFolder);
cascadeDataLoader->SetFolder(GetDetectorDataFolder());
}
AliITSLoader::~AliITSLoader(){
AliDataLoader* dl = 0;
UnloadRawClusters();
dl = GetRawClLoader();
fDataLoaders->Remove(dl);
UnloadBackTracks();
dl = GetBackTracksDataLoader();
fDataLoaders->Remove(dl);
UnloadVertices();
dl = GetVertexDataLoader();
fDataLoaders->Remove(dl);
UnloadV0s();
dl = GetV0DataLoader();
fDataLoaders->Remove(dl);
UnloadCascades();
dl = GetCascadeDataLoader();
fDataLoaders->Remove(dl);
if(fGeom)delete fGeom;
fGeom = 0;
}
void AliITSLoader::SetupDigits(TObjArray *digPerDet,Int_t n,
const Char_t **digclass){
Int_t i,m;
TClonesArray *cl = 0;
TTree *td = 0;
TBranch *br = 0;
Char_t branch[14];
const Char_t *det[3] = {"SPD","SDD","SSD"};
if(!digPerDet){
Error("SetUpDigits","TObject Array digPerDet does not exist");
return;
}
m = digPerDet->GetSize();
if(m<n){
Error("SetUpDigits","TObject Array digPerDet=%p must have a size"
" at least that of n=%d",digPerDet,n);
}
if(m<3){
Error("SetUpDigits","TObject Array digPerDet=%p must have a size >2",
digPerDet);
return;
}
td = TreeD();
for(i=0;i<n;i++){
if(digPerDet->At(i)==0){
digPerDet->AddAt(new TClonesArray(digclass[i],1000),i);
if(n==3) snprintf(branch,13,"ITSDigits%s",det[i]);
else snprintf(branch,13,"ITSDigits%d",i+1);
br = td->GetBranch(branch);
br->SetAddress(&((*digPerDet)[i]));
continue;
}
cl = dynamic_cast<TClonesArray*> (digPerDet->At(i));
if(!cl && digPerDet->At(i)!=0){
Error("SetUpDigits","TObject Array digPerDet-At(%d)=%p must be "
"zeroed or filled with TClonesArrays",i,digPerDet);
return;
}
if(!(cl->GetClass()->GetBaseClass(AliITSdigit::Class()))){
Error("SetUPDigits","TClones array at digPerDet[%d}=%p must be"
"derived from AliITSdigit",i,digPerDet->At(i));
}
cl->Clear();
if(n==3) snprintf(branch,13,"ITSDigits%s",det[i]);
else snprintf(branch,13,"ITSDigits%d",i+1);
br = td->GetBranch(branch);
br->SetAddress(&((*digPerDet)[i]));
continue;
}
}
AliITSdigit * AliITSLoader::GetDigit(TObjArray *digPerDet,Int_t module,
Int_t digit){
if(digPerDet==0){
Error("GetDigit","digPerDet=%p, module=%d, digit=%d",
digPerDet,module,digit);
return 0;
}
return 0;
}
void AliITSLoader::MakeTree(Option_t *opt){
AliLoader::MakeTree(opt);
const char *oC = strstr(opt,"C");
if (oC) MakeRawClustersContainer();
const char *oB = strstr(opt,"B");
if (oB) MakeBackTracksContainer();
const char *oV0 = strstr(opt,"V0");
if (oV0) MakeV0Container();
const char *oX = strstr(opt,"X");
if (oX) MakeCascadeContainer();
}
AliITSgeom* AliITSLoader::GetITSgeom(Bool_t force) {
if(fGeom && !force)return fGeom;
if(fGeom && force){
delete fGeom;
fGeom = 0;
}
if(!gGeoManager){
AliError("gGeoManager is a null pointer - ITS geometry not built");
return fGeom;
}
AliITSInitGeometry initgeom;
fGeom = initgeom.CreateAliITSgeom();
AliDebug(1,"AliITSgeom object has been initialized from TGeo\n");
AliDebug(1,Form("Geometry name: %s",(initgeom.GetGeometryName()).Data()));
return fGeom;
}
void AliITSLoader::SetITSgeom(AliITSgeom *geom){
if(fGeom==geom) return;
if(fGeom) {
delete fGeom;
fGeom=0;
}
fGeom=geom;
}
const TString& AliITSLoader::GetDefaultRawClustersContainerName() {
static const TString kDefaultRawClustersContainerName = "TreeC";
return kDefaultRawClustersContainerName;
}
const TString& AliITSLoader::GetDefaultBackTracksContainerName() {
static const TString kDefaultBackTracksContainerName = "TreeB";
return kDefaultBackTracksContainerName;
}
const TString& AliITSLoader::GetDefaultVerticesContainerName() {
static const TString kDefaultVerticesContainerName = "Vertex";
return kDefaultVerticesContainerName;
}
const TString& AliITSLoader::GetDefaultV0ContainerName() {
static const TString kDefaultV0ContainerName = "V0";
return kDefaultV0ContainerName;
}
const TString& AliITSLoader::GetDefaultCascadeContainerName() {
static const TString kDefaultCascadeContainerName = "Cascade";
return kDefaultCascadeContainerName;
}