263 template<
typename ParticleInfoStruct,
int NumBins = 1>
266 std::vector<ParticleInfoStruct> particles;
269 event(event&&) =
default;
270 event(
const event&) =
default;
271 event(
const ParticleInfoStruct&
p)
275 void add(
const ParticleInfoStruct&
p)
277 particles.push_back(
p);
282 std::deque<event> partA_events;
283 std::deque<event> partB_events;
285 bin_data bins[NumBins];
288 typename std::deque<event>::size_type decor_events = 10;
296 KVEventMixer(
typename std::deque<event>::size_type number_of_events_to_mix = 10)
297 : decor_events{number_of_events_to_mix}
378 template<
typename TreatCorPairFunc,
typename TreatNCorPairFunc,
typename partA_iterator,
typename partB_iterator>
379 void ProcessEvent(
int bin_number, partA_iterator iter_A, partB_iterator iter_B, TreatCorPairFunc TreatCorPair, TreatNCorPairFunc TreatNCorPair)
381 int n_partA(0), n_partB(0);
383 for (
auto& partA : iter_A) {
386 if (n_partA == 1) bins[bin_number].partA_events.push_back(ParticleInfoStruct(partA));
387 else bins[bin_number].partA_events.back().add(ParticleInfoStruct(partA));
389 for (
auto& partB : iter_B) {
393 if (n_partB == 1) bins[bin_number].partB_events.push_back(ParticleInfoStruct(partB));
394 else bins[bin_number].partB_events.back().add(ParticleInfoStruct(partB));
396 TreatCorPair(bin_number, partA, partB);
402 for (
auto& partB : iter_B) {
405 if (n_partB == 1) bins[bin_number].partB_events.push_back(ParticleInfoStruct(partB));
406 else bins[bin_number].partB_events.back().add(ParticleInfoStruct(partB));
413 ((bins[bin_number].partB_events.size() == decor_events && !n_partB)
414 || bins[bin_number].partB_events.size() == (decor_events + 1) && n_partB)) {
416 for (
auto& partA : iter_A) {
417 for (decltype(decor_events) i = 0; i < decor_events; ++i) {
418 auto&
e = bins[bin_number].partB_events[i];
419 for (
auto& partB :
e.particles) {
420 TreatNCorPair(bin_number, partA, partB);
426 ((bins[bin_number].partA_events.size() == decor_events && !n_partA)
427 || bins[bin_number].partA_events.size() == (decor_events + 1) && n_partA)) {
429 for (
auto& partB : iter_B) {
430 for (decltype(decor_events) i = 0; i < decor_events; ++i) {
431 auto&
e = bins[bin_number].partA_events[i];
432 for (
auto& partA :
e.particles) {
433 TreatNCorPair(bin_number, partB, partA);
440 if (bins[bin_number].partA_events.size() > decor_events) {
442 bins[bin_number].partA_events.pop_front();
444 if (bins[bin_number].partB_events.size() > decor_events) {
446 bins[bin_number].partB_events.pop_front();
winID h TVirtualViewer3D TVirtualGLPainter p
Generic event mixing algorithm for two-particle correlation studies.
KVEventMixer(typename std::deque< event >::size_type number_of_events_to_mix=10)
void ProcessEvent(int bin_number, partA_iterator iter_A, partB_iterator iter_B, TreatCorPairFunc TreatCorPair, TreatNCorPairFunc TreatNCorPair)
Event-by-event processing function.