ARA ROOT Test BEd Software

calibration/firstCalibTry.cxx

00001 #include <iostream>
00002 #include <fstream>
00003 
00004 //Event Reader Includes
00005 #include "UsefulAraEvent.h"
00006 #include "RawAraEvent.h"
00007 #include "araDefines.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 "TTree.h"
00016 #include "TTreeIndex.h"
00017 #include "TButton.h"
00018 #include "TGroupButton.h"
00019 #include "TThread.h"
00020 #include "TEventList.h"
00021 #include "TMath.h"
00022 #include <TGClient.h>
00023 
00024 #include <zlib.h>
00025 
00026 void loadPedestals();   
00027 int gotPedFile=0;
00028 char pedFile[FILENAME_MAX];
00029 float pedestalData[ACTIVE_CHIPS][CHANNELS_PER_CHIP][MAX_NUMBER_SAMPLES];
00030 
00031 
00032 int main(int argc, char *argv)
00033 {
00034   //  TFile *fp = new TFile("/Users/rjn/ara/data/root/event_frozen_200MHz.root");
00035   TFile *fp = new TFile("/unix/anita1/ara/data/frozen_daqbox_calibration/Minus54C/sine_wave_data/root/event200MHz_317mV.root");
00036   if(!fp) {
00037     std::cerr << "Can't open file\n";
00038     return -1;
00039   }
00040   TTree *eventTree = (TTree*) fp->Get("eventTree");
00041   if(!eventTree) {
00042     std::cerr << "Can't find eventTree\n";
00043     return -1;
00044   }
00045   RawAraEvent *evPtr=0;
00046   eventTree->SetBranchAddress("event",&evPtr);
00047   //  strcpy(pedFile,"/Users/rjn/ara/data/frozen_daqbox_calibration/Minus54C/pedestal_files/peds_1291239657/peds_1291239657/peds_1291239657.193855.dat");
00048   strcpy(pedFile,"/unix/anita1/ara/data/frozen_daqbox_calibration/Minus54C/pedestal_files/peds_1291303459/peds_1291303459.323022.dat");
00049   gotPedFile=1;
00050   loadPedestals();
00051 
00052   Double_t frequency=0.2; //Ghz
00053   Double_t ampmv=317;
00054 
00055   char histName[180];
00056   sprintf(histName,"histFile_%3.0fMHz_%3.0fmV.root",1000*frequency,ampmv);
00057   TFile *histFile = new TFile(histName,"RECREATE");
00058   TH1F *histFirstSamp[NUM_DIGITIZED_CHANNELS][2];
00059   TH1F *histLastSamp[NUM_DIGITIZED_CHANNELS][2];
00060   TH1F *histZC[NUM_DIGITIZED_CHANNELS][2];
00061   TH1F *histNorm[NUM_DIGITIZED_CHANNELS][2];
00062   TH1F *histBinWidth[NUM_DIGITIZED_CHANNELS][2];
00063   TH1F *histBinWidthErr[NUM_DIGITIZED_CHANNELS][2];
00064   for(int chan=0;chan<NUM_DIGITIZED_CHANNELS;chan++) {
00065     for(int rco=0;rco<2;rco++) {
00066       sprintf(histName,"histFirstSamp_%d_%d",chan,rco);
00067       histFirstSamp[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00068       sprintf(histName,"histLastSamp_%d_%d",chan,rco);
00069       histLastSamp[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00070       sprintf(histName,"histZC_%d_%d",chan,rco);
00071       histZC[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00072       sprintf(histName,"histNorm_%d_%d",chan,rco);
00073       histNorm[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00074       sprintf(histName,"histBinWidth_%d_%d",chan,rco);
00075       histBinWidth[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00076       sprintf(histName,"histBinWidthErr_%d_%d",chan,rco);
00077       histBinWidthErr[chan][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00078     }
00079   }
00080 
00081   Long64_t numEntries=eventTree->GetEntries();
00082   Long64_t starEvery=numEntries/80;
00083   if(starEvery==0) starEvery++;
00084   for(Long64_t i=0;i<numEntries;i++) {
00085     if(i%starEvery==0) std::cerr << "*";
00086     eventTree->GetEntry(i);
00087     
00088     for(int chan=0;chan<NUM_DIGITIZED_CHANNELS;chan++) {
00089       int chip=chan/9;
00090       int realChan=chan%9;
00091       if(realChan==8) continue;
00092       int rco=evPtr->getRCO(chan);
00093       int firstSamp=evPtr->getEarliestSample(chan);
00094       int lastSamp=evPtr->getLatestSample(chan);
00095       //This cut is to exclude those events with misdetermined RCO phases
00096       if(firstSamp<20 || firstSamp>250) continue;
00097       histFirstSamp[chan][rco]->Fill(firstSamp);
00098       histLastSamp[chan][rco]->Fill(lastSamp);
00099       double data[MAX_NUMBER_SAMPLES];
00100 
00101       for(int samp=0;samp<260;samp++) {
00102         data[samp]=evPtr->chan[chan].data[samp]-pedestalData[chip][realChan][samp];
00103       }
00104       //Zero mean the waveform
00105       double mean=TMath::Mean(260,data);
00106       //      std::cout << mean << "\t" << data[0] << "\n";
00107       for(int samp=0;samp<260;samp++)
00108         data[samp]-=mean;
00109 
00110       if(firstSamp<lastSamp) {
00111         //continue;     
00112         //One RCO phase
00113         for(int i=firstSamp;i<lastSamp-1;i++) {
00114           double val1=data[i];
00115           double val2=data[i+1];
00116           histNorm[chan][rco]->Fill(i);
00117           if(val1<0 && val2>0) {
00118             histZC[chan][rco]->Fill(i);
00119             histBinWidth[chan][rco]->Fill(i);
00120           }
00121           else if(val1>0 && val2<0) {
00122             histZC[chan][rco]->Fill(i);
00123             histBinWidth[chan][rco]->Fill(i);
00124           }
00125           else if(val1==0 || val2==0) {
00126             histZC[chan][rco]->Fill(i,0.5);
00127             histBinWidth[chan][rco]->Fill(i,0.5);
00128           }
00129           
00130         }
00131       }
00132       else {
00133         //continue;
00134         //Two RCO phases
00135         if(firstSamp<258) {
00136           for(int i=firstSamp;i<259;i++) {
00137             double val1=data[i];
00138             double val2=data[i+1];
00139             //      if(i==258)
00140             //        std::cout << val1 << "\t" << val2 << "\n";
00141             histNorm[chan][1-rco]->Fill(i);
00142             if(val1<0 && val2>0) {
00143               histZC[chan][1-rco]->Fill(i);
00144               histBinWidth[chan][1-rco]->Fill(i);
00145             }
00146             else if(val1>0 && val2<0) {
00147               histZC[chan][1-rco]->Fill(i);
00148               histBinWidth[chan][1-rco]->Fill(i);
00149             }
00150             else if(val1==0 || val2==0) {
00151               histZC[chan][1-rco]->Fill(i,0.5);
00152               histBinWidth[chan][1-rco]->Fill(i,0.5);
00153             }   
00154             
00155           }
00156         }
00157         if(lastSamp>2) {
00158           for(int i=0;i<lastSamp-1;i++) {
00159             double val1=data[i];
00160             double val2=data[i+1];
00161             histNorm[chan][rco]->Fill(i);
00162             if(val1<0 && val2>0) {
00163               histZC[chan][rco]->Fill(i);
00164               histBinWidth[chan][rco]->Fill(i);
00165             }
00166             else if(val1>0 && val2<0) {
00167               histZC[chan][rco]->Fill(i);
00168               histBinWidth[chan][rco]->Fill(i);
00169             }
00170             else if(val1==0 || val2==0) {
00171               histZC[chan][rco]->Fill(i,0.5);
00172               histBinWidth[chan][rco]->Fill(i,0.5);
00173             }
00174             
00175           }
00176         }           
00177       }
00178     }   
00179   }
00180   
00181   Double_t avgNorm=0;
00182   Int_t numNorm=0;
00183   for(int chip=0;chip<3;chip++) {
00184     for(int rco=0;rco<2;rco++) {
00185       for(int chan=0;chan<8;chan++) {
00186         int chanIndex = chip*CHANNELS_PER_CHIP+chan;
00187         if(chip==2 && chan==7) continue;
00188         for(int bin=1;bin<260;bin++) {
00189           numNorm++;
00190           avgNorm+=histNorm[chanIndex][rco]->GetBinContent(bin);
00191         }
00192       }
00193     }
00194   }
00195   avgNorm/=numNorm;
00196 
00197   TH1F *histBinWidthChip[3][2];
00198   TH1F *histNormChip[3][2];
00199   TH1F *histBinWidthChipErr[3][2];
00200   char outName[FILENAME_MAX];
00201   sprintf(outName,"binWidths_%3.0fMhz_%3.0fmV.txt",frequency*1000,ampmv);
00202 
00203   for(int chip=0;chip<3;chip++) {
00204     for(int rco=0;rco<2;rco++) {
00205 
00206       //Make the chip-by-chip hists
00207       sprintf(histName,"histNormChip_%d_%d",chip,rco);
00208       histNormChip[chip][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00209       sprintf(histName,"histBinWidthChip_%d_%d",chip,rco);
00210       histBinWidthChip[chip][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00211       sprintf(histName,"histBinWidthChipErr_%d_%d",chip,rco);
00212       histBinWidthChipErr[chip][rco] = new TH1F(histName,histName,260,-0.5,259.5);
00213       
00214       for(int chan=0;chan<8;chan++) {
00215         if(chip==2 && chan==7) continue;
00216         
00217         int chanIndex=chan+chip*9;   
00218         //Fill chip-by-chip hists
00219         histBinWidthChip[chip][rco]->Add(histBinWidth[chanIndex][rco]);
00220         histNormChip[chip][rco]->Add(histNorm[chanIndex][rco]); 
00221         
00222         //Scale chan-by-chan hists
00223         for(int bin=1;bin<260;bin++) {
00224           double value=histBinWidth[chanIndex][rco]->GetBinContent(bin);
00225           if(value>0) {
00226             histBinWidthErr[chanIndex][rco]->SetBinContent(bin,TMath::Sqrt(value));
00227           }
00228         }
00229         histBinWidth[chanIndex][rco]->Divide(histNorm[chanIndex][rco]);
00230         histBinWidth[chanIndex][rco]->Scale(0.5/frequency);
00231         histBinWidthErr[chanIndex][rco]->Divide(histNorm[chanIndex][rco]);
00232         //histBinWidthErr[chanIndex][rco]->Scale(1./avgNorm);
00233         histBinWidthErr[chanIndex][rco]->Scale(0.5/frequency);
00234       }
00235     }
00236   }
00237 
00238 
00239   Double_t avgChipNorm[3]={0};
00240   Int_t numChipNorm[3]={0};
00241   for(int chip=0;chip<3;chip++) {
00242     for(int rco=0;rco<2;rco++) {
00243       for(int bin=1;bin<260;bin++) {
00244         numChipNorm[chip]++;
00245         avgChipNorm[chip]+=histNormChip[chip][rco]->GetBinContent(bin);
00246       }
00247     }
00248     avgChipNorm[chip]/=numChipNorm[chip];
00249   }
00250 
00251 
00252 
00253   for(int chip=0;chip<3;chip++) {
00254     for(int rco=0;rco<2;rco++) {
00255       //Scale chip-by-chip hists
00256       for(int bin=1;bin<260;bin++) {
00257         double value=histBinWidthChip[chip][rco]->GetBinContent(bin);
00258         if(value>0) {
00259           histBinWidthChipErr[chip][rco]->SetBinContent(bin,TMath::Sqrt(value));
00260         }
00261       }
00262       histBinWidthChip[chip][rco]->Divide(histNormChip[chip][rco]);
00263       // histBinWidthChip[chip][rco]->Scale(1./avgChipNorm[chip]);
00264       histBinWidthChip[chip][rco]->Scale(0.5/frequency);
00265       histBinWidthChipErr[chip][rco]->Divide(histNormChip[chip][rco]);
00266       //histBinWidthChipErr[chip][rco]->Scale(1./avgChipNorm[chip]);
00267       histBinWidthChipErr[chip][rco]->Scale(0.5/frequency);
00268     }
00269   }
00270       
00271       
00272   std::ofstream OutFile(outName);
00273   for(int chip=0;chip<3;chip++) {
00274     for(int rco=0;rco<2;rco++) {
00275       OutFile << chip << "\t" << rco << "\t";
00276     
00277       for(int samp=0;samp<260;samp++) {
00278         int bin=samp+1;
00279         if(bin<260) {
00280           OutFile << histBinWidthChip[chip][rco]->GetBinContent(bin) << " ";
00281         }
00282         else {
00283           OutFile << "0 ";
00284         }
00285       }
00286       OutFile << "\n";
00287     }
00288   }
00289 
00290 
00291   histFile->Write();
00292 
00293 }
00294 
00295 
00296 
00297 void loadPedestals()
00298 {
00299   if(!gotPedFile) {
00300     char calibDir[FILENAME_MAX];
00301     char *calibEnv=getenv("ARA_CALIB_DIR");
00302     if(!calibEnv) {
00303       char *utilEnv=getenv("ARA_UTIL_INSTALL_DIR");
00304       if(!utilEnv)
00305         sprintf(calibDir,"calib");
00306       else
00307         sprintf(calibDir,"%s/share/araCalib",utilEnv);
00308     }
00309     else {
00310       strncpy(calibDir,calibEnv,FILENAME_MAX);
00311     }  
00312     sprintf(pedFile,"%s/peds_1286989711.394723.dat",calibDir);
00313   }
00314   FullLabChipPedStruct_t peds;
00315   gzFile inPed = gzopen(pedFile,"r");
00316   if( !inPed ){
00317     fprintf(stderr,"Failed to open pedestal file %s.\n",pedFile);
00318     return;
00319   }
00320 
00321   int nRead = gzread(inPed,&peds,sizeof(FullLabChipPedStruct_t));
00322   if( nRead != sizeof(FullLabChipPedStruct_t)){
00323     int numErr;
00324     fprintf(stderr,"Error reading pedestal file %s; %s\n",pedFile,gzerror(inPed,&numErr));
00325     gzclose(inPed);
00326     return;
00327   }
00328 
00329   int chip,chan,samp;
00330   for(chip=0;chip<ACTIVE_CHIPS;++chip) {
00331     for(chan=0;chan<CHANNELS_PER_CHIP;++chan) {
00332       int chanIndex = chip*CHANNELS_PER_CHIP+chan;
00333       for(samp=0;samp<MAX_NUMBER_SAMPLES;++samp) {
00334         pedestalData[chip][chan][samp]=peds.chan[chanIndex].pedMean[samp];
00335       }
00336     }
00337   }
00338   gzclose(inPed);
00339 }

Generated on Wed Aug 8 16:18:56 2012 for ARA ROOT Test Bed Software by doxygen 1.4.7