- bugfix component handler: library load via gSystem pretended to fail in some
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 11 Apr 2008 14:43:36 +0000 (14:43 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 11 Apr 2008 14:43:36 +0000 (14:43 +0000)
  case although it was ok
- bagfix AliHLTEsdManager: corrected list handling, copying of ESDs and merging
  of separate event ESDs into one still needs some fix in AliESDEvent
- TPCEsdWriter: add ESD to user info in order to save the actual ESD layout

HLT/BASE/AliHLTComponentHandler.cxx
HLT/BASE/AliHLTOUT.h
HLT/TPCLib/AliHLTTPCEsdWriterComponent.cxx
HLT/rec/AliHLTEsdManager.cxx
HLT/rec/AliHLTEsdManager.h
HLT/rec/AliHLTReconstructor.cxx

index 486d513..c26cc14 100644 (file)
@@ -346,7 +346,7 @@ int AliHLTComponentHandler::LoadLibrary( const char* libraryPath, int bActivateA
        hLib.fHandle=pRootHandle;
     }
     
-    if (hLib.fHandle==NULL && gSystem->Load(libraryPath)==0) {
+    if (hLib.fHandle==NULL && gSystem->Load(libraryPath)>=0) {
       int* pRootHandle=new int;
       if (pRootHandle) *pRootHandle=1;
       hLib.fHandle=pRootHandle;
index 2e923b6..fd67d6e 100644 (file)
@@ -352,6 +352,7 @@ class AliHLTOUT : public AliHLTLogging {
    * The current list entries are checked if the handler is already in
    * the list. It is added if not in the list, otherwise the block index
    * is added to the existing entry.
+   * @param list     the handler list
    * @param entry    handler list entry
    * @return 0 if added, EEXIST (non negative!) if merged with existing entry <br>
    *         neg. error code if failed
index 4e0b518..7e92e3a 100644 (file)
@@ -34,6 +34,7 @@
 #include "AliESDEvent.h"
 #include "AliESDtrack.h"
 #include "TTree.h"
+#include "TList.h"
 #include "AliHLTTPCTrack.h"
 #include "AliHLTTPCTrackArray.h"
 #include "AliHLTTPCTrackletDataFormat.h"
@@ -108,13 +109,21 @@ int AliHLTTPCEsdWriterComponent::AliWriter::CloseWriter()
   // see header file for class documentation
   int iResult=0;
   if (fTree) {
+    // the esd structure is written to the user info and is
+    // needed in te ReadFromTree method to read all objects correctly
+    if (fESD) fTree->GetUserInfo()->Add(fESD);
     WriteObject(kAliHLTVoidEventID, fTree);
+    fTree->GetUserInfo()->Clear();
     TTree* pTree=fTree;
     fTree=NULL;
     delete pTree;
   } else {
     HLTWarning("not initialized");
   }
+
+  if (fESD) {
+    delete fESD;
+  }
   iResult=AliHLTRootFileWriterComponent::CloseWriter();
   return iResult;
 }
@@ -272,8 +281,8 @@ AliHLTComponentDataType AliHLTTPCEsdWriterComponent::AliConverter::GetOutputData
 void AliHLTTPCEsdWriterComponent::AliConverter::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
 {
   // see header file for class documentation
-  constBase=1000000;
-  inputMultiplier=5.0;
+  constBase=2000000;
+  inputMultiplier=10.0;
 }
 
 int AliHLTTPCEsdWriterComponent::AliConverter::DoInit(int argc, const char** argv)
@@ -339,13 +348,20 @@ int AliHLTTPCEsdWriterComponent::AliConverter::DoEvent(const AliHLTComponentEven
 
     if ((iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt))>=0) {
        // TODO: set the specification correctly
-      if (pTree)
+      if (pTree) {
+       // the esd structure is written to the user info and is
+       // needed in te ReadFromTree method to read all objects correctly
+       pTree->GetUserInfo()->Add(pESD);
        iResult=PushBack(pTree, kAliHLTDataTypeESDTree|kAliHLTDataOriginTPC, 0);
-      else
+      } else {
        iResult=PushBack(pESD, kAliHLTDataTypeESDObject|kAliHLTDataOriginTPC, 0);
+      }
     }
-    if (pTree)
+    if (pTree) {
+      // clear user info list to prevent objects from being deleted
+      pTree->GetUserInfo()->Clear();
       delete pTree;
+    }
 
     delete pESD;
   }
index 66049b8..ed22b38 100644 (file)
@@ -31,6 +31,7 @@
 #include "TTree.h"
 #include "TClass.h"
 #include "TObject.h"
+#include "TObjectTable.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTEsdManager)
@@ -49,6 +50,12 @@ AliHLTEsdManager::AliHLTEsdManager()
 AliHLTEsdManager::~AliHLTEsdManager()
 {
   // see header file for class documentation
+  for (unsigned int i=0; i<fESDs.size(); i++) {
+    if (fESDs[i]) {
+      delete fESDs[i];
+    }
+    fESDs[i]=NULL;
+  }
 }
 
 AliHLTEsdManager::AliHLTEsdListEntry* AliHLTEsdManager::Find(AliHLTComponentDataType dt) const
@@ -56,8 +63,8 @@ AliHLTEsdManager::AliHLTEsdListEntry* AliHLTEsdManager::Find(AliHLTComponentData
   // see header file for class documentation
   AliHLTEsdListEntry* pEntry=NULL;
   for (unsigned int i=0; i<fESDs.size(); i++) {
-    if (fESDs[i]==dt) {
-      pEntry=const_cast<AliHLTEsdListEntry*>(&fESDs[i]);
+    if (fESDs[i] && *(fESDs[i])==dt) {
+      pEntry=const_cast<AliHLTEsdListEntry*>(fESDs[i]);
     }
   }
   return pEntry;
@@ -99,7 +106,7 @@ int AliHLTEsdManager::WriteESD(const AliHLTUInt8_t* pBuffer, AliHLTUInt32_t size
       if (pESD) {
        AliHLTEsdListEntry* entry=Find(dt);
        if (!entry) {
-         AliHLTEsdListEntry newEntry(dt);
+         AliHLTEsdListEntry* newEntry=new AliHLTEsdListEntry(dt);
          fESDs.push_back(newEntry);
        }
        if (tgtesd) {
@@ -138,41 +145,22 @@ AliHLTEsdManager::AliHLTEsdListEntry::AliHLTEsdListEntry(AliHLTComponentDataType
   // see header file for class documentation
 }
 
-AliHLTEsdManager::AliHLTEsdListEntry::AliHLTEsdListEntry(const AliHLTEsdListEntry& src)
-  :
-  AliHLTLogging(),
-  fName(src.fName),
-  fpFile(src.fpFile),
-  fpTree(src.fpTree),
-  fpEsd(src.fpEsd),
-  fDt(src.fDt)
-{
-  // copy constructor copies everything including pointers
-}
-
-AliHLTEsdManager::AliHLTEsdListEntry& AliHLTEsdManager::AliHLTEsdListEntry::operator=(const AliHLTEsdListEntry& src)
-{
-  // assignment operator copies everything including pointers
-  fName=src.fName;
-  fpFile=src.fpFile;
-  fpTree=src.fpTree;
-  fpEsd=src.fpEsd;
-  fDt=src.fDt;
-  return *this;
-}
-
 AliHLTEsdManager::AliHLTEsdListEntry::~AliHLTEsdListEntry()
 {
   // see header file for class documentation
   if (fpTree) {
+    fpTree->GetUserInfo()->Clear();
     delete fpTree;
     fpTree=NULL;
   }
 
-  if (fpEsd) {
+  // due to the Root garbage collection the ESD object might already be
+  // deleted since the pTree->GetUserInfo()->Add(pESD) adds the ESD object to
+  // an internal list which is cleaned when the tree is deleted
+  if (fpEsd && gObjectTable->PtrIsValid(fpEsd)) {
     delete fpEsd;
-    fpEsd=NULL;
   }
+  fpEsd=NULL;
 
   if (fpFile) {
     fpFile->Close();
@@ -217,6 +205,8 @@ int AliHLTEsdManager::AliHLTEsdListEntry::WriteESD(AliESDEvent* pESD, int eventn
       fpTree=new TTree("esdTree", "Tree with HLT ESD objects");
       if (!fpTree) {
        iResult=-ENOMEM;
+      } else {
+       fpTree->SetDirectory(0);
       }
     }
     if (fpTree && iResult>=0) {
@@ -225,7 +215,7 @@ int AliHLTEsdManager::AliHLTEsdListEntry::WriteESD(AliESDEvent* pESD, int eventn
        fpEsd=new AliESDEvent;
        if (fpEsd) {
          fpEsd->CreateStdContent();
-         fpEsd->WriteToTree(fpTree);
+         fpTree->GetUserInfo()->Add(fpEsd);
        } else {
          iResult=-ENOMEM;
        }
@@ -248,11 +238,17 @@ int AliHLTEsdManager::AliHLTEsdListEntry::WriteESD(AliESDEvent* pESD, int eventn
        // used for filling
        TTree* dummy=new TTree("dummy","dummy");
        if (dummy) {
+         /*
+         dummy->SetDirectory(0);
          pESD->WriteToTree(dummy);
          dummy->Fill();
+         dummy->GetUserInfo()->Add(pESD);
          fpEsd->ReadFromTree(dummy);
          dummy->GetEvent(0);
+         */
+         fpEsd->WriteToTree(fpTree);
          fpTree->Fill();
+         dummy->GetUserInfo()->Clear();
          delete dummy;
        } else {
          iResult=-ENOMEM;
index f1469be..b02f020 100644 (file)
@@ -59,10 +59,6 @@ class AliHLTEsdManager : public AliHLTLogging {
   public:
     /** constructor */
     AliHLTEsdListEntry(AliHLTComponentDataType dt);
-    /** copy constructor */
-    AliHLTEsdListEntry(const AliHLTEsdListEntry& src);
-    /** assignment operator */
-    AliHLTEsdListEntry& operator=(const AliHLTEsdListEntry& src);
     /** destructor */
     ~AliHLTEsdListEntry();
 
@@ -80,6 +76,10 @@ class AliHLTEsdManager : public AliHLTLogging {
     bool operator==(AliHLTComponentDataType dt) const;
 
   private:
+    /** copy constructor prohibited */
+    AliHLTEsdListEntry(const AliHLTEsdListEntry& src);
+    /** assignment operator prohibited */
+    AliHLTEsdListEntry& operator=(const AliHLTEsdListEntry& src);
 
     /** root file name */
     TString fName; //!transient
@@ -93,7 +93,7 @@ class AliHLTEsdManager : public AliHLTLogging {
     AliHLTComponentDataType fDt; //!transient
   };
 
-  typedef vector<AliHLTEsdListEntry> AliHLTEsdList;
+  typedef vector<AliHLTEsdListEntry*> AliHLTEsdPList;
 
   /**
    * Find list entry for given data type
@@ -101,7 +101,7 @@ class AliHLTEsdManager : public AliHLTLogging {
   AliHLTEsdListEntry* Find(AliHLTComponentDataType dt) const;
 
   /** the list of the ESDs */
-  AliHLTEsdList fESDs; //!transient
+  AliHLTEsdPList fESDs; //!transient
 
   ClassDef(AliHLTEsdManager, 0)
 };
index 384df79..a8648cd 100644 (file)
@@ -263,11 +263,6 @@ void AliHLTReconstructor::ProcessHLTOUT(AliHLTOUT* pHLTOUT, AliESDEvent* esd) co
     return;
   }
 
-  // postpone the processing until a few issues have been solved
-  // - copying of ESDs
-  // - HLT loader
-  return;
-
   if (fFctProcessHLTOUT) {
     typedef int (*AliHLTSystemProcessHLTOUT)(AliHLTSystem* pInstance, AliHLTOUT* pHLTOUT, AliESDEvent* esd);
     AliHLTSystemProcessHLTOUT pFunc=(AliHLTSystemProcessHLTOUT)fFctProcessHLTOUT;