Add zipping of SOA tracks + PV relations demonstrator
The main change here is to generalise the IterablePODTracks wrapper (and associated proxies) that was used to loop over/apply selections to LHCb::Pr::*::Tracks objects into LHCb::Pr::Zip, which can take multiple containers and yields proxies that can access fields from all of them:
ContainerA a{...};
ContainerB b{...};
auto zip = LHCb::Pr::make_zip( a, b );
for ( auto const& chunk : zip ) {
// chunk is a vector-register-sized chunk of elements
chunk.something_from_a() + chunk.something_from_b();
}
It can also be used to make a filtered copy:
// this copies the selected objects, 'copy' does not refer back to 'zip', 'a' or 'b'
// it contains elements from both 'a' and 'b'
auto copy = zip.filter( []( auto const& chunk ) { chunk.pt() > 400.f; } );
// make_zip() with a single argument is still useful to make an iterable, non-owning view
auto iterable = LHCb::Pr::make_zip( copy );
Along with Rec!1678 (merged) and Moore!229 (merged) this MR uses this tool to make track->PV relations, zip them to tracks, and use the resulting zip as input to the 1-track and 2-track MVA lines. This was the simplest test-case, muon ID is probably a more useful one.
Full list of changes:
- Add
zipIdentifier()methods returningZipping::ZipFamilyNumberto several classes (some previously had nothing, some previously had a temporaryfamily()method returningunsigned short) - Add
Foo( Zipping::ZipFamilyNumber, Foo const& )constructors needed byzip.filter( ... )to several containers - Move proxy definitions out of the generic
PrZip.hand intoPrIterable{Velo,FittedForward}Tracks.h - Minor tweaks in SIMDWrapper (cc: @ahennequ):
- Reorganise
popcount( mask_v )definitions so they can be found by ADL - Add some
operator<<( std::ostream& os, ... )definitions for debugging convenience - Add
LHCb::type_mapentries (see below) -
lb-formatis responsible for the whitespace changes...
- Reorganise
- Add
LHCb::type_map<T>helper to allow generic code to ask "what is the integer type that goes with this floating point type" when the types involved may be plain C++ ones or SIMDWrapper ones - Minor changes to SOAExtensions (cc: @pseyfert):
- Make
Zipping::generateZipIdentifier()part of the public interface - Add
operator<<( std::ostream& os, Zipping::ZipFamilyNumber ) - Make semantic checks conditional on
ZIPPING_SEMANTIC_CHECKSinstead ofNDEBUGso it is easier to turn them on/off. Turn them on in-optbuilds, unlike before.
- Make
Edited by Marco Cattaneo