1 #include "AliITSdigit.h"
2 #include "AliITSLoader.h"
3 #include "AliRunLoader.h"
6 ///////////////////////////////////////////////////////////////////////////
8 // it manages the I/O for:
9 // raw clusters, primary vertices
11 // and tracks propagated to the origin
12 //////////////////////////////////////////////////////////////////////////
13 const TString AliITSLoader::fgkDefaultRawClustersContainerName = "TreeC";
14 const TString AliITSLoader::fgkDefaultBackTracksContainerName = "TreeB";
15 const TString AliITSLoader::fgkDefaultVerticesContainerName = "Vertex";
16 const TString AliITSLoader::fgkDefaultV0ContainerName = "V0";
17 const TString AliITSLoader::fgkDefaultCascadeContainerName = "Cascade";
18 ClassImp(AliITSLoader)
20 /**********************************************************************/
21 AliITSLoader::AliITSLoader():AliLoader(){
22 // Default constructor
26 /*********************************************************************/
27 AliITSLoader::AliITSLoader(const Char_t *name,const Char_t *topfoldername):
28 AliLoader(name,topfoldername){
30 AliDataLoader* rawClustersDataLoader = new AliDataLoader(
31 fDetectorName + ".RawCl.root",fgkDefaultRawClustersContainerName,
33 fDataLoaders->Add(rawClustersDataLoader);
34 rawClustersDataLoader->SetEventFolder(fEventFolder);
35 rawClustersDataLoader->SetFolder(GetDetectorDataFolder());
37 AliDataLoader* backTracksDataLoader = new AliDataLoader(
38 fDetectorName + ".BackTracks.root",fgkDefaultBackTracksContainerName,
39 "Back Propagated Tracks");
40 fDataLoaders->Add(backTracksDataLoader);
41 backTracksDataLoader->SetEventFolder(fEventFolder);
42 backTracksDataLoader->SetFolder(GetDetectorDataFolder());
44 AliDataLoader* vertexDataLoader = new AliDataLoader(
45 fDetectorName + ".Vertex.root",fgkDefaultVerticesContainerName,
46 "Primary Vertices","O");
47 fDataLoaders->Add(vertexDataLoader);
48 vertexDataLoader->SetEventFolder(fEventFolder);
49 vertexDataLoader->SetFolder(GetDetectorDataFolder());
51 AliDataLoader* v0DataLoader = new AliDataLoader(
52 fDetectorName + ".V0s.root",fgkDefaultV0ContainerName,"V0 Vertices");
53 fDataLoaders->Add(v0DataLoader);
54 v0DataLoader->SetEventFolder(fEventFolder);
55 v0DataLoader->SetFolder(GetDetectorDataFolder());
57 AliDataLoader* cascadeDataLoader = new AliDataLoader(
58 fDetectorName + ".Cascades.root",fgkDefaultCascadeContainerName,
60 fDataLoaders->Add(cascadeDataLoader);
61 cascadeDataLoader->SetEventFolder(fEventFolder);
62 cascadeDataLoader->SetFolder(GetDetectorDataFolder());
66 /**********************************************************************/
67 AliITSLoader::AliITSLoader(const Char_t *name,TFolder *topfolder):
68 AliLoader(name,topfolder) {
70 AliDataLoader* rawClustersDataLoader = new AliDataLoader(
71 fDetectorName + ".RawCl.root",fgkDefaultRawClustersContainerName,
73 fDataLoaders->Add(rawClustersDataLoader);
74 rawClustersDataLoader->SetEventFolder(fEventFolder);
75 rawClustersDataLoader->SetFolder(GetDetectorDataFolder());
77 AliDataLoader* backTracksDataLoader = new AliDataLoader(
78 fDetectorName + ".BackTracks.root",fgkDefaultBackTracksContainerName,
79 "Back Propagated Tracks");
80 fDataLoaders->Add(backTracksDataLoader);
81 backTracksDataLoader->SetEventFolder(fEventFolder);
82 backTracksDataLoader->SetFolder(GetDetectorDataFolder());
84 AliDataLoader* vertexDataLoader = new AliDataLoader(
85 fDetectorName + ".Vertex.root",fgkDefaultVerticesContainerName,
86 "Primary Vertices","O");
87 fDataLoaders->Add(vertexDataLoader);
88 vertexDataLoader->SetEventFolder(fEventFolder);
89 vertexDataLoader->SetFolder(GetDetectorDataFolder());
91 AliDataLoader* v0DataLoader = new AliDataLoader(
92 fDetectorName + ".V0.root",fgkDefaultV0ContainerName,"V0 Vertices");
93 fDataLoaders->Add(v0DataLoader);
94 v0DataLoader->SetEventFolder(fEventFolder);
95 v0DataLoader->SetFolder(GetDetectorDataFolder());
97 AliDataLoader* cascadeDataLoader = new AliDataLoader(
98 fDetectorName + ".Cascade.root",fgkDefaultCascadeContainerName,
100 fDataLoaders->Add(cascadeDataLoader);
101 cascadeDataLoader->SetEventFolder(fEventFolder);
102 cascadeDataLoader->SetFolder(GetDetectorDataFolder());
107 //______________________________________________________________________
108 AliITSLoader::AliITSLoader(const AliITSLoader &ob) : AliLoader(ob) {
110 // Copies are not allowed. The method is protected to avoid misuse.
111 Error("AliITSLoader","Copy constructor not allowed\n");
114 //______________________________________________________________________
115 AliITSLoader& AliITSLoader::operator=(const AliITSLoader& /* ob */){
116 // Assignment operator
117 // Assignment is not allowed. The method is protected to avoid misuse.
118 Error("= operator","Assignment operator not allowed\n");
122 /**********************************************************************/
123 AliITSLoader::~AliITSLoader(){
125 AliDataLoader* dl = 0;
127 dl = GetRawClLoader();
128 fDataLoaders->Remove(dl);
131 dl = GetBackTracksDataLoader();
132 fDataLoaders->Remove(dl);
135 dl = GetVertexDataLoader();
136 fDataLoaders->Remove(dl);
139 dl = GetV0DataLoader();
140 fDataLoaders->Remove(dl);
143 dl = GetCascadeDataLoader();
144 fDataLoaders->Remove(dl);
145 if(fGeom)delete fGeom;
149 //----------------------------------------------------------------------
150 AliITS* AliITSLoader::GetITS(){
151 // Returns the pointer to the ITS, kept on the file. A short cut metthod
157 // Returns a pointer to the ITS, if not found returns 0.
161 its = dynamic_cast<AliITS*> (gAlice->GetDetector(
162 GetDetectorName().Data()));
169 ar = rl->GetAliRun();
171 its = dynamic_cast<AliITS*> (ar->GetDetector(GetDetectorName().Data()));
174 //----------------------------------------------------------------------
175 void AliITSLoader::SetupDigits(AliITS *its){
176 // Sets up to store ITS Digits in side AliITS::fDtype TObjArray
178 // AliITS *its Pointer to the ITS
184 its->SetTreeAddressD(TreeD());
187 //----------------------------------------------------------------------
188 void AliITSLoader::SetupDigits(TObjArray *digPerDet,Int_t n,
189 const Char_t **digclass){
190 // Sets up digPerDet to store ITS Digits.
192 // TObjArray *digPerDet A pointer to a TObject Array size>=3.
193 // Int_t n The size of the TObjArray and digclass array
194 // Char_t **digclass Array of digit class names
196 // TObjArray *digPerDet Setup and linked to the tree of digits
200 TClonesArray *cl = 0;
204 const Char_t *det[3] = {"SPD","SDD","SSD"};
207 Error("SetUpDigits","TObject Array digPerDet does not exist");
210 m = digPerDet->GetSize();
212 Error("SetUpDigits","TObject Array digPerDet=%p must have a size"
213 " at least that of n=%d",digPerDet,n);
216 Error("SetUpDigits","TObject Array digPerDet=%p must have a size >2",
222 if(digPerDet->At(i)==0){ // set up TClones Array
223 digPerDet->AddAt(new TClonesArray(digclass[i],1000),i);
224 if(n==3) sprintf(branch,"ITSDigits%s",det[i]);
225 else sprintf(branch,"ITSDigits%d",i+1);
226 br = td->GetBranch(branch);
227 br->SetAddress(&((*digPerDet)[i]));
228 continue; // do next one.
230 cl = dynamic_cast<TClonesArray*> (digPerDet->At(i));
231 if(!cl && digPerDet->At(i)!=0){ // not a TClonesArray
232 Error("SetUpDigits","TObject Array digPerDet-At(%d)=%p must be "
233 "zeroed or filled with TClonesArrays",i,digPerDet);
236 if(!(cl->GetClass()->GetBaseClass(AliITSdigit::Class()))){
237 Error("SetUPDigits","TClones array at digPerDet[%d}=%p must be"
238 "derived from AliITSdigit",i,digPerDet->At(i));
241 if(n==3) sprintf(branch,"ITSDigits%s",det[i]);
242 else sprintf(branch,"ITSDigits%d",i+1);
243 br = td->GetBranch(branch);
244 br->SetAddress(&((*digPerDet)[i]));
248 //---------------------------------------------------------------------
249 AliITSdigit * AliITSLoader::GetDigit(TObjArray *digPerDet,Int_t module,
251 // Gets the digit for for a specific detector type and module.
252 // To be used in conjustion with Setupdigits(AliITS *its).
254 // TObjArray *digPereDet Pointer to the Array of digits
255 // Int_t module Module number
256 // Int_t digit Digit number
260 // returns the pointer to the digit. if zero then last digit for that
264 Error("GetDigit","digPerDet=%p, module=%d, digit=%d",
265 digPerDet,module,digit);
271 //---------------------------------------------------------------------
272 AliITSdigit * AliITSLoader::GetDigit(AliITS *its,Int_t module,Int_t digit){
273 // Gets the digit for for a specific detector type and module.
274 // To be used in conjustion with Setupdigits(AliITS *its).
276 // AliITS *its Pointer to the ITS
277 // Int_t module Module number
278 // Int_t digit Digit number
282 // returns the pointer to the digit. if zero then last digit for that
284 //AliITSDetType *idtype;
285 AliITSgeom *geom = its->GetITSgeom();
286 Int_t idet = geom->GetModuleType(module);
287 TClonesArray *digits;
290 TreeD()->GetEvent(module);
291 digits = its->DigitsAddress(idet);
292 if(digit>-1 && digit<digits->GetEntriesFast()){ // if in range.
293 return (AliITSdigit*) digits->At(digit);
298 //----------------------------------------------------------------------
299 void AliITSLoader::MakeTree(Option_t *opt){
300 // invokes AliLoader::MakeTree + specific ITS tree(s)
301 // Valid options: H,S,D,R,T and C (C=raw clusters)
302 AliLoader::MakeTree(opt);
303 const char *oC = strstr(opt,"C");
304 if (oC) MakeRawClustersContainer();
306 const char *oB = strstr(opt,"B");
307 if (oB) MakeBackTracksContainer();
309 const char *oV0 = strstr(opt,"V0");
310 if (oV0) MakeV0Container();
312 const char *oX = strstr(opt,"X");
313 if (oX) MakeCascadeContainer();
316 //----------------------------------------------------------------------
317 AliITSgeom* AliITSLoader::GetITSgeom(Bool_t force) {
318 // retrieves the ITS geometry from file
319 if(fGeom && !force)return fGeom;
324 AliRunLoader *runLoader = GetRunLoader();
325 if (!runLoader->GetAliRun()) runLoader->LoadgAlice();
326 if (!runLoader->GetAliRun()) {
327 Error("GetITSgeom", "couldn't get AliRun object");
331 TDirectory *curdir = gDirectory;
332 runLoader->CdGAFile();
333 fGeom = (AliITSgeom*)gDirectory->Get("AliITSgeom");
336 Error("GetITSgeom","no ITS geometry available");
339 AliWarning("AliITSgeom object has been fetched from galice.root file");
342 //______________________________________________________________________
343 void AliITSLoader::SetITSgeom(AliITSgeom *geom){
344 // Replaces the AliITSgeom object read from file with the one
347 // AliITSgeom *geom The AliITSgeom object to replace the one
348 // read from the file
354 if(fGeom==geom) return; // Same do nothing