ARA ROOT v3.10 Software

calibration/ICRR/Station1/doBinWidths.cxx

00001 //Written by Jonathan Davies - UCL
00002 //doBinWidths.cxx - Calculate time between samples in the LABCHIPs used on ARA station 1
00003 
00004 #include <iostream>
00005 #include <fstream>
00006 #include <cmath>
00007 #include "zlib.h"
00008 
00009 
00010 //ROOT Includes
00011 #include "TSystem.h"
00012 #include "TFile.h"
00013 #include "TTree.h"
00014 #include "TH1.h"
00015 #include "TCanvas.h"
00016 #include "TStyle.h"
00017 #include "TGraph.h"
00018 #include "TChain.h"
00019 
00020 //AraRoot Includes -- using version 3.0
00021 //#include "RawAraEvent.h"
00022 #include "RawIcrrStationEvent.h"
00023 //#include "AraRawRFChannel.h"
00024 #include "AraRawIcrrRFChannel.h"
00025 //#include "araDefines.h"
00026 #include "araIcrrDefines.h"
00027 
00028 int gotPedFile=0;
00029 char pedFile[FILENAME_MAX];
00030 float pedestalData[LAB3_PER_ICRR][CHANNELS_PER_LAB3][MAX_NUMBER_SAMPLES_LAB3];
00031 
00032 int doBinWidths(char[FILENAME_MAX], char[FILENAME_MAX], char[FILENAME_MAX], char[FILENAME_MAX], int, int, int);
00033 void loadPedestals();  
00034 
00035 using namespace std;
00036 
00037 int main(int argc, char *argv[]){
00038   int freq, minRun, maxRun;
00039   char runDir[200], baseDir[200], temp[200], pedFile[200];
00040   sprintf(runDir, "/Users/jdavies/ara/data/ara_station1_ICRR_calibration/root/Station1Test");
00041   sprintf(baseDir, "/Users/jdavies/ara/calibration/ara_station1_ICRR/testing/testing");
00042   sprintf(pedFile, "/Users/jdavies/ara/data/ara_station1_ICRR_calibration/data/peds/run_003747/peds_1326108401/peds_1326108401.602169.run003747.dat");
00043 
00044   // if(argc<5){
00045   //   printf("Correct usage : ./doBinWidths <frequency> <minRun> <maxRun> <Minus40 / Minus20 / Minus5 / RoomTemp>\n");
00046   //   return -1;
00047   // }
00048   // freq=atoi(argv[1]);
00049   // minRun=atoi(argv[2]);
00050   // maxRun=atoi(argv[3]);
00051   // strcpy(temp, argv[4]);
00052 
00053   //jd to comment out
00054   freq=175;
00055   minRun=3763;
00056   maxRun=3769;
00057   sprintf(temp, "Minus20");
00058 
00059 
00060 
00061   printf("freq %i minRun %i maxRun %i temp %s\n", freq, minRun, maxRun, temp);
00062 
00063   doBinWidths(runDir, baseDir, temp, pedFile, freq, minRun,maxRun);
00064   
00065   return 0;
00066 }
00067 
00068 int doBinWidths(char runName[FILENAME_MAX], char baseDir[FILENAME_MAX], char temp[FILENAME_MAX], char ped[FILENAME_MAX], int frequency, int minRun, int maxRun){
00069 
00070   TChain *eventTree = new TChain("eventTree");
00071   
00072   for(int run=minRun; run<=maxRun;run++){
00073     char name[200];
00074     sprintf(name, "%s/run%i/event%i.root", runName, run, run);
00075     eventTree->Add(name);
00076   }
00077 
00078   //  RawAraEvent *event=0;
00079   RawIcrrStationEvent *event=0;
00080 
00081   //  AraRawRFChannel chanOut; 
00082   AraRawIcrrRFChannel chanOut;
00083 
00084   Double_t zeroCrossing[LAB3_PER_ICRR][2][MAX_NUMBER_SAMPLES_LAB3] = {{{0}}};
00085   Double_t noSineWaves[LAB3_PER_ICRR][2][MAX_NUMBER_SAMPLES_LAB3]={{{0}}};
00086   Double_t dataOut[NUM_DIGITIZED_CHANNELS][MAX_NUMBER_SAMPLES_LAB3] = {{0}};
00087   Double_t BinWidths[LAB3_PER_ICRR][2][MAX_NUMBER_SAMPLES_LAB3]={{{0}}};
00088   Double_t BinSize=0, zc=0, sc=0, offset=0, error=0;
00089   Int_t firstHitBus=0, lastHitBus=0, wrapped=0, Chip=0, RCO = 0, RCO2=0, Sample = 0, Channel=0, earliestSample=0, offsetcount=0;
00090   Double_t period=1./(.001*frequency);
00091   eventTree->SetBranchAddress("event", &event);
00092 
00093   
00094   //strcpy(pedFile,"/Users/jdavies/ara/data/ara_station1_ICRR_calibration/data/peds/run_002263/peds_1324969832/peds_1324969832.905582.run002263.dat");
00095   strcpy(pedFile, ped);
00096   gotPedFile=1;
00097   loadPedestals();
00098   
00099   Int_t maxEntries = eventTree->GetEntries();
00100   Int_t starEvery = maxEntries/80;
00101   printf("No of entries in the run Tree is %i\n", maxEntries);
00102 
00103   cout << maxEntries << endl;
00104   
00105   for(int entry = 0; entry < maxEntries; entry ++){
00106     if(entry%starEvery==0) fprintf(stderr, "*");
00107 
00108     eventTree->GetEntry(entry);
00109     
00110     for(int i=0;i<NUM_DIGITIZED_CHANNELS;i++){
00111       Chip = i/9;
00112       Channel = i%9;
00113       if(Channel==8) continue; //skip the clock channel
00114       chanOut = event->chan[i];
00115       firstHitBus = event->getFirstHitBus(i);
00116       lastHitBus = event->getLastHitBus(i);
00117       wrapped = event->getWrappedHitBus(i);
00118       earliestSample = event->getEarliestSample(i);
00119       RCO = event->getRCO(i); 
00120       RCO2 = 1-RCO;
00121       
00122       //offset used to zero-mean sine-wave data
00123       
00124       offset=0;
00125       offsetcount=0;
00126       
00127       if(earliestSample<20){
00128         continue;
00129       }
00130       
00131       //zero-meaning the waveform
00132       
00133       if(wrapped==0){
00134         
00135         for(Sample=0; Sample<firstHitBus; Sample++){
00136           offset += chanOut.data[Sample]-pedestalData[Chip][Channel][Sample];
00137           offsetcount++;
00138         }
00139         
00140         for(Sample=lastHitBus+1; Sample <259; Sample++){
00141           offset += chanOut.data[Sample]-pedestalData[Chip][Channel][Sample];
00142           offsetcount++;            
00143         }
00144       }
00145       
00146       if(wrapped==1){
00147         
00148         for(Sample=firstHitBus+1; Sample<lastHitBus; Sample++){
00149           offset += chanOut.data[Sample]-pedestalData[Chip][Channel][Sample];
00150           offsetcount++;
00151         }
00152       }
00153       offset=offset/offsetcount;
00154         
00155       if(wrapped==0){
00156         for(Sample =0; Sample<firstHitBus-1;Sample++){
00157           dataOut[i][Sample]= chanOut.data[Sample]-pedestalData[Chip][Channel][Sample]-offset;
00158           dataOut[i][Sample+1]= chanOut.data[Sample+1]-pedestalData[Chip][Channel][Sample+1]-offset;
00159           noSineWaves[Chip][RCO][Sample]+=1;
00160           if(dataOut[i][Sample]>0&&dataOut[i][Sample+1]<0){
00161             zeroCrossing[Chip][RCO][Sample]+=1;
00162           }
00163           if(dataOut[i][Sample]<0&&dataOut[i][Sample+1]>0){
00164             zeroCrossing[Chip][RCO][Sample]+=1;
00165           }
00166           if(dataOut[i][Sample]==0||dataOut[i][Sample+1]==0){
00167             zeroCrossing[Chip][RCO][Sample]+=0.5;    
00168           }
00169         }
00170         
00171         
00172         for(Sample=lastHitBus+1; Sample<259;Sample++){
00173           dataOut[i][Sample]= chanOut.data[Sample]-pedestalData[Chip][Channel][Sample]-offset;
00174           dataOut[i][Sample+1]= chanOut.data[Sample+1]-pedestalData[Chip][Channel][Sample+1]-offset;
00175           noSineWaves[Chip][RCO2][Sample]+=1;
00176           if(dataOut[i][Sample]>0&&dataOut[i][Sample+1]<0){
00177             zeroCrossing[Chip][RCO2][Sample]+=1;
00178           }
00179           if(dataOut[i][Sample]<0&&dataOut[i][Sample+1]>0){
00180             zeroCrossing[Chip][RCO2][Sample]+=1;
00181           }
00182           if(dataOut[i][Sample]==0||dataOut[i][Sample+1]==0){
00183             zeroCrossing[Chip][RCO2][Sample]+=0.5;    
00184           }
00185         }
00186       }//wrapped==0
00187       
00188       if(wrapped==1){
00189         for(Sample=firstHitBus+1; Sample<lastHitBus-1;Sample++){
00190           dataOut[i][Sample]= chanOut.data[Sample]-pedestalData[Chip][Channel][Sample]-offset;
00191           dataOut[i][Sample+1]= chanOut.data[Sample+1]-pedestalData[Chip][Channel][Sample+1]-offset;
00192           noSineWaves[Chip][RCO][Sample]+=1;
00193           if(dataOut[i][Sample]>0&&dataOut[i][Sample+1]<0){
00194             zeroCrossing[Chip][RCO][Sample]+=1;
00195           }
00196           if(dataOut[i][Sample]<0&&dataOut[i][Sample+1]>0){
00197             zeroCrossing[Chip][RCO][Sample]+=1;
00198           }
00199           if(dataOut[i][Sample]==0||dataOut[i][Sample+1]==0){
00200             zeroCrossing[Chip][RCO][Sample]+=0.5;    
00201           }
00202         }
00203       }//wrapped==1
00204     }//logical Channel
00205   }//entry   
00206   
00207   printf("\n");
00208 
00209   char rootName[FILENAME_MAX];
00210   sprintf(rootName, "%s/root/%s/BinWidths%iMHzRun%iTo%i.root",baseDir, temp,frequency, minRun,maxRun);
00211   
00212   TFile *outFile = new TFile(rootName, "RECREATE");
00213   TTree *outTree = new TTree("binWidths", "binWidths");
00214   
00215   outTree->Branch("Chip", &Chip, "Chip/I");
00216   outTree->Branch("Sample", &Sample, "Sample/I");
00217   outTree->Branch("BinSize", &BinSize, "BinSize/D");
00218   outTree->Branch("error", &error, "error/D");
00219   outTree->Branch("RCO", &RCO, "RCO/I");
00220   outTree->Branch("zc", &zc, "zc/D");
00221   outTree->Branch("sc", &sc, "sc/D");
00222   
00223   for(Chip=0; Chip<3;Chip++){
00224     for(RCO=0; RCO<2;RCO++){
00225       for(Sample=0; Sample<MAX_NUMBER_SAMPLES_LAB3; Sample++){        
00226         zc=zeroCrossing[Chip][RCO][Sample];
00227         sc=noSineWaves[Chip][RCO][Sample];
00228         BinSize = (1.0/(frequency*0.002))*(zc/sc);  
00229         error = (1.0/(frequency*0.002))*(sqrt(zc)/sc);      
00230         outTree->Fill();
00231         BinWidths[Chip][RCO][Sample]=BinSize;
00232       }
00233     }
00234   }
00235 
00236 
00237   TCanvas *canvas = new TCanvas("ChipRCO", "ChipRCO");
00238   char name[100];
00239   canvas->Divide(3,2);
00240   canvas->cd(1);
00241   outTree->Draw("BinSize","Chip==0&&RCO==0&&Sample<256");
00242   canvas->cd(2);
00243   outTree->Draw("BinSize","Chip==1&&RCO==0&&Sample<256");
00244   canvas->cd(3);
00245   outTree->Draw("BinSize","Chip==2&&RCO==0&&Sample<256");
00246   canvas->cd(4);
00247   outTree->Draw("BinSize","Chip==0&&RCO==1&&Sample<256");
00248   canvas->cd(5);
00249   outTree->Draw("BinSize","Chip==1&&RCO==1&&Sample<256");
00250   canvas->cd(6);
00251   outTree->Draw("BinSize","Chip==2&&RCO==1&&Sample<256");
00252 
00253   canvas->Write();
00254   canvas->Close();
00255   
00256   //Now to produce binWdiths.txt file for AraRoot
00257 
00258   ofstream textOut;
00259   char calibName[FILENAME_MAX];
00260   sprintf(calibName, "%s/calib/%s/binWidths.txt", baseDir,temp);
00261   textOut.open(calibName);
00262 
00263   for(Chip=0; Chip<3;Chip++){
00264     for(RCO=0; RCO<2;RCO++){
00265       textOut << Chip << "\t" <<  RCO << "\t" ;
00266       for(Sample=0; Sample<MAX_NUMBER_SAMPLES_LAB3-1; Sample++){              
00267         textOut << BinWidths[Chip][RCO][Sample] << " ";
00268       }
00269       Sample=259;
00270       BinSize=0;
00271       textOut << BinSize << endl;
00272     }
00273   }
00274   
00275   textOut.close();
00276   
00277   outFile->Write();
00278   outFile->Close();
00279   
00280   
00281   return 0;
00282 }
00283 
00284 
00285 void loadPedestals()
00286 {
00287   if(!gotPedFile) {
00288     char calibDir[FILENAME_MAX];
00289     char *calibEnv=getenv("ARA_CALIB_DIR");
00290     if(!calibEnv) {
00291       char *utilEnv=getenv("ARA_UTIL_INSTALL_DIR");
00292       if(!utilEnv)
00293         sprintf(calibDir,"calib");
00294       else
00295         sprintf(calibDir,"%s/share/araCalib",utilEnv);
00296     }
00297     else {
00298       strncpy(calibDir,calibEnv,FILENAME_MAX);
00299     }  
00300     sprintf(pedFile,"%s/peds_1286989711.394723.dat",calibDir);
00301   }
00302   FullLabChipPedStruct_t peds;
00303   gzFile inPed = gzopen(pedFile,"r");
00304   if( !inPed ){
00305     fprintf(stderr,"Failed to open pedestal file %s.\n",pedFile);
00306     return;
00307   }
00308 
00309   int nRead = gzread(inPed,&peds,sizeof(FullLabChipPedStruct_t));
00310   if( nRead != sizeof(FullLabChipPedStruct_t)){
00311     int numErr;
00312     fprintf(stderr,"Error reading pedestal file %s; %s\n",pedFile,gzerror(inPed,&numErr));
00313     gzclose(inPed);
00314     return;
00315   }
00316 
00317   int chip,chan,samp;
00318   for(chip=0;chip<LAB3_PER_ICRR;++chip) {
00319     for(chan=0;chan<CHANNELS_PER_LAB3;++chan) {
00320       int chanIndex = chip*CHANNELS_PER_LAB3+chan;
00321       for(samp=0;samp<MAX_NUMBER_SAMPLES_LAB3;++samp) {
00322         pedestalData[chip][chan][samp]=peds.chan[chanIndex].pedMean[samp];
00323       }
00324     }
00325   }
00326   gzclose(inPed);
00327 }
00328 
00329 
00330 
00331 

Generated on Tue Jul 16 16:58:02 2013 for ARA ROOT v3.10 Software by doxygen 1.4.7