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
