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
