Export AliDAQ header file into include
[u/mrichter/AliRoot.git] / RAW / AliTagDB.cxx
1 // @(#)alimdc:$Name$:$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
29 #include "AliESD.h"
30
31 #include "AliRawDB.h"
32 #include "AliRawEventHeaderBase.h"
33 #include "AliTagDB.h"
34
35
36 ClassImp(AliTagDB)
37
38
39 //______________________________________________________________________________
40 AliTagDB::AliTagDB(AliRawEventHeaderBase *header, const char* fileName) :
41   fTagDB(NULL),
42   fTree(NULL),
43   fHeader(header),
44   fMaxSize(-1),
45   fFS(""),
46   fDeleteFiles(kFALSE)
47 {
48    // Create tag DB.
49
50    if (fileName) {
51       if (!Create(fileName))
52          MakeZombie();
53    }
54 }
55
56 //______________________________________________________________________________
57 AliTagDB::AliTagDB(const AliTagDB& tagDB): TObject(tagDB)
58 {
59 // copy constructor
60
61   Fatal("AliTagDB", "copy constructor not implemented");
62 }
63
64 //______________________________________________________________________________
65 AliTagDB& AliTagDB::operator = (const AliTagDB& /*tagDB*/)
66 {
67 // assignment operator
68
69   Fatal("operator =", "assignment operator not implemented");
70   return *this;
71 }
72
73 //______________________________________________________________________________
74 Bool_t AliTagDB::Create(const char* fileName)
75 {
76    // Create a new tag DB.
77
78    const char *name = fileName;
79    if (!name) name = GetFileName();
80    fTagDB = new TFile(name, "RECREATE",
81                       Form("ALICE MDC%d tag DB", AliRawDB::kMDC), 1);
82    if (fTagDB->IsZombie()) {
83       Error("Create", "error opening tag DB");
84       fTagDB = 0;
85       return kFALSE;
86    }
87    // Put wide read-write permissions
88    if(gSystem->Chmod(name,438)) {
89      Error("Create", "can't set permissions for tag DB file");
90      fTagDB = 0;
91      return kFALSE;
92    }
93
94    // Create ROOT Tree object container
95    fTree = new TTree("TAG", Form("ALICE MDC%d header data tree", AliRawDB::kMDC));
96    fTree->SetAutoSave(100000000);  // autosave when 100 Mbyte written
97
98    Int_t bufsize = 32000;
99    Int_t split   = 1;
100    const char *headername = fHeader->GetName();
101    fTree->Branch("header", headername, &fHeader, bufsize, split);
102
103    return kTRUE;
104 }
105
106 //______________________________________________________________________________
107 void AliTagDB::Close()
108 {
109    // Close tag DB.
110
111    if (!fTagDB) return;
112
113    fTagDB->cd();
114
115    // Write the tree.
116    fTree->Write();
117
118    // Close DB, this also deletes the fTree
119    fTagDB->Close();
120
121    if (fDeleteFiles)
122       gSystem->Unlink(fTagDB->GetName());
123
124    delete fTagDB;
125    fTagDB = 0;
126 }
127
128 //______________________________________________________________________________
129 Bool_t AliTagDB::NextFile(const char* fileName)
130 {
131    // Close te current file and open a new one.
132    // Returns kFALSE in case opening failed.
133
134    Close();
135
136    if (!Create(fileName)) return kFALSE;
137    return kTRUE;
138 }
139
140 //______________________________________________________________________________
141 void AliTagDB::SetFS(const char* fs)
142 {
143 // set the file system location
144
145   fFS = fs;
146   if (fs) {
147     gSystem->ResetErrno();
148     gSystem->MakeDirectory(fs);
149     if (gSystem->GetErrno() && gSystem->GetErrno() != EEXIST) {
150       SysError("SetFS", "mkdir %s", fs);
151     }
152   }
153 }
154
155 //______________________________________________________________________________
156 Float_t AliTagDB::GetCompressionFactor() const
157 {
158    // Return compression factor.
159
160    if (fTree->GetZipBytes() == 0.)
161       return 1.0;
162    else
163       return fTree->GetTotBytes()/fTree->GetZipBytes();
164 }
165
166 //______________________________________________________________________________
167 const char *AliTagDB::GetFileName() const
168 {
169    // Return filename based on hostname and date and time. This will make
170    // each file unique. The tags will be stored in the /data1/tags directory.
171
172    static char fname[64];
173    const char *fs = fFS;
174
175    // check that fs exists (crude check fails if fs is a file)
176    gSystem->MakeDirectory(fs);
177
178    char hostname[64];
179
180    strcpy(hostname, gSystem->HostName());
181
182    char *s;
183    if ((s = strchr(hostname, '.')))
184       *s = 0;
185
186    TDatime dt;
187
188    sprintf(fname, "%s/%s_%d_%d.root", fs, hostname, dt.GetDate(), dt.GetTime());
189
190    return fname;
191 }