ROOT logo
// @(#)root/proof:$Id: TProofOutputFile.cxx 28393 2009-04-30 08:52:33Z ganis $
// Author: Long Tran-Thanh   14/09/07

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofOutputFile                                                     //
//                                                                      //
// Small class to steer the merging of files produced on the workers    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TProofOutputFile.h"
#include <TEnv.h>
#include <TFileMerger.h>
#include <TFile.h>
#include <TList.h>
#include <TObjArray.h>
#include <TObject.h>
#include <TObjString.h>
#include <TProofServ.h>
#include <TSystem.h>
#include <TUUID.h>

ClassImp(TProofOutputFile)

//________________________________________________________________________________
TProofOutputFile::TProofOutputFile(const char* path,
                                   const char* location, const char* mode)
                 : TNamed(path,"")
{
   // Main conctructor

   fMerged = kFALSE;
   fMerger = 0;

   TUrl u(path, kTRUE);
   // File name
   fFileName = u.GetFile();
   // Unique file name
   fFileName1 = GetTmpName(fFileName.Data());
   // Path
   fIsLocal = kFALSE;
   fDir = u.GetUrl();
   Int_t pos = fDir.Index(fFileName);
   if (pos != kNPOS)
      fDir.Remove(pos);

   if (fDir == "file:") {
      fIsLocal = kTRUE;
      // The directory for the file will be the sandbox
      TString dirPath = gSystem->WorkingDirectory();
      TString pfx  = gEnv->GetValue("Path.Localroot","");
      if (!pfx.IsNull()) dirPath.Remove(0, pfx.Length());
      // Check if a local data server has been specified
      if (gSystem->Getenv("LOCALDATASERVER")) {
         fDir = gSystem->Getenv("LOCALDATASERVER");
      } else {
         // Default is a local XROODT server on default port
         fDir = Form("root://%s",TUrl(gSystem->HostName()).GetHostFQDN());
      }
      if (!fDir.EndsWith("/")) fDir += "/";
      fDir += Form("%s", dirPath.Data());
   }
   // Notify
   Info("TProofOutputFile", "dir: %s", fDir.Data());

   // Default output file name
   fOutputFileName = gEnv->GetValue("Proof.OutputFile", "");
   if (!fOutputFileName.IsNull() && !fOutputFileName.EndsWith("/"))
      fOutputFileName += "/";
   // Add default file name
   fOutputFileName += path;
   if (!fOutputFileName.EndsWith(".root"))
      fOutputFileName += ".root";
   // Resolve placeholders
   ResolveKeywords(fOutputFileName);
   Info("TProofOutputFile", "output file url: %s", fOutputFileName.Data());

   // Location
   fLocation = "REMOTE";
   if (location && strlen(location) > 0) {
      fLocation = location;
      if (fLocation.CompareTo("LOCAL", TString::kIgnoreCase) &&
          fLocation.CompareTo("REMOTE", TString::kIgnoreCase)) {
         Warning("TProofOutputFile","unknown location %s: ignore (use: \"REMOTE\")", location);
         fLocation = "REMOTE";
      }
      fLocation.ToUpper();
   }
   // Mode
   fMode = "CENTRAL";
   if (mode && strlen(mode) > 0) {
      fMode = mode;
      if (fMode.CompareTo("CENTRAL", TString::kIgnoreCase) &&
          fMode.CompareTo("SEQUENTIAL", TString::kIgnoreCase)) {
         Warning("TProofOutputFile","unknown mode %s: ignore (use: \"CENTRAL\")", mode);
         fMode = "CENTRAL";
      }
      fMode.ToUpper();
   }
}

//________________________________________________________________________________
TProofOutputFile::~TProofOutputFile()
{
   // Main destructor

   if (fMerger) delete fMerger;
}

//______________________________________________________________________________
TString TProofOutputFile::GetTmpName(const char* name)
{
   // Create a temporary unique name for this file

   TUUID uuid;

   TString tmpName(name);
   Ssiz_t pos = tmpName.Last('.');
   if (pos != kNPOS)
      tmpName.Insert(pos,Form("-%s",uuid.AsString()));
   else
      tmpName += Form("-%s",uuid.AsString());

   // Done
   return tmpName;
}

//______________________________________________________________________________
void TProofOutputFile::SetFileName(const char* name)
{
   // Set the file name

   fFileName = name;
   fFileName1 = GetTmpName(name);
}

//______________________________________________________________________________
void TProofOutputFile::SetOutputFileName(const char *name)
{
   // Set the name of the output file; in the form of an Url.

   if (name && strlen(name) > 0) {
      fOutputFileName = name;
      ResolveKeywords(fOutputFileName);
      Info("SetOutputFileName", "output file url: %s", fOutputFileName.Data());
   } else {
      fOutputFileName = "";
   }
}

//______________________________________________________________________________
void TProofOutputFile::ResolveKeywords(TString &fname)
{
   // Replace <user> and <group> placeholders in fname

   // Replace <user>, if any
   if (fname.Contains("<user>")) {
      TString user = "nouser";
      // Get user logon name
      UserGroup_t *pw = gSystem->GetUserInfo();
      if (pw) {
         user = pw->fUser;
         delete pw;
      }
      fname.ReplaceAll("<user>", user);
   }
   // Replace <group>, if any
   if (fname.Contains("<group>")) {
      if (gProofServ && gProofServ->GetGroup() && strlen(gProofServ->GetGroup()))
         fname.ReplaceAll("<group>", gProofServ->GetGroup());
      else
         fname.ReplaceAll("<group>", "default");
   }
}

//______________________________________________________________________________
TFile* TProofOutputFile::OpenFile(const char* opt)
{
   // Open the file using the unique temporary name

   if (fFileName1.IsNull())
      return 0;

   // Create the path
   TString fileLoc = (fIsLocal || fDir.IsNull()) ? fFileName1
                                : Form("%s/%s", fDir.Data(), fFileName1.Data());
   // Open the file
   TFile *retFile = TFile::Open(fileLoc, opt);

   return retFile;
}

//______________________________________________________________________________
Int_t TProofOutputFile::AdoptFile(TFile *f)
{
   // Adopt a file already open.
   // Return 0 if OK, -1 in case of failure

   if (!f || f->IsZombie())
      return -1;

   // Set the name and dir
   TUrl u(*(f->GetEndpointUrl()));
   fIsLocal = kFALSE;
   if (!strcmp(u.GetProtocol(), "file")) {
      fIsLocal = kTRUE;
      fDir = u.GetFile();
   } else {
      fDir = u.GetUrl();
   }
   fFileName1 = gSystem->BaseName(fDir.Data());
   fFileName = fFileName1;
   fDir.ReplaceAll(fFileName1, "");

   return 0;
}

//______________________________________________________________________________
Long64_t TProofOutputFile::Merge(TCollection* list)
{
   // Merge objects from the list into this object

   if(!list || list->IsEmpty())
      return 0; 

   TString fileLoc;
   TString outputFileLoc = (fOutputFileName.IsNull()) ? fFileName : fOutputFileName;

   if (fMode == "SEQUENTIAL") {
      TFileMerger* merger = new TFileMerger;
      if (fLocation == "LOCAL") {
         merger->OutputFile(outputFileLoc);
         if (!fMerged) {
            fileLoc = Form("%s/%s", fDir.Data(), GetFileName());
            AddFile(merger, fileLoc);
            Unlink(outputFileLoc);
         } else {
            AddFile(merger, outputFileLoc);
            Unlink(outputFileLoc);
         }

         TList* elist = new TList;
         elist->AddAll(list); 
         TIter next(elist);
         TProofOutputFile* pFile = 0;

         while ((pFile = (TProofOutputFile*)next())) {
            fileLoc = Form("%s/%s", pFile->GetDir(), pFile->GetFileName());
            AddFile(merger, fileLoc);
         }

         Bool_t result = merger->Merge();
         if (!result) {
            NotifyError("TProofOutputFile::Merge: error from TFileMerger::Merge()");
            return -1;
         }

         if (!fMerged) {
            fileLoc = Form("%s/%s", fDir.Data(), GetFileName());
            Unlink(fileLoc);
            fMerged = kTRUE;
         }

         next.Reset();
         while ((pFile = (TProofOutputFile*)next())) {
            fileLoc = Form("%s/%s", pFile->GetDir(), pFile->GetFileName());
            Unlink(fileLoc);
         }
      } else if (fLocation == "REMOTE") {

         TString outputFileLoc2 = GetTmpName(fOutputFileName);
         TString tmpOutputLoc = (outputFileLoc.BeginsWith("root://")) ? GetTmpName(fFileName) : "";
         TList* fileList = new TList;

         if (!fMerged) {
            fileLoc = Form("%s/%s", fDir.Data(), GetFileName());
            TFile* fCurrFile = TFile::Open(fileLoc,"READ");
            if (!fCurrFile) {
               Warning("Merge","Cannot open file: %s", fileLoc.Data());
            } else {
               fileList->Add(fCurrFile);
               Info("Merge", "now adding file :%s\n", fCurrFile->GetPath());
            }
            Unlink(outputFileLoc);
         } else {
            if (tmpOutputLoc.IsNull()) {
               gSystem->Rename(outputFileLoc,outputFileLoc2);
            } else {
               TFile::Cp(outputFileLoc, outputFileLoc2);
               Unlink(outputFileLoc);
            }

            TFile* fCurrOutputFile = TFile::Open(outputFileLoc2,"READ");
            if (!fCurrOutputFile) {
               Warning("Merge","Cannot open tmp output file: %s", outputFileLoc2.Data());
            } else {
               fileList->Add(fCurrOutputFile);
            }
         }

         TList* elist = new TList;
         elist->AddAll(list);
         TIter next(elist);
         TProofOutputFile* pFile = 0;

         while ((pFile = (TProofOutputFile*)next())) {
            fileLoc = Form("%s/%s", pFile->GetDir(), pFile->GetFileName());

            TFile* fCurrFile = TFile::Open(fileLoc.Data(),"READ");
            if (!fCurrFile) {
               Warning("Merge","Cannot open file: %s", fileLoc.Data());
               continue;
            } else {
               fileList->Add(fCurrFile);
            }
         }

         TFile* outputFile;
         if (tmpOutputLoc.IsNull()) {
            outputFile = TFile::Open(outputFileLoc, "RECREATE");
         } else {
            outputFile = TFile::Open(tmpOutputLoc,"RECREATE");
         }

         if (!outputFile) {
            Error("Merge","cannot open output file %s",outputFileLoc.Data());
            return -1;
         }
         Bool_t result =  merger->MergeRecursive(outputFile, fileList, 0);
         if (!result) {
            NotifyError("TProofOutputFile::Merge: error from TFileMerger::MergeRecursive()");

            TIter fnext(fileList);
            TFile *fCurrFile = 0;
            while ((fCurrFile = (TFile*)fnext())) {
               fCurrFile->Close();
            }
            return -1;
         } else {
            outputFile->Write();
            outputFile->Close();

            TIter fnext(fileList);
            TFile *fCurrFile = 0;
            while ((fCurrFile = (TFile*)fnext())) {
               fCurrFile->Close();
            }

            if (!fMerged) {
               fileLoc = Form("%s/%s", fDir.Data(), GetFileName());
               Unlink(fileLoc);
               fMerged = kTRUE;
            }

            next.Reset();
            while ((pFile = (TProofOutputFile *)next())) {
               fileLoc = Form("%s/%s", pFile->GetDir(), pFile->GetFileName());
               Unlink(fileLoc);
            }

            Unlink(outputFileLoc2); 
            if (!tmpOutputLoc.IsNull()) {
               TFile::Cp(tmpOutputLoc,outputFileLoc);
               Unlink(tmpOutputLoc);
            }
         } //end else
      } else {   // end fLocation = "Remote"
         // the given merging location is not valid
         Error("Merge", "invalid location value: %s", fLocation.Data());
         return -1;
      }
      SafeDelete(merger);

      // end fMode = "SEQUENTIAL"

   } else if (fMode == "CENTRAL") {

      // if we merge the outputfiles centrally

      if (fLocation != "REMOTE" && fLocation != "LOCAL") {
         Error("Merge", "invalid location value: %s", fLocation.Data());
         return -1;
      }

      // Get the file merger instance
      Bool_t isLocal = (fLocation == "REMOTE") ? kFALSE : kTRUE;
      TFileMerger *merger = GetFileMerger(isLocal);
      if (!merger) {
         Error("Merge", "could not instantiate the file merger");
         return -1;
      }

      if (!fMerged) {

         merger->OutputFile(outputFileLoc);
         Unlink(outputFileLoc);

         fileLoc = Form("%s/%s", fDir.Data(), GetFileName());
         AddFile(merger, fileLoc);

         fMerged = kTRUE;
      }

      TList* elist = new TList;
      elist->AddAll(list); 
      TIter next(elist);
      TProofOutputFile* pFile = 0;

      while((pFile = (TProofOutputFile*)next())) {
         fileLoc = Form("%s/%s", pFile->GetDir(), pFile->GetFileName());
         AddFile(merger, fileLoc);
      }

      // end fMode = "CENTRAL"

   } else {
      Error("Merge", "invalid mode value: %s", fMode.Data());
      return -1;
   }

   // Done
   return 0;
}

//______________________________________________________________________________
void TProofOutputFile::Print(Option_t *) const
{
   // Dump the class content

   Info("Print","-------------- %s : start ------------", GetName());
   Info("Print"," dir:              %s", fDir.Data());
   Info("Print"," file name:        %s", fFileName.Data());
   Info("Print"," location:         %s", fLocation.Data());
   Info("Print"," mode:             %s", fMode.Data());
   Info("Print"," output file name: %s", fOutputFileName.Data());
   Info("Print"," ordinal:          %s", fWorkerOrdinal.Data());
   Info("Print","-------------- %s : done -------------", GetName());

   return;
}

//______________________________________________________________________________
void TProofOutputFile::NotifyError(const char *msg)
{
   // Notify error message

   if (msg) {
      if (gProofServ)
         gProofServ->SendAsynMessage(msg);
      else
         Printf(msg);
   } else {
      Info("NotifyError","called with empty message");
   }

   return;
}

//______________________________________________________________________________
void TProofOutputFile::AddFile(TFileMerger *merger, const char *path)
{
   // Add file to merger, checking the result

   if (merger && path) {
      if (!merger->AddFile(path))
         NotifyError(Form("TProofOutputFile::AddFile:"
                          " error from TFileMerger::AddFile(%s)", path));
   }
}

//______________________________________________________________________________
void TProofOutputFile::Unlink(const char *path)
{
   // Unlink path

   if (path) {
      if (!gSystem->AccessPathName(path)) {
         if (gSystem->Unlink(path) != 0)
            NotifyError(Form("TProofOutputFile::Unlink:"
                             " error from TSystem::Unlink(%s)", path));
      }
   }
}

//______________________________________________________________________________
TFileMerger *TProofOutputFile::GetFileMerger(Bool_t local)
{
   // Get instance of the file merger to be used in "CENTRAL" mode

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