// Author: Wuestenfeld/Dohrmann
// Written: 2.2.2008
// Revised: 


#ifndef PBREMSSTRAHLUNG__H
#define PBREMSSTRAHLUNG__H
//Class definition

#include "PChannelModel.h"
#include "PAdaptiveMesh.h"
#include "TGraph2D.h"
#include "TGraph.h"

#define BREMS_KAPTARI_KAEMPFER 0
#define BREMS_SHYAM_MOSEL      1

class PBremsstrahlung : public PChannelModel {
 public:

    PBremsstrahlung(const Char_t *id, const Char_t *de, Int_t key);
    PDistribution* Clone(const char *delme=NULL) const;

//    Bool_t SampleMass(Double_t *mass, Int_t *didx=NULL);
    Bool_t Init(void);
    using PChannelModel::SampleMass;
    Bool_t SampleMass(void);
    
    using PChannelModel::GetWeight;
    Double_t GetWeight(void);
    
    Double_t    Eval(Double_t x, Double_t y = 0, Double_t z = 0, Double_t t = 0) const;
    Double_t    EvalPar(const Double_t *x, const Double_t *params);
    //TF1 wrapper to use GetRandom of ROOT
    
    void SetSqrtS(Double_t s)  {sqrt_s = s;};
    void SetMode(Char_t mode);
    void SetAuthor(Int_t a)    {author = a;};    //0=KK, 1=SM
    void SetFunc(TGraph *gr)   {graph = gr;};    //overwrites author by handmade array
    void SetFunc(TGraph2D *gr) {graph2d = gr;};  //overwrites author by handmade array
    
    //This are variables needed for the standalone Draw()
    void SetNeutron(Int_t n) {neutron_position = n;};
    void SetP2E(Double_t s)  {p2_energy = s;};


 private:

    enum Mode {gNN=0, gDN, cSum, gN1520, FSI, VMD, cFsiVmd};
    Char_t model;

    Double_t mn, mp;
    Double_t sqrt_s, threshold;
    PParticle *dilepton, *parent;
    PParticle *p1, *p2, *p3, *p4;
    
    Int_t dilepton_position,neutron_position,author;
    Double_t p2_energy;
    PAdaptiveMesh *bin;

    Double_t EvalSM(Double_t x, Double_t y = 0, Double_t z = 0, Double_t t = 0) const;

    Double_t Pol1(Double_t z, Double_t p1, Double_t p2) const;
    Double_t Pol2(Double_t z, Double_t p1, Double_t p2, Double_t p3) const;
    //Double_t Pol3(Double_t z, Double_t p1, Double_t p2, Double_t p3, Double_t p4);*/
    Double_t AGauss(Double_t x, Double_t *par) const;
    Double_t DLines(Double_t x, Double_t par0, Double_t par1,Double_t par2,Double_t par3) const;

    TGraph   *graph;
    TGraph2D *graph2d;

    ClassDef(PBremsstrahlung, 0)  // pn/pp Bremsstrahlung

};

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