ARA ROOT v3.10 Software

analysis/avWaveformICLPulser.cxx

00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 //Includes
00011 #include <iostream>
00012 
00013 //AraRoot Includes
00014 #include "RawAtriStationEvent.h"
00015 #include "UsefulAtriStationEvent.h"
00016 #include "AraEventCalibrator.h"
00017 #include "FFTtools.h"
00018 
00019 
00020 //Include FFTtools.h if you want to ask the correlation, etc. tools
00021 
00022 //ROOT Includes
00023 #include "TTree.h"
00024 #include "TFile.h"
00025 #include "TGraph.h"
00026 #include "TCanvas.h"
00027 
00028 RawAtriStationEvent *rawAtriEvPtr;
00029 UsefulAtriStationEvent *realAtriEvPtr;
00030 
00031 bool isICLPulserEvent(RawAtriStationEvent *evPtr);
00032 
00033 int main(int argc, char **argv)
00034 {
00035 
00036   if(argc<4) {
00037     std::cout << "Usage\n" << argv[0] << " <run file> <ped file> <out file>\n";
00038     std::cout << "e.g.\n" << argv[0] << " http://www.hep.ucl.ac.uk/uhen/ara/monitor/root/run1841/event1841.root\n";
00039     return 0;
00040   }
00041   
00042   char pedFileName[FILENAME_MAX];
00043   char outFileName[FILENAME_MAX];
00044   sprintf(pedFileName, "%s", argv[2]);
00045   sprintf(outFileName, "%s", argv[3]);
00046   
00047   printf("------------------------------------------------------------------------\n");
00048   printf("%s\n", argv[0]);
00049   printf("runFileName %s\n", argv[1]);
00050   printf("pedFileName %s\n", pedFileName);
00051   printf("outFileName %s\n", outFileName);
00052   printf("------------------------------------------------------------------------\n");
00053   TFile *fpOut = new TFile(outFileName, "RECREATE");
00054   TGraph *grAv[3][8]={{0}};
00055   TGraph *grAvFFT[3][8]={{0}};
00056   TCanvas *canAv[2]={0};
00057 
00058   const Int_t grSize=20000;
00059   const Int_t maxNumWaveforms=200;
00060   const Double_t intSample=(1./1.6)/32;
00061   Double_t grAvXVals[3][8][grSize]={{{0}}};
00062   Double_t grAvYVals[3][8][grSize]={{{0}}};
00063   Int_t numWaveforms[3][8]={{0}};
00064   Int_t chanMap[3][8]={{0,1,8,9,16,17,24,25},{3,4,10,11,18,19,26,27},{5,6,28,29,-1,-1}};
00065   TFile *fp = TFile::Open(argv[1]);
00066   if(!fp) {
00067     std::cerr << "Can't open file\n";
00068      return -1;
00069    }
00070    TTree *eventTree = (TTree*) fp->Get("eventTree");
00071    if(!eventTree) {
00072      std::cerr << "Can't find eventTree\n";
00073      return -1;
00074    }
00075    
00076    eventTree->SetBranchAddress("event",&rawAtriEvPtr);
00077    Long64_t numEntries=eventTree->GetEntries();
00078    Long64_t starEvery=numEntries/80;
00079    Int_t stationId=0;
00080    eventTree->GetEntry(0);
00081    stationId = rawAtriEvPtr->stationId;
00082    if(starEvery==0) starEvery++;
00083 
00084 
00085    printf("stationId %i numEntries %li\n", stationId, (long int)numEntries);
00086 
00087    AraEventCalibrator *calibrator = AraEventCalibrator::Instance();
00088    calibrator->setAtriPedFile(pedFileName, stationId);
00089 
00090    for(Long64_t event=0;event<numEntries;event++) {
00091      if(event%starEvery==0) {
00092        std::cerr << "*";       
00093      }
00094 
00095      eventTree->GetEntry(event);
00096      
00097      //     if(rawAtriEvPtr->isCalpulserEvent()==0) continue;
00098      
00099      if(!isICLPulserEvent(rawAtriEvPtr)) continue;
00100 
00101      realAtriEvPtr = new UsefulAtriStationEvent(rawAtriEvPtr, AraCalType::kFirstCalib);
00102      
00103      Int_t chan=0;
00104      Int_t ant=0;
00105      Int_t pol=0;
00106      for(pol=0;pol<2;pol++){
00107        for(ant=0;ant<8;ant++){
00108          chan=chanMap[pol][ant];
00109          //printf("pol %i ant %i chan %i\n", pol, ant, chan);
00110          if(chan<0) continue;
00111          if(numWaveforms[pol][ant]>=maxNumWaveforms) continue;
00112          
00113          TGraph *grChan = realAtriEvPtr->getGraphFromElecChan(chan);             
00114          TGraph *chanInt = FFTtools::getInterpolatedGraph(grChan,intSample); 
00115          
00116          //      printf("grChan N %i chanInt N %i\n", grChan->GetN(), chanInt->GetN());
00117 
00118 
00119 
00120          //second time etc
00121          if(numWaveforms[pol][ant]==0){
00122            Double_t *xVals = chanInt->GetX();
00123            Double_t *yVals = chanInt->GetY();
00124            Int_t numSamples = chanInt->GetN();
00125            for(int samp=0;samp<grSize;samp++){
00126              if(samp>numSamples) continue;
00127              grAvYVals[pol][ant][samp]+=yVals[samp];
00128              grAvXVals[pol][ant][samp]=xVals[samp];
00129            }
00130            numWaveforms[pol][ant]++;
00131          }
00132          else{
00133            TGraph *grTemplate = new TGraph(grSize, grAvXVals[pol][ant], grAvYVals[pol][ant]);    
00134            TGraph *grCorr = FFTtools::getCorrelationGraph(chanInt, grTemplate);
00135            Int_t peakBin =  FFTtools::getPeakBin(grCorr);
00136            
00137            Double_t *xVals = chanInt->GetX();
00138            Double_t *yVals = chanInt->GetY();
00139            Int_t numSamples = chanInt->GetN();
00140            //      printf("peakBin %i numSamples %d proposed %d\n", peakBin, grCorr->GetN()/2,  peakBin - grCorr->GetN()/2);
00141            Int_t deltaBin = peakBin - grCorr->GetN()/2;
00142            for(int samp=0;samp<grSize;samp++){
00143              if(samp>numSamples) continue;
00144              //      grAvXVals[pol][ant][samp]=xVals[samp];
00145 
00146              Int_t newSample = samp+deltaBin;
00147              if(newSample<0 || newSample>grSize) continue;
00148              grAvYVals[pol][ant][samp]+=yVals[newSample];
00149              
00150            }
00151            numWaveforms[pol][ant]++;
00152            delete grCorr;
00153            delete grTemplate;
00154 
00155          }
00156          
00157          delete grChan;
00158          delete chanInt;
00159        }
00160      }
00161      delete realAtriEvPtr;
00162    
00163      if(maxNumWaveforms<=numWaveforms[0][0]) break;
00164 
00165    }
00166    
00167 
00168 
00169    Int_t chan=0;
00170    Int_t ant=0;
00171    Int_t pol=0;
00172    for(pol=0;pol<2;pol++){
00173      char canName[100];
00174      sprintf(canName, "can%sPol_%i_waveforms", pol ? "H": "V", numWaveforms[pol][0]);
00175      canAv[pol]=new TCanvas(canName, canName);
00176      canAv[pol]->Divide(4,2);
00177      for(ant=0;ant<8;ant++){
00178        Int_t row=0, column=0;
00179        row = ant%2;
00180        column = ant/2;
00181        canAv[pol]->cd(1+column+row*4);
00182        chan=chanMap[pol][ant];
00183        
00184        for(int samp=0;samp<grSize;samp++){
00185          if(numWaveforms[pol][ant]==0) grAvYVals[pol][ant][samp]=0;
00186          else grAvYVals[pol][ant][samp]/=numWaveforms[pol][ant];
00187        }
00188        grAv[pol][ant] = new TGraph(grSize, grAvXVals[pol][ant], grAvYVals[pol][ant]);
00189        char grName[100];
00190        sprintf(grName, "grAv_%sPol_ant%i", pol ? "H": "V", ant);
00191        grAv[pol][ant]->SetName(grName);
00192        grAv[pol][ant]->SetTitle(grName);
00193        grAv[pol][ant]->GetXaxis()->SetTitle("Time (ns)");
00194        grAv[pol][ant]->GetYaxis()->SetTitle("Voltage (mV)");
00195        fpOut->cd();
00196        grAv[pol][ant]->Draw("AL");
00197        grAv[pol][ant]->Write();
00198 
00199        grAvFFT[pol][ant] = FFTtools::makePowerSpectrumMilliVoltsNanoSecondsdB(grAv[pol][ant]);
00200        sprintf(grName, "grAvFFT_%sPol_ant%i", pol ? "H": "V", ant);
00201        grAvFFT[pol][ant]->SetName(grName);
00202        grAvFFT[pol][ant]->SetTitle(grName);
00203        grAvFFT[pol][ant]->GetXaxis()->SetTitle("Frequency (MHz)");
00204        grAvFFT[pol][ant]->GetYaxis()->SetTitle("Power ()");
00205 
00206        grAvFFT[pol][ant]->Write();
00207        //       printf("%sPol ant %i numWaveforms %i\n", pol ? "H" : "V", ant, numWaveforms[pol][ant]);
00208 
00209      }
00210      canAv[pol]->SetTitle(canName);
00211      canAv[pol]->Write();
00212      
00213    }
00214    fpOut->Write();
00215 
00216    std::cerr << "\n";
00217 
00218 }
00219 
00220 
00221 
00222 
00223 bool isICLPulserEvent(RawAtriStationEvent *evPtr){
00224   Int_t stationId = evPtr->stationId;
00225   UInt_t timeStamp = evPtr->timeStamp;
00226   
00227   if(stationId==3){
00228     if(evPtr->numReadoutBlocks!=80&&TMath::Abs(timeStamp-5e7)<1e6) return true;
00229   }
00230   else if(stationId==2){
00231     if(TMath::Abs(timeStamp-1.510e3)<5e1) return true;
00232 
00233   }
00234   else if(stationId==100){
00235 
00236     if(TMath::Abs(timeStamp-9.40e2)<5e1) return true;
00237 
00238   }
00239   
00240 
00241   return false;
00242 
00243 }

Generated on Tue Jul 16 16:58:01 2013 for ARA ROOT v3.10 Software by doxygen 1.4.7