ROOT logo
// @(#)root/gfal:$Id$
// Author: Fons Rademakers   8/12/2005

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGFALFile                                                            //
//                                                                      //
// A TGFALFile is like a normal TFile except that it reads and writes   //
// its data via the underlaying Grid access mechanism.                  //
// TGFALFile file names are either a logical file name, a guid, an      //
// SURL or a TURL, like:                                                //
//                                                                      //
//    gfal:/lfn/user/r/rdm/galice.root                                  //
//                                                                      //
// Grid storage interactions today require using several existing       //
// software components:                                                 //
//  - The replica catalog services to locate valid replicas of          //
//    files.                                                            //
//  - The SRM software to ensure:                                       //
//     - files  exist on disk (they are recalled from mass              //
//       storage if necessary) or                                       //
//     - space is allocated on disk for new files (they are possibly    //
//       migrated to mass storage later)                                //
//  - A file access mechanism to access files from the storage          //
//    system on the worker node.                                        //
//                                                                      //
// The GFAL library hides these interactions and presents a Posix       //
// interface for the I/O operations. The currently supported protocols  //
// are: file for local access, dcap, gsidcap and kdcap (dCache access   //
// protocol) and rfio (CASTOR access protocol).                         //
//                                                                      //
// File naming convention:                                              //
// A file name can be a Logical File Name (LFN), a Grid Unique          //
// IDentifier (GUID), a file replica (SURL) or a Transport file         //
// name (TURL):                                                         //
//                                                                      //
//     an LFN starts with lfn:                                          //
//        for example lfn:baud/testgfal15                               //
//                                                                      //
//     a GUID starts with guid:                                         //
//        for example guid:2cd59291-7ae7-4778-af6d-b1f423719441         //
//                                                                      //
//     an SURL starts with srm://                                       //
//         for example srm://wacdr002d.cern.ch:8443/castor/             //
//                    cern.ch/user/b/baud/testgfal15                    //
//                                                                      //
//      a TURL starts with a protocol name:                             //
//          for example rfio:///castor/cern.ch/user/b/baud/testgfal15   //
//                                                                      //
// Note that for the TGFALFile plugin to work, all these pathnames      //
// should be prepended by gfal:.                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TROOT.h"
#include "TUrl.h"

extern "C" {
#include <gfal_api.h>
}

// GFAL2 doesn't use special names for 64 bit versions
#if defined(_GFAL2_API_) || defined(GFAL2_API_H_)
#define gfal_lseek64   gfal_lseek
#define gfal_open64    gfal_open
#define gfal_readdir64 gfal_readdir
#define gfal_stat64    gfal_stat
#define dirent64       dirent
#define stat64         stat
#endif

#include "TGFALFile.h"

ClassImp(TGFALFile)
ClassImp(TGFALSystem)

//______________________________________________________________________________
TGFALFile::TGFALFile(const char *url, Option_t *option, const char *ftitle,
                     Int_t compress)
         : TFile(url, "NET", ftitle, compress)
{
   // Create a GFAL file object. A GFAL file is the same as a TFile
   // except that it is being accessed via the underlaying Grid access
   // mechanism. The url argument must be of the form: gfal:/lfn/file.root
   // If the file specified in the URL does not exist, is not accessable
   // or can not be created the kZombie bit will be set in the TGFALFile
   // object. Use IsZombie() to see if the file is accessable.
   // For a description of the option and other arguments see the TFile ctor.
   // The preferred interface to this constructor is via TFile::Open().

   fStatCached = kFALSE;

   fOption = option;
   fOption.ToUpper();

   if (fOption == "NEW")
      fOption = "CREATE";

   Bool_t create   = (fOption == "CREATE") ? kTRUE : kFALSE;
   Bool_t recreate = (fOption == "RECREATE") ? kTRUE : kFALSE;
   Bool_t update   = (fOption == "UPDATE") ? kTRUE : kFALSE;
   Bool_t read     = (fOption == "READ") ? kTRUE : kFALSE;
   if (!create && !recreate && !update && !read) {
      read    = kTRUE;
      fOption = "READ";
   }

   TString stmp;
   char *fname;
   if ((fname = gSystem->ExpandPathName(fUrl.GetFileAndOptions()))) {
      stmp = fname;
      delete [] fname;
      fname = (char *)stmp.Data();
   } else {
      Error("TGFALFile", "error expanding path %s", fUrl.GetFileAndOptions());
      goto zombie;
   }

   if (recreate) {
      if (::gfal_access(fname, kFileExists) == 0)
         ::gfal_unlink(fname);
      recreate = kFALSE;
      create   = kTRUE;
      fOption  = "CREATE";
   }
   if (create && ::gfal_access(fname, kFileExists) == 0) {
      Error("TGFALFile", "file %s already exists", fname);
      goto zombie;
   }
   if (update) {
      if (::gfal_access(fname, kFileExists) != 0) {
         update = kFALSE;
         create = kTRUE;
      }
      if (update && ::gfal_access(fname, kWritePermission) != 0) {
         Error("TGFALFile", "no write permission, could not open file %s", fname);
         goto zombie;
      }
   }
   if (read) {
#ifdef GFAL_ACCESS_FIXED
      if (::gfal_access(fname, kFileExists) != 0) {
         Error("TGFALFile", "file %s does not exist", fname);
         goto zombie;
      }
      if (::gfal_access(fname, kReadPermission) != 0) {
         Error("TGFALFile", "no read permission, could not open file %s", fname);
         goto zombie;
      }
#endif
   }

   // Connect to file system stream
   fRealName = fname;

   if (create || update) {
#ifndef WIN32
      fD = SysOpen(fname, O_RDWR | O_CREAT, 0644);
#else
      fD = SysOpen(fname, O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
#endif
      if (fD == -1) {
         SysError("TGFALFile", "file %s can not be opened", fname);
         goto zombie;
      }
      fWritable = kTRUE;
   } else {
#ifndef WIN32
      fD = SysOpen(fname, O_RDONLY, 0644);
#else
      fD = SysOpen(fname, O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
#endif
      if (fD == -1) {
         SysError("TGFALFile", "file %s can not be opened for reading", fname);
         goto zombie;
      }
      fWritable = kFALSE;
   }

   Init(create);

   return;

zombie:
   // error in file opening occured, make this object a zombie
   MakeZombie();
   gDirectory = gROOT;
}

//______________________________________________________________________________
TGFALFile::~TGFALFile()
{
   // GFAL file dtor. Close and flush directory structure.

   Close();
}

//______________________________________________________________________________
Int_t TGFALFile::SysOpen(const char *pathname, Int_t flags, UInt_t mode)
{
   // Interface to system open. All arguments like in POSIX open.

   Int_t ret = ::gfal_open64(pathname, flags, (Int_t) mode);

   return ret;
}

//______________________________________________________________________________
Int_t TGFALFile::SysClose(Int_t fd)
{
   // Interface to system close. All arguments like in POSIX close.

   Int_t ret = ::gfal_close(fd);

   return ret;
}

//______________________________________________________________________________
Int_t TGFALFile::SysRead(Int_t fd, void *buf, Int_t len)
{
   // Interface to system read. All arguments like in POSIX read.

   Int_t ret = ::gfal_read(fd, buf, len);

   return ret;
}

//______________________________________________________________________________
Int_t TGFALFile::SysWrite(Int_t fd, const void *buf, Int_t len)
{
   // Interface to system write. All arguments like in POSIX write.

   Int_t ret = ::gfal_write(fd, buf, len);

   return ret;
}

//______________________________________________________________________________
Long64_t TGFALFile::SysSeek(Int_t fd, Long64_t offset, Int_t whence)
{
   // Interface to system lseek. All arguments like in POSIX lseek
   // except that the offset and return value are Long_t to be able to
   // handle 64 bit file systems.

   Long64_t ret = ::gfal_lseek64(fd, offset, whence);

   return ret;
}

//______________________________________________________________________________
Int_t TGFALFile::SysStat(Int_t /*fd*/, Long_t *id, Long64_t *size, Long_t *flags,
                         Long_t *modtime)
{
   // Interface to TSystem:GetPathInfo(). Generally implemented via
   // stat() or fstat().

   struct stat64 &statbuf = fStatBuffer;

   if (fOption != "READ" || !fStatCached) {
      // We are not in read mode, or the file status information is not yet
      // in the cache. Update or read the status information with gfal_stat().

      if (::gfal_stat64(fRealName, &statbuf) >= 0)
         fStatCached = kTRUE;
   }

   if (fStatCached) {
      if (id)
         *id = (statbuf.st_dev << 24) + statbuf.st_ino;
      if (size)
         *size = statbuf.st_size;
      if (modtime)
         *modtime = statbuf.st_mtime;
      if (flags) {
         *flags = 0;
         if (statbuf.st_mode & ((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
            *flags |= 1;
         if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
            *flags |= 2;
         if ((statbuf.st_mode & S_IFMT) != S_IFREG &&
             (statbuf.st_mode & S_IFMT) != S_IFDIR)
            *flags |= 4;
      }
      return 0;
   }

   return 1;
}

//______________________________________________________________________________
Bool_t TGFALFile::ReadBuffer(char *buf, Int_t len)
{
   // Read specified byte range from remote file via GFAL.
   // Returns kTRUE in case of error.

   Int_t st;
   if ((st = ReadBufferViaCache(buf, len))) {
      if (st == 2)
         return kTRUE;
      return kFALSE;
   }

   return TFile::ReadBuffer(buf, len);
}

//______________________________________________________________________________
Bool_t TGFALFile::ReadBuffer(char *buf, Long64_t pos, Int_t len)
{
   // Read specified byte range from remote file via GFAL.
   // Returns kTRUE in case of error.

   SetOffset(pos);
   Int_t st;
   if ((st = ReadBufferViaCache(buf, len))) {
      if (st == 2)
         return kTRUE;
      return kFALSE;
   }

   return TFile::ReadBuffer(buf, pos, len);
}

//______________________________________________________________________________
Bool_t TGFALFile::WriteBuffer(const char *buf, Int_t len)
{
   // Write specified byte range to remote file via GFAL.
   // Returns kTRUE in case of error.

   if (!IsOpen() || !fWritable) return kTRUE;

   Int_t st;
   if ((st = WriteBufferViaCache(buf, len))) {
      if (st == 2)
         return kTRUE;
      return kFALSE;
   }

   return TFile::WriteBuffer(buf, len);
}


//______________________________________________________________________________
TGFALSystem::TGFALSystem() : TSystem("-gfal", "GFAL Helper System")
{
   // Create helper class that allows directory access via GFAL.

   // name must start with '-' to bypass the TSystem singleton check
   SetName("gfal");

   fDirp = 0;
}

//______________________________________________________________________________
Int_t TGFALSystem::MakeDirectory(const char *dir)
{
   // Make a directory via GFAL.

   TUrl url(dir);

   Int_t ret = ::gfal_mkdir(url.GetFileAndOptions(), 0755);

   return ret;
}

//______________________________________________________________________________
void *TGFALSystem::OpenDirectory(const char *dir)
{
   // Open a directory via GFAL. Returns an opaque pointer to a dir
   // structure. Returns 0 in case of error.

   if (fDirp) {
      Error("OpenDirectory", "invalid directory pointer (should never happen)");
      fDirp = 0;
   }

   TUrl url(dir);

   struct stat64 finfo;

   if (::gfal_stat64(url.GetFileAndOptions(), &finfo) < 0)
      return 0;

   if ((finfo.st_mode & S_IFMT) != S_IFDIR)
      return 0;

   fDirp = (void*) ::gfal_opendir(url.GetFileAndOptions());

   return fDirp;
}

//______________________________________________________________________________
void TGFALSystem::FreeDirectory(void *dirp)
{
   // Free directory via GFAL.

   if (dirp != fDirp) {
      Error("FreeDirectory", "invalid directory pointer (should never happen)");
      return;
   }

   if (dirp)
      ::gfal_closedir((DIR*)dirp);

   fDirp = 0;
}

//______________________________________________________________________________
const char *TGFALSystem::GetDirEntry(void *dirp)
{
   // Get directory entry via GFAL. Returns 0 in case no more entries.

   if (dirp != fDirp) {
      Error("GetDirEntry", "invalid directory pointer (should never happen)");
      return 0;
   }

   struct dirent64 *dp;

   if (dirp) {
      dp = ::gfal_readdir64((DIR*)dirp);
      if (!dp)
         return 0;
      return dp->d_name;
   }
   return 0;
}

//______________________________________________________________________________
Int_t TGFALSystem::GetPathInfo(const char *path, FileStat_t &buf)
{
   // Get info about a file. Info is returned in the form of a FileStat_t
   // structure (see TSystem.h).
   // The function returns 0 in case of success and 1 if the file could
   // not be stat'ed.

   TUrl url(path);

   struct stat64 sbuf;

   if (path && ::gfal_stat64(url.GetFileAndOptions(), &sbuf) >= 0) {

      buf.fDev    = sbuf.st_dev;
      buf.fIno    = sbuf.st_ino;
      buf.fMode   = sbuf.st_mode;
      buf.fUid    = sbuf.st_uid;
      buf.fGid    = sbuf.st_gid;
      buf.fSize   = sbuf.st_size;
      buf.fMtime  = sbuf.st_mtime;
      buf.fIsLink = kFALSE;

      return 0;
   }
   return 1;
}

//______________________________________________________________________________
Bool_t TGFALSystem::AccessPathName(const char *path, EAccessMode mode)
{
   // Returns FALSE if one can access a file using the specified access mode.
   // Mode is the same as for the Unix access(2) function.
   // Attention, bizarre convention of return value!!

   TUrl url(path);

   if (::gfal_access(url.GetFileAndOptions(), mode) == 0)
      return kFALSE;

   return kTRUE;
}
 TGFALFile.cxx:1
 TGFALFile.cxx:2
 TGFALFile.cxx:3
 TGFALFile.cxx:4
 TGFALFile.cxx:5
 TGFALFile.cxx:6
 TGFALFile.cxx:7
 TGFALFile.cxx:8
 TGFALFile.cxx:9
 TGFALFile.cxx:10
 TGFALFile.cxx:11
 TGFALFile.cxx:12
 TGFALFile.cxx:13
 TGFALFile.cxx:14
 TGFALFile.cxx:15
 TGFALFile.cxx:16
 TGFALFile.cxx:17
 TGFALFile.cxx:18
 TGFALFile.cxx:19
 TGFALFile.cxx:20
 TGFALFile.cxx:21
 TGFALFile.cxx:22
 TGFALFile.cxx:23
 TGFALFile.cxx:24
 TGFALFile.cxx:25
 TGFALFile.cxx:26
 TGFALFile.cxx:27
 TGFALFile.cxx:28
 TGFALFile.cxx:29
 TGFALFile.cxx:30
 TGFALFile.cxx:31
 TGFALFile.cxx:32
 TGFALFile.cxx:33
 TGFALFile.cxx:34
 TGFALFile.cxx:35
 TGFALFile.cxx:36
 TGFALFile.cxx:37
 TGFALFile.cxx:38
 TGFALFile.cxx:39
 TGFALFile.cxx:40
 TGFALFile.cxx:41
 TGFALFile.cxx:42
 TGFALFile.cxx:43
 TGFALFile.cxx:44
 TGFALFile.cxx:45
 TGFALFile.cxx:46
 TGFALFile.cxx:47
 TGFALFile.cxx:48
 TGFALFile.cxx:49
 TGFALFile.cxx:50
 TGFALFile.cxx:51
 TGFALFile.cxx:52
 TGFALFile.cxx:53
 TGFALFile.cxx:54
 TGFALFile.cxx:55
 TGFALFile.cxx:56
 TGFALFile.cxx:57
 TGFALFile.cxx:58
 TGFALFile.cxx:59
 TGFALFile.cxx:60
 TGFALFile.cxx:61
 TGFALFile.cxx:62
 TGFALFile.cxx:63
 TGFALFile.cxx:64
 TGFALFile.cxx:65
 TGFALFile.cxx:66
 TGFALFile.cxx:67
 TGFALFile.cxx:68
 TGFALFile.cxx:69
 TGFALFile.cxx:70
 TGFALFile.cxx:71
 TGFALFile.cxx:72
 TGFALFile.cxx:73
 TGFALFile.cxx:74
 TGFALFile.cxx:75
 TGFALFile.cxx:76
 TGFALFile.cxx:77
 TGFALFile.cxx:78
 TGFALFile.cxx:79
 TGFALFile.cxx:80
 TGFALFile.cxx:81
 TGFALFile.cxx:82
 TGFALFile.cxx:83
 TGFALFile.cxx:84
 TGFALFile.cxx:85
 TGFALFile.cxx:86
 TGFALFile.cxx:87
 TGFALFile.cxx:88
 TGFALFile.cxx:89
 TGFALFile.cxx:90
 TGFALFile.cxx:91
 TGFALFile.cxx:92
 TGFALFile.cxx:93
 TGFALFile.cxx:94
 TGFALFile.cxx:95
 TGFALFile.cxx:96
 TGFALFile.cxx:97
 TGFALFile.cxx:98
 TGFALFile.cxx:99
 TGFALFile.cxx:100
 TGFALFile.cxx:101
 TGFALFile.cxx:102
 TGFALFile.cxx:103
 TGFALFile.cxx:104
 TGFALFile.cxx:105
 TGFALFile.cxx:106
 TGFALFile.cxx:107
 TGFALFile.cxx:108
 TGFALFile.cxx:109
 TGFALFile.cxx:110
 TGFALFile.cxx:111
 TGFALFile.cxx:112
 TGFALFile.cxx:113
 TGFALFile.cxx:114
 TGFALFile.cxx:115
 TGFALFile.cxx:116
 TGFALFile.cxx:117
 TGFALFile.cxx:118
 TGFALFile.cxx:119
 TGFALFile.cxx:120
 TGFALFile.cxx:121
 TGFALFile.cxx:122
 TGFALFile.cxx:123
 TGFALFile.cxx:124
 TGFALFile.cxx:125
 TGFALFile.cxx:126
 TGFALFile.cxx:127
 TGFALFile.cxx:128
 TGFALFile.cxx:129
 TGFALFile.cxx:130
 TGFALFile.cxx:131
 TGFALFile.cxx:132
 TGFALFile.cxx:133
 TGFALFile.cxx:134
 TGFALFile.cxx:135
 TGFALFile.cxx:136
 TGFALFile.cxx:137
 TGFALFile.cxx:138
 TGFALFile.cxx:139
 TGFALFile.cxx:140
 TGFALFile.cxx:141
 TGFALFile.cxx:142
 TGFALFile.cxx:143
 TGFALFile.cxx:144
 TGFALFile.cxx:145
 TGFALFile.cxx:146
 TGFALFile.cxx:147
 TGFALFile.cxx:148
 TGFALFile.cxx:149
 TGFALFile.cxx:150
 TGFALFile.cxx:151
 TGFALFile.cxx:152
 TGFALFile.cxx:153
 TGFALFile.cxx:154
 TGFALFile.cxx:155
 TGFALFile.cxx:156
 TGFALFile.cxx:157
 TGFALFile.cxx:158
 TGFALFile.cxx:159
 TGFALFile.cxx:160
 TGFALFile.cxx:161
 TGFALFile.cxx:162
 TGFALFile.cxx:163
 TGFALFile.cxx:164
 TGFALFile.cxx:165
 TGFALFile.cxx:166
 TGFALFile.cxx:167
 TGFALFile.cxx:168
 TGFALFile.cxx:169
 TGFALFile.cxx:170
 TGFALFile.cxx:171
 TGFALFile.cxx:172
 TGFALFile.cxx:173
 TGFALFile.cxx:174
 TGFALFile.cxx:175
 TGFALFile.cxx:176
 TGFALFile.cxx:177
 TGFALFile.cxx:178
 TGFALFile.cxx:179
 TGFALFile.cxx:180
 TGFALFile.cxx:181
 TGFALFile.cxx:182
 TGFALFile.cxx:183
 TGFALFile.cxx:184
 TGFALFile.cxx:185
 TGFALFile.cxx:186
 TGFALFile.cxx:187
 TGFALFile.cxx:188
 TGFALFile.cxx:189
 TGFALFile.cxx:190
 TGFALFile.cxx:191
 TGFALFile.cxx:192
 TGFALFile.cxx:193
 TGFALFile.cxx:194
 TGFALFile.cxx:195
 TGFALFile.cxx:196
 TGFALFile.cxx:197
 TGFALFile.cxx:198
 TGFALFile.cxx:199
 TGFALFile.cxx:200
 TGFALFile.cxx:201
 TGFALFile.cxx:202
 TGFALFile.cxx:203
 TGFALFile.cxx:204
 TGFALFile.cxx:205
 TGFALFile.cxx:206
 TGFALFile.cxx:207
 TGFALFile.cxx:208
 TGFALFile.cxx:209
 TGFALFile.cxx:210
 TGFALFile.cxx:211
 TGFALFile.cxx:212
 TGFALFile.cxx:213
 TGFALFile.cxx:214
 TGFALFile.cxx:215
 TGFALFile.cxx:216
 TGFALFile.cxx:217
 TGFALFile.cxx:218
 TGFALFile.cxx:219
 TGFALFile.cxx:220
 TGFALFile.cxx:221
 TGFALFile.cxx:222
 TGFALFile.cxx:223
 TGFALFile.cxx:224
 TGFALFile.cxx:225
 TGFALFile.cxx:226
 TGFALFile.cxx:227
 TGFALFile.cxx:228
 TGFALFile.cxx:229
 TGFALFile.cxx:230
 TGFALFile.cxx:231
 TGFALFile.cxx:232
 TGFALFile.cxx:233
 TGFALFile.cxx:234
 TGFALFile.cxx:235
 TGFALFile.cxx:236
 TGFALFile.cxx:237
 TGFALFile.cxx:238
 TGFALFile.cxx:239
 TGFALFile.cxx:240
 TGFALFile.cxx:241
 TGFALFile.cxx:242
 TGFALFile.cxx:243
 TGFALFile.cxx:244
 TGFALFile.cxx:245
 TGFALFile.cxx:246
 TGFALFile.cxx:247
 TGFALFile.cxx:248
 TGFALFile.cxx:249
 TGFALFile.cxx:250
 TGFALFile.cxx:251
 TGFALFile.cxx:252
 TGFALFile.cxx:253
 TGFALFile.cxx:254
 TGFALFile.cxx:255
 TGFALFile.cxx:256
 TGFALFile.cxx:257
 TGFALFile.cxx:258
 TGFALFile.cxx:259
 TGFALFile.cxx:260
 TGFALFile.cxx:261
 TGFALFile.cxx:262
 TGFALFile.cxx:263
 TGFALFile.cxx:264
 TGFALFile.cxx:265
 TGFALFile.cxx:266
 TGFALFile.cxx:267
 TGFALFile.cxx:268
 TGFALFile.cxx:269
 TGFALFile.cxx:270
 TGFALFile.cxx:271
 TGFALFile.cxx:272
 TGFALFile.cxx:273
 TGFALFile.cxx:274
 TGFALFile.cxx:275
 TGFALFile.cxx:276
 TGFALFile.cxx:277
 TGFALFile.cxx:278
 TGFALFile.cxx:279
 TGFALFile.cxx:280
 TGFALFile.cxx:281
 TGFALFile.cxx:282
 TGFALFile.cxx:283
 TGFALFile.cxx:284
 TGFALFile.cxx:285
 TGFALFile.cxx:286
 TGFALFile.cxx:287
 TGFALFile.cxx:288
 TGFALFile.cxx:289
 TGFALFile.cxx:290
 TGFALFile.cxx:291
 TGFALFile.cxx:292
 TGFALFile.cxx:293
 TGFALFile.cxx:294
 TGFALFile.cxx:295
 TGFALFile.cxx:296
 TGFALFile.cxx:297
 TGFALFile.cxx:298
 TGFALFile.cxx:299
 TGFALFile.cxx:300
 TGFALFile.cxx:301
 TGFALFile.cxx:302
 TGFALFile.cxx:303
 TGFALFile.cxx:304
 TGFALFile.cxx:305
 TGFALFile.cxx:306
 TGFALFile.cxx:307
 TGFALFile.cxx:308
 TGFALFile.cxx:309
 TGFALFile.cxx:310
 TGFALFile.cxx:311
 TGFALFile.cxx:312
 TGFALFile.cxx:313
 TGFALFile.cxx:314
 TGFALFile.cxx:315
 TGFALFile.cxx:316
 TGFALFile.cxx:317
 TGFALFile.cxx:318
 TGFALFile.cxx:319
 TGFALFile.cxx:320
 TGFALFile.cxx:321
 TGFALFile.cxx:322
 TGFALFile.cxx:323
 TGFALFile.cxx:324
 TGFALFile.cxx:325
 TGFALFile.cxx:326
 TGFALFile.cxx:327
 TGFALFile.cxx:328
 TGFALFile.cxx:329
 TGFALFile.cxx:330
 TGFALFile.cxx:331
 TGFALFile.cxx:332
 TGFALFile.cxx:333
 TGFALFile.cxx:334
 TGFALFile.cxx:335
 TGFALFile.cxx:336
 TGFALFile.cxx:337
 TGFALFile.cxx:338
 TGFALFile.cxx:339
 TGFALFile.cxx:340
 TGFALFile.cxx:341
 TGFALFile.cxx:342
 TGFALFile.cxx:343
 TGFALFile.cxx:344
 TGFALFile.cxx:345
 TGFALFile.cxx:346
 TGFALFile.cxx:347
 TGFALFile.cxx:348
 TGFALFile.cxx:349
 TGFALFile.cxx:350
 TGFALFile.cxx:351
 TGFALFile.cxx:352
 TGFALFile.cxx:353
 TGFALFile.cxx:354
 TGFALFile.cxx:355
 TGFALFile.cxx:356
 TGFALFile.cxx:357
 TGFALFile.cxx:358
 TGFALFile.cxx:359
 TGFALFile.cxx:360
 TGFALFile.cxx:361
 TGFALFile.cxx:362
 TGFALFile.cxx:363
 TGFALFile.cxx:364
 TGFALFile.cxx:365
 TGFALFile.cxx:366
 TGFALFile.cxx:367
 TGFALFile.cxx:368
 TGFALFile.cxx:369
 TGFALFile.cxx:370
 TGFALFile.cxx:371
 TGFALFile.cxx:372
 TGFALFile.cxx:373
 TGFALFile.cxx:374
 TGFALFile.cxx:375
 TGFALFile.cxx:376
 TGFALFile.cxx:377
 TGFALFile.cxx:378
 TGFALFile.cxx:379
 TGFALFile.cxx:380
 TGFALFile.cxx:381
 TGFALFile.cxx:382
 TGFALFile.cxx:383
 TGFALFile.cxx:384
 TGFALFile.cxx:385
 TGFALFile.cxx:386
 TGFALFile.cxx:387
 TGFALFile.cxx:388
 TGFALFile.cxx:389
 TGFALFile.cxx:390
 TGFALFile.cxx:391
 TGFALFile.cxx:392
 TGFALFile.cxx:393
 TGFALFile.cxx:394
 TGFALFile.cxx:395
 TGFALFile.cxx:396
 TGFALFile.cxx:397
 TGFALFile.cxx:398
 TGFALFile.cxx:399
 TGFALFile.cxx:400
 TGFALFile.cxx:401
 TGFALFile.cxx:402
 TGFALFile.cxx:403
 TGFALFile.cxx:404
 TGFALFile.cxx:405
 TGFALFile.cxx:406
 TGFALFile.cxx:407
 TGFALFile.cxx:408
 TGFALFile.cxx:409
 TGFALFile.cxx:410
 TGFALFile.cxx:411
 TGFALFile.cxx:412
 TGFALFile.cxx:413
 TGFALFile.cxx:414
 TGFALFile.cxx:415
 TGFALFile.cxx:416
 TGFALFile.cxx:417
 TGFALFile.cxx:418
 TGFALFile.cxx:419
 TGFALFile.cxx:420
 TGFALFile.cxx:421
 TGFALFile.cxx:422
 TGFALFile.cxx:423
 TGFALFile.cxx:424
 TGFALFile.cxx:425
 TGFALFile.cxx:426
 TGFALFile.cxx:427
 TGFALFile.cxx:428
 TGFALFile.cxx:429
 TGFALFile.cxx:430
 TGFALFile.cxx:431
 TGFALFile.cxx:432
 TGFALFile.cxx:433
 TGFALFile.cxx:434
 TGFALFile.cxx:435
 TGFALFile.cxx:436
 TGFALFile.cxx:437
 TGFALFile.cxx:438
 TGFALFile.cxx:439
 TGFALFile.cxx:440
 TGFALFile.cxx:441
 TGFALFile.cxx:442
 TGFALFile.cxx:443
 TGFALFile.cxx:444
 TGFALFile.cxx:445
 TGFALFile.cxx:446
 TGFALFile.cxx:447
 TGFALFile.cxx:448
 TGFALFile.cxx:449
 TGFALFile.cxx:450
 TGFALFile.cxx:451
 TGFALFile.cxx:452
 TGFALFile.cxx:453
 TGFALFile.cxx:454
 TGFALFile.cxx:455
 TGFALFile.cxx:456
 TGFALFile.cxx:457
 TGFALFile.cxx:458
 TGFALFile.cxx:459
 TGFALFile.cxx:460
 TGFALFile.cxx:461
 TGFALFile.cxx:462
 TGFALFile.cxx:463
 TGFALFile.cxx:464
 TGFALFile.cxx:465
 TGFALFile.cxx:466
 TGFALFile.cxx:467
 TGFALFile.cxx:468
 TGFALFile.cxx:469
 TGFALFile.cxx:470
 TGFALFile.cxx:471
 TGFALFile.cxx:472
 TGFALFile.cxx:473
 TGFALFile.cxx:474
 TGFALFile.cxx:475
 TGFALFile.cxx:476
 TGFALFile.cxx:477