199 template<
int NPart,
typename ParticleClass,
typename ParticleInfoStruct,
int NumBins = 1>
203 std::vector<ParticleInfoStruct> particles;
206 event(event&&) =
default;
207 event(
const event&) =
default;
208 event(
const ParticleInfoStruct&
p)
212 void add(
const ParticleInfoStruct&
p)
214 particles.push_back(
p);
218 using event_buffer = std::deque<event>;
220 std::vector<event_buffer> part_events = std::vector<event_buffer>(NPart);
222 bin_data bins[NumBins];
224 typename event_buffer::size_type decor_events = 10;
226 int current_bin_number;
227 std::array<int, NPart> n_part;
228 std::array<bool, NPart> mult_fixed;
229 std::array<bool, NPart> buffer_ready;
230 std::array<bool, NPart> can_decorrelate;
241 KVEventMixerN(
typename event_buffer::size_type number_of_events_to_mix = 10)
242 : decor_events{number_of_events_to_mix}
245 template<
typename TreatCorFunc>
252 TreatCor(current_bin_number, correlated_particles);
255 template<
typename TreatCorFunc,
typename part_iterator,
typename... part_iterator_list>
256 void process_event(
int part_index, TreatCorFunc TreatCor, part_iterator& iter_part, part_iterator_list... part_iterators)
263 bool count_and_store =
true;
266 if (part_index > 0) {
267 for (
int i = 0; i < part_index; ++i) count_and_store &= (n_part[i] == 1);
269 for (
auto& part : iter_part) {
270 if (count_and_store) {
271 ++n_part[part_index];
272 if (n_part[part_index] == 1) bins[current_bin_number].part_events[part_index].push_back(ParticleInfoStruct(part));
273 else bins[current_bin_number].part_events[part_index].back().add(ParticleInfoStruct(part));
276 correlated_particles.
set(part_index, &part);
287 template<
typename part_iterator,
typename... part_iterator_list>
296 if (!n_part[part_index] && (!n_part[part_index - 1] || mult_fixed[part_index - 1])) {
297 mult_fixed[part_index] =
true;
298 for (
auto& part : iter_part) {
299 ++n_part[part_index];
300 if (n_part[part_index] == 1) bins[current_bin_number].part_events[part_index].push_back(ParticleInfoStruct(part));
301 else bins[current_bin_number].part_events[part_index].back().add(ParticleInfoStruct(part));
308 template<
typename TreatNCorFunc>
309 void recursive_decorrelation(ParticleClass& part,
int part_index,
int decor_index,
int decor_vec_index, TreatNCorFunc TreatNCor)
311 if (decor_index == NPart) {
312 TreatNCor(current_bin_number, part, uncorrelated_particles);
314 else if (decor_index != part_index) {
316 auto& event_buffer = bins[current_bin_number].part_events[decor_index];
317 for (
size_t i = 0; i < decor_events; ++i) {
318 for (
auto& _part : event_buffer[i].particles) {
320 uncorrelated_particles.
set(decor_vec_index, &_part);
329 template<
typename TreatNCorFunc>
333 template<
typename TreatNCorFunc,
typename part_iterator,
typename... part_iterator_list>
334 void decorrelate(
int part_index, TreatNCorFunc TreatNCor, part_iterator& iter_part, part_iterator_list... part_iterators)
340 if (n_part[part_index] && can_decorrelate[part_index]) {
341 for (
auto& part : iter_part) {
345 decorrelate(part_index, TreatNCor, part_iterators...);
348 template<
typename TreatCorFunc,
typename TreatNCorFunc,
typename part_iterator,
typename... part_iterator_list>
349 void ProcessEvent(
int bin_number, TreatCorFunc TreatCor, TreatNCorFunc TreatNCor,
const part_iterator& iter_part, part_iterator_list... part_iterators)
351 current_bin_number = bin_number;
353 for (
int i = 0; i < NPart; ++i) {
355 mult_fixed[i] =
false;
356 can_decorrelate[i] =
true;
374 for (
int i = 0; i < NPart; ++i) {
375 auto buf_siz = bins[current_bin_number].part_events[i].size();
376 buffer_ready[i] = ((buf_siz == decor_events) && !n_part[i]) || ((buf_siz == decor_events + 1) && n_part[i]);
378 for (
int j = 0; j < NPart; ++j) {
379 if (j == i)
continue;
380 can_decorrelate[j] &= buffer_ready[i];
385 decorrelate(-1, TreatNCor, iter_part, part_iterators...);
388 for (
int i = 0; i < NPart; ++i) {
389 if (bins[current_bin_number].part_events[i].
size() > decor_events) {
391 bins[current_bin_number].part_events[i].pop_front();
size_t size(const MatrixT &matrix)
winID h TVirtualViewer3D TVirtualGLPainter p
Generic event mixing algorithm for N-particle correlation studies.
KVEventMixerN(typename event_buffer::size_type number_of_events_to_mix=10)
vector of references to particles from buffers for decorrelation
void fill_all_particle_buffers(int part_index, part_iterator &iter_part, part_iterator_list... part_iterators)
void decorrelate(int part_index, TreatNCorFunc TreatNCor, part_iterator &iter_part, part_iterator_list... part_iterators)
void process_event(int, TreatCorFunc TreatCor)
void decorrelate(int, TreatNCorFunc)
void process_event(int part_index, TreatCorFunc TreatCor, part_iterator &iter_part, part_iterator_list... part_iterators)
void ProcessEvent(int bin_number, TreatCorFunc TreatCor, TreatNCorFunc TreatNCor, const part_iterator &iter_part, part_iterator_list... part_iterators)
void fill_all_particle_buffers(int)
void recursive_decorrelation(ParticleClass &part, int part_index, int decor_index, int decor_vec_index, TreatNCorFunc TreatNCor)