#ifndef MARS_MMcWeightEnergySpecCalc
#define MARS_MWeigthEnergySlopeCalc

#ifndef MARS_MTask
#include "MTask.h"
#endif


class MParList;
class MMcEvt;
class MWeight;
class TF1;


class MMcWeightEnergySpecCalc : public MTask
{

 private:

    const MMcEvt *fMcEvt;
    MWeight  *fWeight;

    TF1*     fNewSpectrum;     // Function with the new spectrum

    Bool_t   fNewSpecIsPowLaw; // Tells whether the new spectrum is introduced 
                               //as a TF1 object or not
    Double_t fCorsikaSlope; // Slope of energy spectrum generated with Corsika
    Double_t fNewSlope;     // Slope of the new spectrum (if it is a power law)
    Double_t fELowLim;      
    Double_t fEUppLim;      // Limits of energy range for generation
    Double_t fCorSpecInt;   // Value of the integrals of the Corsika and new
    Double_t fNewSpecInt;   //spectrum respectively, between fElow and fUppLim

    UInt_t   fTotalNumSimulatedShowers;
    Bool_t   fAllEvtsTriggered;

    void   Init(const char *name, const char *title);
    Bool_t ReInit(MParList *plist); 

    Int_t PreProcess(MParList *pList);
    Int_t Process();
   

 public:

    MMcWeightEnergySpecCalc(const Float_t slope,
			    const char *name=NULL, const char *title=NULL);

    MMcWeightEnergySpecCalc(const TF1& spectrum,
			    const char *name=NULL, const char *title=NULL);

    MMcWeightEnergySpecCalc(const char* spectrum,
			    const char *name=NULL, const char *title=NULL);
   
    MMcWeightEnergySpecCalc(void *function,
			    const char *name=NULL, const char *title=NULL);
 
    MMcWeightEnergySpecCalc(Double_t (*function)(Double_t* x, Double_t* par),
	      const Int_t npar, const char *name=NULL, const char *title=NULL);
    

    ~MMcWeightEnergySpecCalc();


    ClassDef(MMcWeightEnergySpecCalc, 0) // Task to convert the spectrum of the MC showers simulated with Corsika to a different one, by using weights
};

#endif 








