### Tree

#### Performance

- Introduce support for `TTree` with variable cluster size (i.e. value of `fAutoFlush`).

  Iterating through the cluster should be done via the new class `TTree::TClusterIterator` (i.e. this replaces `+= fAutoFlush`):

         TTree::TClusterIterator clusterIter = tree->GetClusterIterator(which_entry_to_start_from);
         Long64_t clusterStart;
         while( (clusterStart = clusterIter()) < tree-<GetEntries()) {
            printf("The cluster starts at %lld and ends at %lld\n",clusterStart,clusterIter.GetNextEntry()-1);
         }

  See `TTreeCache::FillBuffer` for a concrete usage example.
- Significant improvement of the performance of `SetBranchAddress/SetAddress` (by a factor 3 to 10 depending on the length/complexity of the classname).
- Prevent the unlimited growth of the `TBasket`'s buffer even if the basket is reused. When the basket is `Reset` (this happens when it is written and will be reused), if the `TBuffer` size is greater than
  - - twice the data in the current basket
  - and - twice the average data in each basket (of this branch)
  - and - twice the requeste basket size (`TBranch::GetBasketSize`).
  the size of the buffer is reduced to the max of 'the data in the current basket' and 'the average' and the requested buffer size and aligned to next highest multiple of 512.
- In `TBranchRef` distinguish between the entry we need (now called `RequestedEntry`) and the entry we have read (`fReadEntry`) so that we can avoid re-reading the same entry too many times when executing `TRef::GetObject`.
- Reduce by 40% the time taken `GetEntry` for a branch created using a leaflist (exclusive of the decompression time).
- Introduce `TVirtualPerfStats::FileUnzipEvent` to be able to keep track of the cost of unzipping and use this in `TTreePerfStats` and `TBasket` ... This give a good picture of where the time in unzip or in unstreaming
- Add more clusters to the `TTreeCache` buffer until `fBufferMinSize` is hit to avoid severely underfilled buffer when a low number of branches is selected/used.
- When reading backwards, make sure to load a full (new) cluster and several other fixes to `TTreeCache.`
- Reduce the memory used by a `TTree` in half. Refactor the code reading and writing the TBasket data. A single transient buffer holding the compressed data is now managed by `TTree` (and could be made thread local) rather than having one per `TBranch`.
- In `TTree::Fill`, call `FlushBasket` before calling `OptimizeBaskets` so that we have a correct and accurate value of `fTotBytes` to use as the requested memory. In `TTree::OptimizeBasket` enforces hard minimun for the basket size (no lower than the estimate size of one entry in the branch and no lower than 8 bytes).

#### TTree::Process

- Add support for the flag `TSelector::kAbortFile.`

#### TTree::Draw

- The line width setting was missing in a few places.
- Namely support the option 'a' for `TGraphs` in `TTree::Draw` (delegate the axis management to the `TGraph` object).

#### TTreeSQL

- Allow `TTreeSQL` to see temporary tables.
- Avoid creating the unnecessary array fEntryOffset ... which when its content is always set to zero actually prevent reading text field with `TTreeSQL.`
- Properly find the column even if they were not created by `TTreeSQL` itself. Fix the loading of data for the last column.

#### Other

- Update the branch split mechanism to no longer split a base class that can not be split (i.e. respect the information returned by `TStreamerElement::CannotSplit` (and thus `TClass::CanSplit`).
- In `TChain::ls`, print the name of the chain and indent the list of files (this fixes #79909).
- When setting `fBranch` in the loaded basket, make sure to set it also for the first/only basket ; this prevents a crash when calling `SetBasketSize` for a split top level branch in a file produced by v4.00/08.
- In `TTree::Streamer`, if the object we are reading in was already attached to a directory, let's make sure to unregister the object before setting `fDirectory` to zero.
- Prevent `TChainIndex` and `TTreeIndex` from finding the branches from the friend tree when looking up the value in the master/parent `TTree`. This fixes #79166.
- Update `GetEntryNumberFriend` and related functions to retun a Long64_t as needed.
- Fix the case of a split collection which contains a class with one data member which is an instance of a class with more than one base class some of which are not split (for example if one the base class is std::vector<int>).
- Fix the problem reported at #11890 by making sure that `TChain::ResetBranchAddress(TBranch*)` also record the reset in the chain's meta information about branches.
- Allow the output name passed to `MakeProxy` to be either a classname (to which will be added .h to make the filename) or a filename (which already has an extension).
- Allow (via the option `kIgnoreMissingTopLevel`) for the `TTreeCloner` to handle the case where the output `TTree` has more top level branches than the input `TTree` (this is usefull in case of 'horizontal' merging of TTrees and/or the case of copy and add.)
- Add support for csv files:

  Add support for other delimiters (like ',') and for direct import of files in the common .csv format in `TTree::ReadFile`. To handle older .csv files, add support for '\r' carriage returns in addition to '\n' (which also works for "\r\n").