ROOT logo
// @(#)root/base:$Id: TProofDataSetManager.cxx 28593 2009-05-13 10:48:14Z ganis $
// Author: Jan Fiete Grosse-Oetringhaus, 04.06.07

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofDataSetManager                                                 //
//                                                                      //
// This class contains functions to handle datasets in PROOF            //
// It is the layer between TProofServ and the file system that stores   //
// the datasets.                                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TProofDataSetManager.h"

#include "Riostream.h"

#include "TEnv.h"
#include "TFileCollection.h"
#include "TFileInfo.h"
#include "TMD5.h"
#include "THashList.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TParameter.h"
#include "TPRegexp.h"
#include "TRegexp.h"
#include "TSystem.h"
#include "TVirtualMonitoring.h"

// One Gigabyte
#define DSM_ONE_GB (1073741824)

// Name for common datasets
TString TProofDataSetManager::fgCommonDataSetTag = "COMMON";

ClassImp(TProofDataSetManager)

//_____________________________________________________________________________
TProofDataSetManager::TProofDataSetManager(const char *group, const char *user,
                                           const char *options)
                     : fGroup(group),
                       fUser(user), fCommonUser(), fCommonGroup(),
                       fGroupQuota(), fGroupUsed(),
                       fUserUsed(), fNTouchedFiles(0), fNOpenedFiles(0),
                       fNDisappearedFiles(0), fMTimeGroupConfig(-1)
{
   //
   // Main constructor

   // Fill default group and user if none is given
   if (fGroup.IsNull())
      fGroup = "default";
   if (fUser.IsNull()) {
      fUser = "--nouser--";
      // Get user logon name
      UserGroup_t *pw = gSystem->GetUserInfo();
      if (pw) {
         fUser = pw->fUser;
         delete pw;
      }
   }

   fGroupQuota.SetOwner();
   fGroupUsed.SetOwner();
   fUserUsed.SetOwner();

   fCommonUser = "COMMON";
   fCommonGroup = "COMMON";

   fNTouchedFiles = -1;
   fNOpenedFiles = -1;
   fNDisappearedFiles = -1;
   fMTimeGroupConfig = -1;

   fAvgFileSize = 50000000;  // Default 50 MB per file

   // Parse options
   ParseInitOpts(options);

   if (!fUser.IsNull() && !fGroup.IsNull()) {

      // If not in sandbox, construct the base URI using session defaults
      // (group, user) (syntax: /group/user/dsname[#[subdir/]objname])
      if (!TestBit(TProofDataSetManager::kIsSandbox))
         fBase.SetUri(TString(Form("/%s/%s/", fGroup.Data(), fUser.Data())));

   }

   // Read config file
   ReadGroupConfig(gEnv->GetValue("Proof.GroupFile", ""));
}

//______________________________________________________________________________
TProofDataSetManager::~TProofDataSetManager()
{
   // Destructor

   // Clear used space
   fGroupQuota.DeleteAll();
   fGroupUsed.DeleteAll();
   fUserUsed.DeleteAll();
}

//______________________________________________________________________________
void TProofDataSetManager::ParseInitOpts(const char *opts)
{
   // Parse the opts string and set the init bits accordingly
   // Available options:
   //    Cq:               set kCheckQuota
   //    Ar:               set kAllowRegister
   //    Av:               set kAllowVerify
   //    As:               set kAllowStaging
   //    Sb:               set kIsSandbox
   // The opts string may also contain additional unrelated info: in such a case
   // the field delimited by the prefix "opt:" is analyzed, e.g. if opts is
   // "/tmp/dataset  opt:Cq:-Ar: root://lxb6046.cern.ch" only the substring
   // "Cq:-Ar:" will be parsed .

   // Default option bits
   ResetBit(TProofDataSetManager::kCheckQuota);
   SetBit(TProofDataSetManager::kAllowRegister);
   SetBit(TProofDataSetManager::kAllowVerify);
   ResetBit(TProofDataSetManager::kAllowStaging);
   ResetBit(TProofDataSetManager::kIsSandbox);

   if (opts && strlen(opts) > 0) {
      TString opt(opts);
      // If it contains the prefix "opt:", isolate the related field
      Int_t ip = opt.Index("opt:");
      if (ip != kNPOS) opt.Remove(0, ip + 4);
      ip = opt.Index(" ");
      if (ip != kNPOS) opt.Remove(ip);
      // Check the content, now
      if (opt.Contains("Cq:") && !opt.Contains("-Cq:"))
         SetBit(TProofDataSetManager::kCheckQuota);
      if (opt.Contains("-Ar:"))
         ResetBit(TProofDataSetManager::kAllowRegister);
      if (opt.Contains("-Av:"))
         ResetBit(TProofDataSetManager::kAllowVerify);
      if (opt.Contains("As:") && !opt.Contains("-As:"))
         SetBit(TProofDataSetManager::kAllowStaging);
      if (opt.Contains("Sb:") && !opt.Contains("-Sb:"))
         SetBit(TProofDataSetManager::kIsSandbox);
   }

   // Check dependencies
   if (TestBit(TProofDataSetManager::kAllowStaging)) {
      // Staging of missing files requires verification permition
      SetBit(TProofDataSetManager::kAllowVerify);
   }
   if (TestBit(TProofDataSetManager::kAllowVerify)) {
      // Dataset verification requires registration permition
      SetBit(TProofDataSetManager::kAllowRegister);
   }
}

//______________________________________________________________________________
Bool_t TProofDataSetManager::ReadGroupConfig(const char *cf)
{
   // Read group config file 'cf'.
   // If cf == 0 re-read, if changed, the file pointed by fGroupConfigFile .
   //
   // expects the following directives:
   // Group definition:
   //   group <groupname> <user>+
   // disk quota
   //   property <groupname> diskquota <quota in GB>
   // average filesize (to be used when the file size is not available)
   //   averagefilesize <average size>{G,g,M,m,K,k}

   // Validate input
   FileStat_t st;
   if (!cf || (strlen(cf) <= 0) || !strcmp(cf, fGroupConfigFile.Data())) {
      // If this is the first time we cannot do anything
      if (fGroupConfigFile.IsNull()) {
         if (gDebug > 0)
            Info("ReadGroupConfig", "path to config file undefined - nothing to do");
         return kFALSE;
      }
      // Check if fGroupConfigFile has changed
      if (gSystem->GetPathInfo(fGroupConfigFile, st)) {
         Error("ReadGroupConfig", "could not stat %s", fGroupConfigFile.Data());
         return kFALSE;
      }
      if (st.fMtime <= fMTimeGroupConfig) {
         if (gDebug > 0)
            Info("ReadGroupConfig","file has not changed - do nothing");
         return kTRUE;
      }
   }

   // Either new file or the file has changed
   if (cf && (strlen(cf) > 0)) {
      // The file must exist and be readable
      if (gSystem->GetPathInfo(cf, st)) {
         Error("ReadGroupConfig", "could not stat %s", cf);
         return kFALSE;
      }
      if (gSystem->AccessPathName(cf, kReadPermission)) {
         Error("ReadGroupConfig", "cannot read %s", cf);
         return kFALSE;
      }
      // Ok
      fGroupConfigFile = cf;
      fMTimeGroupConfig = st.fMtime;
   }

   if (gDebug > 0)
      Info("ReadGroupConfig","reading group config from %s", cf);

   // Open the config file
   ifstream in;
   in.open(cf);
   if (!in.is_open()) {
      Error("ReadGroupConfig", "could not open config file %s", cf);
      return kFALSE;
   }

   // Container for the global common user
   TString tmpCommonUser;

   // Go through
   TString line;
   while (in.good()) {
      // Read new line
      line.ReadLine(in);
      // Parse it
      Ssiz_t from = 0;
      TString key;
      if (!line.Tokenize(key, from, " ")) // No token
         continue;
      // Parsing depends on the key
      if (key == "property") {
         // Read group
         TString grp;
         if (!line.Tokenize(grp, from, " ")) {// No token
            if (gDebug > 0)
               Info("ReadGroupConfig","incomplete line: '%s'", line.Data());
            continue;
         }
         // Read type of property
         TString type;
         if (!line.Tokenize(type, from, " ")) // No token
            continue;
         if (type == "diskquota") {
            // Read diskquota
            TString sdq;
            if (!line.Tokenize(sdq, from, " ")) // No token
               continue;
            // Enforce GigaBytes as default
            if (sdq.IsDigit()) sdq += "G";
            Long64_t quota = ToBytes(sdq);
            if (quota > -1) {
               fGroupQuota.Add(new TObjString(grp),
                               new TParameter<Long64_t> ("group quota", quota));
            } else {
               Warning("ReadGroupConfig",
                       "problems parsing string: wrong or unsupported suffix? %s",
                        sdq.Data());
            }
         } else if (type == "commonuser") {
            // Read common user for this group
            TString comusr;
            if (!line.Tokenize(comusr, from, " ")) // No token
               continue;

         }

      } else if (key == "dataset") {
         // Read type
         TString type;
         if (!line.Tokenize(type, from, " ")) {// No token
            if (gDebug > 0)
               Info("ReadGroupConfig","incomplete line: '%s'", line.Data());
            continue;
         }
         if (type == "commonuser") {
            // Read global common user
            TString comusr;
            if (!line.Tokenize(comusr, from, " ")) // No token
               continue;
            fCommonUser = comusr;
         } else if (type == "commongroup") {
            // Read global common group
            TString comgrp;
            if (!line.Tokenize(comgrp, from, " ")) // No token
               continue;
            fCommonGroup = comgrp;
         } else if (type == "diskquota") {
            // Quota check switch
            TString on;
            if (!line.Tokenize(on, from, " ")) // No token
               continue;
            if (on == "on") {
               SetBit(TProofDataSetManager::kCheckQuota);
            } else if (on == "off") {
               ResetBit(TProofDataSetManager::kCheckQuota);
            }
         }

      } else if (key == "averagefilesize") {

         // Read average size
         TString avgsize;
         if (!line.Tokenize(avgsize, from, " ")) {// No token
            if (gDebug > 0)
               Info("ReadGroupConfig","incomplete line: '%s'", line.Data());
            continue;
         }
         Long64_t avgsz = ToBytes(avgsize);
         if (avgsz > -1) {
            fAvgFileSize = avgsz;
         } else {
            Warning("ReadGroupConfig",
                    "problems parsing string: wrong or unsupported suffix? %s",
                    avgsize.Data());
         }
      }
   }
   in.close();

   return kTRUE;
}

//______________________________________________________________________________
Long64_t TProofDataSetManager::ToBytes(const char *size)
{
   // Static utility function to gt the number of bytes from a string
   // representation in the form "<digit><sfx>" with <sfx> = {"", "k", "M", "G",
   // "T", "P"} (case insensitive).
   // Returns -1 if the format is wrong.

   Long64_t lsize = -1;

   // Check if valid
   if (!size || strlen(size) <= 0) return lsize;

   TString s(size);
   // Determine factor
   Long64_t fact = 1;
   if (!s.IsDigit()) {
      const char *unit[5] = { "k", "M", "G", "T", "P"};
      fact = 1024;
      Int_t jj = 0;
      while (jj <= 4) {
         if (s.EndsWith(unit[jj], TString::kIgnoreCase)) {
            s.Remove(s.Length()-1);
            break;
         }
         fact *= 1024;
         jj++;
      }
   }
   // Apply factor now
   if (s.IsDigit())
      lsize = s.Atoi() * fact;

   // Done
   return lsize;
}

//______________________________________________________________________________
TFileCollection *TProofDataSetManager::GetDataSet(const char *, const char *)
{
   // Utility function used in various methods for user dataset upload.

   AbstractMethod("GetDataSet");
   return (TFileCollection *)0;
}

//______________________________________________________________________________
Bool_t TProofDataSetManager::RemoveDataSet(const char *)
{
   // Removes the indicated dataset

   AbstractMethod("RemoveDataSet");
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TProofDataSetManager::ExistsDataSet(const char *)
{
   // Checks if the indicated dataset exits

   AbstractMethod("ExistsDataSet");
   return kFALSE;
}

//______________________________________________________________________________
TMap *TProofDataSetManager::GetDataSets(const char *, UInt_t)
{
   //
   // Returns all datasets for the <group> and <user> specified by <uri>.
   // If <user> is 0, it returns all datasets for the given <group>.
   // If <group> is 0, it returns all datasets.
   // The returned TMap contains:
   //    <group> --> <map of users> --> <map of datasets> --> <dataset> (TFileCollection)
   //
   // The unsigned int 'option' is forwarded to GetDataSet and BrowseDataSet.
   // Available options (to be .or.ed):
   //    kShowDefault    a default selection is shown that include the ones from
   //                    the current user, the ones from the group and the common ones
   //    kPrint          print the dataset content
   //    kQuotaUpdate    update quotas
   //    kExport         use export naming
   //
   // NB1: options "kPrint", "kQuoatUpdate" and "kExport" are mutually exclusive
   // NB2: for options "kPrint" and "kQuoatUpdate" return is null.

   AbstractMethod("GetDataSets");

   return (TMap *)0;
}

//______________________________________________________________________________
Int_t TProofDataSetManager::ScanDataSet(const char *, UInt_t)
{
   // Scans the dataset indicated by <uri> and returns the number of missing files.
   // Returns -1 if any failure occurs.
   // For more details, see documentation of
   // ScanDataSet(TFileCollection *dataset, const char *option)

   AbstractMethod("ScanDataSet");

   return -1;
}

//______________________________________________________________________________
void TProofDataSetManager::GetQuota(const char *group, const char *user,
                                    const char *dsName, TFileCollection *dataset)
{
   //
   // Gets quota information from this dataset

   if (gDebug > 0)
      Info("GetQuota", "processing dataset %s %s %s", group, user, dsName);

   if (dataset->GetTotalSize() > 0) {
      TParameter<Long64_t> *size =
         dynamic_cast<TParameter<Long64_t>*> (fGroupUsed.GetValue(group));
      if (!size) {
         size = new TParameter<Long64_t> ("group used", 0);
         fGroupUsed.Add(new TObjString(group), size);
      }

      size->SetVal(size->GetVal() + dataset->GetTotalSize());

      TMap *userMap = dynamic_cast<TMap*> (fUserUsed.GetValue(group));
      if (!userMap) {
         userMap = new TMap;
         fUserUsed.Add(new TObjString(group), userMap);
      }

      size = dynamic_cast<TParameter<Long64_t>*> (userMap->GetValue(user));
      if (!size) {
         size = new TParameter<Long64_t> ("user used", 0);
         userMap->Add(new TObjString(user), size);
      }

      size->SetVal(size->GetVal() + dataset->GetTotalSize());
   }
}

//______________________________________________________________________________
void TProofDataSetManager::ShowQuota(const char *opt)
{
   // Display quota information

   UpdateUsedSpace();

   TMap *groupQuotaMap = GetGroupQuotaMap();
   TMap *userUsedMap = GetUserUsedMap();
   if (!groupQuotaMap || !userUsedMap)
      return;

   Bool_t noInfo = kTRUE;
   TIter iter(groupQuotaMap);
   TObjString *group = 0;
   while ((group = dynamic_cast<TObjString*> (iter.Next()))) {
      noInfo = kFALSE;
      Long64_t groupQuota = GetGroupQuota(group->String());
      Long64_t groupUsed = GetGroupUsed(group->String());

      Printf(" +++ Group %s uses %.1f GB out of %.1f GB", group->String().Data(),
                                        (Float_t) groupUsed / DSM_ONE_GB,
                                       (Float_t) groupQuota / DSM_ONE_GB);

      // display also user information
      if (opt && !TString(opt).Contains("U", TString::kIgnoreCase))
         continue;

      TMap *userMap = dynamic_cast<TMap*> (userUsedMap->GetValue(group->String()));
      if (!userMap)
         continue;

      TIter iter2(userMap);
      TObjString *user = 0;
      while ((user = dynamic_cast<TObjString*> (iter2.Next()))) {
         TParameter<Long64_t> *size2 =
            dynamic_cast<TParameter<Long64_t>*> (userMap->GetValue(user->String().Data()));
         if (!size2)
            continue;

         Printf(" +++  User %s uses %.1f GB", user->String().Data(),
                                  (Float_t) size2->GetVal() / DSM_ONE_GB);
      }

      Printf("------------------------------------------------------");
   }
   // Check if something has been printed
   if (noInfo) {
      Printf(" +++ Quota check enabled but no quota info available +++ ");
   }
}

//______________________________________________________________________________
void TProofDataSetManager::PrintUsedSpace()
{
   //
   // Prints the quota

   Info("PrintUsedSpace", "listing used space");

   TIter iter(&fUserUsed);
   TObjString *group = 0;
   while ((group = dynamic_cast<TObjString*> (iter.Next()))) {
      TMap *userMap = dynamic_cast<TMap*> (fUserUsed.GetValue(group->String()));

      TParameter<Long64_t> *size =
         dynamic_cast<TParameter<Long64_t>*> (fGroupUsed.GetValue(group->String()));

      if (userMap && size) {
         Printf("Group %s: %lld B = %.2f GB", group->String().Data(), size->GetVal(),
                                      (Float_t) size->GetVal() / DSM_ONE_GB);

         TIter iter2(userMap);
         TObjString *user = 0;
         while ((user = dynamic_cast<TObjString*> (iter2.Next()))) {
            TParameter<Long64_t> *size2 =
               dynamic_cast<TParameter<Long64_t>*> (userMap->GetValue(user->String().Data()));
            if (size2)
               Printf("  User %s: %lld B = %.2f GB", user->String().Data(), size2->GetVal(),
                                            (Float_t) size2->GetVal() / DSM_ONE_GB);
         }

         Printf("------------------------------------------------------");
      }
   }
}

//______________________________________________________________________________
void TProofDataSetManager::MonitorUsedSpace(TVirtualMonitoringWriter *monitoring)
{
   //
   // Log info to the monitoring server

   Info("MonitorUsedSpace", "sending used space to monitoring server");

   TIter iter(&fUserUsed);
   TObjString *group = 0;
   while ((group = dynamic_cast<TObjString*> (iter.Next()))) {
      TMap *userMap = dynamic_cast<TMap*> (fUserUsed.GetValue(group->String()));
      TParameter<Long64_t> *size =
         dynamic_cast<TParameter<Long64_t>*> (fGroupUsed.GetValue(group->String()));

      if (!userMap || !size)
         continue;

      TList *list = new TList;
      list->SetOwner();
      list->Add(new TParameter<Long64_t>("_TOTAL_", size->GetVal()));
      Long64_t groupQuota = GetGroupQuota(group->String());
      if (groupQuota != -1)
         list->Add(new TParameter<Long64_t>("_QUOTA_", groupQuota));

      TIter iter2(userMap);
      TObjString *user = 0;
      while ((user = dynamic_cast<TObjString*> (iter2.Next()))) {
         TParameter<Long64_t> *size2 =
            dynamic_cast<TParameter<Long64_t>*> (userMap->GetValue(user->String().Data()));
         if (!size2)
            continue;
         list->Add(new TParameter<Long64_t>(user->String().Data(), size2->GetVal()));
      }

      monitoring->SendParameters(list, group->String());
      delete list;
   }
}

//______________________________________________________________________________
Long64_t TProofDataSetManager::GetGroupUsed(const char *group)
{
   //
   // Returns the used space of that group

   if (fgCommonDataSetTag == group)
      group = fCommonGroup;

   TParameter<Long64_t> *size =
      dynamic_cast<TParameter<Long64_t>*> (fGroupUsed.GetValue(group));
   if (!size) {
      if (gDebug > 0)
         Info("GetGroupUsed", "group %s not found", group);
      return 0;
   }

   return size->GetVal();
}

//______________________________________________________________________________
Long64_t TProofDataSetManager::GetGroupQuota(const char *group)
{
   //
   // returns the quota a group is allowed to have

   if (fgCommonDataSetTag == group)
      group = fCommonGroup;

   TParameter<Long64_t> *value =
      dynamic_cast<TParameter<Long64_t>*> (fGroupQuota.GetValue(group));
   if (!value) {
      if (gDebug > 0)
         Info("GetGroupQuota", "group %s not found", group);
      return 0;
   }
   return value->GetVal();
}

//______________________________________________________________________________
void TProofDataSetManager::UpdateUsedSpace()
{
   // updates the used space maps

   AbstractMethod("UpdateUsedSpace");
}

//______________________________________________________________________________
Int_t TProofDataSetManager::RegisterDataSet(const char *,
                                            TFileCollection *,
                                            const char *)
{
   // Register a dataset, perfoming quota checkings, if needed.
   // Returns 0 on success, -1 on failure

   AbstractMethod("RegisterDataSet");
   return -1;
}

//______________________________________________________________________________
TString TProofDataSetManager::CreateUri(const char *dsGroup, const char *dsUser,
                                        const char *dsName, const char *dsObjPath)
{
   // Creates URI for the dataset manger in the form '[[/dsGroup/]dsUser/]dsName[#dsObjPath]',
   // The optional dsObjPath can be in the form [subdir/]objname]'.

   TString uri;

   if (dsGroup && strlen(dsGroup) > 0) {
      if (dsUser && strlen(dsUser) > 0) {
         uri += Form("/%s/%s/", dsGroup, dsUser);
      } else {
         uri += Form("/%s/*/", dsGroup);
      }
   } else if (dsUser && strlen(dsUser) > 0) {
      uri += Form("%s/", dsUser);
   }
   if (dsName && strlen(dsName) > 0)
      uri += dsName;
   if (dsObjPath && strlen(dsObjPath) > 0)
      uri += Form("#%s", dsObjPath);

   // Done
   return uri;
}

//______________________________________________________________________________
Bool_t TProofDataSetManager::ParseUri(const char *uri,
                                      TString *dsGroup, TString *dsUser,
                                      TString *dsName, TString *dsTree,
                                      Bool_t onlyCurrent, Bool_t wildcards)
{
   // Parses a (relative) URI that describes a DataSet on the cluster.
   // The input 'uri' should be in the form '[[/group/]user/]dsname[#[subdir/]objname]',
   //  where 'objname' is the name of the object (e.g. the tree name) and the 'subdir'
   // is the directory in the file wher it should be looked for.
   // After resolving against a base URI consisting of proof://masterhost/group/user/
   // - meaning masterhost, group and user of the current session -
   // the path is checked to contain exactly three elements separated by '/':
   // group/user/dsname
   // If wildcards, '*' is allowed in group and user and dsname is allowed to be empty.
   // If onlyCurrent, only group and user of current session are allowed.
   // Only non-null parameters are filled by this function.
   // Returns kTRUE in case of success.

   // Append trailing slash if missing when wildcards are enabled
   TString uristr(uri);
   if (wildcards && uristr.Length() > 0 && !uristr.EndsWith("/"))
      uristr += '/';

   // Resolve given URI agains the base
   TUri resolved = TUri::Transform(uristr, fBase);
   if (resolved.HasQuery())
      Info ("ParseUri", "URI query part <%s> ignored", resolved.GetQuery().Data());

   TString path(resolved.GetPath());
   // Must be in the form /group/user/dsname
   Int_t pc = path.CountChar('/');
   if (pc != 3) {
      if (!TestBit(TProofDataSetManager::kIsSandbox)) {
         Error ("ParseUri", "illegal dataset path: %s", uri);
         return kFALSE;
      } else if (pc >= 0 && pc < 3) {
         // Add missing slashes
         TString sls("/");
         if (pc == 2) {
            sls = "/";
         } else if (pc == 1) {
            sls = Form("/%s/", fGroup.Data());
         } else if (pc == 0) {
            sls = Form("/%s/%s/", fGroup.Data(), fUser.Data());
         }
         path.Insert(0, sls);
      }
   }
   if (gDebug > 1)
      Info("ParseUri", "path: '%s'", path.Data());

   // Get individual values from tokens
   Int_t from = 1;
   TString group, user, name;
   path.Tokenize(group, from, "/");
   path.Tokenize(user, from, "/");
   path.Tokenize(name, from, "/");

   // The fragment may contain the subdir and the object name in the form '[subdir/]objname'
   TString tree = resolved.GetFragment();
   if (tree.EndsWith("/"))
      tree.Remove(tree.Length()-1);

   if (gDebug > 1)
      Info("ParseUri", "group: '%s', user: '%s', dsname:'%s', seg: '%s'",
                              group.Data(), user.Data(), name.Data(), tree.Data());

   // Check for unwanted use of wildcards
   if ((user == "*" || group == "*") && !wildcards) {
      Error ("ParseUri", "no wildcards allowed for user/group in this context");
      return kFALSE;
   }

   // dsname may only be empty if wildcards expected
   if (name.IsNull() && !wildcards) {
      Error ("ParseUri", "DataSet name is empty");
      return kFALSE;
   }

   // Construct regexp whitelist for checking illegal characters in user/group
   TPRegexp wcExp (wildcards ? "^(?:[A-Za-z0-9-]*|[*])$" : "^[A-Za-z0-9-]*$");

   // Check for illegal characters in all components
   if (!wcExp.Match(group)) {
      Error("ParseUri", "illegal characters in group");
      return kFALSE;
   }

   if (!wcExp.Match(user)) {
      Error("ParseUri", "illegal characters in user");
      return kFALSE;
   }

   if (name.Contains(TRegexp("[^A-Za-z0-9-._]"))) {
      Error("ParseUri", "illegal characters in dataset name");
      return kFALSE;
   }

   if (tree.Contains(TRegexp("[^A-Za-z0-9-/_]"))) {
      Error("ParseUri", "Illegal characters in subdir/object name");
      return kFALSE;
   }

   // Check user & group
   if (onlyCurrent && (group.CompareTo(fGroup) || user.CompareTo(fUser))) {
      Error("ParseUri", "only datasets from your group/user allowed");
      return kFALSE;
   }

   // fill parameters passed by reference, if defined
   if (dsGroup)
      *dsGroup = group;
   if (dsUser)
      *dsUser = user;
   if (dsName)
      *dsName = name;
   if (dsTree)
      *dsTree = tree;

   return kTRUE;
}

//______________________________________________________________________________
TMap *TProofDataSetManager::GetSubDataSets(const char *ds, const char *exclude)
{
   // Partition dataset 'ds' accordingly to the servers.
   // The returned TMap contains:
   //                <server> --> <subdataset> (TFileCollection)
   // where <subdataset> is the subset of 'ds' on <server>
   // The partitioning is done using all the URLs in the TFileInfo's, so the
   // resulting datasets are not mutually exclusive.
   // The string 'exclude' contains a comma-separated list of servers to exclude
   // from the map.

   TMap *map = (TMap *)0;

   if (!ds || strlen(ds) <= 0) {
      Info("GetDataSets", "dataset name undefined!");
      return map;
   }

   // Get the dataset
   TFileCollection *fc = GetDataSet(ds);
   if (!fc) {
      Info("GetDataSets", "could not retrieve the dataset '%s'", ds);
      return map;
   }

   // Get the subset
   if (!(map = fc->GetFilesPerServer(exclude))) {
      if (gDebug > 0)
         Info("GetDataSets", "could not get map for '%s'", ds);
   }

   // Cleanup
   delete fc;

   // Done
   return map;
}

//______________________________________________________________________________
void TProofDataSetManager::PrintDataSet(TFileCollection *fc, Int_t popt)
{
   // Formatted printout of the content of TFileCollection 'fc'.
   // Options in the form
   //           popt = u * 10 + f
   //     f    0 => header only, 1 => header + files
   //   when printing files
   //     u    0 => print file name only, 1 => print full URL

   if (!fc) return;

   Int_t f = popt%10;
   Int_t u = popt - 10 * f;

   Printf("+++");
   if (fc->GetTitle() && (strlen(fc->GetTitle()) > 0)) {
      Printf("+++ Dumping: %s: ", fc->GetTitle());
   } else {
      Printf("+++ Dumping: %s: ", fc->GetName());
   }
   Printf("%s", fc->ExportInfo("+++ Summary:", 1)->GetName());
   if (f == 1) {
      Printf("+++ Files:");
      Int_t nf = 0;
      TIter nxfi(fc->GetList());
      TFileInfo *fi = 0;
      while ((fi = (TFileInfo *)nxfi())) {
         if (u == 1)
            Printf("+++ %5d. %s", ++nf, fi->GetCurrentUrl()->GetUrl());
         else
            Printf("+++ %5d. %s", ++nf, fi->GetCurrentUrl()->GetFile());
      }
   }
   Printf("+++");
}

//______________________________________________________________________________
void TProofDataSetManager::ShowDataSets(const char *uri, const char *opt)
{
   // Prints formatted information about the dataset 'uri'.
   // The type and format of output is driven by 'opt':
   //
   //   1. opt = "server:srv1[,srv2[,srv3[,...]]]"
   //            Print info about the subsets of 'uri' on servers srv1, srv2, ...
   //   2. opt = "servers[:exclude:srv1[,srv2[,srv3[,...]]]]"
   //            Print info about the subsets of 'uri' on all servers, except
   //            the ones in the exclude list srv1, srv2, ...
   //   3. opt = <any>
   //            Print info about all datasets matching 'uri'
   //
   //   If 'opt' contains 'full:' the list of files in the datasets are also printed.
   //   In case 3. this is enabled only if 'uri' matches a single dataset.


   TFileCollection *fc = 0;
   TString o(opt);
   Int_t popt = 0;
   if (o.Contains("full:")) {
      o.ReplaceAll("full:","");
      popt = 1;
   }
   if (o.BeginsWith("server:")) {
      o.ReplaceAll("server:", "");
      TString srv;
      Int_t from = 0;
      while ((o.Tokenize(srv, from, ","))) {
         fc = GetDataSet(uri, srv.Data());
         PrintDataSet(fc, popt);
         delete fc;
      }
   } else if (o.BeginsWith("servers")) {
      o.ReplaceAll("servers", "");
      if (o.BeginsWith(":exclude:"))
         o.ReplaceAll(":exclude:", "");
      else
         o = "";
      TMap *dsmap = GetSubDataSets(uri, o.Data());
      if (dsmap) {
         TIter nxk(dsmap);
         TObject *k = 0;
         while ((k = nxk()) && (fc = (TFileCollection *) dsmap->GetValue(k))) {
            PrintDataSet(fc, popt);
         }
         delete dsmap;
      }
   } else {
      TString u(uri);
      if (!u.IsNull() && !u.Contains("*") && (fc = GetDataSet(uri))) {
         // Single dataset
         PrintDataSet(fc, 10 + popt);
         delete fc;
      } else {
         // Support for "*" or "/*"
         if (u == "" || u == "*" || u == "/*" || u == "/*/" || u == "/*/*") u = "/*/*/";
         // Scan the existing datasets and print the content
         GetDataSets(u.Data(), (UInt_t)TProofDataSetManager::kPrint);
      }
   }

   return;
}
 TProofDataSetManager.cxx:1
 TProofDataSetManager.cxx:2
 TProofDataSetManager.cxx:3
 TProofDataSetManager.cxx:4
 TProofDataSetManager.cxx:5
 TProofDataSetManager.cxx:6
 TProofDataSetManager.cxx:7
 TProofDataSetManager.cxx:8
 TProofDataSetManager.cxx:9
 TProofDataSetManager.cxx:10
 TProofDataSetManager.cxx:11
 TProofDataSetManager.cxx:12
 TProofDataSetManager.cxx:13
 TProofDataSetManager.cxx:14
 TProofDataSetManager.cxx:15
 TProofDataSetManager.cxx:16
 TProofDataSetManager.cxx:17
 TProofDataSetManager.cxx:18
 TProofDataSetManager.cxx:19
 TProofDataSetManager.cxx:20
 TProofDataSetManager.cxx:21
 TProofDataSetManager.cxx:22
 TProofDataSetManager.cxx:23
 TProofDataSetManager.cxx:24
 TProofDataSetManager.cxx:25
 TProofDataSetManager.cxx:26
 TProofDataSetManager.cxx:27
 TProofDataSetManager.cxx:28
 TProofDataSetManager.cxx:29
 TProofDataSetManager.cxx:30
 TProofDataSetManager.cxx:31
 TProofDataSetManager.cxx:32
 TProofDataSetManager.cxx:33
 TProofDataSetManager.cxx:34
 TProofDataSetManager.cxx:35
 TProofDataSetManager.cxx:36
 TProofDataSetManager.cxx:37
 TProofDataSetManager.cxx:38
 TProofDataSetManager.cxx:39
 TProofDataSetManager.cxx:40
 TProofDataSetManager.cxx:41
 TProofDataSetManager.cxx:42
 TProofDataSetManager.cxx:43
 TProofDataSetManager.cxx:44
 TProofDataSetManager.cxx:45
 TProofDataSetManager.cxx:46
 TProofDataSetManager.cxx:47
 TProofDataSetManager.cxx:48
 TProofDataSetManager.cxx:49
 TProofDataSetManager.cxx:50
 TProofDataSetManager.cxx:51
 TProofDataSetManager.cxx:52
 TProofDataSetManager.cxx:53
 TProofDataSetManager.cxx:54
 TProofDataSetManager.cxx:55
 TProofDataSetManager.cxx:56
 TProofDataSetManager.cxx:57
 TProofDataSetManager.cxx:58
 TProofDataSetManager.cxx:59
 TProofDataSetManager.cxx:60
 TProofDataSetManager.cxx:61
 TProofDataSetManager.cxx:62
 TProofDataSetManager.cxx:63
 TProofDataSetManager.cxx:64
 TProofDataSetManager.cxx:65
 TProofDataSetManager.cxx:66
 TProofDataSetManager.cxx:67
 TProofDataSetManager.cxx:68
 TProofDataSetManager.cxx:69
 TProofDataSetManager.cxx:70
 TProofDataSetManager.cxx:71
 TProofDataSetManager.cxx:72
 TProofDataSetManager.cxx:73
 TProofDataSetManager.cxx:74
 TProofDataSetManager.cxx:75
 TProofDataSetManager.cxx:76
 TProofDataSetManager.cxx:77
 TProofDataSetManager.cxx:78
 TProofDataSetManager.cxx:79
 TProofDataSetManager.cxx:80
 TProofDataSetManager.cxx:81
 TProofDataSetManager.cxx:82
 TProofDataSetManager.cxx:83
 TProofDataSetManager.cxx:84
 TProofDataSetManager.cxx:85
 TProofDataSetManager.cxx:86
 TProofDataSetManager.cxx:87
 TProofDataSetManager.cxx:88
 TProofDataSetManager.cxx:89
 TProofDataSetManager.cxx:90
 TProofDataSetManager.cxx:91
 TProofDataSetManager.cxx:92
 TProofDataSetManager.cxx:93
 TProofDataSetManager.cxx:94
 TProofDataSetManager.cxx:95
 TProofDataSetManager.cxx:96
 TProofDataSetManager.cxx:97
 TProofDataSetManager.cxx:98
 TProofDataSetManager.cxx:99
 TProofDataSetManager.cxx:100
 TProofDataSetManager.cxx:101
 TProofDataSetManager.cxx:102
 TProofDataSetManager.cxx:103
 TProofDataSetManager.cxx:104
 TProofDataSetManager.cxx:105
 TProofDataSetManager.cxx:106
 TProofDataSetManager.cxx:107
 TProofDataSetManager.cxx:108
 TProofDataSetManager.cxx:109
 TProofDataSetManager.cxx:110
 TProofDataSetManager.cxx:111
 TProofDataSetManager.cxx:112
 TProofDataSetManager.cxx:113
 TProofDataSetManager.cxx:114
 TProofDataSetManager.cxx:115
 TProofDataSetManager.cxx:116
 TProofDataSetManager.cxx:117
 TProofDataSetManager.cxx:118
 TProofDataSetManager.cxx:119
 TProofDataSetManager.cxx:120
 TProofDataSetManager.cxx:121
 TProofDataSetManager.cxx:122
 TProofDataSetManager.cxx:123
 TProofDataSetManager.cxx:124
 TProofDataSetManager.cxx:125
 TProofDataSetManager.cxx:126
 TProofDataSetManager.cxx:127
 TProofDataSetManager.cxx:128
 TProofDataSetManager.cxx:129
 TProofDataSetManager.cxx:130
 TProofDataSetManager.cxx:131
 TProofDataSetManager.cxx:132
 TProofDataSetManager.cxx:133
 TProofDataSetManager.cxx:134
 TProofDataSetManager.cxx:135
 TProofDataSetManager.cxx:136
 TProofDataSetManager.cxx:137
 TProofDataSetManager.cxx:138
 TProofDataSetManager.cxx:139
 TProofDataSetManager.cxx:140
 TProofDataSetManager.cxx:141
 TProofDataSetManager.cxx:142
 TProofDataSetManager.cxx:143
 TProofDataSetManager.cxx:144
 TProofDataSetManager.cxx:145
 TProofDataSetManager.cxx:146
 TProofDataSetManager.cxx:147
 TProofDataSetManager.cxx:148
 TProofDataSetManager.cxx:149
 TProofDataSetManager.cxx:150
 TProofDataSetManager.cxx:151
 TProofDataSetManager.cxx:152
 TProofDataSetManager.cxx:153
 TProofDataSetManager.cxx:154
 TProofDataSetManager.cxx:155
 TProofDataSetManager.cxx:156
 TProofDataSetManager.cxx:157
 TProofDataSetManager.cxx:158
 TProofDataSetManager.cxx:159
 TProofDataSetManager.cxx:160
 TProofDataSetManager.cxx:161
 TProofDataSetManager.cxx:162
 TProofDataSetManager.cxx:163
 TProofDataSetManager.cxx:164
 TProofDataSetManager.cxx:165
 TProofDataSetManager.cxx:166
 TProofDataSetManager.cxx:167
 TProofDataSetManager.cxx:168
 TProofDataSetManager.cxx:169
 TProofDataSetManager.cxx:170
 TProofDataSetManager.cxx:171
 TProofDataSetManager.cxx:172
 TProofDataSetManager.cxx:173
 TProofDataSetManager.cxx:174
 TProofDataSetManager.cxx:175
 TProofDataSetManager.cxx:176
 TProofDataSetManager.cxx:177
 TProofDataSetManager.cxx:178
 TProofDataSetManager.cxx:179
 TProofDataSetManager.cxx:180
 TProofDataSetManager.cxx:181
 TProofDataSetManager.cxx:182
 TProofDataSetManager.cxx:183
 TProofDataSetManager.cxx:184
 TProofDataSetManager.cxx:185
 TProofDataSetManager.cxx:186
 TProofDataSetManager.cxx:187
 TProofDataSetManager.cxx:188
 TProofDataSetManager.cxx:189
 TProofDataSetManager.cxx:190
 TProofDataSetManager.cxx:191
 TProofDataSetManager.cxx:192
 TProofDataSetManager.cxx:193
 TProofDataSetManager.cxx:194
 TProofDataSetManager.cxx:195
 TProofDataSetManager.cxx:196
 TProofDataSetManager.cxx:197
 TProofDataSetManager.cxx:198
 TProofDataSetManager.cxx:199
 TProofDataSetManager.cxx:200
 TProofDataSetManager.cxx:201
 TProofDataSetManager.cxx:202
 TProofDataSetManager.cxx:203
 TProofDataSetManager.cxx:204
 TProofDataSetManager.cxx:205
 TProofDataSetManager.cxx:206
 TProofDataSetManager.cxx:207
 TProofDataSetManager.cxx:208
 TProofDataSetManager.cxx:209
 TProofDataSetManager.cxx:210
 TProofDataSetManager.cxx:211
 TProofDataSetManager.cxx:212
 TProofDataSetManager.cxx:213
 TProofDataSetManager.cxx:214
 TProofDataSetManager.cxx:215
 TProofDataSetManager.cxx:216
 TProofDataSetManager.cxx:217
 TProofDataSetManager.cxx:218
 TProofDataSetManager.cxx:219
 TProofDataSetManager.cxx:220
 TProofDataSetManager.cxx:221
 TProofDataSetManager.cxx:222
 TProofDataSetManager.cxx:223
 TProofDataSetManager.cxx:224
 TProofDataSetManager.cxx:225
 TProofDataSetManager.cxx:226
 TProofDataSetManager.cxx:227
 TProofDataSetManager.cxx:228
 TProofDataSetManager.cxx:229
 TProofDataSetManager.cxx:230
 TProofDataSetManager.cxx:231
 TProofDataSetManager.cxx:232
 TProofDataSetManager.cxx:233
 TProofDataSetManager.cxx:234
 TProofDataSetManager.cxx:235
 TProofDataSetManager.cxx:236
 TProofDataSetManager.cxx:237
 TProofDataSetManager.cxx:238
 TProofDataSetManager.cxx:239
 TProofDataSetManager.cxx:240
 TProofDataSetManager.cxx:241
 TProofDataSetManager.cxx:242
 TProofDataSetManager.cxx:243
 TProofDataSetManager.cxx:244
 TProofDataSetManager.cxx:245
 TProofDataSetManager.cxx:246
 TProofDataSetManager.cxx:247
 TProofDataSetManager.cxx:248
 TProofDataSetManager.cxx:249
 TProofDataSetManager.cxx:250
 TProofDataSetManager.cxx:251
 TProofDataSetManager.cxx:252
 TProofDataSetManager.cxx:253
 TProofDataSetManager.cxx:254
 TProofDataSetManager.cxx:255
 TProofDataSetManager.cxx:256
 TProofDataSetManager.cxx:257
 TProofDataSetManager.cxx:258
 TProofDataSetManager.cxx:259
 TProofDataSetManager.cxx:260
 TProofDataSetManager.cxx:261
 TProofDataSetManager.cxx:262
 TProofDataSetManager.cxx:263
 TProofDataSetManager.cxx:264
 TProofDataSetManager.cxx:265
 TProofDataSetManager.cxx:266
 TProofDataSetManager.cxx:267
 TProofDataSetManager.cxx:268
 TProofDataSetManager.cxx:269
 TProofDataSetManager.cxx:270
 TProofDataSetManager.cxx:271
 TProofDataSetManager.cxx:272
 TProofDataSetManager.cxx:273
 TProofDataSetManager.cxx:274
 TProofDataSetManager.cxx:275
 TProofDataSetManager.cxx:276
 TProofDataSetManager.cxx:277
 TProofDataSetManager.cxx:278
 TProofDataSetManager.cxx:279
 TProofDataSetManager.cxx:280
 TProofDataSetManager.cxx:281
 TProofDataSetManager.cxx:282
 TProofDataSetManager.cxx:283
 TProofDataSetManager.cxx:284
 TProofDataSetManager.cxx:285
 TProofDataSetManager.cxx:286
 TProofDataSetManager.cxx:287
 TProofDataSetManager.cxx:288
 TProofDataSetManager.cxx:289
 TProofDataSetManager.cxx:290
 TProofDataSetManager.cxx:291
 TProofDataSetManager.cxx:292
 TProofDataSetManager.cxx:293
 TProofDataSetManager.cxx:294
 TProofDataSetManager.cxx:295
 TProofDataSetManager.cxx:296
 TProofDataSetManager.cxx:297
 TProofDataSetManager.cxx:298
 TProofDataSetManager.cxx:299
 TProofDataSetManager.cxx:300
 TProofDataSetManager.cxx:301
 TProofDataSetManager.cxx:302
 TProofDataSetManager.cxx:303
 TProofDataSetManager.cxx:304
 TProofDataSetManager.cxx:305
 TProofDataSetManager.cxx:306
 TProofDataSetManager.cxx:307
 TProofDataSetManager.cxx:308
 TProofDataSetManager.cxx:309
 TProofDataSetManager.cxx:310
 TProofDataSetManager.cxx:311
 TProofDataSetManager.cxx:312
 TProofDataSetManager.cxx:313
 TProofDataSetManager.cxx:314
 TProofDataSetManager.cxx:315
 TProofDataSetManager.cxx:316
 TProofDataSetManager.cxx:317
 TProofDataSetManager.cxx:318
 TProofDataSetManager.cxx:319
 TProofDataSetManager.cxx:320
 TProofDataSetManager.cxx:321
 TProofDataSetManager.cxx:322
 TProofDataSetManager.cxx:323
 TProofDataSetManager.cxx:324
 TProofDataSetManager.cxx:325
 TProofDataSetManager.cxx:326
 TProofDataSetManager.cxx:327
 TProofDataSetManager.cxx:328
 TProofDataSetManager.cxx:329
 TProofDataSetManager.cxx:330
 TProofDataSetManager.cxx:331
 TProofDataSetManager.cxx:332
 TProofDataSetManager.cxx:333
 TProofDataSetManager.cxx:334
 TProofDataSetManager.cxx:335
 TProofDataSetManager.cxx:336
 TProofDataSetManager.cxx:337
 TProofDataSetManager.cxx:338
 TProofDataSetManager.cxx:339
 TProofDataSetManager.cxx:340
 TProofDataSetManager.cxx:341
 TProofDataSetManager.cxx:342
 TProofDataSetManager.cxx:343
 TProofDataSetManager.cxx:344
 TProofDataSetManager.cxx:345
 TProofDataSetManager.cxx:346
 TProofDataSetManager.cxx:347
 TProofDataSetManager.cxx:348
 TProofDataSetManager.cxx:349
 TProofDataSetManager.cxx:350
 TProofDataSetManager.cxx:351
 TProofDataSetManager.cxx:352
 TProofDataSetManager.cxx:353
 TProofDataSetManager.cxx:354
 TProofDataSetManager.cxx:355
 TProofDataSetManager.cxx:356
 TProofDataSetManager.cxx:357
 TProofDataSetManager.cxx:358
 TProofDataSetManager.cxx:359
 TProofDataSetManager.cxx:360
 TProofDataSetManager.cxx:361
 TProofDataSetManager.cxx:362
 TProofDataSetManager.cxx:363
 TProofDataSetManager.cxx:364
 TProofDataSetManager.cxx:365
 TProofDataSetManager.cxx:366
 TProofDataSetManager.cxx:367
 TProofDataSetManager.cxx:368
 TProofDataSetManager.cxx:369
 TProofDataSetManager.cxx:370
 TProofDataSetManager.cxx:371
 TProofDataSetManager.cxx:372
 TProofDataSetManager.cxx:373
 TProofDataSetManager.cxx:374
 TProofDataSetManager.cxx:375
 TProofDataSetManager.cxx:376
 TProofDataSetManager.cxx:377
 TProofDataSetManager.cxx:378
 TProofDataSetManager.cxx:379
 TProofDataSetManager.cxx:380
 TProofDataSetManager.cxx:381
 TProofDataSetManager.cxx:382
 TProofDataSetManager.cxx:383
 TProofDataSetManager.cxx:384
 TProofDataSetManager.cxx:385
 TProofDataSetManager.cxx:386
 TProofDataSetManager.cxx:387
 TProofDataSetManager.cxx:388
 TProofDataSetManager.cxx:389
 TProofDataSetManager.cxx:390
 TProofDataSetManager.cxx:391
 TProofDataSetManager.cxx:392
 TProofDataSetManager.cxx:393
 TProofDataSetManager.cxx:394
 TProofDataSetManager.cxx:395
 TProofDataSetManager.cxx:396
 TProofDataSetManager.cxx:397
 TProofDataSetManager.cxx:398
 TProofDataSetManager.cxx:399
 TProofDataSetManager.cxx:400
 TProofDataSetManager.cxx:401
 TProofDataSetManager.cxx:402
 TProofDataSetManager.cxx:403
 TProofDataSetManager.cxx:404
 TProofDataSetManager.cxx:405
 TProofDataSetManager.cxx:406
 TProofDataSetManager.cxx:407
 TProofDataSetManager.cxx:408
 TProofDataSetManager.cxx:409
 TProofDataSetManager.cxx:410
 TProofDataSetManager.cxx:411
 TProofDataSetManager.cxx:412
 TProofDataSetManager.cxx:413
 TProofDataSetManager.cxx:414
 TProofDataSetManager.cxx:415
 TProofDataSetManager.cxx:416
 TProofDataSetManager.cxx:417
 TProofDataSetManager.cxx:418
 TProofDataSetManager.cxx:419
 TProofDataSetManager.cxx:420
 TProofDataSetManager.cxx:421
 TProofDataSetManager.cxx:422
 TProofDataSetManager.cxx:423
 TProofDataSetManager.cxx:424
 TProofDataSetManager.cxx:425
 TProofDataSetManager.cxx:426
 TProofDataSetManager.cxx:427
 TProofDataSetManager.cxx:428
 TProofDataSetManager.cxx:429
 TProofDataSetManager.cxx:430
 TProofDataSetManager.cxx:431
 TProofDataSetManager.cxx:432
 TProofDataSetManager.cxx:433
 TProofDataSetManager.cxx:434
 TProofDataSetManager.cxx:435
 TProofDataSetManager.cxx:436
 TProofDataSetManager.cxx:437
 TProofDataSetManager.cxx:438
 TProofDataSetManager.cxx:439
 TProofDataSetManager.cxx:440
 TProofDataSetManager.cxx:441
 TProofDataSetManager.cxx:442
 TProofDataSetManager.cxx:443
 TProofDataSetManager.cxx:444
 TProofDataSetManager.cxx:445
 TProofDataSetManager.cxx:446
 TProofDataSetManager.cxx:447
 TProofDataSetManager.cxx:448
 TProofDataSetManager.cxx:449
 TProofDataSetManager.cxx:450
 TProofDataSetManager.cxx:451
 TProofDataSetManager.cxx:452
 TProofDataSetManager.cxx:453
 TProofDataSetManager.cxx:454
 TProofDataSetManager.cxx:455
 TProofDataSetManager.cxx:456
 TProofDataSetManager.cxx:457
 TProofDataSetManager.cxx:458
 TProofDataSetManager.cxx:459
 TProofDataSetManager.cxx:460
 TProofDataSetManager.cxx:461
 TProofDataSetManager.cxx:462
 TProofDataSetManager.cxx:463
 TProofDataSetManager.cxx:464
 TProofDataSetManager.cxx:465
 TProofDataSetManager.cxx:466
 TProofDataSetManager.cxx:467
 TProofDataSetManager.cxx:468
 TProofDataSetManager.cxx:469
 TProofDataSetManager.cxx:470
 TProofDataSetManager.cxx:471
 TProofDataSetManager.cxx:472
 TProofDataSetManager.cxx:473
 TProofDataSetManager.cxx:474
 TProofDataSetManager.cxx:475
 TProofDataSetManager.cxx:476
 TProofDataSetManager.cxx:477
 TProofDataSetManager.cxx:478
 TProofDataSetManager.cxx:479
 TProofDataSetManager.cxx:480
 TProofDataSetManager.cxx:481
 TProofDataSetManager.cxx:482
 TProofDataSetManager.cxx:483
 TProofDataSetManager.cxx:484
 TProofDataSetManager.cxx:485
 TProofDataSetManager.cxx:486
 TProofDataSetManager.cxx:487
 TProofDataSetManager.cxx:488
 TProofDataSetManager.cxx:489
 TProofDataSetManager.cxx:490
 TProofDataSetManager.cxx:491
 TProofDataSetManager.cxx:492
 TProofDataSetManager.cxx:493
 TProofDataSetManager.cxx:494
 TProofDataSetManager.cxx:495
 TProofDataSetManager.cxx:496
 TProofDataSetManager.cxx:497
 TProofDataSetManager.cxx:498
 TProofDataSetManager.cxx:499
 TProofDataSetManager.cxx:500
 TProofDataSetManager.cxx:501
 TProofDataSetManager.cxx:502
 TProofDataSetManager.cxx:503
 TProofDataSetManager.cxx:504
 TProofDataSetManager.cxx:505
 TProofDataSetManager.cxx:506
 TProofDataSetManager.cxx:507
 TProofDataSetManager.cxx:508
 TProofDataSetManager.cxx:509
 TProofDataSetManager.cxx:510
 TProofDataSetManager.cxx:511
 TProofDataSetManager.cxx:512
 TProofDataSetManager.cxx:513
 TProofDataSetManager.cxx:514
 TProofDataSetManager.cxx:515
 TProofDataSetManager.cxx:516
 TProofDataSetManager.cxx:517
 TProofDataSetManager.cxx:518
 TProofDataSetManager.cxx:519
 TProofDataSetManager.cxx:520
 TProofDataSetManager.cxx:521
 TProofDataSetManager.cxx:522
 TProofDataSetManager.cxx:523
 TProofDataSetManager.cxx:524
 TProofDataSetManager.cxx:525
 TProofDataSetManager.cxx:526
 TProofDataSetManager.cxx:527
 TProofDataSetManager.cxx:528
 TProofDataSetManager.cxx:529
 TProofDataSetManager.cxx:530
 TProofDataSetManager.cxx:531
 TProofDataSetManager.cxx:532
 TProofDataSetManager.cxx:533
 TProofDataSetManager.cxx:534
 TProofDataSetManager.cxx:535
 TProofDataSetManager.cxx:536
 TProofDataSetManager.cxx:537
 TProofDataSetManager.cxx:538
 TProofDataSetManager.cxx:539
 TProofDataSetManager.cxx:540
 TProofDataSetManager.cxx:541
 TProofDataSetManager.cxx:542
 TProofDataSetManager.cxx:543
 TProofDataSetManager.cxx:544
 TProofDataSetManager.cxx:545
 TProofDataSetManager.cxx:546
 TProofDataSetManager.cxx:547
 TProofDataSetManager.cxx:548
 TProofDataSetManager.cxx:549
 TProofDataSetManager.cxx:550
 TProofDataSetManager.cxx:551
 TProofDataSetManager.cxx:552
 TProofDataSetManager.cxx:553
 TProofDataSetManager.cxx:554
 TProofDataSetManager.cxx:555
 TProofDataSetManager.cxx:556
 TProofDataSetManager.cxx:557
 TProofDataSetManager.cxx:558
 TProofDataSetManager.cxx:559
 TProofDataSetManager.cxx:560
 TProofDataSetManager.cxx:561
 TProofDataSetManager.cxx:562
 TProofDataSetManager.cxx:563
 TProofDataSetManager.cxx:564
 TProofDataSetManager.cxx:565
 TProofDataSetManager.cxx:566
 TProofDataSetManager.cxx:567
 TProofDataSetManager.cxx:568
 TProofDataSetManager.cxx:569
 TProofDataSetManager.cxx:570
 TProofDataSetManager.cxx:571
 TProofDataSetManager.cxx:572
 TProofDataSetManager.cxx:573
 TProofDataSetManager.cxx:574
 TProofDataSetManager.cxx:575
 TProofDataSetManager.cxx:576
 TProofDataSetManager.cxx:577
 TProofDataSetManager.cxx:578
 TProofDataSetManager.cxx:579
 TProofDataSetManager.cxx:580
 TProofDataSetManager.cxx:581
 TProofDataSetManager.cxx:582
 TProofDataSetManager.cxx:583
 TProofDataSetManager.cxx:584
 TProofDataSetManager.cxx:585
 TProofDataSetManager.cxx:586
 TProofDataSetManager.cxx:587
 TProofDataSetManager.cxx:588
 TProofDataSetManager.cxx:589
 TProofDataSetManager.cxx:590
 TProofDataSetManager.cxx:591
 TProofDataSetManager.cxx:592
 TProofDataSetManager.cxx:593
 TProofDataSetManager.cxx:594
 TProofDataSetManager.cxx:595
 TProofDataSetManager.cxx:596
 TProofDataSetManager.cxx:597
 TProofDataSetManager.cxx:598
 TProofDataSetManager.cxx:599
 TProofDataSetManager.cxx:600
 TProofDataSetManager.cxx:601
 TProofDataSetManager.cxx:602
 TProofDataSetManager.cxx:603
 TProofDataSetManager.cxx:604
 TProofDataSetManager.cxx:605
 TProofDataSetManager.cxx:606
 TProofDataSetManager.cxx:607
 TProofDataSetManager.cxx:608
 TProofDataSetManager.cxx:609
 TProofDataSetManager.cxx:610
 TProofDataSetManager.cxx:611
 TProofDataSetManager.cxx:612
 TProofDataSetManager.cxx:613
 TProofDataSetManager.cxx:614
 TProofDataSetManager.cxx:615
 TProofDataSetManager.cxx:616
 TProofDataSetManager.cxx:617
 TProofDataSetManager.cxx:618
 TProofDataSetManager.cxx:619
 TProofDataSetManager.cxx:620
 TProofDataSetManager.cxx:621
 TProofDataSetManager.cxx:622
 TProofDataSetManager.cxx:623
 TProofDataSetManager.cxx:624
 TProofDataSetManager.cxx:625
 TProofDataSetManager.cxx:626
 TProofDataSetManager.cxx:627
 TProofDataSetManager.cxx:628
 TProofDataSetManager.cxx:629
 TProofDataSetManager.cxx:630
 TProofDataSetManager.cxx:631
 TProofDataSetManager.cxx:632
 TProofDataSetManager.cxx:633
 TProofDataSetManager.cxx:634
 TProofDataSetManager.cxx:635
 TProofDataSetManager.cxx:636
 TProofDataSetManager.cxx:637
 TProofDataSetManager.cxx:638
 TProofDataSetManager.cxx:639
 TProofDataSetManager.cxx:640
 TProofDataSetManager.cxx:641
 TProofDataSetManager.cxx:642
 TProofDataSetManager.cxx:643
 TProofDataSetManager.cxx:644
 TProofDataSetManager.cxx:645
 TProofDataSetManager.cxx:646
 TProofDataSetManager.cxx:647
 TProofDataSetManager.cxx:648
 TProofDataSetManager.cxx:649
 TProofDataSetManager.cxx:650
 TProofDataSetManager.cxx:651
 TProofDataSetManager.cxx:652
 TProofDataSetManager.cxx:653
 TProofDataSetManager.cxx:654
 TProofDataSetManager.cxx:655
 TProofDataSetManager.cxx:656
 TProofDataSetManager.cxx:657
 TProofDataSetManager.cxx:658
 TProofDataSetManager.cxx:659
 TProofDataSetManager.cxx:660
 TProofDataSetManager.cxx:661
 TProofDataSetManager.cxx:662
 TProofDataSetManager.cxx:663
 TProofDataSetManager.cxx:664
 TProofDataSetManager.cxx:665
 TProofDataSetManager.cxx:666
 TProofDataSetManager.cxx:667
 TProofDataSetManager.cxx:668
 TProofDataSetManager.cxx:669
 TProofDataSetManager.cxx:670
 TProofDataSetManager.cxx:671
 TProofDataSetManager.cxx:672
 TProofDataSetManager.cxx:673
 TProofDataSetManager.cxx:674
 TProofDataSetManager.cxx:675
 TProofDataSetManager.cxx:676
 TProofDataSetManager.cxx:677
 TProofDataSetManager.cxx:678
 TProofDataSetManager.cxx:679
 TProofDataSetManager.cxx:680
 TProofDataSetManager.cxx:681
 TProofDataSetManager.cxx:682
 TProofDataSetManager.cxx:683
 TProofDataSetManager.cxx:684
 TProofDataSetManager.cxx:685
 TProofDataSetManager.cxx:686
 TProofDataSetManager.cxx:687
 TProofDataSetManager.cxx:688
 TProofDataSetManager.cxx:689
 TProofDataSetManager.cxx:690
 TProofDataSetManager.cxx:691
 TProofDataSetManager.cxx:692
 TProofDataSetManager.cxx:693
 TProofDataSetManager.cxx:694
 TProofDataSetManager.cxx:695
 TProofDataSetManager.cxx:696
 TProofDataSetManager.cxx:697
 TProofDataSetManager.cxx:698
 TProofDataSetManager.cxx:699
 TProofDataSetManager.cxx:700
 TProofDataSetManager.cxx:701
 TProofDataSetManager.cxx:702
 TProofDataSetManager.cxx:703
 TProofDataSetManager.cxx:704
 TProofDataSetManager.cxx:705
 TProofDataSetManager.cxx:706
 TProofDataSetManager.cxx:707
 TProofDataSetManager.cxx:708
 TProofDataSetManager.cxx:709
 TProofDataSetManager.cxx:710
 TProofDataSetManager.cxx:711
 TProofDataSetManager.cxx:712
 TProofDataSetManager.cxx:713
 TProofDataSetManager.cxx:714
 TProofDataSetManager.cxx:715
 TProofDataSetManager.cxx:716
 TProofDataSetManager.cxx:717
 TProofDataSetManager.cxx:718
 TProofDataSetManager.cxx:719
 TProofDataSetManager.cxx:720
 TProofDataSetManager.cxx:721
 TProofDataSetManager.cxx:722
 TProofDataSetManager.cxx:723
 TProofDataSetManager.cxx:724
 TProofDataSetManager.cxx:725
 TProofDataSetManager.cxx:726
 TProofDataSetManager.cxx:727
 TProofDataSetManager.cxx:728
 TProofDataSetManager.cxx:729
 TProofDataSetManager.cxx:730
 TProofDataSetManager.cxx:731
 TProofDataSetManager.cxx:732
 TProofDataSetManager.cxx:733
 TProofDataSetManager.cxx:734
 TProofDataSetManager.cxx:735
 TProofDataSetManager.cxx:736
 TProofDataSetManager.cxx:737
 TProofDataSetManager.cxx:738
 TProofDataSetManager.cxx:739
 TProofDataSetManager.cxx:740
 TProofDataSetManager.cxx:741
 TProofDataSetManager.cxx:742
 TProofDataSetManager.cxx:743
 TProofDataSetManager.cxx:744
 TProofDataSetManager.cxx:745
 TProofDataSetManager.cxx:746
 TProofDataSetManager.cxx:747
 TProofDataSetManager.cxx:748
 TProofDataSetManager.cxx:749
 TProofDataSetManager.cxx:750
 TProofDataSetManager.cxx:751
 TProofDataSetManager.cxx:752
 TProofDataSetManager.cxx:753
 TProofDataSetManager.cxx:754
 TProofDataSetManager.cxx:755
 TProofDataSetManager.cxx:756
 TProofDataSetManager.cxx:757
 TProofDataSetManager.cxx:758
 TProofDataSetManager.cxx:759
 TProofDataSetManager.cxx:760
 TProofDataSetManager.cxx:761
 TProofDataSetManager.cxx:762
 TProofDataSetManager.cxx:763
 TProofDataSetManager.cxx:764
 TProofDataSetManager.cxx:765
 TProofDataSetManager.cxx:766
 TProofDataSetManager.cxx:767
 TProofDataSetManager.cxx:768
 TProofDataSetManager.cxx:769
 TProofDataSetManager.cxx:770
 TProofDataSetManager.cxx:771
 TProofDataSetManager.cxx:772
 TProofDataSetManager.cxx:773
 TProofDataSetManager.cxx:774
 TProofDataSetManager.cxx:775
 TProofDataSetManager.cxx:776
 TProofDataSetManager.cxx:777
 TProofDataSetManager.cxx:778
 TProofDataSetManager.cxx:779
 TProofDataSetManager.cxx:780
 TProofDataSetManager.cxx:781
 TProofDataSetManager.cxx:782
 TProofDataSetManager.cxx:783
 TProofDataSetManager.cxx:784
 TProofDataSetManager.cxx:785
 TProofDataSetManager.cxx:786
 TProofDataSetManager.cxx:787
 TProofDataSetManager.cxx:788
 TProofDataSetManager.cxx:789
 TProofDataSetManager.cxx:790
 TProofDataSetManager.cxx:791
 TProofDataSetManager.cxx:792
 TProofDataSetManager.cxx:793
 TProofDataSetManager.cxx:794
 TProofDataSetManager.cxx:795
 TProofDataSetManager.cxx:796
 TProofDataSetManager.cxx:797
 TProofDataSetManager.cxx:798
 TProofDataSetManager.cxx:799
 TProofDataSetManager.cxx:800
 TProofDataSetManager.cxx:801
 TProofDataSetManager.cxx:802
 TProofDataSetManager.cxx:803
 TProofDataSetManager.cxx:804
 TProofDataSetManager.cxx:805
 TProofDataSetManager.cxx:806
 TProofDataSetManager.cxx:807
 TProofDataSetManager.cxx:808
 TProofDataSetManager.cxx:809
 TProofDataSetManager.cxx:810
 TProofDataSetManager.cxx:811
 TProofDataSetManager.cxx:812
 TProofDataSetManager.cxx:813
 TProofDataSetManager.cxx:814
 TProofDataSetManager.cxx:815
 TProofDataSetManager.cxx:816
 TProofDataSetManager.cxx:817
 TProofDataSetManager.cxx:818
 TProofDataSetManager.cxx:819
 TProofDataSetManager.cxx:820
 TProofDataSetManager.cxx:821
 TProofDataSetManager.cxx:822
 TProofDataSetManager.cxx:823
 TProofDataSetManager.cxx:824
 TProofDataSetManager.cxx:825
 TProofDataSetManager.cxx:826
 TProofDataSetManager.cxx:827
 TProofDataSetManager.cxx:828
 TProofDataSetManager.cxx:829
 TProofDataSetManager.cxx:830
 TProofDataSetManager.cxx:831
 TProofDataSetManager.cxx:832
 TProofDataSetManager.cxx:833
 TProofDataSetManager.cxx:834
 TProofDataSetManager.cxx:835
 TProofDataSetManager.cxx:836
 TProofDataSetManager.cxx:837
 TProofDataSetManager.cxx:838
 TProofDataSetManager.cxx:839
 TProofDataSetManager.cxx:840
 TProofDataSetManager.cxx:841
 TProofDataSetManager.cxx:842
 TProofDataSetManager.cxx:843
 TProofDataSetManager.cxx:844
 TProofDataSetManager.cxx:845
 TProofDataSetManager.cxx:846
 TProofDataSetManager.cxx:847
 TProofDataSetManager.cxx:848
 TProofDataSetManager.cxx:849
 TProofDataSetManager.cxx:850
 TProofDataSetManager.cxx:851
 TProofDataSetManager.cxx:852
 TProofDataSetManager.cxx:853
 TProofDataSetManager.cxx:854
 TProofDataSetManager.cxx:855
 TProofDataSetManager.cxx:856
 TProofDataSetManager.cxx:857
 TProofDataSetManager.cxx:858
 TProofDataSetManager.cxx:859
 TProofDataSetManager.cxx:860
 TProofDataSetManager.cxx:861
 TProofDataSetManager.cxx:862
 TProofDataSetManager.cxx:863
 TProofDataSetManager.cxx:864
 TProofDataSetManager.cxx:865
 TProofDataSetManager.cxx:866
 TProofDataSetManager.cxx:867
 TProofDataSetManager.cxx:868
 TProofDataSetManager.cxx:869
 TProofDataSetManager.cxx:870
 TProofDataSetManager.cxx:871
 TProofDataSetManager.cxx:872
 TProofDataSetManager.cxx:873
 TProofDataSetManager.cxx:874
 TProofDataSetManager.cxx:875
 TProofDataSetManager.cxx:876
 TProofDataSetManager.cxx:877
 TProofDataSetManager.cxx:878
 TProofDataSetManager.cxx:879
 TProofDataSetManager.cxx:880
 TProofDataSetManager.cxx:881
 TProofDataSetManager.cxx:882
 TProofDataSetManager.cxx:883
 TProofDataSetManager.cxx:884
 TProofDataSetManager.cxx:885
 TProofDataSetManager.cxx:886
 TProofDataSetManager.cxx:887
 TProofDataSetManager.cxx:888
 TProofDataSetManager.cxx:889
 TProofDataSetManager.cxx:890
 TProofDataSetManager.cxx:891
 TProofDataSetManager.cxx:892
 TProofDataSetManager.cxx:893
 TProofDataSetManager.cxx:894
 TProofDataSetManager.cxx:895
 TProofDataSetManager.cxx:896
 TProofDataSetManager.cxx:897
 TProofDataSetManager.cxx:898
 TProofDataSetManager.cxx:899
 TProofDataSetManager.cxx:900
 TProofDataSetManager.cxx:901
 TProofDataSetManager.cxx:902
 TProofDataSetManager.cxx:903
 TProofDataSetManager.cxx:904
 TProofDataSetManager.cxx:905
 TProofDataSetManager.cxx:906
 TProofDataSetManager.cxx:907
 TProofDataSetManager.cxx:908
 TProofDataSetManager.cxx:909
 TProofDataSetManager.cxx:910
 TProofDataSetManager.cxx:911
 TProofDataSetManager.cxx:912
 TProofDataSetManager.cxx:913
 TProofDataSetManager.cxx:914
 TProofDataSetManager.cxx:915
 TProofDataSetManager.cxx:916
 TProofDataSetManager.cxx:917
 TProofDataSetManager.cxx:918
 TProofDataSetManager.cxx:919
 TProofDataSetManager.cxx:920
 TProofDataSetManager.cxx:921
 TProofDataSetManager.cxx:922
 TProofDataSetManager.cxx:923
 TProofDataSetManager.cxx:924
 TProofDataSetManager.cxx:925
 TProofDataSetManager.cxx:926
 TProofDataSetManager.cxx:927
 TProofDataSetManager.cxx:928
 TProofDataSetManager.cxx:929
 TProofDataSetManager.cxx:930
 TProofDataSetManager.cxx:931
 TProofDataSetManager.cxx:932
 TProofDataSetManager.cxx:933
 TProofDataSetManager.cxx:934
 TProofDataSetManager.cxx:935
 TProofDataSetManager.cxx:936
 TProofDataSetManager.cxx:937
 TProofDataSetManager.cxx:938
 TProofDataSetManager.cxx:939
 TProofDataSetManager.cxx:940
 TProofDataSetManager.cxx:941
 TProofDataSetManager.cxx:942
 TProofDataSetManager.cxx:943
 TProofDataSetManager.cxx:944
 TProofDataSetManager.cxx:945
 TProofDataSetManager.cxx:946
 TProofDataSetManager.cxx:947
 TProofDataSetManager.cxx:948
 TProofDataSetManager.cxx:949
 TProofDataSetManager.cxx:950