]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TEvtGen/EvtGenBase/EvtPredGen.hh
New plots for trending injector efficiencies (Melinda)
[u/mrichter/AliRoot.git] / TEvtGen / EvtGenBase / EvtPredGen.hh
CommitLineData
da0e9ce3 1/*******************************************************************************
2 * Project: BaBar detector at the SLAC PEP-II B-factory
3 * Package: EvtGenBase
4 * File: $Id: EvtPredGen.hh,v 1.3 2003/06/19 02:17:14 dvoretsk Exp $
5 * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
6 *
7 * Copyright (C) 2002 Caltech
8 *******************************************************************************/
9
10// A predicate is applied to a generator to get another generator.
11// Accept-reject can be implemented in this way.
12//
13// Predicate
14// Generator -> Generator
15
16#ifndef EVT_PRED_GEN_HH
17#define EVT_PRED_GEN_HH
18
19#include <stdio.h>
20
21template <class Generator, class Predicate>
22class EvtPredGen {
23
24public:
25
26 typedef typename Generator::result_type result_type;
27
28 EvtPredGen()
29 : itsTried(0), itsPassed(0)
30 {}
31
32 EvtPredGen(Generator gen, Predicate pred)
33 : itsGen(gen), itsPred(pred), itsTried(0), itsPassed(0)
34 {}
35
36 EvtPredGen(const EvtPredGen& other)
37 : itsGen(other.itsGen), itsPred(other.itsPred),
38 itsTried(other.itsTried), itsPassed(other.itsPassed)
39 {}
40
41 ~EvtPredGen()
42 {}
43
44 result_type operator()() {
45
46 int i = 0;
47 int MAX = 10000;
48 while(i++ < MAX) {
49
50 itsTried++;
51 result_type point = itsGen();
52 if(itsPred(point)) {
53 itsPassed++;
54 return point;
55 }
56 }
57
58 printf("No random point generated after %d attempts\n",MAX);
59 printf("Sharp peak? Consider using pole compensation.\n");
60 printf("I will now pick a point at random to return.\n");
61 return itsGen();
62 }
63
64 inline int getTried() const { return itsTried; }
65 inline int getPassed() const { return itsPassed; }
66
67protected:
68
69 Generator itsGen;
70 Predicate itsPred;
71 int itsTried;
72 int itsPassed;
73
74};
75
76#endif
77