ARA ROOT Test BEd Software

analysis/makeFFTHistos.cxx

00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 //Includes
00010 #include <iostream>
00011 
00012 //AraRoot Includes
00013 #include "UsefulAraEvent.h"
00014 #include "RawAraEvent.h"
00015 #include "RawAraHeader.h"
00016 #include "AraHkData.h"
00017 #include "araDefines.h"
00018 #include "FFTtools.h"
00019 
00020 //ROOT Includes
00021 #include "TObject.h"
00022 #include "TObjArray.h"
00023 #include "TList.h"
00024 #include "TChain.h"
00025 #include "TTree.h"
00026 #include "TFile.h"
00027 #include "TGraph.h"
00028 #include "TH1.h"
00029 #include "TH1D.h"
00030 #include "TH2.h"
00031 #include "TH2D.h"
00032 #include "TMath.h"
00033 
00034 //Global input file variables
00035 TChain *feventTreeIn=0;
00036 RawAraEvent *evPtr=0;
00037 
00038 //Global variables used for the analysis
00039 TH1D *fftWindow[RFCHANS_PER_STATION];
00040 //TH2D *fftAvTime[RFCHANS_PER_STATION];
00041 Int_t numEventsInWindow[RFCHANS_PER_STATION]={0};
00042 Int_t eventNumLastHour=0;
00043 Long64_t lastUnixTime=0;
00044 Long64_t lastUnixTimeHours[RFCHANS_PER_STATION]={0};
00045 Long64_t unixTimeFirstEvent=0;
00046 Long64_t unixTimeOfFirstHour=0;
00047 Int_t eventNumFirstEvent=0;
00048 
00049 void makeHistos();
00050 
00051 double calcEventRate(Long64_t lastTime, Long64_t thisTime, double lastEvNum, double thisEvNum, double interval, double lastRate);
00052 
00053 int openRootFile(char *fileDir, int minRun, int maxRun);
00054 
00055 double getXMax(TGraph *gr);
00056 
00057 int main(int argc, char **argv)
00058 {
00059 
00060   if(argc<5) {
00061     std::cout << "Usage\n" << argv[0] << " <input file> <output file>\n";
00062     std::cout << "e.g.\n" << argv[0] << " http://www.hep.ucl.ac.uk/uhen/ara/monitor/root minRun maxRun output.root\n";
00063     return 0;
00064   }
00065 
00066   if(openRootFile(argv[1], atoi(argv[2]), atoi(argv[3]))==0){
00067     std::cout << "Opened input file\n";
00068   }
00069   else return -1;
00070 
00071   char outFileName[FILENAME_MAX];
00072   sprintf(outFileName, "%s", argv[4]);   //FIXME
00073   TFile *fpOut = new TFile(outFileName, "RECREATE");
00074 
00075   char histoName[260];
00076   Int_t numBinsF=256;
00077   Double_t minF=0.0;
00078   Double_t maxF=1000.0;
00079   minF = minF - ( (maxF-minF)/numBinsF/2.0 ); // adjust histogram edges so that the bin centers
00080   maxF = maxF + ( (maxF-minF)/numBinsF/2.0 ); // of the histograms are aligned with graph [add bdf]
00081   numBinsF++;
00082   
00083   for(int antenna=0;antenna<RFCHANS_PER_STATION;antenna++){
00084     sprintf(histoName, "average_fft_antenna_%i", antenna);
00085     fftWindow[antenna] = new TH1D(histoName, histoName, numBinsF, minF, maxF);
00086     
00087   }
00088 
00089 
00090   // Create variables to store in our output tree
00091   Int_t eventNum=0;
00092   Int_t lastEventNum=0;
00093   Int_t unixTime=0; //FIXME  could use full unix time in us as well
00094   Long64_t histoTime=0;
00095   Double_t eventRate=0;
00096   Double_t lastEventRate=0;
00097   Double_t rms[RFCHANS_PER_STATION]={0};
00098   Int_t eventsInHisto[RFCHANS_PER_STATION]={0};
00099 
00100   TTree *mapTree = new TTree("mapTimes", "mapTimes");
00101   int fillTree=0;
00102   mapTree->Branch("histoTime", &histoTime, "histoTime/L");
00103   mapTree->Branch("eventRate", &eventRate, "eventRate/D");
00104   mapTree->Branch("rms", rms, "rms[16]/D");//FIXME
00105   mapTree->Branch("eventsInHisto", &eventsInHisto, "eventsInHisto[16]/I");
00106 
00107   UsefulAraEvent *realEvent=0;
00108   TH1D* tempFft;
00109   TGraph *rfChan;
00110 
00111 
00112   //Now loop through the event Tree
00113 
00114    Long64_t numEntries=feventTreeIn->GetEntries();
00115 
00116    Long64_t starEvery=numEntries/80;
00117    if(starEvery==0) starEvery++;
00118    
00119    //   numEntries=10;//FIXME
00120 
00121 
00122    for(Long64_t event=0;event<numEntries;event++) {
00123      if(event%starEvery==0) {
00124        std::cerr << "*";       
00125      }
00126 
00127      feventTreeIn->GetEntry(event);
00128      realEvent = new UsefulAraEvent(evPtr,AraCalType::kLatestCalib);
00129      eventNum = evPtr->head.eventNumber;
00130      unixTime = evPtr->head.unixTime;
00131 
00132 
00133 
00134 
00135      for(int antenna=0;antenna<RFCHANS_PER_STATION;antenna++){
00136        rfChan = realEvent->getGraphFromRFChan(antenna);
00137        rms[antenna]=rfChan->GetRMS(2);
00138        tempFft = realEvent->getFFTHistForRFChan(antenna);       
00139 
00140        //Fill our histograms for the average FFT
00141        if(unixTime<lastUnixTimeHours[antenna]+60*60){
00142          for(int bin=1; bin<(tempFft->GetNbinsX()+1);bin++){
00143            double expBin = TMath::Power(10,(tempFft->GetBinContent(bin))/10);
00144            fftWindow[antenna]->AddBinContent(bin, expBin);
00145            // fftWindow[antenna]->Add(tempFft);
00146          }
00147        }
00148 
00149        else{
00150          if(numEventsInWindow[antenna]>0) {
00151 
00152            fftWindow[antenna]->Scale(1./numEventsInWindow[antenna]);
00153            //re-scale to the dB scale
00154 
00155            for(int bin=1; bin<(fftWindow[antenna]->GetNbinsX()+1);bin++){
00156 
00157              double logBin=0;
00158              if(fftWindow[antenna]>0)
00159                logBin = 10*TMath::Log10(fftWindow[antenna]->GetBinContent(bin));
00160                
00161              fftWindow[antenna]->SetBinContent(bin, logBin);
00162              // fftWindow[antenna]->Add(tempFft);
00163            }
00164 
00165          }
00166 
00167          sprintf(histoName, "time_%llu", lastUnixTimeHours[antenna]+60*60);
00168          if(fpOut->GetDirectory(histoName)==0)
00169            fpOut->mkdir(histoName);
00170          fpOut->cd(histoName);
00171          fftWindow[antenna]->Write();
00172          fpOut->cd();
00173 
00174          //Now clear the TH1
00175          fftWindow[antenna]->Reset();
00176 
00177          eventsInHisto[antenna]=numEventsInWindow[antenna];
00178          numEventsInWindow[antenna]=0;
00179          histoTime=lastUnixTimeHours[antenna]+60*60;
00180          lastUnixTimeHours[antenna]=histoTime;
00181 
00182          fillTree=1;
00183 
00184        }
00185        
00186        //std::cerr << "deleting graphs and TH1s\n";
00187 
00188        delete rfChan;
00189        delete tempFft;
00190 
00191      }
00192      
00193      if(fillTree){
00194          eventRate=calcEventRate(lastUnixTime, unixTime, lastEventNum, eventNum, 3600, lastEventRate);
00195 
00196          //      printf("eventRate %e lastUnixTime %llu unixTime %llu lastEventNum %d eventNum %d lastEventRate %e\n",eventRate, lastUnixTime, unixTime, lastEventNum, eventNum, lastEventRate);
00197          lastUnixTime=histoTime;
00198          lastEventNum=eventNum;
00199          lastEventRate=eventRate;
00200 
00201        mapTree->Fill();
00202      }
00203      fillTree=0;
00204 
00205      delete realEvent;
00206 
00207    }
00208 
00209    //Now make sure that we save everything and close the files
00210 
00211    //make sure that we save the tree in the right directory
00212    mapTree->Write();
00213    
00214    fpOut->cd();
00215 
00216    fpOut->Close();
00217 
00218    std::cerr << "\n";
00219 
00220 
00221 
00222 }
00223 
00224 void makeHistos(){
00225 
00226   char histoName[260];
00227    Int_t numBinsF=256;
00228    Double_t minF=0.0;
00229    Double_t maxF=1000.0;
00230    minF = minF - ( (maxF-minF)/numBinsF/2.0 ); // adjust histogram edges so that the bin centers
00231    maxF = maxF + ( (maxF-minF)/numBinsF/2.0 ); // of the histograms are aligned with graph [add bdf]
00232    numBinsF++;
00233 
00234    // Int_t numBinsT=1000;
00235    // Double_t minT=0.0;
00236    // Double_t maxT=10.0;
00237 
00238 
00239   for(int antenna=0;antenna<RFCHANS_PER_STATION;antenna++){
00240     sprintf(histoName, "average_fft_antenna_%i", antenna);
00241     fftWindow[antenna] = new TH1D(histoName, histoName, numBinsF, minF, maxF);
00242     //    sprintf(histoName, "average_vTime_fft_antenna_%i", antenna);
00243     //    fftAvTime[antenna] = new TH2D(histoName, histoName, numBinsT, minT, maxT, numBinsF, minF, maxF);
00244 
00245   }
00246 
00247 
00248 }
00249 
00250 int openRootFile(char *fileDir, int minRun, int maxRun){
00251 
00252   feventTreeIn = new TChain("eventTree");
00253   char name[260];
00254   for(int run=minRun;run<maxRun+1;run++){
00255     sprintf(name, "%s/run%06i/event%06i.root",fileDir, run,run);
00256     //    printf("Opening %s\n", name);
00257     if(feventTreeIn->Add(name)==0)
00258       printf("No entries in the tree\n");
00259   }
00260 
00261   feventTreeIn->SetBranchAddress("event",&evPtr);
00262   feventTreeIn->GetEntry(0);
00263 
00264   unixTimeFirstEvent=evPtr->head.unixTime;
00265   unixTimeOfFirstHour=((unixTimeFirstEvent/3600)*3600);
00266 
00267   for(int antenna=0;antenna<RFCHANS_PER_STATION;antenna++){
00268     lastUnixTimeHours[antenna]=unixTimeOfFirstHour;
00269   }
00270   lastUnixTime=unixTimeOfFirstHour;
00271 
00272   return 0;
00273 
00274 }
00275 
00276 
00277 double calcEventRate(Long64_t lastTime, Long64_t thisTime, double lastEvNum, double thisEvNum, double interval, double lastRate){
00278      Double_t dRate = 0;
00279      Double_t eventRate = 0;
00280      if(thisEvNum > lastEvNum)
00281        {
00282          Double_t dEventNum = thisEvNum - lastEvNum;
00283          if(thisTime > lastTime+interval)
00284            dRate = (thisTime-lastTime)/dEventNum;
00285        }
00286      if(dRate>0)
00287        eventRate = 1./dRate;
00288      else 
00289        eventRate = lastRate;
00290   
00291      return eventRate;
00292 
00293 }
00294 
00295 
00296 
00297 double getXMax(TGraph *gr){
00298   int bin=FFTtools::getPeakBin(gr);
00299   return gr->GetX()[bin];
00300 
00301 
00302 }
00303 
00304  

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