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
