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
