ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Base class for ALICE modules. Both sensitive modules (detectors) and      //
// non-sensitive ones are described by this base class. This class           //
// supports the hit and digit trees produced by the simulation and also      //
// the objects produced by the reconstruction.                               //
//                                                                           //
// This class is also responsible for building the geometry of the           //
// detectors.                                                                //
//                                                                           //
//Begin_Html
/*
<img src="picts/AliDetectorClass.gif">
*/
//End_Html
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <TBrowser.h>
#include <TClonesArray.h>
#include <TTree.h>

#include "AliLog.h"
#include "AliConfig.h"
#include "AliDetector.h"
#include "AliHit.h"
#include "AliLoader.h"
#include "AliRun.h"
#include "AliMC.h"


ClassImp(AliDetector)
 
//_______________________________________________________________________
AliDetector::AliDetector():
  AliModule(),
  fTimeGate(200.e-9),
  fIshunt(0),
  fNhits(0),
  fNdigits(0),
  fBufferSize(1600),
  fMaxIterHit(0),
  fCurIterHit(0),
  fHits(0),
  fDigits(0),
  fLoader(0x0)
{
  //
  // Default constructor for the AliDetector class
  //
}
 
//_____________________________________________________________________________
AliDetector::AliDetector(const char* name,const char *title):
  AliModule(name,title),
  fTimeGate(200.e-9),
  fIshunt(0),
  fNhits(0),
  fNdigits(0),
  fBufferSize(1600),
  fMaxIterHit(0),
  fCurIterHit(0),
  fHits(0),
  fDigits(0),
  fLoader(0x0)
{
  //
  // Normal constructor invoked by all Detectors.
  // Create the list for detector specific histograms
  // Add this Detector to the global list of Detectors in Run.
  //

  fActive     = kTRUE;
  AliConfig::Instance()->Add(this);

}
 
//_______________________________________________________________________
AliDetector::~AliDetector()
{
  //
  // Destructor
  //

  // Delete digits structure
  if (fDigits) {
    fDigits->Delete();
    delete fDigits;
    fDigits     = 0;
  }

  if (fLoader)
   {
    fLoader->GetModulesFolder()->Remove(this);
   }

}

//_______________________________________________________________________
void AliDetector::Publish(const char */*dir*/, void */*address*/, const char */*name*/) const
{
//
// Register pointer to detector objects. 
// 
  MayNotUse("Publish");
}

//_______________________________________________________________________
void AliDetector::AddAlignableVolumes() const
{
  // 
  AliWarning(Form("%s still has to implement the AddAlignableVolumes method!",GetName()));
}

//_______________________________________________________________________
TBranch* AliDetector::MakeBranchInTree(TTree *tree, const char* name, 
                                       void* address, Int_t size,
                                       const char *file)
{ 
    return(MakeBranchInTree(tree,name,0,address,size,99,file));
}

//_______________________________________________________________________
TBranch* AliDetector::MakeBranchInTree(TTree *tree, const char* name, 
                                       const char *classname, 
                                       void* address,Int_t size, 
                                       Int_t splitlevel, const char */*file*/)
{ 
//
// Makes branch in given tree and diverts them to a separate file
// 
//
//
    
 AliDebug(2,Form("Making Branch %s",name));
 if (tree == 0x0) 
  {
   AliError(Form("Making Branch %s Tree is NULL",name));
   return 0x0;
  }
 TBranch *branch = tree->GetBranch(name);
 if (branch) 
  {  
    AliDebug(2,Form("Branch %s is already in tree.",name));
    return branch;
  }
    
 if (classname) 
  {
    branch = tree->Branch(name,classname,address,size,splitlevel);
  } 
 else 
  {
    branch = tree->Bronch(name, "TClonesArray", address, size, splitlevel);
  }
 AliDebug(2,Form("Branch %s returning branch %p",name,branch));
 return branch;
}

//_______________________________________________________________________
void AliDetector::Browse(TBrowser *b)
{
  //
  // Insert Detector objects in the list of objects to be browsed
  //
  char name[64]="";
  if( fHits == 0) return;
  TObject *obj;
  Int_t i, nobjects;
  //
  nobjects = fHits->GetEntries();
  for (i=0;i<nobjects;i++) {
    obj = fHits->At(i);
    snprintf(name,63,"%s_%d",obj->GetName(),i);
    b->Add(obj, &name[0]);
  }
}

//_______________________________________________________________________
void AliDetector::FinishRun()
{
  //
  // Procedure called at the end of a run.
  //
}

//_______________________________________________________________________
AliHit* AliDetector::FirstHit(Int_t track)
{
  //
  // Initialise the hit iterator
  // Return the address of the first hit for track
  // If track>=0 the track is read from disk
  // while if track<0 the first hit of the current
  // track is returned
  // 
  if(track>=0) {
    gAlice->GetMCApp()->ResetHits(); //stupid = if N detector this method is called N times
    fLoader->TreeH()->GetEvent(track); //skowron
  }
  //
  fMaxIterHit=fHits->GetEntriesFast();
  fCurIterHit=0;
  if(fMaxIterHit) return dynamic_cast<AliHit*>(fHits->UncheckedAt(0));
  else            return 0;
}

//_______________________________________________________________________
AliHit* AliDetector::NextHit()
{
  //
  // Return the next hit for the current track
  //
  if(fMaxIterHit) {
    if(++fCurIterHit<fMaxIterHit) 
      return dynamic_cast<AliHit*>(fHits->UncheckedAt(fCurIterHit));
    else        
      return 0;
  } else {
    AliWarning("Hit Iterator called without calling FistHit before");
    return 0;
  }
}

//_______________________________________________________________________
void AliDetector::MakeBranch(Option_t *option)
{
  //
  // Create a new branch for this detector in its treeH
  //

  AliDebug(2,Form(" for %s",GetName()));
  const char *cH = strstr(option,"H");

  if (fHits && fLoader->TreeH() && cH) 
   {
     MakeBranchInTree(fLoader->TreeH(), GetName(), &fHits, fBufferSize, 0);
   }	
}

//_______________________________________________________________________
void AliDetector::ResetDigits()
{
  //
  // Reset number of digits and the digits array
  //
  fNdigits   = 0;
  if (fDigits) fDigits->Clear();
}

//_______________________________________________________________________
void AliDetector::ResetHits()
{
  //
  // Reset number of hits and the hits array
  //
  fNhits   = 0;
  if (fHits) fHits->Clear();
}

//_______________________________________________________________________
void AliDetector::SetTreeAddress()
{
  //
  // Set branch address for the Hits and Digits Trees
  //
  TBranch *branch;
  //
  // Branch address for hit tree
  
  TTree* tree = fLoader->TreeH();
  if (tree && fHits) {
    branch = tree->GetBranch(GetName());
    if (branch) 
     {
       AliDebug(2,Form("(%s) Setting for Hits",GetName()));
       branch->SetAddress(&fHits);
     }
    else
     { //can be invoked before branch creation
       AliDebug(2,Form("(%s) Failed for Hits. Can not find branch in tree.",GetName()));
     }
  }
  
  //
  // Branch address for digit tree
  TTree *treeD = fLoader->TreeD();
  if (treeD && fDigits) {
    branch = treeD->GetBranch(GetName());
    if (branch) branch->SetAddress(&fDigits);
  }
}

//_______________________________________________________________________
void AliDetector::MakeTree(Option_t *option)
 {
 //makes a tree (container) for the data defined in option
 //"H" - hits
 //"D" - digits
 //"S" - summable digits
 //"R" - recontructed points and tracks
 
    AliLoader* loader = GetLoader();
    if (loader == 0x0)
     {
       AliError(Form("Can not get loader for %s",GetName()));
       return;
     }
    loader->MakeTree(option); //delegate this job to getter
 }

//_______________________________________________________________________
AliLoader* AliDetector::MakeLoader(const char* topfoldername)
{ 
//builds standard getter (AliLoader type)
//if detector wants to use castomized getter, it must overload this method

 AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
         GetName(),topfoldername));
     
 fLoader = new AliLoader(GetName(),topfoldername);
 return fLoader;
}


 AliDetector.cxx:1
 AliDetector.cxx:2
 AliDetector.cxx:3
 AliDetector.cxx:4
 AliDetector.cxx:5
 AliDetector.cxx:6
 AliDetector.cxx:7
 AliDetector.cxx:8
 AliDetector.cxx:9
 AliDetector.cxx:10
 AliDetector.cxx:11
 AliDetector.cxx:12
 AliDetector.cxx:13
 AliDetector.cxx:14
 AliDetector.cxx:15
 AliDetector.cxx:16
 AliDetector.cxx:17
 AliDetector.cxx:18
 AliDetector.cxx:19
 AliDetector.cxx:20
 AliDetector.cxx:21
 AliDetector.cxx:22
 AliDetector.cxx:23
 AliDetector.cxx:24
 AliDetector.cxx:25
 AliDetector.cxx:26
 AliDetector.cxx:27
 AliDetector.cxx:28
 AliDetector.cxx:29
 AliDetector.cxx:30
 AliDetector.cxx:31
 AliDetector.cxx:32
 AliDetector.cxx:33
 AliDetector.cxx:34
 AliDetector.cxx:35
 AliDetector.cxx:36
 AliDetector.cxx:37
 AliDetector.cxx:38
 AliDetector.cxx:39
 AliDetector.cxx:40
 AliDetector.cxx:41
 AliDetector.cxx:42
 AliDetector.cxx:43
 AliDetector.cxx:44
 AliDetector.cxx:45
 AliDetector.cxx:46
 AliDetector.cxx:47
 AliDetector.cxx:48
 AliDetector.cxx:49
 AliDetector.cxx:50
 AliDetector.cxx:51
 AliDetector.cxx:52
 AliDetector.cxx:53
 AliDetector.cxx:54
 AliDetector.cxx:55
 AliDetector.cxx:56
 AliDetector.cxx:57
 AliDetector.cxx:58
 AliDetector.cxx:59
 AliDetector.cxx:60
 AliDetector.cxx:61
 AliDetector.cxx:62
 AliDetector.cxx:63
 AliDetector.cxx:64
 AliDetector.cxx:65
 AliDetector.cxx:66
 AliDetector.cxx:67
 AliDetector.cxx:68
 AliDetector.cxx:69
 AliDetector.cxx:70
 AliDetector.cxx:71
 AliDetector.cxx:72
 AliDetector.cxx:73
 AliDetector.cxx:74
 AliDetector.cxx:75
 AliDetector.cxx:76
 AliDetector.cxx:77
 AliDetector.cxx:78
 AliDetector.cxx:79
 AliDetector.cxx:80
 AliDetector.cxx:81
 AliDetector.cxx:82
 AliDetector.cxx:83
 AliDetector.cxx:84
 AliDetector.cxx:85
 AliDetector.cxx:86
 AliDetector.cxx:87
 AliDetector.cxx:88
 AliDetector.cxx:89
 AliDetector.cxx:90
 AliDetector.cxx:91
 AliDetector.cxx:92
 AliDetector.cxx:93
 AliDetector.cxx:94
 AliDetector.cxx:95
 AliDetector.cxx:96
 AliDetector.cxx:97
 AliDetector.cxx:98
 AliDetector.cxx:99
 AliDetector.cxx:100
 AliDetector.cxx:101
 AliDetector.cxx:102
 AliDetector.cxx:103
 AliDetector.cxx:104
 AliDetector.cxx:105
 AliDetector.cxx:106
 AliDetector.cxx:107
 AliDetector.cxx:108
 AliDetector.cxx:109
 AliDetector.cxx:110
 AliDetector.cxx:111
 AliDetector.cxx:112
 AliDetector.cxx:113
 AliDetector.cxx:114
 AliDetector.cxx:115
 AliDetector.cxx:116
 AliDetector.cxx:117
 AliDetector.cxx:118
 AliDetector.cxx:119
 AliDetector.cxx:120
 AliDetector.cxx:121
 AliDetector.cxx:122
 AliDetector.cxx:123
 AliDetector.cxx:124
 AliDetector.cxx:125
 AliDetector.cxx:126
 AliDetector.cxx:127
 AliDetector.cxx:128
 AliDetector.cxx:129
 AliDetector.cxx:130
 AliDetector.cxx:131
 AliDetector.cxx:132
 AliDetector.cxx:133
 AliDetector.cxx:134
 AliDetector.cxx:135
 AliDetector.cxx:136
 AliDetector.cxx:137
 AliDetector.cxx:138
 AliDetector.cxx:139
 AliDetector.cxx:140
 AliDetector.cxx:141
 AliDetector.cxx:142
 AliDetector.cxx:143
 AliDetector.cxx:144
 AliDetector.cxx:145
 AliDetector.cxx:146
 AliDetector.cxx:147
 AliDetector.cxx:148
 AliDetector.cxx:149
 AliDetector.cxx:150
 AliDetector.cxx:151
 AliDetector.cxx:152
 AliDetector.cxx:153
 AliDetector.cxx:154
 AliDetector.cxx:155
 AliDetector.cxx:156
 AliDetector.cxx:157
 AliDetector.cxx:158
 AliDetector.cxx:159
 AliDetector.cxx:160
 AliDetector.cxx:161
 AliDetector.cxx:162
 AliDetector.cxx:163
 AliDetector.cxx:164
 AliDetector.cxx:165
 AliDetector.cxx:166
 AliDetector.cxx:167
 AliDetector.cxx:168
 AliDetector.cxx:169
 AliDetector.cxx:170
 AliDetector.cxx:171
 AliDetector.cxx:172
 AliDetector.cxx:173
 AliDetector.cxx:174
 AliDetector.cxx:175
 AliDetector.cxx:176
 AliDetector.cxx:177
 AliDetector.cxx:178
 AliDetector.cxx:179
 AliDetector.cxx:180
 AliDetector.cxx:181
 AliDetector.cxx:182
 AliDetector.cxx:183
 AliDetector.cxx:184
 AliDetector.cxx:185
 AliDetector.cxx:186
 AliDetector.cxx:187
 AliDetector.cxx:188
 AliDetector.cxx:189
 AliDetector.cxx:190
 AliDetector.cxx:191
 AliDetector.cxx:192
 AliDetector.cxx:193
 AliDetector.cxx:194
 AliDetector.cxx:195
 AliDetector.cxx:196
 AliDetector.cxx:197
 AliDetector.cxx:198
 AliDetector.cxx:199
 AliDetector.cxx:200
 AliDetector.cxx:201
 AliDetector.cxx:202
 AliDetector.cxx:203
 AliDetector.cxx:204
 AliDetector.cxx:205
 AliDetector.cxx:206
 AliDetector.cxx:207
 AliDetector.cxx:208
 AliDetector.cxx:209
 AliDetector.cxx:210
 AliDetector.cxx:211
 AliDetector.cxx:212
 AliDetector.cxx:213
 AliDetector.cxx:214
 AliDetector.cxx:215
 AliDetector.cxx:216
 AliDetector.cxx:217
 AliDetector.cxx:218
 AliDetector.cxx:219
 AliDetector.cxx:220
 AliDetector.cxx:221
 AliDetector.cxx:222
 AliDetector.cxx:223
 AliDetector.cxx:224
 AliDetector.cxx:225
 AliDetector.cxx:226
 AliDetector.cxx:227
 AliDetector.cxx:228
 AliDetector.cxx:229
 AliDetector.cxx:230
 AliDetector.cxx:231
 AliDetector.cxx:232
 AliDetector.cxx:233
 AliDetector.cxx:234
 AliDetector.cxx:235
 AliDetector.cxx:236
 AliDetector.cxx:237
 AliDetector.cxx:238
 AliDetector.cxx:239
 AliDetector.cxx:240
 AliDetector.cxx:241
 AliDetector.cxx:242
 AliDetector.cxx:243
 AliDetector.cxx:244
 AliDetector.cxx:245
 AliDetector.cxx:246
 AliDetector.cxx:247
 AliDetector.cxx:248
 AliDetector.cxx:249
 AliDetector.cxx:250
 AliDetector.cxx:251
 AliDetector.cxx:252
 AliDetector.cxx:253
 AliDetector.cxx:254
 AliDetector.cxx:255
 AliDetector.cxx:256
 AliDetector.cxx:257
 AliDetector.cxx:258
 AliDetector.cxx:259
 AliDetector.cxx:260
 AliDetector.cxx:261
 AliDetector.cxx:262
 AliDetector.cxx:263
 AliDetector.cxx:264
 AliDetector.cxx:265
 AliDetector.cxx:266
 AliDetector.cxx:267
 AliDetector.cxx:268
 AliDetector.cxx:269
 AliDetector.cxx:270
 AliDetector.cxx:271
 AliDetector.cxx:272
 AliDetector.cxx:273
 AliDetector.cxx:274
 AliDetector.cxx:275
 AliDetector.cxx:276
 AliDetector.cxx:277
 AliDetector.cxx:278
 AliDetector.cxx:279
 AliDetector.cxx:280
 AliDetector.cxx:281
 AliDetector.cxx:282
 AliDetector.cxx:283
 AliDetector.cxx:284
 AliDetector.cxx:285
 AliDetector.cxx:286
 AliDetector.cxx:287
 AliDetector.cxx:288
 AliDetector.cxx:289
 AliDetector.cxx:290
 AliDetector.cxx:291
 AliDetector.cxx:292
 AliDetector.cxx:293
 AliDetector.cxx:294
 AliDetector.cxx:295
 AliDetector.cxx:296
 AliDetector.cxx:297
 AliDetector.cxx:298
 AliDetector.cxx:299
 AliDetector.cxx:300
 AliDetector.cxx:301
 AliDetector.cxx:302
 AliDetector.cxx:303
 AliDetector.cxx:304
 AliDetector.cxx:305
 AliDetector.cxx:306
 AliDetector.cxx:307
 AliDetector.cxx:308
 AliDetector.cxx:309
 AliDetector.cxx:310
 AliDetector.cxx:311
 AliDetector.cxx:312
 AliDetector.cxx:313
 AliDetector.cxx:314
 AliDetector.cxx:315
 AliDetector.cxx:316
 AliDetector.cxx:317
 AliDetector.cxx:318
 AliDetector.cxx:319
 AliDetector.cxx:320
 AliDetector.cxx:321
 AliDetector.cxx:322
 AliDetector.cxx:323
 AliDetector.cxx:324
 AliDetector.cxx:325
 AliDetector.cxx:326
 AliDetector.cxx:327
 AliDetector.cxx:328
 AliDetector.cxx:329
 AliDetector.cxx:330
 AliDetector.cxx:331
 AliDetector.cxx:332
 AliDetector.cxx:333
 AliDetector.cxx:334
 AliDetector.cxx:335
 AliDetector.cxx:336
 AliDetector.cxx:337
 AliDetector.cxx:338
 AliDetector.cxx:339
 AliDetector.cxx:340
 AliDetector.cxx:341
 AliDetector.cxx:342