calibration/ATRI/voltageCalib/calibrationFitter.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, Int_t thisBlock); 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 Int_t thisBlock=0; 00023 if(argc<4){ 00024 std::cerr << "Usage: " << argv[0] << " <inFile> <outFile> <block>\n"; 00025 return 1; 00026 } 00027 sprintf(inFileName, argv[1]); 00028 sprintf(outFileName, argv[2]); 00029 thisBlock=atoi(argv[3]); 00030 calibrationFitter(inFileName, outFileName, thisBlock); 00031 return 0; 00032 } 00033 00034 00035 00036 void calibrationFitter(char *inFileName, char *outFileName, Int_t thisBlock){ 00037 inFile = TFile::Open(inFileName); 00038 outFile = new TFile(outFileName, "RECREATE"); 00039 00040 Int_t dda=0,chan=0,sample=0,block=0; 00041 Double_t p0=0,p1=0,p2=0,p3=0,p4=0,chiSq=0; 00042 00043 TTree *fitTree = new TTree("fitTree", "Tree containing fit parameters for ADC to mV conversion"); 00044 fitTree->Branch("dda", &dda, "dda/I"); 00045 fitTree->Branch("chan", &chan, "chan/I"); 00046 fitTree->Branch("sample", &sample, "sample/I"); 00047 fitTree->Branch("block", &block, "block/I"); 00048 00049 fitTree->Branch("p0", &p0, "p0/D"); 00050 fitTree->Branch("p1", &p1, "p1/D"); 00051 fitTree->Branch("p2", &p2, "p2/D"); 00052 fitTree->Branch("p3", &p3, "p3/D"); 00053 fitTree->Branch("p4", &p4, "p4/D"); 00054 00055 fitTree->Branch("chiSq", &chiSq, "chiSq/D"); 00056 00057 myTF1 = new TF1("myTF1", myFunction,0,4096,5); 00058 myTF1->SetParLimits(0,0,4095); 00059 myTF1->SetParLimits(1,0.3,0.9); 00060 myTF1->SetParLimits(2,1e-6,1e-4); 00061 myTF1->SetParLimits(3,-1e-6,1e-6); 00062 myTF1->SetParLimits(4,-1e-8,+1e-8); 00063 00064 block=thisBlock; 00065 00066 char grName[FILENAME_MAX]; 00067 TGraph *grTemp; 00068 Int_t entry=0; 00069 Int_t starEvery=DDA_PER_ATRI*RFCHAN_PER_DDA*SAMPLES_PER_BLOCK/80; 00070 for(dda=0;dda<DDA_PER_ATRI;dda++){ 00071 for(chan=0;chan<RFCHAN_PER_DDA;chan++){ 00072 for(sample=0;sample<SAMPLES_PER_BLOCK;sample++){ 00073 entry++; 00074 if(entry%starEvery==0) std::cerr << "*"; 00075 00076 00077 sprintf(grName, "grADCVolt_%i_%i_%i_%i", dda, chan,sample,block); 00078 grTemp = (TGraph*) inFile->Get(grName); 00079 00080 //Prepare fitting function 00081 Double_t lowerLimit = findLowerLimit(grTemp); 00082 Double_t upperLimit = findUpperLimit(grTemp); 00083 lowerLimit-=500; 00084 upperLimit+=500; 00085 00086 Double_t spPar0=(upperLimit+lowerLimit)/2.; 00087 Double_t spPar1=7e-1; 00088 Double_t spPar2=5e-5; 00089 Double_t spPar3=-9e-7; 00090 Double_t spPar4=7e-10; 00091 00092 myTF1->SetParLimits(0,lowerLimit, upperLimit); 00093 myTF1->SetParameters(spPar0,spPar1,spPar2,spPar3,spPar4); 00094 00095 //Fit 00096 grTemp->Fit("myTF1", "QB"); 00097 p0=myTF1->GetParameter(0); 00098 p1=myTF1->GetParameter(1); 00099 p2=myTF1->GetParameter(2); 00100 p3=myTF1->GetParameter(3); 00101 p4=myTF1->GetParameter(4); 00102 chiSq=myTF1->GetChisquare(); 00103 fitTree->Fill(); 00104 } 00105 } 00106 } 00107 00108 std::cerr << "\n"; 00109 00110 00111 outFile->Write(); 00112 outFile->Close(); 00113 inFile->Close(); 00114 00115 std::cerr << "Done!\n"; 00116 00117 00118 } 00119 00120 00121 Double_t myFunction(Double_t *x, Double_t *par){ 00122 00123 Double_t ADC=x[0]; 00124 Double_t mV=0; 00125 if(ADC<par[0]){ 00126 mV = par[1]*(ADC-par[0]) 00127 + par[2]*TMath::Power((ADC-par[0]),2); 00128 } 00129 else{ 00130 mV = par[1]*(ADC-par[0]) 00131 + par[2]*TMath::Power((ADC-par[0]),2) 00132 + par[3]*TMath::Power((ADC-par[0]),3) 00133 + par[4]*TMath::Power((ADC-par[0]),4); 00134 } 00135 00136 return mV; 00137 00138 } 00139 Double_t findUpperLimit(TGraph *gr){ 00140 Double_t *yVals=gr->GetY(); 00141 Double_t *xVals=gr->GetX(); 00142 Int_t numVals=gr->GetN(); 00143 Double_t maxADC=0; 00144 for(Int_t bin=0;bin<numVals;bin++){ 00145 if(TMath::Abs(yVals[bin])<1e-3){ 00146 if(xVals[bin]>maxADC) maxADC=xVals[bin]; 00147 } 00148 } 00149 00150 00151 return maxADC; 00152 00153 } 00154 Double_t findLowerLimit(TGraph *gr){ 00155 Double_t *yVals=gr->GetY(); 00156 Double_t *xVals=gr->GetX(); 00157 Int_t numVals=gr->GetN(); 00158 Double_t minADC=4095; 00159 for(Int_t bin=0;bin<numVals;bin++){ 00160 if(TMath::Abs(yVals[bin])<1e-3){ 00161 if(xVals[bin]<minADC) minADC=xVals[bin]; 00162 } 00163 } 00164 00165 00166 return minADC; 00167 00168 }
Generated on Tue Jul 16 16:58:02 2013 for ARA ROOT v3.10 Software by
