57 ClassImp(TDSetElement);
 
   63 TDSetElement::TDSetElement() : TNamed(
"",
""),
 
   64                                fDirectory(), fFirst(0), fNum(0), fMsd(),
 
   65                                fTDSetOffset(0), fEntryList(0), fValid(kFALSE),
 
   66                                fEntries(0), fFriends(0), fDataSet(), fAssocObjList(0),
 
   70    ResetBit(kHasBeenLookedUp);
 
   80 TDSetElement::TDSetElement(
const char *file, 
const char *objname, 
const char *dir,
 
   81                            Long64_t first, Long64_t num,
 
   82                            const char *msd, 
const char *dataset)
 
   83              : TNamed(file, objname)
 
   86       Warning(
"TDSetElement", 
"first must be >= 0, %lld is not allowed - setting to 0", first);
 
   92       Warning(
"TDSetElement", 
"num must be >= -1, %lld is not allowed - setting to -1", num);
 
  110    ResetBit(kHasBeenLookedUp);
 
  112    ResetBit(kCorrupted);
 
  114    ResetBit(kNewPacket);
 
  120 TDSetElement::TDSetElement(
const TDSetElement& elem)
 
  121              : TNamed(elem.GetFileName(), elem.GetObjName())
 
  123    fDirectory = elem.GetDirectory();
 
  124    fFirst = elem.fFirst;
 
  127    fTDSetOffset = elem.fTDSetOffset;
 
  129    fValid = elem.fValid;
 
  130    fEntries = elem.fEntries;
 
  132    fDataSet = elem.fDataSet;
 
  134    fMaxProcTime = elem.fMaxProcTime;
 
  136    ResetBit(kHasBeenLookedUp);
 
  138    ResetBit(kCorrupted);
 
  140    ResetBit(kNewPacket);
 
  146 TDSetElement::~TDSetElement()
 
  150       fAssocObjList->SetOwner(kTRUE);
 
  151       SafeDelete(fAssocObjList);
 
  158 void TDSetElement::Reset()
 
  168    ResetBit(kHasBeenLookedUp);
 
  171    ResetBit(kNewPacket);
 
  182 Int_t TDSetElement::MergeElement(TDSetElement *elem)
 
  185    if (!elem) 
return -1;
 
  188    if (strcmp(GetName(), elem->GetName()) || strcmp(GetTitle(), elem->GetTitle()))
 
  193    if (fFirst == 0 && fNum == -1) {
 
  196    } 
else if (elem->GetFirst() == 0 && elem->GetNum() == -1) {
 
  200       fEntries = elem->GetEntries();
 
  202    } 
else if (fFirst >= 0 && fNum > 0 && elem->GetFirst() >= 0 && elem->GetNum() > 0) {
 
  203       Long64_t last = fFirst + fNum - 1, lastref = 0;
 
  204       Long64_t lastelem = elem->GetFirst() + elem->GetNum() - 1;
 
  205       if (elem->GetFirst() == last + 1) {
 
  208       } 
else if (fFirst == lastelem + 1) {
 
  209          fFirst += elem->GetFirst();
 
  212       } 
else if (elem->GetFirst() < last + 1 && elem->GetFirst() >= fFirst) {
 
  213          lastref = (lastelem > last) ? lastelem : last;
 
  215       } 
else if (fFirst < lastelem + 1 && fFirst >= elem->GetFirst()) {
 
  216          fFirst += elem->GetFirst();
 
  217          lastref = (lastelem > last) ? lastelem : last;
 
  220       fNum = lastref - fFirst + 1;
 
  222    if (rc >= 0 && fEntries < 0 && elem->GetEntries() > 0) fEntries = elem->GetEntries();
 
  231 TFileInfo *TDSetElement::GetFileInfo(
const char *type)
 
  234    TFileInfoMeta *meta = 0;
 
  235    Long64_t entries = (fEntries < 0 && fNum > 0) ? fNum : fEntries;
 
  236    Printf(
"entries: %lld (%lld)", entries, fNum);
 
  237    if (!strcmp(type, 
"TTree")) {
 
  238       meta = 
new TFileInfoMeta(GetTitle(), 
"TTree", entries, fFirst,
 
  239                                 fFirst + entries - 1);
 
  241       meta = 
new TFileInfoMeta(GetTitle(), fDirectory, type, entries, fFirst,
 
  242                                 fFirst + entries - 1);
 
  244    TFileInfo *fi = 
new TFileInfo(GetName(), 0, 0, 0, meta);
 
  245    if (!fDataSet.IsNull()) fi->SetTitle(fDataSet.Data());
 
  246    if (TestBit(TDSetElement::kCorrupted)) fi->SetBit(TFileInfo::kCorrupted);
 
  253 const char *TDSetElement::GetDirectory()
 const 
  261 void TDSetElement::Print(Option_t *opt)
 const 
  263    if (opt && opt[0] == 
'a') {
 
  264       Printf(
"%s file=\"%s\" dir=\"%s\" obj=\"%s\" first=%lld num=%lld msd=\"%s\"",
 
  265              IsA()->GetName(), GetName(), fDirectory.Data(), GetTitle(),
 
  266              fFirst, fNum, fMsd.Data());
 
  268       Printf(
"\tLFN: %s", GetName());
 
  275 void TDSetElement::Validate(Bool_t isTree)
 
  277    Long64_t entries = GetEntries(isTree);
 
  278    if (entries < 0) 
return; 
 
  279    if (fFirst < entries) {
 
  281          fNum = entries - fFirst;
 
  284          if (fNum <= entries - fFirst) {
 
  287             Error(
"Validate", 
"TDSetElement has only %lld entries starting" 
  288                               " with entry %lld, while %lld were requested",
 
  289                               entries - fFirst, fFirst, fNum);
 
  293       Error(
"Validate", 
"TDSetElement has only %lld entries with" 
  294             " first entry requested as %lld", entries, fFirst);
 
  301 void TDSetElement::Validate(TDSetElement *elem)
 
  314    if (!elem || !elem->GetValid()) {
 
  315       Error(
"Validate", 
"TDSetElement to validate against is not valid");
 
  319    TString name = TUrl(GetFileName()).GetFileAndOptions();
 
  320    TString elemname = TUrl(elem->GetFileName()).GetFileAndOptions();
 
  321    if ((name == elemname) &&
 
  322        !strcmp(GetDirectory(), elem->GetDirectory()) &&
 
  323        !strcmp(GetObjName(), elem->GetObjName())) {
 
  324       Long64_t entries = elem->fFirst + elem->fNum;
 
  325       if (fFirst < entries) {
 
  327             fNum = entries - fFirst;
 
  330             if (fNum <= entries - fFirst) {
 
  333                Error(
"Validate", 
"TDSetElement requests %lld entries starting" 
  334                                  " with entry %lld, while TDSetElement to validate against" 
  335                                  " has only %lld entries", fNum, fFirst, entries);
 
  339          Error(
"Validate", 
"TDSetElement to validate against has only %lld" 
  340                " entries, but this TDSetElement requested %lld as its first" 
  341                " entry", entries, fFirst);
 
  344       Error(
"Validate", 
"TDSetElements do not refer to same objects");
 
  351 Int_t TDSetElement::Compare(
const TObject *obj)
 const 
  353    if (
this == obj) 
return 0;
 
  355    const TDSetElement *elem = 
dynamic_cast<const TDSetElement*
>(obj);
 
  358          return (strncmp(GetName(),obj->GetName(),strlen(GetName()))) ? 1 : 0;
 
  362    Int_t order = strncmp(GetName(),elem->GetFileName(),strlen(GetName()));
 
  364       if (GetFirst() < elem->GetFirst())
 
  366       else if (GetFirst() > elem->GetFirst())
 
  376 void TDSetElement::AddFriend(TDSetElement *friendElement, 
const char *alias)
 
  378    if (!friendElement) {
 
  379       Error(
"AddFriend", 
"The friend TDSetElement is null!");
 
  383       fFriends = 
new TList();
 
  384       fFriends->SetOwner();
 
  387    if (alias && strlen(alias) > 0) {
 
  388       TUrl uf(friendElement->GetName());
 
  389       TString uo(uf.GetOptions());
 
  390       uo += TString::Format(
"friend_alias=%s|", alias);
 
  392       friendElement->SetName(uf.GetUrl());
 
  394    fFriends->Add(
new TDSetElement(*friendElement));
 
  400 void TDSetElement::DeleteFriends()
 
  405    fFriends->SetOwner(kTRUE);
 
  413 TDSetElement *TDSet::Next(Long64_t )
 
  416       fIterator = 
new TIter(fElements);
 
  419    fCurrent = (TDSetElement *) fIterator->Next();
 
  429 Long64_t TDSetElement::GetEntries(Bool_t isTree, Bool_t openfile)
 
  431    if (fEntries > -1 || !openfile)
 
  435    if (gPerfStats) start = TTimeStamp();
 
  438    TFile::EFileType typ = TFile::kDefault;
 
  439    TString fname = gEnv->GetValue(
"Path.Localroot",
""), pfx(fname);
 
  441    Int_t oldLevel = gErrorIgnoreLevel;
 
  442    gErrorIgnoreLevel = kError+1;
 
  443    if ((typ = TFile::GetType(GetName(), 
"", &fname)) != TFile::kLocal) fname = GetName();
 
  444    gErrorIgnoreLevel = oldLevel;
 
  446    TFile *file = TFile::Open(fname);
 
  449       gPerfStats->FileOpenEvent(file, GetName(), start);
 
  452       ::SysError(
"TDSetElement::GetEntries",
 
  453                  "cannot open file %s (type: %d, pfx: %s)", GetName(), typ, pfx.Data());
 
  460    if (Lookup(kFALSE) != 0) Warning(
"GetEntries", 
"lookup problems for %s", GetName());
 
  462    TDirectory *dirsave = gDirectory;
 
  463    if (!file->cd(fDirectory)) {
 
  464       Error(
"GetEntries", 
"cannot cd to %s", fDirectory.Data());
 
  469    TDirectory *dir = gDirectory;
 
  474       TString on(GetTitle());
 
  475       TString sreg(GetTitle());
 
  478       if (sreg.Length() <= 0 || sreg == 
"" || sreg.Contains(
"*")) {
 
  479          if (sreg.Contains(
"*"))
 
  480             sreg.ReplaceAll(
"*", 
".*");
 
  484          if (dir->GetListOfKeys()) {
 
  485             TIter nxk(dir->GetListOfKeys());
 
  487             Bool_t notfound = kTRUE;
 
  488             while ((k = (TKey *) nxk())) {
 
  489                if (!strcmp(k->GetClassName(), 
"TTree")) {
 
  490                   TString kn(k->GetName());
 
  491                   if (kn.Index(re) != kNPOS) {
 
  495                      } 
else if (kn != on) {
 
  496                        Warning(
"GetEntries",
 
  497                                "additional tree found in the file: %s", kn.Data());
 
  505       TKey *key = dir->GetKey(on);
 
  507          Error(
"GetEntries", 
"cannot find tree \"%s\" in %s",
 
  508                GetTitle(), GetName());
 
  512       TTree *tree = (TTree *) key->ReadObj();
 
  518       fEntries = tree->GetEntries();
 
  522       TList *keys = dir->GetListOfKeys();
 
  523       fEntries = keys->GetSize();
 
  534 Int_t TDSetElement::Lookup(Bool_t force)
 
  536    static Int_t xNetPluginOK = -1;
 
  537    static TFileStager *xStager = 0;
 
  541    if (!force && HasBeenLookedUp())
 
  546    TString anch = url.GetAnchor();
 
  547    TString opts = url.GetOptions();
 
  549    TString name(url.GetUrl());
 
  552    Bool_t doit = kFALSE;
 
  553    TFile::EFileType type = TFile::GetType(name, 
"");
 
  554    if (type == TFile::kNet) {
 
  555       TPluginHandler *h = 0;
 
  557       if (xNetPluginOK == -1) {
 
  560          if ((h = gROOT->GetPluginManager()->FindHandler(
"TFile", name)) &&
 
  561             !strcmp(h->GetClass(),
"TXNetFile") && h->LoadPlugin() == 0)
 
  564       doit = (xNetPluginOK == 1) ? kTRUE : kFALSE;
 
  569       if (!xStager || !xStager->Matches(name)) {
 
  571          if (!(xStager = TFileStager::Open(name))) {
 
  572             Error(
"Lookup", 
"TFileStager instance cannot be instantiated");
 
  576       if (xStager && xStager->Locate(name.Data(), name) == 0) {
 
  580          url.SetOptions(opts);
 
  583          fName = url.GetUrl();
 
  586          Error(
"Lookup", 
"couldn't lookup %s", name.Data());
 
  592    SetBit(kHasBeenLookedUp);
 
  599 void TDSetElement::SetEntryList(TObject *aList, Long64_t first, Long64_t num)
 
  609    TEntryList *enl = 
dynamic_cast<TEntryList*
>(aList);
 
  611       evl = 
dynamic_cast<TEventList*
>(aList);
 
  613       Error(
"SetEntryList", 
"type of input object must be either TEntryList " 
  614                             "or TEventList (found: '%s' - do nothing", aList->ClassName());
 
  620       enl->SetEntriesToProcess(num);
 
  622       for (; num > 0; num--, first++)
 
  623          evl->Enter(evl->GetEntry((Int_t)first));
 
  634 void TDSetElement::AddAssocObj(TObject *assocobj)
 
  637       if (!fAssocObjList) fAssocObjList = 
new TList;
 
  638       if (fAssocObjList) fAssocObjList->Add(assocobj);
 
  652 TObject *TDSetElement::GetAssocObj(Long64_t i, Bool_t isentry)
 
  655    if (!fAssocObjList || fAssocObjList->GetSize() <= 0) 
return o;
 
  660       if (i < fFirst) 
return o;
 
  661       s.Form(
"%lld", i - fFirst);
 
  666    if (!(s.IsDigit())) 
return o;
 
  668    if (pos > fAssocObjList->GetSize() - 1) pos %= fAssocObjList->GetSize();
 
  669    return fAssocObjList->At(pos);
 
  706    fElements = 
new THashList;
 
  707    fElements->SetOwner();
 
  717    ResetBit(kValidityChecked);
 
  718    ResetBit(kSomeInvalid);
 
  719    ResetBit(kMultiDSet);
 
  722    gROOT->GetListOfDataSets()->Add(
this);
 
  741 TDSet::TDSet(
const char *name,
 
  742              const char *objname, 
const char *dir, 
const char *type)
 
  744    fElements = 
new THashList;
 
  745    fElements->SetOwner();
 
  754    ResetBit(kValidityChecked);
 
  755    ResetBit(kSomeInvalid);
 
  756    ResetBit(kMultiDSet);
 
  761    if (name && strlen(name) > 0) {
 
  765          if (cn.Contains(
':')) cn.Remove(0, cn.Index(
":")+1);
 
  766          if (TClass::GetClass(cn))
 
  775          if (strlen(type) > 0)
 
  776             if (TClass::GetClass(type))
 
  779    } 
else if (type && strlen(type) > 0) {
 
  781       if (TClass::GetClass(type))
 
  785    c = TClass::GetClass(fType);
 
  787    fIsTree = (c->InheritsFrom(TTree::Class())) ? kTRUE : kFALSE;
 
  796    if (fName.Length() <= 0)
 
  797       fName = TString::Format(
"TDSet:%s", fObjName.Data());
 
  802    gROOT->GetListOfDataSets()->Add(
this);
 
  811 TDSet::TDSet(
const TChain &chain, Bool_t withfriends)
 
  813    fElements = 
new THashList;
 
  814    fElements->SetOwner();
 
  823    ResetBit(kValidityChecked);
 
  824    ResetBit(kSomeInvalid);
 
  825    ResetBit(kMultiDSet);
 
  829    fObjName = chain.GetName();
 
  830    fName = TString::Format(
"TChain:%s", chain.GetName());
 
  833    TIter next(chain.GetListOfFiles());
 
  834    TChainElement *elem = 0;
 
  836    while ((elem = (TChainElement *)next())) {
 
  837       TString file(elem->GetTitle());
 
  838       TString tree(elem->GetName());
 
  839       Int_t isl = tree.Last(
'/');
 
  843          TString behindSlash = tree(isl + 1, tree.Length() - isl - 1);
 
  850       TString msd(TUrl(file).GetOptions());
 
  852       if ((imsd = msd.Index(
"msd=")) != kNPOS) {
 
  853          msd.Remove(0, imsd+4);
 
  858       Long64_t nent = (elem->GetEntries() > 0 &&
 
  859                        elem->GetEntries() != TTree::kMaxEntries) ? elem->GetEntries() : -1;
 
  860       if (Add(file, tree, dir, 0, nent, ((msd.IsNull()) ? 0 : msd.Data()))) {
 
  861          if (elem->HasBeenLookedUp()) {
 
  863             TDSetElement *dse = (TDSetElement *) fElements->Last();
 
  864             if (dse) dse->SetLookedUp();
 
  874       chainsQueue.Add((TObject *)&chain);
 
  875       processed.Add((TObject *)&chain);
 
  876       while (chainsQueue.GetSize() > 0) {
 
  877          TChain *c = (TChain *) chainsQueue.First();
 
  878          chainsQueue.Remove(c);
 
  879          TIter friendsIter(c->GetListOfFriends());
 
  880          while(TFriendElement *fe = dynamic_cast<TFriendElement*> (friendsIter()) ) {
 
  881             if (TChain *fc = dynamic_cast<TChain*>(fe->GetTree())) {
 
  882                if (!processed.FindObject(fc)) {    
 
  883                   processed.AddFirst(fc);
 
  884                   AddFriend(
new TDSet((
const TChain &)(*fc), kFALSE), fe->GetName());
 
  889                Error(
"TDSet", 
"Only TChains supported. Found illegal tree %s",
 
  890                               fe->GetTree()->GetName());
 
  903    SafeDelete(fElements);
 
  904    SafeDelete(fIterator);
 
  905    SafeDelete(fProofChain);
 
  909    gROOT->GetListOfDataSets()->Remove(
this);
 
  919 Long64_t TDSet::Process(TSelector *selector, Option_t *option, Long64_t nentries,
 
  920                         Long64_t first, TObject *enl)
 
  922    if (!IsValid() || !fElements->GetSize()) {
 
  923       Error(
"Process", 
"not a correctly initialized TDSet");
 
  931       return gProof->Process(
this, selector, option, nentries, first);
 
  933    Error(
"Process", 
"no active PROOF session");
 
  944 Long64_t TDSet::Process(
const char *selector, Option_t *option, Long64_t nentries,
 
  945                         Long64_t first, TObject *enl)
 
  947    if (!IsValid() || !fElements->GetSize()) {
 
  948       Error(
"Process", 
"not a correctly initialized TDSet");
 
  956       return gProof->Process(
this, selector, option, nentries, first);
 
  958    Error(
"Process", 
"no active PROOF session");
 
  966 void TDSet::AddInput(TObject *obj)
 
  969       gProof->AddInput(obj);
 
  971       Error(
"AddInput",
"No PROOF session active");
 
  978 void TDSet::ClearInput()
 
  981       gProof->ClearInput();
 
  988 TObject *TDSet::GetOutput(
const char *name)
 
  991       return gProof->GetOutput(name);
 
  998 TList *TDSet::GetOutputList()
 
 1001       return gProof->GetOutputList();
 
 1008 void TDSet::Print(
const Option_t *opt)
 const 
 1010    const char *clnm = (IsA()) ? IsA()->GetName() : 
"TDSet";
 
 1011    Printf(
"OBJ: %s\ttype %s\t%s\tin %s\telements %d", clnm, GetName(),
 
 1012           fObjName.Data(), GetTitle(), GetListOfElements()->GetSize());
 
 1014    if (opt && opt[0] == 
'a') {
 
 1015       TIter next(GetListOfElements());
 
 1017       while ((obj = next())) {
 
 1026 void TDSet::SetObjName(
const char *objname)
 
 1030       TIter next(GetListOfElements());
 
 1032       while ((e = (TDSetElement *) next())) {
 
 1033          e->SetTitle(objname);
 
 1041 void TDSet::SetDirectory(
const char *dir)
 
 1052 Bool_t TDSet::Add(
const char *file, 
const char *objname, 
const char *dir,
 
 1053                   Long64_t first, Long64_t num, 
const char *msd)
 
 1055    if (!file || !*file) {
 
 1056       Error(
"Add", 
"file name must be specified");
 
 1061    if (gProof && gProof->IsLite()) {
 
 1062       TUrl u(file, kTRUE);
 
 1063       if (!strcmp(u.GetProtocol(), 
"file")) {
 
 1064          fn = u.GetFileAndOptions();
 
 1065          gSystem->ExpandPathName(fn);
 
 1066          if (!gSystem->IsAbsoluteFileName(fn))
 
 1067             gSystem->PrependPathName(gSystem->WorkingDirectory(), fn);
 
 1072    TDSetElement *el = (TDSetElement *) fElements->FindObject(fn);
 
 1075          objname = GetObjName();
 
 1077          dir = GetDirectory();
 
 1078       fElements->Add(
new TDSetElement(fn, objname, dir, first, num, msd));
 
 1081       msg.Form(
"duplication detected: %40s is already in dataset - ignored", fn.Data());
 
 1082       Warning(
"Add", 
"%s", msg.Data());
 
 1084          msg.Insert(0, 
"WARNING: ");
 
 1085          gProofServ->SendAsynMessage(msg);
 
 1095 Bool_t TDSet::Add(TDSet *dset)
 
 1100    if (TestBit(TDSet::kMultiDSet)) {
 
 1101       fElements->Add(dset);
 
 1105    if (fType != dset->GetType()) {
 
 1106       Error(
"Add", 
"cannot add a set with a different type");
 
 1111    TIter next(dset->fElements);
 
 1112    TObject *last = (dset == 
this) ? fElements->Last() : 0;
 
 1113    while ((el = (TDSetElement*) next())) {
 
 1114       Add(el->GetFileName(), el->GetObjName(), el->GetDirectory(),
 
 1115           el->GetFirst(), el->GetNum(), el->GetMsd());
 
 1116       if (el == last) 
break;
 
 1132 Bool_t TDSet::Add(TCollection *filelist, 
const char *meta, Bool_t availableOnly,
 
 1133                   TCollection *badlist)
 
 1139    TIter next(filelist);
 
 1140    while ((o = next())) {
 
 1141       TString cn(o->ClassName());
 
 1142       if (cn == 
"TFileInfo") {
 
 1143          TFileInfo *fi = (TFileInfo *)o;
 
 1144          if (!availableOnly ||
 
 1145             (fi->TestBit(TFileInfo::kStaged) &&
 
 1146             !fi->TestBit(TFileInfo::kCorrupted))) {
 
 1147             Int_t nf = fElements->GetSize();
 
 1148             if (!Add(fi, meta)) 
return kFALSE;
 
 1150             if (fElements->GetSize() <= nf && badlist) badlist->Add(fi);
 
 1151          } 
else if (badlist) {
 
 1155       } 
else if (cn == 
"TUrl") {
 
 1156          Add(((TUrl *)o)->GetUrl());
 
 1157       } 
else if (cn == 
"TObjString") {
 
 1158          Add(((TObjString *)o)->GetName());
 
 1160          Warning(
"Add",
"found object fo unexpected type %s - ignoring", cn.Data());
 
 1172 void TDSet::SetSrvMaps(TList *srvmaps)
 
 1175    SafeDelete(fSrvMapsIter);
 
 1176    if (fSrvMaps) fSrvMapsIter = 
new TIter(fSrvMaps);
 
 1185 Bool_t TDSet::Add(TFileInfo *fi, 
const char *meta)
 
 1188       Error(
"Add", 
"TFileInfo object name must be specified");
 
 1194    const char *file = fi->GetFirstUrl()->GetUrl();
 
 1195    Bool_t setLookedUp = kTRUE;
 
 1197    if (TDataSetManager::CheckDataSetSrvMaps(fi->GetFirstUrl(), file1, fSrvMaps) &&
 
 1198        !(file1.IsNull())) {
 
 1199       file = file1.Data();
 
 1200       setLookedUp = kFALSE;
 
 1203    if (fElements->FindObject(file)) {
 
 1204       msg.Form(
"duplication detected: %40s is already in dataset - ignored", file);
 
 1205       Warning(
"Add", 
"%s", msg.Data());
 
 1207          msg.Insert(0, 
"WARNING: ");
 
 1208          gProofServ->SendAsynMessage(msg);
 
 1216    TFileInfoMeta *m = 0;
 
 1217    if (!meta || strlen(meta) <= 0 || !strcmp(meta, 
"/")) {
 
 1219       if ((fil = fi->GetMetaDataList()) && fil->GetSize() > 1) {
 
 1220          msg.Form(
"\n  Object name unspecified and several objects available.\n");
 
 1221          msg += 
"  Please choose one from the list below:\n";
 
 1223          while ((m = (TFileInfoMeta *) nx())) {
 
 1224             TString nm(m->GetName());
 
 1225             if (nm.BeginsWith(
"/")) nm.Remove(0,1);
 
 1226             msg += Form(
"  %s  ->   TProof::Process(\"%s#%s\",...)\n",
 
 1227                         nm.Data(), GetName(), nm.Data());
 
 1230             gProofServ->SendAsynMessage(msg);
 
 1232             Warning(
"Add", 
"%s", msg.Data());
 
 1238    m = fi->GetMetaData(meta);
 
 1241    const char *objname = 0;
 
 1242    const char *dir = 0;
 
 1246       objname = GetObjName();
 
 1247       dir = GetDirectory();
 
 1249       objname = (m->GetObject() && strlen(m->GetObject())) ? m->GetObject() : GetObjName();
 
 1250       dir = (m->GetDirectory() && strlen(m->GetDirectory())) ? m->GetDirectory() : GetDirectory();
 
 1251       first = m->GetFirst();
 
 1252       num = m->GetEntries();
 
 1254    const char *dataset = 0;
 
 1255    if (strcmp(fi->GetTitle(), 
"TFileInfo")) dataset = fi->GetTitle();
 
 1256    TDSetElement *el = 
new TDSetElement(file, objname, dir, first, -1, 0, dataset);
 
 1257    el->SetEntries(num);
 
 1260    if (fi->TestBit(TFileInfo::kStaged) && setLookedUp)
 
 1261       el->SetBit(TDSetElement::kHasBeenLookedUp);
 
 1262    if (fi->TestBit(TFileInfo::kCorrupted))
 
 1263       el->SetBit(TDSetElement::kCorrupted);
 
 1277 Int_t TDSet::ExportFileList(
const char *fpath, Option_t *opt)
 
 1281    if (fElements->GetSize() <= 0)
 
 1284    Bool_t force = (opt[0] == 
'F' || opt[0] == 
'f');
 
 1286    if (gSystem->AccessPathName(fpath, kFileExists) == kFALSE) {
 
 1289          if (gSystem->Unlink(fpath)) {
 
 1290             Info(
"ExportFileList",
"error removing dataset file: %s", fpath);
 
 1297    TList *fileinfo = 
new TList;
 
 1298    fileinfo->SetOwner();
 
 1300    TDSetElement *dse = 0;
 
 1301    TIter next(fElements);
 
 1302    while ((dse = (TDSetElement *) next())) {
 
 1303       TFileInfoMeta *m = 
new TFileInfoMeta(dse->GetTitle(), dse->GetDirectory(), GetType(),
 
 1304                                            dse->GetNum(), dse->GetFirst());
 
 1305       TFileInfo *fi = 
new TFileInfo(dse->GetFileName());
 
 1311    TFile *f = TFile::Open(fpath, 
"RECREATE");
 
 1314       fileinfo->Write(
"fileList", TObject::kSingleKey);
 
 1317       Info(
"ExportFileList",
"error creating dataset file: %s", fpath);
 
 1318       SafeDelete(fileinfo);
 
 1324    SafeDelete(fileinfo);
 
 1335 void TDSet::AddFriend(TDSet *friendset, 
const char* alias)
 
 1338       Error(
"AddFriend", 
"The friend TDSet is null!");
 
 1343       Error(
"AddFriend", 
"a friend set can only be added to a TTree TDSet");
 
 1346    TList *thisList = GetListOfElements();
 
 1347    TList *friendsList = friendset->GetListOfElements();
 
 1348    if (thisList->GetSize() != friendsList->GetSize() && friendsList->GetSize() != 1) {
 
 1349       Error(
"AddFriend", 
"the friend dataset has %d elements while the main one has %d",
 
 1350             thisList->GetSize(), friendsList->GetSize());
 
 1353    TIter next(thisList);
 
 1354    TIter next2(friendsList);
 
 1355    TDSetElement *friendElem = 0;
 
 1356    if (friendsList->GetSize() == 1)
 
 1357       friendElem = dynamic_cast<TDSetElement*> (friendsList->First());
 
 1358    while(TDSetElement* e = dynamic_cast<TDSetElement*> (next())) {
 
 1360          e->AddFriend(friendElem, alias);
 
 1362          e->AddFriend(dynamic_cast<TDSetElement*> (next2()), alias);
 
 1372       fIterator = 
new TIter(fElements);
 
 1382 Long64_t TDSet::GetEntries(Bool_t isTree, 
const char *filename, 
const char *path,
 
 1386    if (gPerfStats) start = TTimeStamp();
 
 1389    TFile::EFileType typ = TFile::kDefault;
 
 1390    TString fname = gEnv->GetValue(
"Path.Localroot",
""), pfx(fname);
 
 1392    Int_t oldLevel = gErrorIgnoreLevel;
 
 1393    gErrorIgnoreLevel = kError+1;
 
 1394    if ((typ = TFile::GetType(filename, 
"", &fname)) != TFile::kLocal) fname = filename;
 
 1395    gErrorIgnoreLevel = oldLevel;
 
 1397    TFile *file = TFile::Open(fname);
 
 1400       gPerfStats->FileOpenEvent(file, filename, start);
 
 1403       ::SysError(
"TDSet::GetEntries",
 
 1404                  "cannot open file %s (type: %d, pfx: %s)", filename, typ, pfx.Data());
 
 1408    TDirectory *dirsave = gDirectory;
 
 1409    if (!file->cd(path)) {
 
 1410       ::Error(
"TDSet::GetEntries", 
"cannot cd to %s", path);
 
 1415    TDirectory *dir = gDirectory;
 
 1419    Bool_t fillname = kFALSE;
 
 1422       TString on(objname);
 
 1423       TString sreg(objname);
 
 1426       if (sreg.Length() <= 0 || sreg == 
"" || sreg.Contains(
"*")) {
 
 1428          if (sreg.Contains(
"*"))
 
 1429             sreg.ReplaceAll(
"*", 
".*");
 
 1433          if (dir->GetListOfKeys()) {
 
 1434             TIter nxk(dir->GetListOfKeys());
 
 1436             Bool_t notfound = kTRUE;
 
 1437             while ((k = (TKey *) nxk())) {
 
 1438                if (!strcmp(k->GetClassName(), 
"TTree")) {
 
 1439                   TString kn(k->GetName());
 
 1440                   if (kn.Index(re) != kNPOS) {
 
 1444                      } 
else if (kn != on) {
 
 1445                        ::Warning(
"TDSet::GetEntries",
 
 1446                                  "additional tree found in the file: %s", kn.Data());
 
 1454       TKey *key = dir->GetKey(on);
 
 1456          ::Error(
"TDSet::GetEntries", 
"cannot find tree \"%s\" in %s",
 
 1457                  objname.Data(), filename);
 
 1461       TTree *tree = (TTree *) key->ReadObj();
 
 1467       entries = tree->GetEntries();
 
 1471       objname = (fillname) ? on : objname;
 
 1474       TList *keys = dir->GetListOfKeys();
 
 1475       entries = keys->GetSize();
 
 1490 Long64_t TDSet::Draw(
const char *varexp, 
const TCut &selection, Option_t *option,
 
 1491                      Long64_t nentries, Long64_t firstentry)
 
 1493    return Draw(varexp, selection.GetTitle(), option, nentries, firstentry);
 
 1501 Long64_t TDSet::Draw(
const char *varexp, 
const char *selection, Option_t *option,
 
 1502                      Long64_t nentries, Long64_t firstentry)
 
 1504    if (!IsValid() || !fElements->GetSize()) {
 
 1505       Error(
"Draw", 
"not a correctly initialized TDSet");
 
 1510       return gProof->DrawSelect(
this, varexp, selection, option, nentries,
 
 1513    Error(
"Draw", 
"no active PROOF session");
 
 1520 void TDSet::StartViewer()
 
 1522    if (gROOT->IsBatch()) {
 
 1523       Warning(
"StartViewer", 
"viewer cannot run in batch mode");
 
 1528       Error(
"StartViewer", 
"no PROOF found");
 
 1532       Error(
"StartViewer", 
"TDSet contents should be of type TTree (or subtype)");
 
 1535    fProofChain = 
new TProofChain(
this, kTRUE);
 
 1538    if ((h = gROOT->GetPluginManager()->FindHandler(
"TVirtualTreeViewer"))) {
 
 1539       if (h->LoadPlugin() == -1)
 
 1541       h->ExecPlugin(1,fProofChain);
 
 1548 TTree* TDSet::GetTreeHeader(TProof* proof)
 
 1550    return proof->GetTreeHeader(
this);
 
 1556 Bool_t TDSet::ElementsValid()
 
 1558    if (TestBit(TDSet::kValidityChecked))
 
 1559       return (TestBit(TDSet::kSomeInvalid) ? kFALSE : kTRUE);
 
 1561    SetBit(TDSet::kValidityChecked);
 
 1562    ResetBit(TDSet::kSomeInvalid);
 
 1563    TIter nextElem(GetListOfElements());
 
 1564    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextElem())) {
 
 1565       if (!elem->GetValid()) {
 
 1566          SetBit(TDSet::kSomeInvalid);
 
 1577 Int_t TDSet::Remove(TDSetElement *elem, Bool_t deleteElem)
 
 1579    if (!elem || !(((THashList *)(GetListOfElements()))->Remove(elem)))
 
 1590 void TDSet::Validate()
 
 1592    TIter nextElem(GetListOfElements());
 
 1593    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextElem())) {
 
 1594       if (!elem->GetValid())
 
 1595          elem->Validate(IsTree());
 
 1606 void TDSet::Lookup(Bool_t removeMissing, TList **listOfMissingFiles)
 
 1614    TString msg(
"Looking up for exact location of files");
 
 1617    UInt_t tot = GetListOfElements()->GetSize();
 
 1618    UInt_t n2 = (tot > 50) ? (UInt_t) tot / 50 : 1;
 
 1620    TIter nextElem(GetListOfElements());
 
 1621    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextElem())) {
 
 1622       if (elem->GetNum() != 0) { 
 
 1624          if (!elem->GetValid())
 
 1625             if (elem->Lookup(kFALSE))
 
 1626                if (removeMissing) {
 
 1627                   if (Remove(elem, kFALSE))
 
 1628                      Error(
"Lookup", 
"Error removing a missing file");
 
 1629                   if (listOfMissingFiles)
 
 1630                    (*listOfMissingFiles)->Add(elem->GetFileInfo(fType));
 
 1635       if (gProof && (n > 0 && !(n % n2)))
 
 1636          gProof->SendDataSetStatus(msg, n, tot, st);
 
 1638       if (gProof && gProof->GetRunStatus() != TProof::kRunning)
 
 1643    if (ng < tot && gProofServ) {
 
 1644       msg = Form(
"Files with entries to be processed: %d (out of %d)\n", ng, tot);
 
 1645       gProofServ->SendAsynMessage(msg);
 
 1648       if (gProof) gProof->SendDataSetStatus(msg, n, tot, st);
 
 1658 void TDSet::SetLookedUp()
 
 1660    TIter nextElem(GetListOfElements());
 
 1661    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextElem()))
 
 1662       elem->SetLookedUp();
 
 1669 void TDSet::Validate(TDSet* dset)
 
 1671    THashList bestElements;
 
 1672    bestElements.SetOwner();
 
 1674    namedHolder.SetOwner();
 
 1675    TIter nextOtherElem(dset->GetListOfElements());
 
 1676    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextOtherElem())) {
 
 1677       if (!elem->GetValid()) 
continue;
 
 1678       TString dir_file_obj = elem->GetDirectory();
 
 1679       dir_file_obj += 
"_";
 
 1680       dir_file_obj += TUrl(elem->GetFileName()).GetFileAndOptions();
 
 1681       dir_file_obj += 
"_";
 
 1682       dir_file_obj += elem->GetObjName();
 
 1683       TPair *p = 
dynamic_cast<TPair*
>(bestElements.FindObject(dir_file_obj));
 
 1685          TDSetElement *prevelem = 
dynamic_cast<TDSetElement*
>(p->Value());
 
 1687             Long64_t entries = prevelem->GetFirst()+prevelem->GetNum();
 
 1688             if (entries<elem->GetFirst()+elem->GetNum()) {
 
 1689                bestElements.Remove(p);
 
 1690                bestElements.Add(
new TPair(p->Key(), elem));
 
 1695          TNamed* named = 
new TNamed(dir_file_obj, dir_file_obj);
 
 1696          namedHolder.Add(named);
 
 1697          bestElements.Add(
new TPair(named, elem));
 
 1701    TIter nextElem(GetListOfElements());
 
 1702    while (TDSetElement *elem = dynamic_cast<TDSetElement*>(nextElem())) {
 
 1703       if (!elem->GetValid()) {
 
 1704          TString dir_file_obj = elem->GetDirectory();
 
 1705          dir_file_obj += 
"_";
 
 1706          dir_file_obj += TUrl(elem->GetFileName()).GetFileAndOptions();
 
 1707          dir_file_obj += 
"_";
 
 1708          dir_file_obj += elem->GetObjName();
 
 1709          if (TPair *p = dynamic_cast<TPair*>(bestElements.FindObject(dir_file_obj))) {
 
 1710             TDSetElement* validelem = 
dynamic_cast<TDSetElement*
>(p->Value());
 
 1711             elem->Validate(validelem);
 
 1723 void TDSetElement::Streamer(TBuffer &R__b)
 
 1725    if (R__b.IsReading()) {
 
 1727       Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
 
 1730          R__b.ReadClassBuffer(TDSetElement::Class(), 
this, R__v, R__s, R__c);
 
 1735             TNamed::Streamer(R__b);
 
 1739             TObject::Streamer(R__b);
 
 1740             TString name, title;
 
 1741             R__b >> name >> title;
 
 1742             SetNameTitle(name, title);
 
 1749          R__b >> fTDSetOffset;
 
 1756          FriendsList_t *friends = 
new FriendsList_t;
 
 1757          static TClassRef classFriendsList = TClass::GetClass(
typeid(FriendsList_t));
 
 1758          R__b.ReadClassBuffer( classFriendsList, friends, classFriendsList->GetClassVersion(), 0, 0);
 
 1761             fFriends = 
new TList();
 
 1762             fFriends->SetOwner();
 
 1763             for (FriendsList_t::iterator i = friends->begin();
 
 1764                  i != friends->end(); ++i) {
 
 1765                TDSetElement *dse = (TDSetElement *) i->first->Clone();
 
 1766                fFriends->Add(
new TPair(dse, 
new TObjString(i->second.Data())));
 
 1772          R__b.CheckByteCount(R__s, R__c, TDSetElement::IsA());
 
 1775       if (TestBit(kWriteV3)) {
 
 1777          R__b << Version_t(3);
 
 1778          TObject::Streamer(R__b);
 
 1779          R__b << TString(GetName());
 
 1780          R__b << TString(GetTitle());
 
 1785          R__b << fTDSetOffset;
 
 1786          R__b << (TEventList *)0;
 
 1791          FriendsList_t *friends = 
new FriendsList_t;
 
 1793             TIter nxf(fFriends);
 
 1795             while ((p = (TPair *)nxf()))
 
 1796                friends->push_back(std::make_pair((TDSetElement *)p->Key(),
 
 1797                                    TString(((TObjString *)p->Value())->GetName())));
 
 1799          static TClassRef classFriendsList = TClass::GetClass(
typeid(FriendsList_t));
 
 1800          R__b.WriteClassBuffer( classFriendsList, &friends );
 
 1806          R__b.WriteClassBuffer(TDSetElement::Class(),
this);
 
 1814 void TDSet::Streamer(TBuffer &R__b)
 
 1816    if (R__b.IsReading()) {
 
 1818       Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
 
 1821          R__b.ReadClassBuffer(TDSet::Class(), 
this, R__v, R__s, R__c);
 
 1825          TNamed::Streamer(R__b);
 
 1830          elems.Streamer(R__b);
 
 1831          elems.SetOwner(kFALSE);
 
 1832          if (elems.GetSize() > 0) {
 
 1833             fElements = 
new THashList;
 
 1834             fElements->SetOwner();
 
 1835             TDSetElement *e = 0;
 
 1837             while ((e = (TDSetElement *)nxe())) {
 
 1846       if (TestBit(kWriteV3)) {
 
 1848          R__b << Version_t(3);
 
 1849          TNamed::Streamer(R__b);
 
 1855             elems.SetOwner(kFALSE);
 
 1856             if (fElements->GetSize() > 0) {
 
 1857                TDSetElement *e = 0;
 
 1858                TIter nxe(fElements);
 
 1859                while ((e = (TDSetElement *)nxe()))
 
 1863          elems.Streamer(R__b);
 
 1866          R__b.WriteClassBuffer(TDSet::Class(),
this);
 
 1875 void TDSet::SetWriteV3(Bool_t on)
 
 1878       SetBit(TDSet::kWriteV3);
 
 1880       ResetBit(TDSet::kWriteV3);
 
 1882    TIter nxe(GetListOfElements());
 
 1886          o->SetBit(TDSetElement::kWriteV3);
 
 1888          o->ResetBit(TDSetElement::kWriteV3);
 
 1894 void TDSet::SetEntryList(TObject *aList)
 
 1901       TIter next(fElements);
 
 1903       while ((el=(TDSetElement*)next())){
 
 1904          el->SetEntryList(aList);
 
 1910    if (TestBit(TDSet::kMultiDSet)) {
 
 1913       TIter nxds(fElements);
 
 1915       while ((ds = (TDSet *) nxds()))
 
 1916          ds->SetEntryList(aList);
 
 1921       TEventList *evl = 0;
 
 1922       TEntryList *enl = 
dynamic_cast<TEntryList*
>(aList);
 
 1924          evl = 
dynamic_cast<TEventList*
>(aList);
 
 1926          Error(
"SetEntryList", 
"type of input object must be either TEntryList " 
 1927                               "or TEventList (found: '%s' - do nothing", aList->ClassName());
 
 1932       fEntryList = (enl) ? enl : (TEntryList *)evl;
 
 1942 void TDSet::SplitEntryList()
 
 1944    if (TestBit(TDSet::kMultiDSet)) {
 
 1946       TIter nxds(fElements);
 
 1948       while ((ds = (TDSet *) nxds()))
 
 1949          ds->SplitEntryList();
 
 1956          Info(
"SplitEntryList", 
"no entry- (or event-) list to split - do nothing");
 
 1961    TEntryList *enl = 
dynamic_cast<TEntryList *
>(fEntryList);
 
 1964       TIter next(fElements);
 
 1966       TEntryList *sublist = 0;
 
 1967       while ((el=(TDSetElement*)next())){
 
 1968          sublist = enl->GetEntryList(el->GetObjName(), el->GetFileName());
 
 1970             el->SetEntryList(sublist);
 
 1971             el->SetNum(sublist->GetN());
 
 1973             sublist = 
new TEntryList(
"", 
"");
 
 1974             el->SetEntryList(sublist);
 
 1979       TEventList *evl = 
dynamic_cast<TEventList *
>(fEntryList);
 
 1982          TIter next(fElements);
 
 1983          TDSetElement *el, *prev;
 
 1985          prev = 
dynamic_cast<TDSetElement*
> (next());
 
 1988          Long64_t low = prev->GetTDSetOffset();
 
 1989          Long64_t high = low;
 
 1990          Long64_t currPos = 0;
 
 1992             el = 
dynamic_cast<TDSetElement*
> (next());
 
 1994             high = (el == 0) ? kMaxLong64 : el->GetTDSetOffset();
 
 1996             while (currPos < evl->GetN() && evl->GetEntry(currPos) < low) {
 
 1997                Error(
"SplitEntryList",
 
 1998                      "TEventList: event outside of the range of any of the TDSetElements");
 
 2002             TEventList* nevl = 
new TEventList();
 
 2003             while (currPos < evl->GetN() && evl->GetEntry((Int_t)currPos) < high) {
 
 2004                nevl->Enter(evl->GetEntry((Int_t)currPos) - low);
 
 2007             prev->SetEntryList(nevl);
 
 2008             prev->SetNum(nevl->GetN());
 
 2019 Int_t TDSet::GetNumOfFiles()
 
 2024       if (TestBit(TDSet::kMultiDSet)) {
 
 2025          TIter nxds(fElements);
 
 2027          while ((ds = (TDSet *) nxds()))
 
 2028             if (ds->GetListOfElements()) nf += ds->GetListOfElements()->GetSize();
 
 2030          nf = fElements->GetSize();