//
//
// Logs:
//
//  $Log: LData.h,v $
//  Revision 1.8  2004/04/09 13:21:05  cvs
//  added cputime logging...
//
//  Revision 1.7  2003/12/22 14:32:36  cvs
//  added simulation of laser -> LDataHeader version 5
//  modified hoppserver sigint interruption
//
//  Revision 1.6  2003/12/15 16:17:26  cvs
//  more verbosity
//
//  Revision 1.5  2003/11/03 13:54:40  cvs
//  TLServer is now threaded, LData and LDataHeader have now right Draw and Paint methods, LIV is controlled and comments were added.
//
//  Revision 1.4  2003/07/01 12:17:18  cvs
//  New LData organization. data is stored in TH2F histograms. This enables easier manipulation. Found a bug in drawing averaged velocity vs time. The average number was calcuated over whole times.
//
//  Revision 1.3  2003/06/26 12:23:15  cvs
//  averaged velocity is stored in .TTIME. instead of transit time. This was done, becose we need to know the average velocity instead of transit time to know mobility.
//
//  Revision 1.2  2003/06/26 09:27:11  cvs
//  added log fields...
//

#ifndef _LDATA___
#define _LDATA___

#include "Config.h"

#include <TBrowser.h>
#include <TNamed.h>
#include <TH1.h>
#include <TH2.h>
#include "Util.h"

#include "LDataHeader.h"
#include "LContainer.h"

class LData: public TNamed {
 protected:
  Long_t fjobID;   //identification of job

 public:
  Int_t fN;        //number of all repetitions stored in fp and fe

  Int_t fnav;   //number of elements in fav (note that transit times,
                //that are longer than total time are not included here)
  Float_t* fav; //average velocity array


  TH2F* fpt; //position vs time distribution
  TH2F* fvt; //velocity vs time distribution
  TH2F* fvp; //velocity vs position distribution
  TH2F* fet; //energy vs time distribution

  LDataHeader* fheader; //Data Header class

 public:
  Float_t favg;   //Transit time average
  Float_t favsig;  //variance of ttime average

 private:
  Float_t* fav_temp; //! temporary storing ttime array
  Int_t fnav_temp; //! index
  Double_t fcpu_time; //time of cpu used to calc data

 public:
  LData();
  LData(LDataHeader* header);
  virtual ~LData();
  
  void Add(const Int_t n,const Float_t* track,const Float_t* tracke,const Float_t ttime,Double_t cputime=-1.);
  void Add(const LContainer* container);
  LData* Add(LData* data);

  Int_t Prepare(); 

  Float_t GetMaxTTime();
  Float_t GetMinTTime();
  Float_t GetTTime(Float_t to=0);
  Float_t GetAV();
  Double_t GetCPUtime() const {return fcpu_time;}


  void SetJobID(const Long_t id){fjobID=id;}
  Long_t GetJobID() const {return fjobID;}
  void SetHeader(LDataHeader* header) {fheader=header;}
  LDataHeader* GetHeader() const {return fheader;}

  TObject* GetHistogram(Option_t* option="",Float_t binwidth=1.0);
  virtual void Browse(TBrowser *);
  virtual void DrawPanel();
  virtual void Draw(Option_t* option=""); 
  virtual void Paint(Option_t* option=""); 

  //various tests
  bool Test(Int_t mode) const;

 private:
  int AddTH2F(TH2F* a,TH2F* b);
  void SetStyle(TH1* his,const char* xaxis,const char* yaxis);
  void AddAV(const Float_t avelocity);
  void ClearArray();
  Float_t Velocity(const Int_t i,const Int_t n,const Float_t* track) const;
  Float_t CalcIndexToTime(const Int_t idx) const 
    {return fheader->CalcIndexToTime(idx);}
  
  ClassDef(LData,4)  //Data class of montecarlo simulation 
};

#endif //_LDATA___


