26 bool Device::Init(
const TString& kinematicFunction,
27 const TString& resolutionFunction,
int genre) {
32 FormulaString f(kinematicFunction.Data());
36 mKinematicFunction =
new TF1(TUUID().AsString(),
37 f.GetString().c_str(), 0., 1.e16);
39 mFormula =
new FormulaString(resolutionFunction.Data());
40 return mFormula && mKinematicFunction;
45 , mKinematicFunction(NULL)
53 : mSmeared(kInvalidKinType)
54 , mKinematicFunction(NULL)
56 Init(variable, resolution, genre);
61 , mSmeared(that.mSmeared)
62 , mKinematicFunction(NULL)
64 , mDimensions(that.mDimensions) {
65 if (that.mKinematicFunction) {
66 mKinematicFunction =
static_cast<TF1*
>(
67 that.mKinematicFunction->Clone(TUUID().AsString()));
79 if (mKinematicFunction) {
80 delete mKinematicFunction;
81 mKinematicFunction = NULL;
87 if (!Accept.
Is(prt)) {
91 const std::vector<KinType> vars = mFormula->Variables();
92 std::vector<double> args;
93 for (
unsigned i(0); i < vars.size(); ++i) {
94 args.push_back(GetVariable(prt, vars.at(i)));
98 double unsmeared = mKinematicFunction->Eval(GetVariable(prt, mSmeared));
99 double resolution = mFormula->Eval(args);
101 SetVariable(out, mKinematicFunction->GetX(smeared),
mSmeared);
103 if (kTheta == mSmeared) {
105 }
else if (kPhi == mSmeared) {
106 out.
phi = FixPhi(out.
phi);
109 HandleBogusValues(out, mSmeared);
118 std::cout <<
"Device smearing " << name <<
" with sigma(" << name <<
119 ") = " << mFormula->GetInputString() << std::endl;
virtual void Print(Option_t *="") const
Double32_t phi
Azimuthal angle.
FormulaString * mFormula
Expression for resolution standard deviation.
virtual double Generate(double midpoint, double width)
bool Is(const erhic::VirtualParticle &prt) const
Device(KinType=kE, const TString &formula="0", EGenre=kAll)
Distributor mDistribution
Random distribution.
Abstract base class for a general particle.
virtual void Smear(const erhic::VirtualParticle &, ParticleMCS &)
Double32_t theta
Polar angle.
virtual Device * Clone(const char *="") const
KinType mSmeared
Smeared variable.