321 :
TFileCacheRead(tree->GetCurrentFile(), buffersize, tree), fEntryMax(tree->GetEntriesFast()), fEntryNext(0),
322 fBrNames(new
TList), fTree(tree), fPrefillType(GetConfiguredPrefillType())
325 Int_t nleaves = tree->GetListOfLeaves()->GetEntriesFast();
389 const char *bname =
b->GetName();
397 const char *mothername =
b->GetMother()->GetName();
398 if (
b !=
b->GetMother() && mothername[strlen(mothername)-1] !=
'.') {
401 if (bem->GetType() < 3) {
405 if (strncmp(bname,build.
Data(),build.
Length()) != 0) {
407 bname = build.
Data();
414 if (
gDebug > 0) printf(
"Entry: %lld, registering branch: %s\n",
b->GetTree()->GetReadEntry(),
b->GetName());
422 for (
Int_t j = 0; j < nb; j++) {
424 if (!branch)
continue;
449 TLeaf *leaf, *leafcount;
460 if (!strcmp(bname,
"*")) all =
true;
461 for (i=0;i<nleaves;i++) {
468 if (strcmp(bname,branch->
GetName())
477 if (leafcount && !all) {
484 if (nb==0 && strchr(bname,
'*')==
nullptr) {
502 if (t==
nullptr)
continue;
505 char *subbranch = (
char*)strstr(bname,fe->
GetName());
506 if (subbranch!=bname) subbranch =
nullptr;
508 subbranch += strlen(fe->
GetName());
509 if ( *subbranch !=
'.' ) subbranch =
nullptr;
521 if (!nb && !foundInFriend) {
522 if (
gDebug > 0) printf(
"AddBranch: unknown branch -> %s \n", bname);
523 Error(
"AddBranch",
"unknown branch -> %s", bname);
553 if (
gDebug > 0) printf(
"Entry: %lld, un-registering branch: %s\n",
b->GetTree()->GetReadEntry(),
b->GetName());
562 for (
Int_t j = 0; j < nb; j++) {
564 if (!branch)
continue;
589 TLeaf *leaf, *leafcount;
600 if (!strcmp(bname,
"*")) all =
true;
601 for (i=0;i<nleaves;i++) {
608 if (strcmp(bname,branch->
GetName())
617 if (leafcount && !all) {
624 if (nb==0 && strchr(bname,
'*')==
nullptr) {
642 if (t==
nullptr)
continue;
645 char *subbranch = (
char*)strstr(bname,fe->
GetName());
646 if (subbranch!=bname) subbranch =
nullptr;
648 subbranch += strlen(fe->
GetName());
649 if ( *subbranch !=
'.' ) subbranch =
nullptr;
661 if (!nb && !foundInFriend) {
662 if (
gDebug > 0) printf(
"DropBranch: unknown branch -> %s \n", bname);
663 Error(
"DropBranch",
"unknown branch -> %s", bname);
730 Int_t *lbaskets =
b.GetBasketBytes();
737 Int_t blistsize =
b.GetWriteBasket();
746 if (basketOffset < 0) {
752 if ((basketOffset < blistsize) &&
b.GetListOfBaskets()->UncheckedAt(basketOffset)) {
758 Long64_t pos =
b.GetBasketSeek(basketOffset);
799 bool found_request =
false;
800 TBranch *resultBranch =
nullptr;
803 std::vector<std::pair<size_t, Int_t>> basketsInfo;
807 for (
int i = 0; i < count; i++) {
812 if (iopos.
fLen == 0) {
816 found_request =
true;
824 Int_t blistsize =
b->GetWriteBasket();
825 Int_t basketNumber = -1;
826 for (
Int_t bn = 0; bn < blistsize; ++bn) {
827 if (iopos.
fPos ==
b->GetBasketSeek(bn)) {
832 if (basketNumber >= 0)
833 basketsInfo.emplace_back((
size_t)i, basketNumber);
842 for (
auto &info : basketsInfo) {
843 perfStats->SetLoadedMiss(info.first, info.second);
866 bool firstMiss =
false;
894 std::vector<Long64_t> positions;
895 positions.reserve(
fMissCache->fEntries.size());
896 std::vector<Int_t> lengths;
900 positions.push_back(mcentry.fIO.fPos);
901 lengths.push_back(mcentry.fIO.fLen);
902 mcentry.fIndex = cumulative;
903 cumulative += mcentry.fIO.fLen;
935 auto iter = std::lower_bound(
fMissCache->fEntries.begin(),
fMissCache->fEntries.end(), mcentry);
938 if (
len > iter->fIO.fLen) {
942 auto offset = iter->fIndex;
963 auto offset = iter->fIndex;
986 Range() : fMin(-1), fMax(-1) {}
990 if (fMin == -1 || min < fMin)
996 if (fMax == -1 || fMax < max)
1000 bool Contains(
Long64_t entry) {
return (fMin <= entry && entry <= fMax); }
1003 std::vector<Range> fRanges;
1004 std::map<Long64_t,size_t> fMinimums;
1005 std::map<Long64_t,size_t> fMaximums;
1007 BasketRanges(
size_t nBranches) { fRanges.resize(nBranches); }
1011 Range &range = fRanges.at(branchNumber);
1014 range.UpdateMin(min);
1015 range.UpdateMax(max);
1017 if (old.fMax != range.fMax) {
1018 if (old.fMax != -1) {
1019 auto maxIter = fMaximums.find(old.fMax);
1020 if (maxIter != fMaximums.end()) {
1021 if (maxIter->second == 1) {
1022 fMaximums.erase(maxIter);
1024 --(maxIter->second);
1032 void Update(
size_t branchNumber,
size_t basketNumber,
Long64_t *entries,
size_t nb,
size_t max)
1034 Update(branchNumber, entries[basketNumber],
1035 (basketNumber < (nb - 1)) ? (entries[basketNumber + 1] - 1) :
max - 1);
1039 bool CheckAllIncludeRange()
1042 for (
const auto &
r : fRanges) {
1056 Range allIncludedRange(AllIncludedRange());
1058 return (
result.fMin == allIncludedRange.fMin &&
result.fMax == allIncludedRange.fMax);
1068 Range AllIncludedRange()
1071 if (!fMinimums.empty())
1072 result.fMin = fMinimums.rbegin()->first;
1073 if (!fMaximums.empty())
1074 result.fMax = fMaximums.begin()->first;
1079 UInt_t BranchesRegistered()
1082 for (
const auto &
r : fRanges) {
1083 if (
r.fMin != -1 &&
r.fMax != -1)
1093 for (
const auto &
r : fRanges) {
1094 if (
r.fMin != -1 &&
r.fMax != -1)
1095 if (
r.fMin <= entry && entry <=
r.fMax)
1103 for (
size_t i = 0; i < fRanges.size(); ++i) {
1104 if (fRanges[i].fMin != -1 || fRanges[i].fMax != -1)
1105 Printf(
"Range #%zu : %lld to %lld", i, fRanges[i].fMin, fRanges[i].fMax);
1119 Long64_t entry = tree->GetReadEntry();
1164 if (entry < 0) entry = 0;
1170 if (entry < 0)
return false;
1176 if (entry < 0 && fEntryNext > 0) {
1196 static constexpr bool showMore =
false;
1198 static const auto PrintAllCacheInfo = [](
TObjArray *branches) {
1199 for (
Int_t i = 0; i < branches->GetEntries(); i++) {
1205 if (showMore ||
gDebug > 6)
1206 Info(
"FillBuffer",
"***** Called for entry %lld", entry);
1211 bool allUsed =
true;
1214 if (!
b->fCacheInfo.AllUsed()) {
1221 if (showMore ||
gDebug > 5)
1222 Info(
"FillBuffer",
"All baskets used already, so refresh the cache early at entry %lld", entry);
1238 bool resetBranchInfo =
false;
1241 resetBranchInfo =
true;
1242 if (showMore ||
gDebug > 6)
1243 Info(
"FillBuffer",
"*** Will reset the branch information about baskets");
1244 }
else if (showMore ||
gDebug > 6) {
1245 Info(
"FillBuffer",
"*** Info we have on the set of baskets");
1252 auto entryCurrent = clusterIter();
1268 if (showMore ||
gDebug > 6)
1282 if (resetBranchInfo) {
1285 if (!(fEntryCurrent < fCurrentClusterStart || fEntryCurrent >=
fNextClusterStart)) {
1286 Error(
"FillBuffer",
"Inconsistency: fCurrentClusterStart=%lld fEntryCurrent=%lld fNextClusterStart=%lld "
1287 "but fEntryCurrent should not be in between the two",
1311 Int_t ntotCurrentBuf = 0;
1315 ntotCurrentBuf =
fNtot;
1324 ntotCurrentBuf =
fNtot;
1331 Int_t clusterIterations = 0;
1335 Int_t nReadPrefRequest = 0;
1338 struct collectionInfo {
1339 Int_t fClusterStart{-1};
1341 bool fLoadedOnce{
false};
1343 void Rewind() { fCurrent = (fClusterStart >= 0) ? fClusterStart : 0; }
1353 prevNtot = ntotCurrentBuf;
1356 bool reachedEnd =
false;
1357 bool skippedFirst =
false;
1358 bool oncePerBranch =
false;
1359 Int_t nDistinctLoad = 0;
1360 bool progress =
true;
1371 auto CollectBaskets = [
this, elist, chainOffset, entry, clusterIterations, resetBranchInfo, perfStats,
1372 &
cursor, &lowestMaxEntry, &maxReadEntry, &minEntry,
1373 &reachedEnd, &skippedFirst, &oncePerBranch, &nDistinctLoad, &progress,
1374 &ranges, &memRanges, &reqRanges,
1375 &ntotCurrentBuf, &nReadPrefRequest](EPass pass, ENarrow narrow,
Long64_t maxCollectEntry) {
1379 Int_t nReachedEnd = 0;
1381 auto oldnReadPrefRequest = nReadPrefRequest;
1382 std::vector<Int_t> potentialVetoes;
1384 if (showMore ||
gDebug > 7)
1385 Info(
"CollectBaskets",
"Called with pass=%d narrow=%d maxCollectEntry=%lld", pass, narrow, maxCollectEntry);
1387 bool filled =
false;
1392 if (
b->GetDirectory()->GetFile() !=
fFile)
1394 potentialVetoes.clear();
1395 if (pass == kStart && !
cursor[i].fLoadedOnce && resetBranchInfo) {
1399 b->fCacheInfo.GetUnused(potentialVetoes);
1400 if (showMore ||
gDebug > 7) {
1402 for(
auto v : potentialVetoes) {
1406 if (!potentialVetoes.empty())
1407 Info(
"FillBuffer",
"*** Potential Vetos for branch #%d: %s", i, vetolist.
Data());
1409 b->fCacheInfo.Reset();
1411 Int_t nb =
b->GetMaxBaskets();
1412 Int_t *lbaskets =
b->GetBasketBytes();
1413 Long64_t *entries =
b->GetBasketEntry();
1414 if (!lbaskets || !entries)
1418 Int_t blistsize =
b->GetListOfBaskets()->GetSize();
1420 auto maxOfBasket = [
this, nb, entries](
int j) {
1421 return ((j < (nb - 1)) ? (entries[j + 1] - 1) :
fEntryMax - 1);
1424 if (pass == kRewind)
1426 else if (
cursor[i].fCurrent == -1) {
1428 cursor[i].fCurrent = (start < 0) ? 0 : start;
1430 for (
auto &j =
cursor[i].fCurrent; j < nb; j++) {
1433 if (j < blistsize && b->GetListOfBaskets()->UncheckedAt(j)) {
1435 if (showMore ||
gDebug > 6) {
1436 ranges.Update(i, entries[j], maxOfBasket(j));
1437 memRanges.Update(i, entries[j], maxOfBasket(j));
1439 if (entries[j] <= entry && entry <= maxOfBasket(j)) {
1440 b->fCacheInfo.SetIsInCache(j);
1441 b->fCacheInfo.SetUsed(j);
1455 if (entries[j] >= maxCollectEntry) {
1462 if (pos <= 0 ||
len <= 0)
1466 if ((showMore ||
gDebug > 7) &&
1467 (!(entries[j] < minEntry && (j < nb - 1 && entries[j + 1] <= minEntry))))
1468 Info(
"FillBuffer",
"Skipping branch %s basket %d is too large for the cache: %d > %d",
1473 if (nReadPrefRequest && entries[j] > (reqRanges.AllIncludedRange().fMax + 1)) {
1483 if (showMore ||
gDebug > 8)
1484 Info(
"FillBuffer",
"Skipping for now due to gap %d/%d with %lld > %lld", i, j, entries[j],
1485 (reqRanges.AllIncludedRange().fMax + 1));
1489 if (entries[j] < minEntry && (j<nb-1 && entries[j+1] <= minEntry))
1493 if (
cursor[i].fClusterStart == -1)
1494 cursor[i].fClusterStart = j;
1499 emax = entries[j + 1] - 1;
1500 if (!elist->
ContainsRange(entries[j]+chainOffset,emax+chainOffset))
1504 if (
b->fCacheInfo.HasBeenUsed(j) ||
b->fCacheInfo.IsInCache(j) ||
b->fCacheInfo.IsVetoed(j)) {
1507 if (showMore ||
gDebug > 7)
1508 Info(
"FillBuffer",
"Skipping basket to avoid redo: %d/%d veto: %d", i, j,
b->fCacheInfo.IsVetoed(j));
1512 if (std::find(std::begin(potentialVetoes), std::end(potentialVetoes), j) != std::end(potentialVetoes)) {
1519 b->fCacheInfo.Veto(j);
1520 if (showMore ||
gDebug > 7)
1521 Info(
"FillBuffer",
"Veto-ing cluster %d [%lld,%lld[ in branch %s #%d", j, entries[j],
1522 maxOfBasket(j) + 1,
b->GetName(), i);
1527 if ((((entries[j] > entry)) || (j < nb - 1 && entries[j + 1] <= entry))) {
1529 if (j ==
cursor[i].fClusterStart && entry > entries[j])
1531 if (entries[j] > entry)
1540 if (clusterIterations > 0 &&
cursor[i].fLoadedOnce) {
1544 if (showMore ||
gDebug > 5) {
1547 "Breaking early because %d is greater than %d at cluster iteration %d will restart at %lld",
1554 if (pass == kStart || !
cursor[i].fLoadedOnce) {
1562 if (showMore ||
gDebug > 5) {
1563 Info(
"FillBuffer",
"Breaking early because %d is greater than 4*%d at cluster iteration "
1564 "%d pass %d will restart at %lld",
1576 if (showMore ||
gDebug > 5) {
1577 Info(
"FillBuffer",
"Breaking early because %d is greater than 2*%d at cluster iteration "
1578 "%d pass %d will restart at %lld",
1590 reqRanges.Update(i, j, entries, nb,
fEntryMax);
1591 if (showMore ||
gDebug > 6)
1592 ranges.Update(i, j, entries, nb,
fEntryMax);
1594 b->fCacheInfo.SetIsInCache(j);
1596 if (showMore ||
gDebug > 6)
1597 Info(
"FillBuffer",
"*** Registering branch %d basket %d %s", i, j,
b->GetName());
1599 if (!
cursor[i].fLoadedOnce) {
1600 cursor[i].fLoadedOnce =
true;
1604 perfStats->SetLoaded(i, j);
1611 ntotCurrentBuf =
fNtot;
1620 ntotCurrentBuf =
fNtot;
1623 if ( ( j < (nb-1) ) && entries[j+1] > maxReadEntry ) {
1625 maxReadEntry = entries[j+1];
1629 Warning(
"FillBuffer",
"There is more data in this cluster (starting at entry %lld to %lld, "
1630 "current=%lld) than usual ... with %d %.3f%% of the branches we already have "
1631 "%d bytes (instead of %d)",
1635 if (pass == kStart) {
1637 auto high = maxOfBasket(j);
1638 if (high < lowestMaxEntry)
1639 lowestMaxEntry = high;
1643 }
else if ((j + 1) == nb || entries[j + 1] >= maxReadEntry || entries[j + 1] >= lowestMaxEntry) {
1645 auto high = maxOfBasket(j);
1646 if (high < lowestMaxEntry)
1647 lowestMaxEntry = high;
1654 if (
cursor[i].fCurrent == nb) {
1659 Info(
"CollectBaskets",
1660 "Entry: %lld, registering baskets branch %s, fEntryNext=%lld, fNseek=%d, ntotCurrentBuf=%d",
1664 skippedFirst = (nSkipped > 0);
1665 oncePerBranch = (nDistinctLoad ==
fNbranches);
1666 progress = nReadPrefRequest - oldnReadPrefRequest;
1673 full = CollectBaskets(kStart, kNarrow,
fEntryNext);
1677 while (!full && !reachedEnd && progress) {
1678 full = CollectBaskets(kStart, kFull, std::min(maxReadEntry,
fEntryNext));
1681 resetBranchInfo =
false;
1686 full = CollectBaskets(kRegular, kFull,
fEntryNext);
1687 }
while (!full && !reachedEnd && progress);
1691 if (!full && skippedFirst) {
1692 full = CollectBaskets(kRewind, kFull,
fEntryNext);
1693 while (!full && !reachedEnd && progress) {
1694 full = CollectBaskets(kRegular, kFull,
fEntryNext);
1698 clusterIterations++;
1700 minEntry = clusterIter.
Next();
1718 (prevNtot < ntotCurrentBuf) && (minEntry <
fEntryMax))) {
1719 if (showMore ||
gDebug > 6)
1720 Info(
"FillBuffer",
"Breaking because %d <= %lld || (%d >= %d) || %lld >= %lld",
fBufferSizeMin,
1721 ((
Long64_t)ntotCurrentBuf * (clusterIterations + 1)) / clusterIterations, prevNtot, ntotCurrentBuf,
1730 if (minEntry >= fEntryCurrentMax && fEntryCurrentMax > 0)
1738 if (showMore ||
gDebug > 6) {
1739 Info(
"FillBuffer",
"Mem ranges");
1741 Info(
"FillBuffer",
"Combined ranges");
1743 Info(
"FillBuffer",
"Requested ranges");
1748 if (nReadPrefRequest == 0) {
1752 if (showMore ||
gDebug > 5) {
1753 Info(
"FillBuffer",
"For entry %lld, nothing was added to the cache.", entry);
1755 }
else if (
fEntryNext < firstClusterEnd && !reqRanges.Contains(entry)) {
1767 if (showMore ||
gDebug > 5) {
1768 Error(
"FillBuffer",
"Reset the next entry because the currently loaded range does not contains the request "
1769 "entry: %lld. fEntryNext updated from %lld to %lld. %d",
1770 entry,
fEntryNext, firstClusterEnd, nReadPrefRequest);
1776 if (showMore ||
gDebug > 5) {
1777 Info(
"FillBuffer",
"Complete adding %d baskets from %d branches taking in memory %d out of %d",
1778 nReadPrefRequest, reqRanges.BranchesRegistered(), ntotCurrentBuf,
fBufferSizeMin);
1807 if (!(stcp =
gSystem->
Getenv(
"ROOT_TTREECACHE_PREFILL")) || !*stcp) {
1905 printf(
"Number of branches in the cache ...: %d\n",
fNbranches);
1906 printf(
"Cache Efficiency ..................: %f\n",
GetEfficiency());
1911 if ( opt.
Contains(
"cachedbranches") ) {
1913 printf(
"Cached branches....................:\n");
1916 for (
Int_t i = 0; i < nbranches; ++i) {
1918 printf(
"Branch name........................: %s\n",branch->
GetName());
1937 ::Info(
"TTreeCache::ReadBufferNormal",
"Cache miss after an %s FillBuffer: pos=%lld",
1938 bufferFilled ?
"active" :
"inactive", basketpos);
1939 for (
Int_t i = 0; i < branches->GetEntries(); ++i) {
1941 Int_t blistsize =
b->GetListOfBaskets()->GetSize();
1942 for (
Int_t j = 0; j < blistsize; ++j) {
1943 if (basketpos ==
b->GetBasketSeek(j)) {
1945 ::Info(
"TTreeCache::ReadBufferNormal",
" Missing basket: %d for %s", j,
b->GetName());
1959 else if (res == 0) {
1963 recordMiss(perfStats,
fBranches, bufferFilled, pos);
1976 recordMiss(perfStats,
fBranches, bufferFilled, pos);
2046 if (
b->GetDirectory()->GetFile() !=
fFile)
2048 b->fCacheInfo.Reset();
2080 if (res == 0 && buffersize <= prevsize) {
2115 Info(
"SetEntryRange",
"fEntryMin=%lld, fEntryMax=%lld, fEntryNext=%lld",
2118 if (needLearningStart) {
2266 if (entry < fEntryMin || entry >
fEntryMax)
return;
#define R__unlikely(expr)
unsigned long long ULong64_t
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t cursor
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
void Print(GNN_Data &d, std::string txt="")
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
R__EXTERN TSystem * gSystem
A Branch for the case of an object.
A TTree is a list of TBranches.
@ kDoNotProcess
Active bit for branches.
void PrintCacheInfo() const
Print the information we have about which basket is currently cached and whether they have been 'used...
Long64_t fEntries
Number of entries.
A chain is a collection of files containing TTree objects.
Long64_t * GetTreeOffset() const
Int_t GetTreeNumber() const override
virtual Int_t GetEntries() const
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
A TEventList object is a list of selected events (entries) in a TTree.
virtual bool ContainsRange(Long64_t entrymin, Long64_t entrymax)
Return TRUE if list contains entries from entrymin to entrymax included.
A cache when reading files over the network.
virtual Int_t SetBufferSize(Int_t buffersize)
Sets the buffer size.
virtual Int_t ReadBuffer(char *buf, Long64_t pos, Int_t len)
Read buffer at position pos.
virtual void SecondPrefetch(Long64_t, Int_t)
Bool_t fEnablePrefetching
reading by prefetching asynchronously
Int_t fNtot
Total size of prefetched blocks.
virtual void Prefetch(Long64_t pos, Int_t len)
Add block of length len at position pos in the list of blocks to be prefetched.
Int_t fBufferSizeMin
Original size of fBuffer.
Bool_t fIsTransferred
True when fBuffer contains something valid.
TFile * fFile
Pointer to file.
Int_t fNseek
Number of blocks to be prefetched.
void Print(Option_t *option="") const override
Print cache statistics.
virtual Int_t GetBufferSize() const
virtual void SetFile(TFile *file, TFile::ECacheAction action=TFile::kDisconnect)
Set the file using this cache and reset the current blocks (if any).
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
virtual void SetCacheRead(TFileCacheRead *cache, TObject *tree=nullptr, ECacheAction action=kDisconnect)
Set a pointer to the read cache.
virtual Bool_t ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf)
Read the nbuf blocks described in arrays pos and len.
ECacheAction
TTreeCache flushing semantics.
A TFriendElement TF describes a TTree object TF in a file.
virtual TTree * GetTree()
Return pointer to friend TTree.
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
virtual TLeaf * GetLeafCount() const
If this leaf stores a variable-sized array or a multi-dimensional array whose last dimension has vari...
TBranch * GetBranch() const
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
void Add(TObject *obj) override
TObject * Remove(TObject *obj) override
Remove object from the list.
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
const char * GetName() const override
Returns name of object.
Int_t GetEntriesFast() const
void AddAt(TObject *obj, Int_t idx) override
Add object at position ids.
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
TObject * UncheckedAt(Int_t i) const
TObject * Remove(TObject *obj) override
Remove object from array.
Collectable string class.
const char * GetName() const override
Returns name of object.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Regular expression class.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of string.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
TString & Append(const char *cs)
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual const char * Getenv(const char *env)
Get environment variable.
A cache to speed-up the reading of ROOT datasets.
virtual void SetLearnPrefill(EPrefillType type=kNoPrefill)
Set whether the learning period is started with a prefilling of the cache and which type of prefillin...
virtual void UpdateBranches(TTree *tree)
Update pointer to current Tree and recompute pointers to the branches in the cache.
Double_t GetEfficiencyRel() const
This will indicate a sort of relative efficiency... a ratio of the reads found in the cache to the nu...
bool fEnabled
! cache enabled for cached reading
Long64_t fLastMiss
! set to the event # of the last miss.
Int_t fNMissReadPref
Number of blocks read into the secondary ("miss") cache.
~TTreeCache() override
Destructor. (in general called by the TFile destructor)
Int_t fNMissReadOk
Number of blocks read, not found in the primary cache, and found in the secondary cache.
Long64_t fEntryMin
! first entry in the cache
void SetOptimizeMisses(bool opt)
Start of methods for the miss cache.
Int_t LearnBranch(TBranch *b, bool subgbranches=false) override
Add a branch discovered by actual usage to the list of branches to be stored in the cache this functi...
static void SetLearnEntries(Int_t n=10)
Static function to set the number of entries to be used in learning mode The default value for n is 1...
bool CheckMissCache(char *buf, Long64_t pos, int len)
Check the miss cache for a particular buffer, fetching if deemed necessary.
Long64_t fEntryNext
! next entry number where cache must be filled
Int_t fNReadMiss
Number of blocks read and not found in the cache.
bool fReverseRead
! reading in reverse mode
Double_t GetEfficiency() const
Give the total efficiency of the primary cache... defined as the ratio of blocks found in the cache v...
virtual bool FillBuffer()
Fill the cache buffer with the branches in the cache.
Long64_t fNextClusterStart
! End+1 of the cluster(s) where the current content was picked out
bool ProcessMiss(Long64_t pos, int len)
! Given a file read not in the miss cache, handle (possibly) loading the data.
const TObjArray * GetCachedBranches() const
bool fIsLearning
! true if cache is in learning mode
Int_t fNMissReadMiss
Number of blocks read and not found in either cache.
IOPos FindBranchBasketPos(TBranch &, Long64_t entry)
Given a branch and an entry, determine the file location (offset / size) of the corresponding basket.
virtual void SetEntryRange(Long64_t emin, Long64_t emax)
Set the minimum and maximum entry number to be processed this information helps to optimize the numbe...
TTreeCache()
Default Constructor.
std::unique_ptr< MissCache > fMissCache
! Cache contents for misses
bool fFirstBuffer
! true if first buffer is used for prefetching
bool fOptimizeMisses
! true if we should optimize cache misses.
void StartLearningPhase()
The name should be enough to explain the method.
TBranch * CalculateMissEntries(Long64_t, int, bool)
Given an file read, try to determine the corresponding branch.
Long64_t fCurrentClusterStart
! Start of the cluster(s) where the current content was picked out
Double_t GetMissEfficiency() const
The total efficiency of the 'miss cache' - defined as the ratio of blocks found in the cache versus t...
virtual Int_t ReadBufferNormal(char *buf, Long64_t pos, Int_t len)
Old method ReadBuffer before the addition of the prefetch mechanism.
virtual void ResetCache()
This will simply clear the cache.
bool fOneTime
! used in the learning phase
EPrefillType fPrefillType
Whether a pre-filling is enabled (and if applicable which type)
bool fLearnPrefilling
! true if we are in the process of executing LearnPrefill
virtual void LearnPrefill()
Perform an initial prefetch, attempting to read as much of the learning phase baskets for all branche...
virtual Int_t DropBranch(TBranch *b, bool subbranches=false)
Remove a branch to the list of branches to be stored in the cache this function is called by TBranch:...
Long64_t fEntryMax
! last entry in the cache
static Int_t fgLearnEntries
number of entries used for learning mode
virtual Int_t ReadBufferPrefetch(char *buf, Long64_t pos, Int_t len)
Used to read a chunk from a block previously fetched.
Long64_t fEntryCurrent
! current lowest entry number in the cache
void ResetMissCache()
Reset all the miss cache training.
Long64_t fFirstMiss
! set to the event # of the first miss.
Int_t ReadBuffer(char *buf, Long64_t pos, Int_t len) override
Read buffer at position pos if the request is in the list of prefetched blocks read from fBuffer.
bool fReadDirectionSet
! read direction established
bool fIsManual
! true if cache is StopLearningPhase was used
Double_t GetMissEfficiencyRel() const
Relative efficiency of the 'miss cache' - ratio of the reads found in cache to the number of reads so...
Int_t SetBufferSize(Int_t buffersize) override
Change the underlying buffer size of the cache.
Long64_t fFirstEntry
! save the value of the first entry
Int_t fFillTimes
! how many times we can fill the current buffer
Int_t fNReadPref
Number of blocks that were prefetched.
TTree * fTree
! pointer to the current Tree
EPrefillType GetConfiguredPrefillType() const
Return the desired prefill type from the environment or resource variable.
static Int_t GetLearnEntries()
Static function returning the number of entries used to train the cache see SetLearnEntries.
virtual void StopLearningPhase()
This is the counterpart of StartLearningPhase() and can be used to stop the learning phase.
void SetFile(TFile *file, TFile::ECacheAction action=TFile::kDisconnect) override
Change the file that is being cached.
Int_t fNbranches
! Number of branches in the cache
Int_t fNReadOk
Number of blocks read and found in the cache.
void Print(Option_t *option="") const override
Print cache statistics.
Int_t AddBranch(TBranch *b, bool subgbranches=false) override
Add a branch to the list of branches to be stored in the cache this function is called by the user vi...
TObjArray * fBranches
! List of branches to be stored in the cache
TList * fBrNames
! list of branch names in the cache
bool fFirstTime
! save the fact that we processes the first entry
Helper class to iterate over cluster of baskets.
Long64_t Next()
Move on to the next cluster and return the starting entry of this next cluster.
A TTree represents a columnar dataset.
virtual TVirtualPerfStats * GetPerfStats() const
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
virtual TObjArray * GetListOfLeaves()
virtual Long64_t GetEntries() const
virtual Long64_t GetReadEntry() const
virtual TTree * GetTree() const
TEventList * GetEventList() const
TClass * IsA() const override
virtual TList * GetListOfFriends() const
Provides the interface for the PROOF internal performance measurement and event tracing.
virtual void SetMissed(TBranch *b, size_t basketNumber)=0
virtual void UpdateBranchIndices(TObjArray *branches)=0
__device__ AFloat max(AFloat x, AFloat y)
Long64_t BinarySearch(Long64_t n, const T *array, T value)
Binary search in an array of n values to locate value.
Int_t fLen
Position in file of cache entry.