00001 #ifndef madanalysis_h
00002 #define madanalysis_h
00003 #include <vector>
00004 #include <string>
00005 #include "TROOT.h"
00006 #include "TChain.h"
00007 #include "TH1.h"
00008 #include "TH2.h"
00009 #include "TF1.h"
00010 #include "TVector3.h"
00011 #include "Mad/MadQuantities.h"
00012 #include "Mad/MadChi2Calc.h"
00013
00014 struct mcev{
00015 double TrueEnergy;
00016 double RecoEnergy;
00017 double MuonEnergy;
00018 double ShowerEnergy;
00019 double Weight;
00020 int Inu;
00021 int Iaction;
00022 };
00023
00024 struct mcev_reweight{
00025 float TrueNuEnergy;
00026 float TrueMuEnergy;
00027 float TrueShwEnergy;
00028 float TrueMuDCosZ;
00029 float RecoNuEnergy;
00030 float RecoMuEnergy;
00031 float RecoShwEnergy;
00032 float RecoMuDCosZ;
00033 float Weight;
00034 bool PassTruth;
00035 int INu;
00036 int IAction;
00037 int Process;
00038 int InitState;
00039 int Nucleus;
00040 float KinX;
00041 float KinY;
00042 float KinQ2;
00043 float KinW2;
00044 };
00045
00046 using namespace std;
00047
00048 class MadAnalysis : public MadQuantities
00049 {
00050
00051 protected:
00052
00053 int NumberOfBins;
00054 float RangeLowerLimit;
00055 float RangeUpperLimit;
00056
00057
00058 TH1F *MCSignalHist[2];
00059 TH1F *MCBkgdHist[2];
00060 TH1F *DataHist[2];
00061 TH1F *DataSignalHist[2];
00062 float DataPOT[2];
00063 int numDataEvts[2];
00064 float signalFracInData[2];
00065 TH1F *DataBkgdHist[2];
00066
00067 vector<mcev_reweight> MCEvents[2];
00068 float MCPOT[2];
00069 int numMCEvts[2];
00070
00071 Int_t NgenBins[3];
00072 Double_t NgenMin[3];
00073 Double_t NgenMax[3];
00074 Double_t NgenMean[3];
00075 Double_t NgenErr[3];
00076 std::string NgenName[3];
00077
00078 TF1 *OscillationFunction;
00079 int NumOscPars;
00080 double *OscillationParameters;
00081 int *varyX;
00082 TH1F *BestFit[2];
00083
00084 std::string tag;
00085
00086 MadChi2Calc *Chi2Calc;
00087 TH2F *Chi2Surf;
00088 float ChiMin;
00089 float NDOF;
00090 float Par1MinVal;
00091 float Par2MinVal;
00092
00093
00094 float EShiftErr;
00095
00096
00097 virtual Bool_t PassTruthSignal(Int_t mcevent=0) {
00098 if(!LoadTruth(mcevent)) return false;
00099 return true; }
00100
00101 virtual Bool_t PassBasicCuts(Int_t event=0) { if(event>=0) return true;
00102 return false; }
00103
00104 virtual Bool_t PassAnalysisCuts(Int_t event=0) { if(event>=0) return true;
00105 return false; }
00106
00107 virtual Float_t PID(Int_t event=0,Int_t method=0) {
00108 if(method>=0 && event>=0) return 1.0;
00109 return 0.0; }
00110
00111 virtual Float_t RecoAnalysisEnergy(Int_t event=0) {
00112 if(!LoadEvent(event)) return 0;
00113 return ntpEvent->ph.gev; }
00114
00115 virtual Float_t GetWeight(Int_t event=0) {if(event>=0) return 1.0; return 0;}
00116
00117 virtual Bool_t AddUserBranches(TTree *tree) {if(tree) return true; return false;}
00118 virtual void CallUserFunctions(Int_t) {return;}
00119
00120 Bool_t writeOut;
00121
00122 public:
00123
00124 MadAnalysis(TChain *chainSR=0,TChain *chainMC=0,
00125 TChain *chainTH=0,TChain *chainEM=0);
00126 MadAnalysis(JobC *,string,int);
00127 virtual ~MadAnalysis();
00128
00129 void ReInit(TChain *chainSR=0,TChain *chainMC=0,
00130 TChain *chainTH=0,TChain *chainEM=0);
00131 void ReInit(JobC *,string,int);
00132
00133 void CreatePAN(std::string);
00134 void CreateANtpPAN(std::string);
00135
00136 void SetFileNameTag(std::string);
00137 void SetHistBookInfo(int,float,float);
00138
00139 void RecoMCExperiment(int startnum,double NearPOT,double FarPOT);
00140 void RecoExperiment(int startnum,double NearExpectedNormToPOT,
00141 double FarExpectedNormToPOT);
00142 void RecoMC(int startnum,double NearPOT,double FarPOT);
00143
00144 void SetOscillationFunction(Double_t (*fcn)(Double_t*, Double_t*),
00145 Float_t,Float_t,int,double *);
00146 void SetOscillationFunction(TF1*,double *);
00147 void VaryFitParam(int ix,int vx) {varyX[ix] = vx;}
00148
00149 Bool_t Do2DFit(float n_a=90.,float min_a=0.5,float max_a=1.0,
00150 float n_b=100.,float min_b=0.0,float max_b=0.005,
00151 float n_c=1.,float f_c=0.);
00152
00153 Bool_t Do2DFitNearFar(float n_a=90.,float min_a=0.5,float max_a=1.0,
00154 float n_b=100.,float min_b=0.0,float max_b=0.005,
00155 float n_c=1.,float f_c=0.);
00156
00157 void SetNeugenReweightInfo(Int_t,Int_t*,Float_t*,Float_t*,
00158 Float_t*,Float_t*,std::string*);
00159
00160 MadChi2Calc *GetChi2Calc() {return Chi2Calc;}
00161 void SetEShiftErr(float err) {EShiftErr = err;}
00162
00163 int SetDataInfo(TH1F *hist=0, int numev=0, float pot=0, float sigfrac=0,
00164 int det=1);
00165 TH1F *GetDataHist(int det) { if(det!=0&&det!=1) return 0;
00166 return DataHist[det]; }
00167 int GetNumDataEvents(int det=1) { return numDataEvts[det]; }
00168 float GetDataPOT(int det=1) { return DataPOT[det]; }
00169 float GetSignalFracInData(int det=1) { return signalFracInData[det]; }
00170
00171 void NoOutFile() { writeOut = false;}
00172 void EndJob();
00173
00174 };
00175 #endif // #ifdef madanalysis_h