X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliDetector.cxx;h=71d748b5b2ddc3ef9a386fbd734dfcf045e9f5cc;hb=12e26c263331e2ed324ce5b54927f438b1242985;hp=08355af3b8d9804cca9fa1e36a2caf3a8bd782f8;hpb=4c03906077acc435bf9790b980186e0015ea0b89;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliDetector.cxx b/STEER/AliDetector.cxx index 08355af3b8d..71d748b5b2d 100644 --- a/STEER/AliDetector.cxx +++ b/STEER/AliDetector.cxx @@ -13,9 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // @@ -34,37 +32,74 @@ $Log$ //End_Html // // /////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "AliLog.h" +#include "AliConfig.h" #include "AliDetector.h" -#include "AliRun.h" #include "AliHit.h" #include "AliPoints.h" -#include -#include -#include +#include "AliLoader.h" +#include "AliRun.h" +#include "AliMC.h" -// Static variables for the hit iterator routines -static Int_t sMaxIterHit=0; -static Int_t sCurIterHit=0; 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; } +//_______________________________________________________________________ +AliDetector::AliDetector(const AliDetector &det): + AliModule(det), + fTimeGate(200.e-9), + fIshunt(0), + fNhits(0), + fNdigits(0), + fBufferSize(1600), + fMaxIterHit(0), + fCurIterHit(0), + fHits(0), + fDigits(0), + fPoints(0), + fLoader(0x0) +{ + det.Copy(*this); +} + //_____________________________________________________________________________ -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. @@ -72,32 +107,93 @@ 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; + AliConfig::Instance()->Add(this); + } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliDetector::~AliDetector() { // // Destructor // - fNhits = 0; - fNdigits = 0; - // + // Delete space point structure - if (fPoints) fPoints->Delete(); - delete fPoints; - fPoints = 0; + if (fPoints) { + fPoints->Delete(); + delete fPoints; + fPoints = 0; + } + // 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"); +} + +//_______________________________________________________________________ +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) { // @@ -116,7 +212,16 @@ void AliDetector::Browse(TBrowser *b) } } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliDetector::Copy(TObject &) const +{ + // + // Copy *this onto det -- not implemented + // + AliFatal("Not implemented"); +} + +//_______________________________________________________________________ void AliDetector::FinishRun() { // @@ -124,7 +229,7 @@ void AliDetector::FinishRun() // } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliHit* AliDetector::FirstHit(Int_t track) { // @@ -135,44 +240,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; // @@ -192,24 +305,32 @@ 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(); - 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->fX; - fp[3*ntrk[trk]+1] = ahit->fY; - fp[3*ntrk[trk]+2] = ahit->fZ; + } + fp[3*ntrk[trk] ] = ahit->X(); + fp[3*ntrk[trk]+1] = ahit->Y(); + fp[3*ntrk[trk]+2] = ahit->Z(); ntrk[trk]++; } // @@ -231,46 +352,43 @@ void AliDetector::LoadPoints(Int_t) delete [] limi; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliDetector::MakeBranch(Option_t *option) { // - // Create a new branch in the current Root Tree - // The branch of fHits is automatically split - // - char branchname[10]; - sprintf(branchname,"%s",GetName()); + // Create a new branch for this detector in its treeH // - // Get the pointer to the header - char *H = strstr(option,"H"); - // - if (fHits && gAlice->TreeH() && H) { - gAlice->TreeH()->Branch(branchname,&fHits, fBufferSize); - printf("* AliDetector::MakeBranch * Making Branch %s for hits\n",branchname); - } + + 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() { // @@ -283,64 +401,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::Streamer(TBuffer &R__b) -{ - // - // Stream an object of class Detector. - // - if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - TNamed::Streamer(R__b); - TAttLine::Streamer(R__b); - TAttMarker::Streamer(R__b); - AliModule::Streamer(R__b); - R__b >> fTimeGate; - R__b >> fIshunt; - //R__b >> fNhits; - // - // Stream the pointers but not the TClonesArrays - R__b >> fHits; // diff - R__b >> fDigits; // diff - - } else { - R__b.WriteVersion(AliDetector::IsA()); - TNamed::Streamer(R__b); - TAttLine::Streamer(R__b); - TAttMarker::Streamer(R__b); - AliModule::Streamer(R__b); - R__b << fTimeGate; - R__b << fIshunt; - //R__b << fNhits; - // - // Stream the pointers but not the TClonesArrays - R__b << fHits; // diff - R__b << fDigits; // diff - } +//_______________________________________________________________________ +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; +} +