Always delete TObjArrays created by TString::Tokenize (Ruben)
[u/mrichter/AliRoot.git] / RAW / AliTagDB.cxx
1 // @(#) $Id$
2 // Author: Fons Rademakers  26/11/99
3
4 /**************************************************************************
5  * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
6  *                                                                        *
7  * Author: The ALICE Off-line Project.                                    *
8  * Contributors are mentioned in the code where appropriate.              *
9  *                                                                        *
10  * Permission to use, copy, modify and distribute this software and its   *
11  * documentation strictly for non-commercial purposes is hereby granted   *
12  * without fee, provided that the above copyright notice appears in all   *
13  * copies and that both the copyright notice and this permission notice   *
14  * appear in the supporting documentation. The authors make no claims     *
15  * about the suitability of this software for any purpose. It is          *
16  * provided "as is" without express or implied warranty.                  *
17  **************************************************************************/
18
19 //////////////////////////////////////////////////////////////////////////
20 //                                                                      //
21 // AliTagDB                                                             //
22 //                                                                      //
23 //////////////////////////////////////////////////////////////////////////
24
25 #include <errno.h>
26
27 #include <TSystem.h>
28 #include <TTimeStamp.h>
29 #include <TBranch.h>
30
31 #include "AliESD.h"
32
33 #include "AliRawDB.h"
34 #include "AliRawEventTag.h"
35 #include "AliTagDB.h"
36 #include "AliRawEventHeaderBase.h"
37
38
39 ClassImp(AliTagDB)
40
41
42 //______________________________________________________________________________
43 AliTagDB::AliTagDB(AliRawEventTag *eventTag, const char* fileName) :
44   fTagDB(NULL),
45   fTree(NULL),
46   fEventTag(eventTag),
47   fMaxSize(-1),
48   fFS(""),
49   fDeleteFiles(kFALSE)
50 {
51    // Create tag DB.
52
53    if (fileName) {
54       if (!Create(fileName))
55          MakeZombie();
56    }
57 }
58
59 static void BranchResetBit(TBranch *b) 
60 {
61   // Reset MapObject on this branch and all the sub-branches
62
63   b->ResetBit( kBranchObject | kBranchAny ); // Or in newer ROOT: b->ResetBit( kMapObject )
64   TIter next( b->GetListOfBranches() );
65   TBranch *sub = 0;
66   while ( (sub = (TBranch*)next() ) ) {
67     BranchResetBit( sub );
68   }
69 }
70
71 //______________________________________________________________________________
72 Bool_t AliTagDB::Create(const char* fileName)
73 {
74    // Create a new tag DB.
75
76    const char *name = fileName;
77    if (!name) name = GetFileName();
78    fTagDB = new TFile(name, "RECREATE",
79                       Form("ALICE tag DB (%s)", AliRawDB::GetAliRootTag()), 1);
80    if (fTagDB->IsZombie()) {
81       Error("Create", "error opening tag DB");
82       fTagDB = 0;
83       return kFALSE;
84    }
85    // Put wide read-write permissions
86    if(gSystem->Chmod(name,438)) {
87      Error("Create", "can't set permissions for tag DB file");
88      fTagDB = 0;
89      return kFALSE;
90    }
91
92    // Create ROOT Tree object container
93    fTree = new TTree("T", Form("ALICE raw-data tag tree (%s)", AliRawDB::GetAliRootTag()));
94    fTree->SetAutoSave(100000000);  // autosave when 100 Mbyte written
95
96    Int_t bufsize = 32000;
97    Int_t split   = 1;
98    const char *tagname = fEventTag->GetName();
99    TBranch * b = fTree->Branch("TAG", tagname, &fEventTag, bufsize, split);
100    BranchResetBit(b);
101
102    return kTRUE;
103 }
104
105 //______________________________________________________________________________
106 void AliTagDB::Close()
107 {
108    // Close tag DB.
109
110    if (!fTagDB) return;
111
112    fTagDB->cd();
113
114    // Write the tree.
115    fTree->Write();
116
117    // Close DB, this also deletes the fTree
118    fTagDB->Close();
119
120    if (fDeleteFiles)
121       gSystem->Unlink(fTagDB->GetName());
122
123    delete fTagDB;
124    fTagDB = 0;
125 }
126
127 //______________________________________________________________________________
128 Bool_t AliTagDB::NextFile(const char* fileName)
129 {
130    // Close te current file and open a new one.
131    // Returns kFALSE in case opening failed.
132
133    Close();
134
135    if (!Create(fileName)) return kFALSE;
136    return kTRUE;
137 }
138
139 //______________________________________________________________________________
140 void AliTagDB::SetFS(const char* fs)
141 {
142 // set the file system location
143
144   fFS = fs;
145   if (fs) {
146     gSystem->ResetErrno();
147     gSystem->MakeDirectory(fs);
148     if (gSystem->GetErrno() && gSystem->GetErrno() != EEXIST) {
149       SysError("SetFS", "mkdir %s", fs);
150     }
151   }
152 }
153
154 //______________________________________________________________________________
155 Float_t AliTagDB::GetCompressionFactor() const
156 {
157    // Return compression factor.
158
159    if (fTree->GetZipBytes() == 0.)
160       return 1.0;
161    else
162       return fTree->GetTotBytes()/fTree->GetZipBytes();
163 }
164
165 //______________________________________________________________________________
166 const char *AliTagDB::GetFileName() const
167 {
168    // Return filename based on hostname and date and time. This will make
169    // each file unique. The tags will be stored in the /data1/tags directory.
170
171    static TString fname;
172    const char *fs = fFS;
173
174    // check that fs exists (crude check fails if fs is a file)
175    gSystem->MakeDirectory(fs);
176
177    // Get the run number
178    Int_t runNumber = -1;
179    if (fEventTag) {
180      AliRawEventHeaderBase *header = fEventTag->GetHeader();
181      if (header) runNumber = header->Get("RunNb");
182    }
183
184    TString hostname;
185    hostname.Form("%s",gSystem->HostName());
186    if ( hostname.First('.') > 0 ) hostname.Resize(hostname.First('.'));
187
188    TTimeStamp ts;
189
190    fname.Form("%s/Run%d.%s_%d_%d_%d.RAW.tag.root", fs, runNumber, hostname.Data(),
191               ts.GetDate(), ts.GetTime(), ts.GetNanoSec());
192
193    return fname.Data();
194 }