ARA ROOT v3.10 Software

calibration/ATRI/voltageCalib/calibrationFitterTest.cxx

00001 #include "TF1.h"
00002 #include "TFile.h"
00003 #include "TTree.h"
00004 #include "TMath.h"
00005 #include "TGraph.h"
00006 
00007 #include "araSoft.h"
00008 
00009 
00010 TFile *inFile;
00011 TFile *outFile;
00012 TF1* myTF1;
00013 Double_t myFunction(Double_t *x, Double_t *par);
00014 void calibrationFitter(char *inFileName, char *outFileName);
00015 Double_t findUpperLimit(TGraph *gr);
00016 Double_t findLowerLimit(TGraph *gr);
00017 
00018 int main(int argc, char **argv)
00019 {
00020   char inFileName[FILENAME_MAX];
00021   char outFileName[FILENAME_MAX];
00022 
00023   if(argc<3){
00024     std::cerr << "Usage: " << argv[0] << " <inFile> <outFile>  \n";
00025     return 1;
00026   }
00027   sprintf(inFileName, argv[1]);
00028   sprintf(outFileName, argv[1]);
00029 
00030   calibrationFitter(inFileName, outFileName);
00031   return 0;
00032 }
00033 
00034 
00035 
00036 void calibrationFitter(char *inFileName, char *outFileName){
00037   inFile = TFile::Open(inFileName);
00038 
00039   Int_t dda=0,chan=0,sample=0,block=0;
00040   Double_t p0=0,p1=0,p2=0,p3=0,p4=0,chiSq=0;
00041 
00042   TTree *fitTree = new TTree("fitTree", "Tree containing fit parameters for ADC to mV conversion");
00043   fitTree->Branch("dda", &dda, "dda/I");
00044   fitTree->Branch("chan", &chan, "chan/I");
00045   fitTree->Branch("sample", &sample, "sample/I");
00046   fitTree->Branch("block", &block, "block/I");
00047 
00048   fitTree->Branch("p0", &p0, "p0/D");
00049   fitTree->Branch("p1", &p1, "p1/D");
00050   fitTree->Branch("p2", &p2, "p2/D");
00051   fitTree->Branch("p3", &p3, "p3/D");
00052   fitTree->Branch("p4", &p4, "p4/D");
00053 
00054   fitTree->Branch("chiSq", &chiSq, "chiSq/D");
00055 
00056   myTF1 = new TF1("myTF1", myFunction,0,4096,5);
00057   myTF1->SetParLimits(0,0,4095);
00058   myTF1->SetParLimits(1,0.3,0.9);
00059   myTF1->SetParLimits(2,1e-5,1e-4);
00060   myTF1->SetParLimits(3,-1e-6,1e-6);
00061   myTF1->SetParLimits(4,-1e-8,+1e-8);
00062 
00063 }
00064 
00065 
00066 Double_t myFunction(Double_t *x, Double_t *par){
00067 
00068   Double_t ADC=x[0];
00069   Double_t mV=0;
00070   if(ADC<par[0]){
00071     mV = par[1]*(ADC-par[0])
00072       + par[2]*TMath::Power((ADC-par[0]),2);
00073   }
00074   else{
00075     mV = par[1]*(ADC-par[0]) 
00076       + par[2]*TMath::Power((ADC-par[0]),2)
00077       + par[3]*TMath::Power((ADC-par[0]),3)
00078       + par[4]*TMath::Power((ADC-par[0]),4);
00079   }
00080 
00081   return mV;
00082 
00083 }
00084 Double_t findUpperLimit(TGraph *gr){
00085   Double_t *yVals=gr->GetY();
00086   Double_t *xVals=gr->GetX();
00087   Int_t numVals=gr->GetN();
00088   Double_t maxADC=0;
00089   for(Int_t bin=0;bin<numVals;bin++){
00090     if(TMath::Abs(yVals[bin])<1e-3){
00091       if(xVals[bin]>maxADC) maxADC=xVals[bin];
00092     }
00093   }
00094   
00095   
00096   return maxADC;
00097   
00098 }
00099 Double_t findLowerLimit(TGraph *gr){
00100   Double_t *yVals=gr->GetY();
00101   Double_t *xVals=gr->GetX();
00102   Int_t numVals=gr->GetN();
00103   Double_t minADC=4095;
00104   for(Int_t bin=0;bin<numVals;bin++){
00105     if(TMath::Abs(yVals[bin])<1e-3){
00106       if(xVals[bin]<minADC) minADC=xVals[bin];
00107     }
00108   }
00109   return minADC;
00110   
00111 }

Generated on Tue Jul 16 16:58:02 2013 for ARA ROOT v3.10 Software by doxygen 1.4.7