class Beam
{
  private:
    int NBunch ;
    int NBunchNonZeroQ ;
    double a0, ap0, de0, tau0, E0 ;
    double a_ave0, ap_ave0, de_ave0, tau_ave0 ;
    double a_rms0, ap_rms0, de_rms0, tau_rms0 ;
    double TotalCharge ; 
    double NuBeta0 ;
    Bunch bunch[NBunchMAX] ;
     double tmpdat[NBunchMAX] ; 
     double tmpq[NBunchMAX] ; 
     double q_bunch[NBunchMAX] ; 
    double q_bunch_distribution( int BunchNo ); 
    Output output ;
  public: 
    void InputData( BeamInput BeamIn, BunchInput BunchIn ) ; 
    void SetData() ;
    void Build() ;
    void set_E0( double E0T ){ E0 = E0T ; } ;
    void set_de0( double de0T ){ de0 = de0T ; } ;
    void set_tau0( double tau0T ){ tau0 = tau0T ; } ;
    void set_de_rms0( double de_rms0T ){ de_rms0 = de_rms0T ; } ;
    void set_tau_rms0( double tau_rms0T ){ tau_rms0 = tau_rms0T ; } ;

    void set_q( double q ) ; 

    Bunch* get_Bunch( int BunchNo ){ return &bunch[BunchNo] ; } ;

    double get_de0(){ return de0 ; } ;
    double get_tau0(){ return tau0 ; } ;
    double get_de_rms0(){ return de_rms0 ; } ;
    double get_tau_rms0(){ return tau_rms0 ; } ;

    double cal_de() ;
    double cal_tau() ;
    double cal_a() ;
    double cal_ap() ;
    double cal_de_rms() ;
    double cal_tau_rms() ;
    double cal_a_rms() ;
    double cal_ap_rms() ;

    double cal_amp() ;

    int get_NBunch(){ return NBunch ; } ; 
    double get_E0(){ return E0 ; } ;

    void Bunch_de_Plot() ;
    void Bunch_a_Plot() ;
    void Bunch_q_Plot() ;
} ;

