ARA ROOT v3.10 Software

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 doxygen 1.4.7