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

#ifndef _PCOMPLEXBREITWIGNER_H_
#define _PCOMPLEXBREITWIGNER_H_

#define COMPLEX_MAX_DECAYCHANNELS 30
#define COMPLEX_MAX_TERMS 10

#include "TF1.h"
#include "TF2.h"
#include "PBreitWigner.h"


class PComplexBreitWigner : public PBreitWigner  {
  
 public:
    PComplexBreitWigner();
    PComplexBreitWigner(const Char_t *id, const Char_t *de, Int_t key);
    PDistribution* Clone(const char *delme=NULL) const;

    using PDistribution::GetWeight;   
    Double_t GetWeight(Double_t *mass, Int_t *didx=NULL);
    TComplex GetAmplitude(Double_t *mass, Int_t *didx=NULL);

    using PDistribution::SampleMass;
    Bool_t SampleMass(Double_t *mass, Int_t *didx=NULL);

    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

    void SetUpdateAmplitude(int i) {
	updateAmplitude=i;
    };

    void AddInterference(int idx, int key, int didx, double ampl, double phase);
    void AddAmplitude(int idx, double ampl, double phase);

    virtual void Print(const Option_t *delme=NULL) const ;  //Debug info

 private:
    
    void ReadModes(void);
    void ReadModels(void);
    int readModesDone,readModelsDone,updateAmplitude;
    TComplex GetAmplitudeLocal(Double_t *mass, Int_t num);

    Int_t num_decaychannels;

    PChannelModel *p[COMPLEX_MAX_DECAYCHANNELS][COMPLEX_MAX_TERMS+1]; //Amplitude models for coherent additions
    Int_t    int_index[COMPLEX_MAX_DECAYCHANNELS]; //Index numbers of decaychannels
    Int_t    num_terms[COMPLEX_MAX_DECAYCHANNELS];
    Double_t int_phase[COMPLEX_MAX_DECAYCHANNELS][COMPLEX_MAX_TERMS+1]; //Phase for each term
    Double_t int_ampl[COMPLEX_MAX_DECAYCHANNELS][COMPLEX_MAX_TERMS+1];  //Ampl for each term
    Int_t    int_key[COMPLEX_MAX_DECAYCHANNELS][COMPLEX_MAX_TERMS+1];  //Key pointing to the term
    Int_t    int_didx[COMPLEX_MAX_DECAYCHANNELS][COMPLEX_MAX_TERMS+1];  //Target didx

    ClassDef(PComplexBreitWigner, 0)  // Breit Wigner (complex version) with mass-dependent width
};

#endif


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