ARA ROOT v3.8 Software

calibration/ICRR/TestBed/plotEpsilonCal.cxx

00001 #include <iostream>
00002 #include <fstream>
00003 
00004 //Event Reader Includes
00005 #include "UsefulAraTestBedStationEvent.h"
00006 #include "RawAraTestBedStationEvent.h"
00007 #include "araTestbedDefines.h"
00008 
00009 //ROOT Includes
00010 #include "TROOT.h"
00011 #include "TCanvas.h"
00012 #include "TTree.h"
00013 #include "TFile.h"
00014 #include "TH1.h"
00015 #include "TGraphErrors.h"
00016 #include "TF1.h"
00017 #include "TTree.h"
00018 #include "TTreeIndex.h"
00019 #include "TButton.h"
00020 #include "TGroupButton.h"
00021 #include "TThread.h"
00022 #include "TEventList.h"
00023 #include "TMath.h"
00024 #include <TGClient.h>
00025 
00026 #include <zlib.h>
00027 
00028 Double_t estimateLag(TGraph *grIn, Double_t freq);
00029 Double_t estimateLagFirst(TGraph *grIn, Double_t freq);
00030 Double_t estimateLagLast(TGraph *grIn, Double_t freq);
00031 void loadCalib();
00032 void loadPedestals();   
00033 Double_t mySineWave(Double_t *t, Double_t *par) ;
00034 int gotPedFile=0;
00035 char pedFile[FILENAME_MAX];
00036 float pedestalData[LAB3_PER_TESTBED][CHANNELS_PER_LAB3][MAX_NUMBER_SAMPLES_LAB3];
00037 Double_t binWidths[LAB3_PER_TESTBED][2][MAX_NUMBER_SAMPLES_LAB3];
00038 
00039 //int main(int argc, char *argv)
00040 int plotEpsilonCal()
00041 {
00042    //  TFile *fp = new TFile("/Users/rjn/ara/data/root/event_frozen_200MHz.root");
00043   TFile *fp = new TFile("/unix/anita1/ara/calibration/Minus54C/sine_wave_data/root/event200MHz_317mV.root");
00044   if(!fp) {
00045     std::cerr << "Can't open file\n";
00046     return -1;
00047   }
00048   TTree *eventTree = (TTree*) fp->Get("eventTree");
00049   if(!eventTree) {
00050     std::cerr << "Can't find eventTree\n";
00051     return -1;
00052   }
00053   RawAraTestBedStationEvent *evPtr=0;
00054   eventTree->SetBranchAddress("event",&evPtr);
00055   strcpy(pedFile,"/unix/anita1/ara/data/fromWisconsin/root/peds_1294924296.869787.run001202.dat");
00056   //  strcpy(pedFile,"/Users/rjn/ara/data/frozen_daqbox_calibration/Minus54C/pedestal_files/peds_1291239657/peds_1291239657/peds_1291239657.193855.dat");
00057   gotPedFile=1;
00058   loadPedestals();
00059   loadCalib();
00060 
00061   Double_t ampVal=200;
00062   Double_t freqVal=0.2; //200 Mhz
00063   Double_t period=1./freqVal;
00064 
00065   //  TF1 *fitSine1 = new TF1("fitSine1",mySineWave,-100,200,3);
00066   //  fitSine1->SetNpx(10000);
00067   //  fitSine1->SetParameters(ampVal,freqVal,0.8);
00068   //  fitSine1->SetParLimits(0,ampVal,ampVal);
00069   //  fitSine1->SetParLimits(1,freqVal,freqVal);
00070   //  fitSine1->SetParLimits(2,0,1/freqVal);
00071 
00072   //  TF1 *fitSine2 = new TF1("fitSine2",mySineWave,-100,200,3);
00073   //  fitSine2->SetNpx(10000);
00074   //  fitSine2->SetParameters(ampVal,freqVal,0.8);
00075   //  fitSine2->SetParLimits(0,ampVal,ampVal);
00076   //  fitSine2->SetParLimits(1,freqVal,freqVal);
00077   //  fitSine2->SetParLimits(2,0,1/freqVal);
00078 
00079   Long64_t numEntries=eventTree->GetEntries();
00080   Long64_t starEvery=numEntries/80;
00081   if(starEvery==0) starEvery++;
00082   for(Long64_t i=9;i<10;i++) {
00083     if(i%starEvery==0) std::cerr << "*";
00084     eventTree->GetEntry(i);
00085     UsefulAraTestBedStationEvent realEvent(evPtr,AraCalType::kFirstCalib);
00086     //    for(int chanIndex=0;chanIndex<NUM_DIGITIZED_TESTBED_CHANNELS;chanIndex++) {
00087     for(int chanIndex=0;chanIndex<1;chanIndex++) {
00088       int chip=chanIndex/9;
00089       int chan=chanIndex%9;
00090       if(chan==8) continue;
00091       if(chip==2 && chan==7) continue;
00092       int rco=evPtr->getRCO(chanIndex);
00093       int firstSamp=evPtr->getEarliestSample(chanIndex);
00094       int lastSamp=evPtr->getLatestSample(chanIndex);
00095 
00096       std::cout << "Channel: " << chanIndex << "\t" << firstSamp << "\t" << lastSamp << "\t" << rco << "\n";
00097 
00098       Float_t data[260];
00099       Float_t maxVal=-1e9;
00100       Float_t minVal=+1e9;
00101       for(int samp=0;samp<260;samp++) {
00102         data[samp]=evPtr->chan[chanIndex].data[samp]-pedestalData[chip][chan][samp];
00103         if(data[samp]>maxVal) maxVal=data[samp];
00104         if(data[samp]<minVal) minVal=data[samp];
00105       }
00106       //Zero mean the waveform
00107       Float_t mean=TMath::Mean(260,data);
00108       for(int samp=0;samp<260;samp++)
00109         data[samp]-=mean;
00110       //      std::cout << mean << "\t" << minVal << "\t" << maxVal << "\n";
00111 
00112       minVal-=mean;
00113       maxVal-=mean;
00114       Double_t amp=TMath::Abs(minVal);
00115       //Set the amplitude
00116       if(TMath::Abs(maxVal)>amp) amp=TMath::Abs(maxVal);
00117       
00118 
00119       if(firstSamp<lastSamp) {
00120         //One RCO lag
00121         continue;
00122       }
00123       else {
00124         //Two RCO lags
00125         //Do the first lag which runs from firstSamp to 259
00126          Int_t numFirst=260-firstSamp;
00127          Double_t tVals[2][260]={{0}};
00128          Double_t vVals[2][260]={{0}};
00129          Double_t vValErrs[2][260]={{10}};
00130          Double_t curTVal=0;
00131          for(int samp=0;samp<numFirst;samp++) {
00132            int cap=samp+firstSamp;
00133            tVals[0][samp]=curTVal;
00134            vVals[0][samp]=data[cap];
00135            if(samp<(numFirst-1))
00136              curTVal+=binWidths[chip][1-rco][cap];
00137          }
00138 
00139          Int_t numSecond=lastSamp+1;
00140          for(int samp=0;samp<numSecond;samp++) {
00141            int cap=samp;
00142            tVals[1][samp]=curTVal;
00143            vVals[1][samp]=data[cap];
00144            curTVal+=binWidths[chip][rco][cap];
00145          }
00146          TGraph *grAll = realEvent.getGraphFromElecChan(chanIndex);
00147          TGraphErrors *grFirst = new TGraphErrors(numFirst,tVals[0],vVals[0],0,vValErrs[0]);
00148          TGraphErrors *grSecond = new TGraphErrors(numSecond,tVals[1],vVals[1],0,vValErrs[1]);
00149          Double_t lagAll=estimateLag(grAll,freqVal);
00150          Double_t lag1=estimateLagLast(grFirst,freqVal);
00151          Double_t lag1a=estimateLag(grFirst,freqVal);
00152          std::cout << "lag1 guess: " << lag1 << "\n";
00153          std::cout << "lag1a guess: " << lag1a << "\n";
00154          Double_t lag2=estimateLagFirst(grSecond,freqVal);
00155          Double_t lag3=estimateLag(grSecond,freqVal);
00156 
00157          TCanvas *can = new TCanvas();
00158          TH1F *framey = can->DrawFrame(0,-1.2*amp,260,1.2*amp);
00159          grFirst->SetMarkerColor(50);
00160          grFirst->SetLineColor(50);
00161          grFirst->Draw("lp");
00162 //       fitSine1->SetParameter(0,amp);
00163 //       fitSine1->SetParLimits(0,amp,amp);
00164 //       fitSine1->SetRange(tVals[0][0],tVals[0][numFirst-1]);
00165 
00166 //       fitSine1->SetParameter(2,lag1);
00167 //       fitSine1->SetParLimits(2,lag1,lag1);
00168 //       //      grFirst->Fit("fitSine1","R");
00169 //       grSecond->SetMarkerColor(8);
00170 //       grSecond->SetLineColor(8);
00171 //       //      grSecond->Draw("lp");
00172 //       fitSine2->SetParameter(0,amp);
00173 //       fitSine2->SetParLimits(0,amp,amp);
00174 //       fitSine2->SetRange(tVals[1][0],tVals[1][numSecond-1]);
00175 
00176 //       fitSine2->SetParameter(2,lag2);
00177 //       fitSine2->SetParLimits(2,lag2,lag2);
00178          //      grSecond->Fit("fitSine2","R");
00179          
00180          Double_t deltaLag=lag1-lag2;
00181          if(TMath::Abs(deltaLag+period)<TMath::Abs(deltaLag))
00182            deltaLag+=period;
00183          if(TMath::Abs(deltaLag-period)<TMath::Abs(deltaLag))
00184            deltaLag-=period;
00185          std::cout << "Lag: "<< deltaLag << "\t" << lag1 << "\t" << lag2   << "\n";
00186          for(int samp=0;samp<numSecond;samp++) {
00187            tVals[1][samp]+=deltaLag;
00188          }
00189 
00190          TGraphErrors *grSecondCor = new TGraphErrors(numSecond,tVals[1],vVals[1],0,vValErrs[1]);
00191          grSecondCor->SetMarkerColor(8);
00192          grSecondCor->SetLineColor(8);
00193          grSecondCor->Draw("lp");
00194          
00195          
00196 
00197       }
00198     }   
00199   }
00200   
00201 }
00202 
00203 
00204 
00205 void loadPedestals()
00206 {
00207   if(!gotPedFile) {
00208     char calibDir[FILENAME_MAX];
00209     char *calibEnv=getenv("ARA_CALIB_DIR");
00210     if(!calibEnv) {
00211       char *utilEnv=getenv("ARA_UTIL_INSTALL_DIR");
00212       if(!utilEnv)
00213         sprintf(calibDir,"calib");
00214       else
00215         sprintf(calibDir,"%s/share/araCalib",utilEnv);
00216     }
00217     else {
00218       strncpy(calibDir,calibEnv,FILENAME_MAX);
00219     }  
00220     sprintf(pedFile,"%s/peds_1286989711.394723.dat",calibDir);
00221   }
00222   FullLabChipPedStruct_t peds;
00223   gzFile inPed = gzopen(pedFile,"r");
00224   if( !inPed ){
00225     fprintf(stderr,"Failed to open pedestal file %s.\n",pedFile);
00226     return;
00227   }
00228 
00229   int nRead = gzread(inPed,&peds,sizeof(FullLabChipPedStruct_t));
00230   if( nRead != sizeof(FullLabChipPedStruct_t)){
00231     int numErr;
00232     fprintf(stderr,"Error reading pedestal file %s; %s\n",pedFile,gzerror(inPed,&numErr));
00233     gzclose(inPed);
00234     return;
00235   }
00236 
00237   int chip,chan,samp;
00238   for(chip=0;chip<LAB3_PER_TESTBED;++chip) {
00239     for(chan=0;chan<CHANNELS_PER_LAB3;++chan) {
00240       int chanIndex = chip*CHANNELS_PER_LAB3+chan;
00241       for(samp=0;samp<MAX_NUMBER_SAMPLES_LAB3;++samp) {
00242         pedestalData[chip][chan][samp]=peds.chan[chanIndex].pedMean[samp];
00243       }
00244     }
00245   }
00246   gzclose(inPed);
00247 }
00248 
00249 
00250 
00251 
00252 Double_t mySineWave(Double_t *t, Double_t *par) 
00253 {
00254   Double_t amp=par[0]; //In mV
00255   Double_t freq=par[1]; //In GHz
00256   Double_t lag=par[2]; //In ns
00257 
00258   return amp*TMath::Sin(TMath::TwoPi()*freq*(t[0]-lag));
00259 
00260 }
00261 
00262 void loadCalib()
00263 {
00264   std::ifstream BinFile("binWidths.txt");
00265   int chip,rco;
00266   double width;
00267   while(BinFile >> chip >> rco) {
00268     for(int samp=0;samp<MAX_NUMBER_SAMPLES_LAB3;samp++) {
00269       BinFile >> width;
00270       binWidths[chip][rco][samp]=width;
00271     }
00272   }
00273 }
00274 
00275 
00276 Double_t estimateLagFirst(TGraph *grIn, Double_t freq)
00277 {
00278 
00279   // This funciton estimates the lag by just using the first negative-positive zero crossing
00280   // To resolve quadrant ambiguity in the ASin function, the first zero crossing is used as a test of lag
00281   Int_t numPoints=grIn->GetN();
00282   if(numPoints<3) return 0;
00283   Double_t period=1./freq;
00284   Double_t *tVals=grIn->GetX();
00285   Double_t *vVals=grIn->GetY();
00286 
00287   Double_t zc=0;
00288   for(int i=2;i<numPoints;i++) {
00289     if(vVals[i-1]<0 && vVals[i]>0) {
00290       Double_t x1=tVals[i-1];
00291       Double_t x2=tVals[i];
00292       Double_t y1=vVals[i-1];
00293       Double_t y2=vVals[i];      
00294       //      std::cout << i << "\t" << y2 << "\t" << y1 << "\t" << (y2-y1) << "\n";
00295       zc=(((0-y1)/(y2-y1))*(x2-x1))+x1;
00296       break;
00297     }
00298   }
00299   while(zc>period) zc-=period;
00300   //  std::cout << zc << "\n";
00301   return zc;
00302 
00303 }
00304 
00305 
00306 
00307 Double_t estimateLagLast(TGraph *grIn, Double_t freq)
00308 {
00309 
00310   // This funciton estimates the lag by just using the first negative-positive zero crossing
00311   // To resolve quadrant ambiguity in the ASin function, the first zero crossing is used as a test of lag
00312   Int_t numPoints=grIn->GetN();
00313   if(numPoints<3) return 0;
00314   Double_t period=1./freq;
00315   Double_t *tVals=grIn->GetX();
00316   Double_t *vVals=grIn->GetY();
00317 
00318   Double_t zc=0;
00319   for(int i=2;i<numPoints;i++) {
00320     if(vVals[i-1]<0 && vVals[i]>0) {
00321       Double_t x1=tVals[i-1];
00322       Double_t x2=tVals[i];
00323       Double_t y1=vVals[i-1];
00324       Double_t y2=vVals[i];      
00325       //      std::cout << i << "\t" << y2 << "\t" << y1 << "\t" << (y2-y1) << "\n";
00326       zc=(((0-y1)/(y2-y1))*(x2-x1))+x1;
00327       //      break;
00328     }
00329   }
00330   while(zc>period) zc-=period;
00331   //  std::cout << zc << "\n";
00332   return zc;
00333 
00334 }
00335 
00336 Double_t estimateLag(TGraph *grIn, Double_t freq)
00337 {
00338   // This funciton estimates the lag by just using all the negative-positive zero crossing
00339  
00340   Int_t numPoints=grIn->GetN();
00341   if(numPoints<3) return 0;
00342   Double_t period=1./freq;
00343   Double_t *tVals=grIn->GetX();
00344   Double_t *vVals=grIn->GetY();
00345 
00346   Double_t zc[1000]={0};
00347   Double_t rawZc[1000]={0};
00348   int countZC=0;
00349   for(int i=2;i<numPoints;i++) {
00350     if(vVals[i-1]<0 && vVals[i]>0) {
00351       Double_t x1=tVals[i-1];
00352       Double_t x2=tVals[i];
00353       Double_t y1=vVals[i-1];
00354       Double_t y2=vVals[i];      
00355       //      std::cout << i << "\t" << y2 << "\t" << y1 << "\t" << (y2-y1) << "\n";
00356       zc[countZC]=(((0-y1)/(y2-y1))*(x2-x1))+x1;
00357       rawZc[countZC]=zc[countZC];
00358       countZC++;
00359       //      if(countZC==1)
00360       //      break;
00361     }
00362   }
00363 
00364   Double_t firstZC=zc[0];
00365   while(firstZC>period) firstZC-=period;
00366   Double_t meanZC=0;
00367   for(int i=0;i<countZC;i++) {
00368      while((zc[i]-firstZC)>period) zc[i]-=period;
00369      if(TMath::Abs((zc[i]-period)-firstZC)<TMath::Abs(zc[i]-firstZC))
00370        zc[i]-=period;
00371      meanZC+=zc[i];
00372      std::cout << i << "\t" << zc[i] << "\n";     
00373   }
00374   TCanvas *can = new TCanvas();
00375   TGraph *gr = new TGraph(countZC,rawZc,zc);
00376   gr->Draw("ap");
00377 
00378   //  std::cout << "\n";
00379   meanZC/=countZC;
00380   
00381   //  std::cout << zc << "\n";
00382   return meanZC;
00383 
00384 }

Generated on Mon Jun 3 14:59:46 2013 for ARA ROOT v3.8 Software by doxygen 1.4.7