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
