Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MadAnalysis.h

Go to the documentation of this file.
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;        //number of bins to use in Reco/Bkgd spectra
00054   float RangeLowerLimit;   //lower range limit for Reco/Bkgd spectra
00055   float RangeUpperLimit;   //upper range limit for Reco/Bkgd spectra
00056   
00057   //two indices for two detectors: 0 = Near, 1 = Far.
00058   TH1F *MCSignalHist[2];   //reconstructed energy for MC sample signal events
00059   TH1F *MCBkgdHist[2];     //reconstructed energy for MC sample bkgd events
00060   TH1F *DataHist[2];       //reconstructed energy for data events passing cuts
00061   TH1F *DataSignalHist[2]; //reconstructed energy for data sample signal events
00062   float DataPOT[2];          //in units of e20
00063   int numDataEvts[2];        //actual number of signal snarls processed
00064   float signalFracInData[2]; //fraction of signal events passing analysis cuts
00065   TH1F *DataBkgdHist[2];     //reco energy for data sample background events
00066   
00067   vector<mcev_reweight> MCEvents[2]; //vector holding info for each MC event
00068   float MCPOT[2];                    //in units of e20
00069   int numMCEvts[2];         //actual number of MC snarls processed
00070 
00071   Int_t NgenBins[3];        // for doing systematics loops
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;  //tells the DoFit functions which params to vary (x,y,...)
00082   TH1F *BestFit[2];
00083 
00084   std::string tag; //for inserting into histo filename
00085 
00086   MadChi2Calc *Chi2Calc; //chi2 calculator object
00087   TH2F *Chi2Surf;
00088   float ChiMin;
00089   float NDOF;
00090   float Par1MinVal;
00091   float Par2MinVal;
00092 
00093   //Used for calculating systematic errors due to energy shifts
00094   float EShiftErr;  //error in energy scale (i.e. absolute calibration error)
00095 
00096   //define truth signal criteria here = events that will be oscillated
00097   virtual Bool_t PassTruthSignal(Int_t mcevent=0) { 
00098                                        if(!LoadTruth(mcevent)) return false;
00099                                        return true; }
00100   //put basic initial cuts in here for analysis
00101   virtual Bool_t PassBasicCuts(Int_t event=0) { if(event>=0) return true; 
00102                                                 return false; }
00103   //put your favourite cuts in here for analysis
00104   virtual Bool_t PassAnalysisCuts(Int_t event=0) { if(event>=0) return true; 
00105                                                    return false; }
00106   //return a pid quantity
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   //reconstruct nu energy using favourite method
00111   virtual Float_t RecoAnalysisEnergy(Int_t event=0) { 
00112                                        if(!LoadEvent(event)) return 0;
00113                                        return ntpEvent->ph.gev; }
00114   //allow event weighting:
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; //write output file <=> do EndJob
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); //set Reco/Bkgd bins, hist range
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;} //so user can set options
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;}  //don't write output file
00172   void EndJob();
00173 
00174 };
00175 #endif // #ifdef madanalysis_h

Generated on Mon Feb 15 11:06:54 2010 for loon by  doxygen 1.3.9.1