ARA ROOT Test BEd Software

analysis/makeL2Files.cxx

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

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