X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliDetector.cxx;h=3bf71256b19e89e76be33613dd2ca130fe70e431;hb=d41276fc746c7d26a19d90c0565b2da05e82023d;hp=84402dbe7fc371bfe250d263fec92096a95c3a61;hpb=2ab0c72500f5baaae8a0a5299ab6566b50c278b4;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliDetector.cxx b/STEER/AliDetector.cxx index 84402dbe7fc..3bf71256b19 100644 --- a/STEER/AliDetector.cxx +++ b/STEER/AliDetector.cxx @@ -13,27 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.10 2001/01/17 10:50:50 hristov -Corrections to destructors - -Revision 1.9 2000/12/12 18:19:06 alibrary -Introduce consistency check when loading points - -Revision 1.8 2000/11/30 07:12:48 alibrary -Introducing new Rndm and QA classes - -Revision 1.7 2000/10/02 21:28:14 fca -Removal of useless dependecies via forward declarations - -Revision 1.6 2000/07/12 08:56:25 fca -Coding convention correction and warning removal - -Revision 1.5 1999/09/29 09:24:29 fca -Introduction of the Copyright and cvs Log - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // @@ -53,40 +33,56 @@ Introduction of the Copyright and cvs Log // // /////////////////////////////////////////////////////////////////////////////// -#include - -#include #include -#include +#include +#include +#include "AliLog.h" +#include "AliConfig.h" #include "AliDetector.h" -#include "AliRun.h" #include "AliHit.h" #include "AliPoints.h" -// Static variables for the hit iterator routines -static Int_t sMaxIterHit=0; -static Int_t sCurIterHit=0; +#include "AliLoader.h" +#include "AliRun.h" +#include "AliMC.h" + ClassImp(AliDetector) -//_____________________________________________________________________________ -AliDetector::AliDetector() +//_______________________________________________________________________ +AliDetector::AliDetector(): + AliModule(), + fTimeGate(200.e-9), + fIshunt(0), + fNhits(0), + fNdigits(0), + fBufferSize(1600), + fMaxIterHit(0), + fCurIterHit(0), + fHits(0), + fDigits(0), + fPoints(0), + fLoader(0x0) { // // Default constructor for the AliDetector class // - fNhits = 0; - fNdigits = 0; - fPoints = 0; - fHits = 0; - fDigits = 0; - fTimeGate = 200.e-9; - fBufferSize = 16000; - fDigitsFile = 0; } //_____________________________________________________________________________ -AliDetector::AliDetector(const char* name,const char *title):AliModule(name,title) +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), + fPoints(0), + fLoader(0x0) { // // Normal constructor invoked by all Detectors. @@ -94,26 +90,18 @@ AliDetector::AliDetector(const char* name,const char *title):AliModule(name,titl // Add this Detector to the global list of Detectors in Run. // - fTimeGate = 200.e-9; fActive = kTRUE; - fNhits = 0; - fHits = 0; - fDigits = 0; - fNdigits = 0; - fPoints = 0; - fBufferSize = 16000; - fDigitsFile = 0; + AliConfig::Instance()->Add(this); + } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliDetector::~AliDetector() { // // Destructor // - fNhits = 0; - fNdigits = 0; - // + // Delete space point structure if (fPoints) { fPoints->Delete(); @@ -126,10 +114,76 @@ AliDetector::~AliDetector() delete fDigits; fDigits = 0; } - if (fDigitsFile) delete [] fDigitsFile; + + 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 %#x",name,branch)); + return branch; +} + +//_______________________________________________________________________ void AliDetector::Browse(TBrowser *b) { // @@ -148,16 +202,7 @@ void AliDetector::Browse(TBrowser *b) } } -//_____________________________________________________________________________ -void AliDetector::Copy(AliDetector &det) const -{ - // - // Copy *this onto det -- not implemented - // - Fatal("Copy","Not implemented~\n"); -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::FinishRun() { // @@ -165,7 +210,7 @@ void AliDetector::FinishRun() // } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliHit* AliDetector::FirstHit(Int_t track) { // @@ -176,44 +221,52 @@ AliHit* AliDetector::FirstHit(Int_t track) // track is returned // if(track>=0) { - gAlice->ResetHits(); - gAlice->TreeH()->GetEvent(track); + gAlice->ResetHits(); //stupid = if N detector this method is called N times + TreeH()->GetEvent(track); //skowron } // - sMaxIterHit=fHits->GetEntriesFast(); - sCurIterHit=0; - if(sMaxIterHit) return (AliHit*) fHits->UncheckedAt(0); + fMaxIterHit=fHits->GetEntriesFast(); + fCurIterHit=0; + if(fMaxIterHit) return dynamic_cast(fHits->UncheckedAt(0)); else return 0; } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliHit* AliDetector::NextHit() { // // Return the next hit for the current track // - if(sMaxIterHit) { - if(++sCurIterHitUncheckedAt(sCurIterHit); + if(fMaxIterHit) { + if(++fCurIterHit(fHits->UncheckedAt(fCurIterHit)); else return 0; } else { - printf("* AliDetector::NextHit * Hit Iterator called without calling FistHit before\n"); + AliWarning("Hit Iterator called without calling FistHit before"); return 0; } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::LoadPoints(Int_t) { // // Store x, y, z of all hits in memory // - if (fHits == 0) return; + if (fHits == 0) + { + AliError(Form("fHits == 0. Name is %s",GetName())); + return; + } // Int_t nhits = fHits->GetEntriesFast(); - if (nhits == 0) return; - Int_t tracks = gAlice->GetNtrack(); + if (nhits == 0) + { +// Error("LoadPoints","nhits == 0. Name is %s",GetName()); + return; + } + Int_t tracks = gAlice->GetMCApp()->GetNtrack(); if (fPoints == 0) fPoints = new TObjArray(tracks); AliHit *ahit; // @@ -233,22 +286,29 @@ void AliDetector::LoadPoints(Int_t) // // Loop over all the hits and store their position for (Int_t hit=0;hitUncheckedAt(hit); + ahit = dynamic_cast(fHits->UncheckedAt(hit)); trk=ahit->GetTrack(); - assert(trk<=tracks); - if(ntrk[trk]==limi[trk]) { + if(trk>tracks) { + AliError(Form("Found track number %d, max track %d",trk, tracks)); + continue; + } + if(ntrk[trk]==limi[trk]) + { // // Initialise a new track fp=new Float_t[3*(limi[trk]+chunk)]; - if(coor[trk]) { - memcpy(fp,coor[trk],sizeof(Float_t)*3*limi[trk]); - delete [] coor[trk]; - } + if(coor[trk]) + { + memcpy(fp,coor[trk],sizeof(Float_t)*3*limi[trk]); + delete [] coor[trk]; + } limi[trk]+=chunk; coor[trk] = fp; - } else { + } + else + { fp = coor[trk]; - } + } fp[3*ntrk[trk] ] = ahit->X(); fp[3*ntrk[trk]+1] = ahit->Y(); fp[3*ntrk[trk]+2] = ahit->Z(); @@ -258,11 +318,11 @@ void AliDetector::LoadPoints(Int_t) for(trk=0; trkSetMarkerColor(GetMarkerColor()); - points->SetMarkerSize(GetMarkerSize()); + points->SetMarkerColor(3); //PH color=3 was set in AliModule + points->SetMarkerSize(1); //PH size-1 is the default value points->SetDetector(this); points->SetParticle(trk); - points->SetPolyMarker(ntrk[trk],coor[trk],GetMarkerStyle()); + points->SetPolyMarker(ntrk[trk],coor[trk],1);//PH style=1 is the default value fPoints->AddAt(points,trk); delete [] coor[trk]; coor[trk]=0; @@ -273,56 +333,43 @@ void AliDetector::LoadPoints(Int_t) delete [] limi; } -//_____________________________________________________________________________ -void AliDetector::MakeBranch(Option_t *option, char *file) +//_______________________________________________________________________ +void AliDetector::MakeBranch(Option_t *option) { // - // Create a new branch in the current Root Tree - // The branch of fHits is automatically split + // Create a new branch for this detector in its treeH // - - char branchname[10]; - sprintf(branchname,"%s",GetName()); - // - // Get the pointer to the header - char *cH = strstr(option,"H"); - // - if (fHits && gAlice->TreeH() && cH) { - gAlice->MakeBranchInTree(gAlice->TreeH(), - branchname, &fHits, fBufferSize, file) ; - } - - char *cD = strstr(option,"D"); - if (cD) { - if (file) { - fDigitsFile = new char[strlen (file)]; - strcpy(fDigitsFile,file); - } - } + AliDebug(2,Form(" for %s",GetName())); + const char *cH = strstr(option,"H"); + + if (fHits && TreeH() && cH) + { + MakeBranchInTree(TreeH(), GetName(), &fHits, fBufferSize, 0); + } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::ResetDigits() { // // Reset number of digits and the digits array // fNdigits = 0; - if (fDigits) fDigits->Clear(); + if (fDigits) fDigits->Clear(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::ResetHits() { // // Reset number of hits and the hits array // fNhits = 0; - if (fHits) fHits->Clear(); + if (fHits) fHits->Clear(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::ResetPoints() { // @@ -335,29 +382,84 @@ void AliDetector::ResetPoints() } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::SetTreeAddress() { // // Set branch address for the Hits and Digits Trees // TBranch *branch; - char branchname[20]; - sprintf(branchname,"%s",GetName()); // // Branch address for hit tree - TTree *treeH = gAlice->TreeH(); - if (treeH && fHits) { - branch = treeH->GetBranch(branchname); - if (branch) branch->SetAddress(&fHits); + + TTree *tree = 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 = gAlice->TreeD(); + TTree *treeD = fLoader->TreeD(); if (treeD && fDigits) { - branch = treeD->GetBranch(branchname); + branch = treeD->GetBranch(GetName()); if (branch) branch->SetAddress(&fDigits); } + + AliModule::SetTreeAddress(); } +//_______________________________________________________________________ +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; +} + +//_______________________________________________________________________ +TTree* AliDetector::TreeH() const +{ +//Get the hits container from the folder + if (GetLoader() == 0x0) + { + //sunstitude this with make getter when we can obtain the event folder name + AliError("Can not get the getter"); + return 0x0; + } + + TTree* tree = (TTree*)GetLoader()->TreeH(); + return tree; +} +