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();