// Author: I. Froehlich
// Written: 23.6.2007
// Revised: 

#ifndef _PFERMIMOMENTUM_H_
#define _PFERMIMOMENTUM_H_

#include "TF1.h"
#include "TF2.h"
#include "TGraph.h"
#include "TSpline.h"
#include "PChannelModel.h"
#include "PAdaptiveMeshN.h"


class PFermiMomentum : public PChannelModel  {
  
 public:
    PFermiMomentum();
    PFermiMomentum(const Char_t *id, const Char_t *de, Int_t key);
    ~PFermiMomentum();

    PDistribution *Clone(const char *delme=NULL) const;

    Bool_t Init(void);
    Bool_t Prepare(void);
    Bool_t IsNotRejected(void);
    int GetDepth(int i);

    void   Print(const Option_t *delme=NULL) const;  //Debug info
    void   SubPrint(Int_t opt) const;
    
    using PDistribution::GetWeight;
    Double_t GetWeight(Double_t *mass, Int_t *didx=NULL);

    Bool_t SampleMomentum(void);

    using PChannelModel::SampleMass;
    Bool_t SampleMass(void);

    void SetMomentumFunction(TGraph *f, Bool_t useSpline=kFALSE) {
       mom = f;
       spline = useSpline;
       if (spline) g_spline = new TSpline3("",f);
    };

    virtual Double_t Eval(Double_t x, Double_t y = 0, Double_t z = 0, Double_t t = 0) const;
    virtual Double_t EvalPar(const Double_t *x, const Double_t *params);
    //TF1 wrapper

 protected:
    
    double SampleFermi(double &px, double &py, double &pz);

 private:

    PParticle *beam;
    PParticle *target;
    PParticle *spectator;
    PParticle *parent;
    PParticle *p1,*p2;
    PParticle *composite;
    Int_t num_of_realevents, num_of_sampledevents;
    Int_t didx_composite;
    PChannelModel *composite_model;
    Int_t tcross_key;
    Int_t debug_print;
    Double_t px, py, pz, participant_mass;
    TLorentzVector my_beam;
    PAdaptiveMeshN *mesh;

    TGraph *mom;
    TSpline3 *g_spline;
    Bool_t spline;


    ClassDef(PFermiMomentum, 0)  // Quasifree scattering using deuteron wave function
};

#endif


 PFermiMomentum.h:1
 PFermiMomentum.h:2
 PFermiMomentum.h:3
 PFermiMomentum.h:4
 PFermiMomentum.h:5
 PFermiMomentum.h:6
 PFermiMomentum.h:7
 PFermiMomentum.h:8
 PFermiMomentum.h:9
 PFermiMomentum.h:10
 PFermiMomentum.h:11
 PFermiMomentum.h:12
 PFermiMomentum.h:13
 PFermiMomentum.h:14
 PFermiMomentum.h:15
 PFermiMomentum.h:16
 PFermiMomentum.h:17
 PFermiMomentum.h:18
 PFermiMomentum.h:19
 PFermiMomentum.h:20
 PFermiMomentum.h:21
 PFermiMomentum.h:22
 PFermiMomentum.h:23
 PFermiMomentum.h:24
 PFermiMomentum.h:25
 PFermiMomentum.h:26
 PFermiMomentum.h:27
 PFermiMomentum.h:28
 PFermiMomentum.h:29
 PFermiMomentum.h:30
 PFermiMomentum.h:31
 PFermiMomentum.h:32
 PFermiMomentum.h:33
 PFermiMomentum.h:34
 PFermiMomentum.h:35
 PFermiMomentum.h:36
 PFermiMomentum.h:37
 PFermiMomentum.h:38
 PFermiMomentum.h:39
 PFermiMomentum.h:40
 PFermiMomentum.h:41
 PFermiMomentum.h:42
 PFermiMomentum.h:43
 PFermiMomentum.h:44
 PFermiMomentum.h:45
 PFermiMomentum.h:46
 PFermiMomentum.h:47
 PFermiMomentum.h:48
 PFermiMomentum.h:49
 PFermiMomentum.h:50
 PFermiMomentum.h:51
 PFermiMomentum.h:52
 PFermiMomentum.h:53
 PFermiMomentum.h:54
 PFermiMomentum.h:55
 PFermiMomentum.h:56
 PFermiMomentum.h:57
 PFermiMomentum.h:58
 PFermiMomentum.h:59
 PFermiMomentum.h:60
 PFermiMomentum.h:61
 PFermiMomentum.h:62
 PFermiMomentum.h:63
 PFermiMomentum.h:64
 PFermiMomentum.h:65
 PFermiMomentum.h:66
 PFermiMomentum.h:67
 PFermiMomentum.h:68
 PFermiMomentum.h:69
 PFermiMomentum.h:70
 PFermiMomentum.h:71
 PFermiMomentum.h:72
 PFermiMomentum.h:73
 PFermiMomentum.h:74
 PFermiMomentum.h:75
 PFermiMomentum.h:76
 PFermiMomentum.h:77
 PFermiMomentum.h:78
 PFermiMomentum.h:79
 PFermiMomentum.h:80
 PFermiMomentum.h:81
 PFermiMomentum.h:82