Line data Source code
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 : // AliRawRFIODB //
22 : // //
23 : //////////////////////////////////////////////////////////////////////////
24 :
25 : #include <TSystem.h>
26 : #include <TUrl.h>
27 :
28 : #include "AliRawRFIODB.h"
29 :
30 :
31 2 : ClassImp(AliRawRFIODB)
32 :
33 :
34 : //______________________________________________________________________________
35 : AliRawRFIODB::AliRawRFIODB(AliRawEventV2 *event,
36 : AliESDEvent *esd,
37 : Int_t compress,
38 : const char* fileName,Int_t basketsize, Long64_t autoflush)
39 0 : : AliRawDB(event, esd, compress, fileName, basketsize, autoflush)
40 0 : {
41 : // Create a new raw DB that will be accessed via RFIO.
42 :
43 : static int init = 0;
44 : // Set STAGE_POOL environment variable to current host
45 0 : if (!init) {
46 : // THESE ENVIRONMENT SYMBOLS ARE NOW DEFINED BY THE ALICE DATE SETUP
47 : // THEREFORE WE SHALL NOT USE ANY HARDCODED VALUES BUT RATHER USE
48 : // WHATEVER HAS BEEN SET IN THE DATE SITE
49 : //gSystem->Setenv("STAGE_POOL", "lcg00");
50 : //gSystem->Setenv("STAGE_HOST", "stage013");
51 :
52 : // however for sanity we check if they are really set
53 0 : if (!gSystem->Getenv("STAGE_POOL"))
54 0 : Error("AliRawRFIODB", "STAGE_POOL not set");
55 0 : if (!gSystem->Getenv("STAGE_HOST"))
56 0 : Error("AliRawRFIODB", "STAGE_HOST not set");
57 0 : init = 1;
58 0 : }
59 : #if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
60 0 : if (fRawDB) fRawDB->UseCache(50, 0x200000); //0x100000 = 1MB)
61 : #endif
62 0 : }
63 :
64 : //______________________________________________________________________________
65 : const char *AliRawRFIODB::GetFileName() const
66 : {
67 : // Return filename based on hostname and date and time. This will make
68 : // each file unique. Also the directory will be made unique for each
69 : // day by adding the date to the fs. Assumes there is always enough
70 : // space on the device.
71 :
72 0 : static TString fname;
73 :
74 0 : TString fs = fFS1;
75 0 : TDatime dt;
76 :
77 : // make a new subdirectory for each day
78 0 : fs += "/adc-";
79 0 : fs += dt.GetDate();
80 :
81 0 : Long_t id, size, flags, time;
82 0 : if (gSystem->GetPathInfo(fs, &id, &size, &flags, &time) == 1) {
83 : // directory does not exist, create it
84 0 : if (gSystem->mkdir(fs, kTRUE) == -1) {
85 0 : Error("GetFileName", "cannot create dir %s, using %s", fs.Data(),
86 0 : fFS1.Data());
87 0 : fs = fFS1;
88 : }
89 : }
90 : // FIXME: should check if fs is a directory
91 :
92 0 : TString hostname = gSystem->HostName();
93 : Int_t pos;
94 0 : if ((pos = hostname.Index(".")) != kNPOS)
95 0 : hostname.Remove(pos);
96 :
97 0 : fname = fs + "/" + hostname + "_";
98 0 : fname += dt.GetDate();
99 0 : fname += "_";
100 0 : fname += dt.GetTime();
101 0 : fname += ".root";
102 :
103 0 : return fname;
104 0 : }
105 :
106 : //______________________________________________________________________________
107 : Long64_t AliRawRFIODB::Close()
108 : {
109 : // Close raw RFIO DB.
110 :
111 0 : if (!fRawDB) return 0;
112 :
113 0 : if (!fRawDB->IsOpen()) return 0;
114 :
115 0 : fRawDB->cd();
116 :
117 : // Write the tree.
118 : Bool_t error = kFALSE;
119 0 : if (fTree)
120 0 : if (fTree->Write() == 0)
121 0 : error = kTRUE;
122 0 : if (fESDTree)
123 0 : if (fESDTree->Write() == 0)
124 0 : error = kTRUE;
125 :
126 : // Close DB, this also deletes the fTree
127 0 : fRawDB->Close();
128 :
129 0 : fTree = NULL;
130 :
131 0 : Long64_t filesize = fRawDB->GetEND();
132 :
133 0 : if (fDeleteFiles) {
134 0 : TUrl u(fRawDB->GetName());
135 0 : gSystem->Exec(Form("rfrm %s", u.GetFile()));
136 0 : }
137 :
138 0 : delete fRawDB;
139 0 : fRawDB = 0;
140 :
141 0 : if(!error)
142 0 : return filesize;
143 : else
144 0 : return -1;
145 0 : }
|