AraCorrelator/AraEventCorrelator.cxx
00001 #include <iostream> 00002 #include "AraEventCorrelator.h" 00003 #include "AraGeomTool.h" 00004 #include "AraAntennaInfo.h" 00005 #include "AraStationInfo.h" 00006 #include "UsefulIcrrStationEvent.h" 00007 #include "UsefulAtriStationEvent.h" 00008 #include "FFTtools.h" 00009 #include "TH2D.h" 00010 #include "TMath.h" 00011 00012 ClassImp(AraEventCorrelator); 00013 00014 AraEventCorrelator * AraEventCorrelator::fgInstance=0; 00015 00016 00017 AraEventCorrelator::AraEventCorrelator(Int_t numAnts, Int_t stationId) 00018 { 00019 //Default constructor 00020 fNumAnts=numAnts; 00021 fNumPairs=0; 00022 fStationId=stationId; 00023 00024 if(numAnts > MAX_NUM_ANTS){ 00025 fprintf(stderr, "%s -- numAnts %i larger than the maximum %i!\n", __FUNCTION__, numAnts, MAX_NUM_ANTS); 00026 } 00027 00028 for(int first=0;first<(fNumAnts-1);first++) { 00029 for(int second=first+1;second<fNumAnts;second++) { 00030 fFirstAnt[fNumPairs]=first; 00031 fSecondAnt[fNumPairs]=second; 00032 fNumPairs++; 00033 } 00034 } 00035 00036 // fillDeltaTArrays(); 00037 fillAntennaPositions(stationId); 00038 setupDeltaTInfinity(); 00039 setupDeltaT40m(); 00040 } 00041 00042 AraEventCorrelator::~AraEventCorrelator() 00043 { 00044 //Default destructor 00045 } 00046 00047 00048 //______________________________________________________________________________ 00049 AraEventCorrelator* AraEventCorrelator::Instance(Int_t numAnts, Int_t stationId) 00050 { 00051 //static function 00052 if(fgInstance) 00053 return fgInstance; 00054 00055 fgInstance = new AraEventCorrelator(numAnts, stationId); 00056 return fgInstance; 00057 } 00058 00059 void AraEventCorrelator::fillAntennaPositions(Int_t stationId){ 00060 if(AraGeomTool::isAtriStation(stationId)) fillAntennaPositionsAtri(); 00061 else if(AraGeomTool::isIcrrStation(stationId)) fillAntennaPositionsIcrr(); 00062 else fprintf(stderr, "%s station %i is neither ATRI nor ICRR\n", __FUNCTION__, (int)stationId); 00063 00064 } 00065 00066 void AraEventCorrelator::fillAntennaPositionsAtri() 00067 { 00068 AraGeomTool *araGeom=AraGeomTool::Instance(); 00069 for(int ant=0;ant<ANTS_PER_ATRI;ant++){ 00070 int antPolNum=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->antPolNum; 00071 if(araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->polType==AraAntPol::kVertical) { 00072 if(antPolNum<8) { 00073 fRfChanVPol[antPolNum]=ant; 00074 fVPolPos[antPolNum][0]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[0]; 00075 fVPolPos[antPolNum][1]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[1]; 00076 fVPolPos[antPolNum][2]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[2]; 00077 fVPolRho[antPolNum]=TMath::Sqrt(fVPolPos[antPolNum][0]*fVPolPos[antPolNum][0]+ 00078 fVPolPos[antPolNum][1]*fVPolPos[antPolNum][1]); 00079 fVPolPhi[antPolNum]=TMath::ATan2(fVPolPos[antPolNum][1],fVPolPos[antPolNum][0]); 00080 } 00081 } 00082 if(araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->polType==AraAntPol::kHorizontal) { 00083 if(antPolNum<8) { 00084 fRfChanHPol[antPolNum]=ant; 00085 fHPolPos[antPolNum][0]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[0]; 00086 fHPolPos[antPolNum][1]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[1]; 00087 fHPolPos[antPolNum][2]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[2]; 00088 fHPolRho[antPolNum]=TMath::Sqrt(fHPolPos[antPolNum][0]*fHPolPos[antPolNum][0]+ 00089 fHPolPos[antPolNum][1]*fHPolPos[antPolNum][1]); 00090 fHPolPhi[antPolNum]=TMath::ATan2(fHPolPos[antPolNum][1],fHPolPos[antPolNum][0]); 00091 } 00092 } 00093 } 00094 std::cout << "\n"; 00095 for(int i=0;i<8;i++) { 00096 std::cout << "V\t" << i << "\t" << fVPolPos[i][0] << "\t" << fVPolPos[i][1] << "\t" << fVPolPos[i][2] << "\n"; 00097 } 00098 for(int i=0;i<8;i++) { 00099 std::cout << "H\t" << i << "\t" << fHPolPos[i][0] << "\t" << fHPolPos[i][1] << "\t" << fHPolPos[i][2] << "\n"; 00100 } 00101 std::cout << "\n"; 00102 //Now fill the arrays with angles 00103 Double_t deltaPhi=360./NUM_PHI_BINS; 00104 Double_t deltaTheta=180./NUM_THETA_BINS; 00105 00106 for(int i=0;i<NUM_PHI_BINS;i++) { 00107 fPhiWaveDeg[i]=-180+0.5*deltaPhi+deltaPhi*i; 00108 fPhiWave[i]=fPhiWaveDeg[i]*TMath::DegToRad(); 00109 } 00110 for(int i=0;i<NUM_THETA_BINS;i++) { 00111 fThetaWaveDeg[i]=-90+0.5*deltaTheta+deltaTheta*i; 00112 fThetaWave[i]=fThetaWaveDeg[i]*TMath::DegToRad(); 00113 } 00114 00115 } 00116 00117 void AraEventCorrelator::fillAntennaPositionsIcrr() 00118 { 00119 AraGeomTool *araGeom=AraGeomTool::Instance(); 00120 00121 for(int ant=0;ant<ANTS_PER_ICRR;ant++) { 00122 int antPolNum=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->antPolNum; 00123 std::cerr << ant << "\t" << antPolNum << "\t" << araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->polType << "\n"; 00124 if(araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->polType==AraAntPol::kVertical) { 00125 if(antPolNum<MAX_NUM_ANTS) { 00126 fRfChanVPol[antPolNum]=ant; 00127 fVPolPos[antPolNum][0]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[0]; 00128 fVPolPos[antPolNum][1]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[1]; 00129 fVPolPos[antPolNum][2]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[2]; 00130 fVPolRho[antPolNum]=TMath::Sqrt(fVPolPos[antPolNum][0]*fVPolPos[antPolNum][0]+ 00131 fVPolPos[antPolNum][1]*fVPolPos[antPolNum][1]); 00132 fVPolPhi[antPolNum]=TMath::ATan2(fVPolPos[antPolNum][1],fVPolPos[antPolNum][0]); 00133 } 00134 } 00135 if(araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->polType==AraAntPol::kHorizontal) { 00136 if(antPolNum<MAX_NUM_ANTS) { 00137 fRfChanHPol[antPolNum]=ant; 00138 fHPolPos[antPolNum][0]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[0]; 00139 fHPolPos[antPolNum][1]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[1]; 00140 fHPolPos[antPolNum][2]=araGeom->getStationInfo(fStationId)->getAntennaInfo(ant)->getLocationXYZ()[2]; 00141 fHPolRho[antPolNum]=TMath::Sqrt(fHPolPos[antPolNum][0]*fHPolPos[antPolNum][0]+ 00142 fHPolPos[antPolNum][1]*fHPolPos[antPolNum][1]); 00143 fHPolPhi[antPolNum]=TMath::ATan2(fHPolPos[antPolNum][1],fHPolPos[antPolNum][0]); 00144 } 00145 } 00146 } 00147 std::cout << "\n"; 00148 for(int i=0;i<MAX_NUM_ANTS;i++) { 00149 std::cout << "V\t" << i << "\t" << fVPolPos[i][0] << "\t" << fVPolPos[i][1] << "\t" << fVPolPos[i][2] << "\n"; 00150 } 00151 for(int i=0;i<MAX_NUM_ANTS;i++) { 00152 std::cout << "H\t" << i << "\t" << fHPolPos[i][0] << "\t" << fHPolPos[i][1] << "\t" << fHPolPos[i][2] << "\n"; 00153 } 00154 std::cout << "\n"; 00155 00156 //Now fill the arrays with angles 00157 Double_t deltaPhi=360./NUM_PHI_BINS; 00158 Double_t deltaTheta=180./NUM_THETA_BINS; 00159 00160 for(int i=0;i<NUM_PHI_BINS;i++) { 00161 fPhiWaveDeg[i]=-180+0.5*deltaPhi+deltaPhi*i; 00162 fPhiWave[i]=fPhiWaveDeg[i]*TMath::DegToRad(); 00163 } 00164 for(int i=0;i<NUM_THETA_BINS;i++) { 00165 fThetaWaveDeg[i]=-90+0.5*deltaTheta+deltaTheta*i; 00166 fThetaWave[i]=fThetaWaveDeg[i]*TMath::DegToRad(); 00167 } 00168 } 00169 00170 00171 void AraEventCorrelator::setupDeltaTInfinity() 00172 { 00173 00174 00175 for(int pair=0;pair<fNumPairs;pair++) { 00176 int ind1=0; 00177 int ind2=0; 00178 getPairIndices(pair,ind1,ind2); 00179 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00180 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00181 fVPolDeltaTInfinity[pair][phiBin][thetaBin]= 00182 calcDeltaTInfinity(fVPolPos[ind1],fVPolRho[ind1],fVPolPhi[ind1], 00183 fVPolPos[ind2],fVPolRho[ind2],fVPolPhi[ind2], 00184 fPhiWave[phiBin],fThetaWave[thetaBin]); 00185 fHPolDeltaTInfinity[pair][phiBin][thetaBin]= 00186 calcDeltaTInfinity(fHPolPos[ind1],fHPolRho[ind1],fHPolPhi[ind1], 00187 fHPolPos[ind2],fHPolRho[ind2],fHPolPhi[ind2], 00188 fPhiWave[phiBin],fThetaWave[thetaBin]); 00189 } 00190 } 00191 } 00192 00193 } 00194 00195 00196 void AraEventCorrelator::setupDeltaT40m() 00197 { 00198 Double_t R=41.8; 00199 00200 00201 for(int pair=0;pair<fNumPairs;pair++) { 00202 int ind1=0; 00203 int ind2=0; 00204 getPairIndices(pair,ind1,ind2); 00205 // std::cout << "Starting pair " << pair << "\t" << ind1 << "\t" << ind2 << "\n"; 00206 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00207 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00208 fVPolDeltaT40m[pair][phiBin][thetaBin]= 00209 calcDeltaTR(fVPolPos[ind1],fVPolRho[ind1],fVPolPhi[ind1], 00210 fVPolPos[ind2],fVPolRho[ind2],fVPolPhi[ind2], 00211 fPhiWave[phiBin],fThetaWave[thetaBin],R); 00212 fHPolDeltaT40m[pair][phiBin][thetaBin]= 00213 calcDeltaTR(fHPolPos[ind1],fHPolRho[ind1],fHPolPhi[ind1], 00214 fHPolPos[ind2],fHPolRho[ind2],fHPolPhi[ind2], 00215 fPhiWave[phiBin],fThetaWave[thetaBin],R); 00216 } 00217 } 00218 } 00219 00220 } 00221 00222 Double_t AraEventCorrelator::calcDeltaTInfinity(Double_t ant1[3],Double_t rho1, Double_t phi1, Double_t ant2[3],Double_t rho2, Double_t phi2, Double_t phiWave, Double_t thetaWave) 00223 { 00224 00225 Double_t d1=TMath::Cos(thetaWave)*(ant1[2]*TMath::Tan(thetaWave)+rho1*TMath::Cos(phi1-phiWave)); 00226 Double_t d2=TMath::Cos(thetaWave)*(ant2[2]*TMath::Tan(thetaWave)+rho2*TMath::Cos(phi2-phiWave)); 00227 Double_t t1t2=(d2-d1)*AraGeomTool::nTopOfIce/TMath::C(); 00228 t1t2*=1e9; 00229 return t1t2; 00230 // Double_t t2t1=(d1-d2)*AraGeomTool::nTopOfIce/TMath::C(); 00231 // t2t1*=1e9; 00232 // return t2t1; 00233 } 00234 00235 Double_t AraEventCorrelator::calcDeltaTR(Double_t ant1[3],Double_t rho1, Double_t phi1, Double_t ant2[3],Double_t rho2, Double_t phi2, Double_t phiWave, Double_t thetaWave, Double_t R) 00236 { 00237 00238 Double_t xs=R*TMath::Cos(thetaWave)*TMath::Cos(phiWave); 00239 Double_t ys=R*TMath::Cos(thetaWave)*TMath::Sin(phiWave); 00240 Double_t zs=R*TMath::Sin(thetaWave); 00241 00242 // if(phiWave*TMath::RadToDeg()>30 && phiWave*TMath::RadToDeg()<31) { 00243 // if(thetaWave*TMath::RadToDeg()>-45 && thetaWave*TMath::RadToDeg()<-44) { 00244 // std::cout << phiWave*TMath::RadToDeg() << "\t" << thetaWave*TMath::RadToDeg() << "\t" << R << "\t" << xs << "\t" << ys << "\t" << zs << "\n"; 00245 // } 00246 // } 00247 00248 Double_t d1=TMath::Sqrt((xs-ant1[0])*(xs-ant1[0])+(ys-ant1[1])*(ys-ant1[1])+(zs-ant1[2])*(zs-ant1[2])); 00249 Double_t d2=TMath::Sqrt((xs-ant2[0])*(xs-ant2[0])+(ys-ant2[1])*(ys-ant2[1])+(zs-ant2[2])*(zs-ant2[2])); 00250 00251 00252 // if(phiWave*TMath::RadToDeg()>30 && phiWave*TMath::RadToDeg()<31) { 00253 // if(thetaWave*TMath::RadToDeg()>-45 && thetaWave*TMath::RadToDeg()<-44) { 00254 // std::cout << d1 << "\t" << d2 << "\t" << d1-d2 << "\n"; 00255 // } 00256 // } 00257 00258 00259 Double_t t1t2=(d1-d2)*AraGeomTool::nTopOfIce/TMath::C(); 00260 t1t2*=1e9; 00261 return t1t2; 00262 } 00263 00264 void AraEventCorrelator::fillDeltaTArrays(AraCorrelatorType::AraCorrelatorType_t corType) { 00265 static AraCorrelatorType::AraCorrelatorType_t lastCorType=AraCorrelatorType::kNotACorType; 00266 if(lastCorType==corType) return; 00267 lastCorType=corType; 00268 00269 switch (corType) { 00270 case AraCorrelatorType::kSphericalDist40: 00271 for(int pair=0;pair<fNumPairs;pair++) { 00272 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00273 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00274 fVPolDeltaT[pair][phiBin][thetaBin]=fVPolDeltaT40m[pair][phiBin][thetaBin]; 00275 fHPolDeltaT[pair][phiBin][thetaBin]=fHPolDeltaT40m[pair][phiBin][thetaBin]; 00276 } 00277 } 00278 } 00279 break; 00280 case AraCorrelatorType::kPlaneWave: 00281 default: 00282 for(int pair=0;pair<fNumPairs;pair++) { 00283 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00284 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00285 fVPolDeltaT[pair][phiBin][thetaBin]=fVPolDeltaTInfinity[pair][phiBin][thetaBin]; 00286 fHPolDeltaT[pair][phiBin][thetaBin]=fHPolDeltaTInfinity[pair][phiBin][thetaBin]; 00287 } 00288 } 00289 } 00290 break; 00291 } 00292 } 00293 00294 00295 00296 void AraEventCorrelator::getPairIndices(int pair, int &ant1, int &ant2) 00297 { 00298 00299 if(pair>=0 && pair<fNumPairs) { 00300 ant1=fFirstAnt[pair]; 00301 ant2=fSecondAnt[pair]; 00302 } 00303 } 00304 00305 TH2D *AraEventCorrelator::getInterferometricMap(UsefulIcrrStationEvent *evPtr, AraAntPol::AraAntPol_t polType,AraCorrelatorType::AraCorrelatorType_t corType) 00306 { 00307 static int counter=0; 00308 fillDeltaTArrays(corType); 00309 //Now need to get correlations for the fNumPairs antenna pairs and then look up the correlation values of each one 00310 Double_t scale=1./fNumPairs; 00311 TH2D *histMap = new TH2D("histMap","histMap",NUM_PHI_BINS,-180,180,NUM_THETA_BINS,-90,90); 00312 TGraph *grRaw[fNumAnts]; 00313 TGraph *grInt[fNumAnts]; 00314 TGraph *grNorm[fNumAnts]; 00315 TGraph *grCor[fNumPairs]; 00316 for(int i=0;i<fNumAnts;i++) { 00317 grRaw[i]=0; 00318 grInt[i]=0; 00319 grNorm[i]=0; 00320 } 00321 for(int i=0;i<fNumPairs;i++) 00322 grCor[i]=0; 00323 00324 if(polType==AraAntPol::kVertical) { 00325 for(int ind=0;ind<fNumAnts;ind++) { 00326 // std::cerr << ind << "\t" << fRfChanVPol[ind] << "\n"; 00327 grRaw[ind]=evPtr->getGraphFromRFChan(fRfChanVPol[ind]); 00328 grInt[ind]=FFTtools::getInterpolatedGraph(grRaw[ind],0.5); 00329 grNorm[ind]=getNormalisedGraph(grInt[ind]); 00330 } 00331 // std::cerr << "Got graphs and made int maps\n"; 00332 00333 for(int pair=0;pair<fNumPairs;pair++) { 00334 int ind1=0; 00335 int ind2=0; 00336 getPairIndices(pair,ind1,ind2); 00337 // std::cerr << pair << "\t" << ind1 << "\t" << ind2 << "\n"; 00338 00339 grCor[pair]=FFTtools::getCorrelationGraph(grNorm[ind1],grNorm[ind2]); 00340 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00341 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00342 //I think this is the correct equation to work out the bin number 00343 //Could just use TH2::GetBin(binx,biny) but the below should be faster 00344 Int_t globalBin=(phiBin+1)+(thetaBin+1)*(NUM_PHI_BINS+2); 00345 Double_t dt=fVPolDeltaT[pair][phiBin][thetaBin]; 00346 //Double_t corVal=grCor[pair]->Eval(dt); 00347 Double_t corVal=fastEvalForEvenSampling(grCor[pair],dt); 00348 corVal*=scale; 00349 Double_t binVal=histMap->GetBinContent(globalBin); 00350 histMap->SetBinContent(globalBin,binVal+corVal); 00351 } 00352 } 00353 } 00354 } 00355 else { 00356 for(int ind=0;ind<fNumAnts;ind++) { 00357 grRaw[ind]=evPtr->getGraphFromRFChan(fRfChanHPol[ind]); 00358 grInt[ind]=FFTtools::getInterpolatedGraph(grRaw[ind],0.5); 00359 grNorm[ind]=getNormalisedGraph(grInt[ind]); 00360 } 00361 00362 for(int pair=0;pair<fNumPairs;pair++) { 00363 int ind1=0; 00364 int ind2=0; 00365 getPairIndices(pair,ind1,ind2); 00366 grCor[pair]=FFTtools::getCorrelationGraph(grNorm[ind1],grNorm[ind2]); 00367 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00368 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00369 //I think this is the correct equation to work out the bin number 00370 //Could just use TH2::GetBin(binx,biny) but the below should be faster 00371 Int_t globalBin=(phiBin+1)+(thetaBin+1)*(NUM_PHI_BINS+2); 00372 Double_t dt=fHPolDeltaT[pair][phiBin][thetaBin]; 00373 // Double_t corVal=grCor[pair]->Eval(dt); 00374 Double_t corVal=fastEvalForEvenSampling(grCor[pair],dt); 00375 corVal*=scale; 00376 Double_t binVal=histMap->GetBinContent(globalBin); 00377 histMap->SetBinContent(globalBin,binVal+corVal); 00378 } 00379 } 00380 } 00381 } 00382 if(fDebugMode) { 00383 char histName[180]; 00384 for(int i=0;i<fNumAnts;i++) { 00385 sprintf(histName,"grRaw%d_%d",i,counter); 00386 grRaw[i]->SetName(histName); 00387 grRaw[i]->SetTitle(histName); 00388 grRaw[i]->Write(); 00389 sprintf(histName,"grInt%d_%d",i,counter); 00390 grInt[i]->SetName(histName); 00391 grInt[i]->SetTitle(histName); 00392 grInt[i]->Write(); 00393 sprintf(histName,"grNorm%d_%d",i,counter); 00394 grNorm[i]->SetName(histName); 00395 grNorm[i]->SetTitle(histName); 00396 grNorm[i]->Write(); 00397 } 00398 for(int i=0;i<fNumPairs;i++) { 00399 sprintf(histName,"grCor%d_%d",i,counter); 00400 grCor[i]->SetName(histName); 00401 grCor[i]->SetTitle(histName); 00402 grCor[i]->Write(); 00403 } 00404 counter++; 00405 } 00406 for(int i=0;i<fNumAnts;i++) { 00407 if(grRaw[i]) delete grRaw[i]; 00408 if(grInt[i]) delete grInt[i]; 00409 if(grNorm[i]) delete grNorm[i]; 00410 } 00411 for(int i=0;i<fNumPairs;i++) { 00412 if(grCor[i]) delete grCor[i]; 00413 } 00414 //Moved the scaling to earlier for optimisation reasons 00415 // histMap->Scale(scale); 00416 return histMap; 00417 } 00418 00419 TH2D *AraEventCorrelator::getInterferometricMap(UsefulAtriStationEvent *evPtr, AraAntPol::AraAntPol_t polType,AraCorrelatorType::AraCorrelatorType_t corType) 00420 { 00421 static int counter=0; 00422 fillDeltaTArrays(corType); 00423 //Now need to get correlations for the fNumPairs antenna pairs and then look up the correlation values of each one 00424 Double_t scale=1./fNumPairs; 00425 TH2D *histMap = new TH2D("histMap","histMap",NUM_PHI_BINS,-180,180,NUM_THETA_BINS,-90,90); 00426 TGraph *grRaw[fNumAnts]; 00427 TGraph *grInt[fNumAnts]; 00428 TGraph *grNorm[fNumAnts]; 00429 TGraph *grCor[fNumPairs]; 00430 for(int i=0;i<fNumAnts;i++) { 00431 grRaw[i]=0; 00432 grInt[i]=0; 00433 grNorm[i]=0; 00434 } 00435 for(int i=0;i<fNumPairs;i++) 00436 grCor[i]=0; 00437 00438 if(polType==AraAntPol::kVertical) { 00439 for(int ind=0;ind<fNumAnts;ind++) { 00440 std::cerr << ind << "\t" << fRfChanVPol[ind] << "\n"; 00441 grRaw[ind]=evPtr->getGraphFromRFChan(fRfChanVPol[ind]); 00442 grInt[ind]=FFTtools::getInterpolatedGraph(grRaw[ind],0.5); 00443 grNorm[ind]=getNormalisedGraph(grInt[ind]); 00444 } 00445 std::cerr << "Got graphs and made int maps\n"; 00446 00447 for(int pair=0;pair<fNumPairs;pair++) { 00448 int ind1=0; 00449 int ind2=0; 00450 getPairIndices(pair,ind1,ind2); 00451 std::cerr << pair << "\t" << ind1 << "\t" << ind2 << "\n"; 00452 00453 grCor[pair]=FFTtools::getCorrelationGraph(grNorm[ind1],grNorm[ind2]); 00454 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00455 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00456 //I think this is the correct equation to work out the bin number 00457 //Could just use TH2::GetBin(binx,biny) but the below should be faster 00458 Int_t globalBin=(phiBin+1)+(thetaBin+1)*(NUM_PHI_BINS+2); 00459 Double_t dt=fVPolDeltaT[pair][phiBin][thetaBin]; 00460 //Double_t corVal=grCor[pair]->Eval(dt); 00461 Double_t corVal=fastEvalForEvenSampling(grCor[pair],dt); 00462 corVal*=scale; 00463 Double_t binVal=histMap->GetBinContent(globalBin); 00464 histMap->SetBinContent(globalBin,binVal+corVal); 00465 } 00466 } 00467 } 00468 } 00469 else { 00470 for(int ind=0;ind<fNumAnts;ind++) { 00471 grRaw[ind]=evPtr->getGraphFromRFChan(fRfChanHPol[ind]); 00472 grInt[ind]=FFTtools::getInterpolatedGraph(grRaw[ind],0.5); 00473 grNorm[ind]=getNormalisedGraph(grInt[ind]); 00474 } 00475 00476 for(int pair=0;pair<fNumPairs;pair++) { 00477 int ind1=0; 00478 int ind2=0; 00479 getPairIndices(pair,ind1,ind2); 00480 grCor[pair]=FFTtools::getCorrelationGraph(grNorm[ind1],grNorm[ind2]); 00481 for(int phiBin=0;phiBin<NUM_PHI_BINS;phiBin++) { 00482 for(int thetaBin=0;thetaBin<NUM_THETA_BINS;thetaBin++) { 00483 //I think this is the correct equation to work out the bin number 00484 //Could just use TH2::GetBin(binx,biny) but the below should be faster 00485 Int_t globalBin=(phiBin+1)+(thetaBin+1)*(NUM_PHI_BINS+2); 00486 Double_t dt=fHPolDeltaT[pair][phiBin][thetaBin]; 00487 // Double_t corVal=grCor[pair]->Eval(dt); 00488 Double_t corVal=fastEvalForEvenSampling(grCor[pair],dt); 00489 corVal*=scale; 00490 Double_t binVal=histMap->GetBinContent(globalBin); 00491 histMap->SetBinContent(globalBin,binVal+corVal); 00492 } 00493 } 00494 } 00495 } 00496 if(fDebugMode) { 00497 char histName[180]; 00498 for(int i=0;i<fNumAnts;i++) { 00499 sprintf(histName,"grRaw%d_%d",i,counter); 00500 grRaw[i]->SetName(histName); 00501 grRaw[i]->SetTitle(histName); 00502 grRaw[i]->Write(); 00503 sprintf(histName,"grInt%d_%d",i,counter); 00504 grInt[i]->SetName(histName); 00505 grInt[i]->SetTitle(histName); 00506 grInt[i]->Write(); 00507 sprintf(histName,"grNorm%d_%d",i,counter); 00508 grNorm[i]->SetName(histName); 00509 grNorm[i]->SetTitle(histName); 00510 grNorm[i]->Write(); 00511 } 00512 for(int i=0;i<fNumPairs;i++) { 00513 sprintf(histName,"grCor%d_%d",i,counter); 00514 grCor[i]->SetName(histName); 00515 grCor[i]->SetTitle(histName); 00516 grCor[i]->Write(); 00517 } 00518 counter++; 00519 } 00520 for(int i=0;i<fNumAnts;i++) { 00521 if(grRaw[i]) delete grRaw[i]; 00522 if(grInt[i]) delete grInt[i]; 00523 if(grNorm[i]) delete grNorm[i]; 00524 } 00525 for(int i=0;i<fNumPairs;i++) { 00526 if(grCor[i]) delete grCor[i]; 00527 } 00528 //Moved the scaling to earlier for optimisation reasons 00529 // histMap->Scale(scale); 00530 return histMap; 00531 } 00532 00533 TGraph* AraEventCorrelator::getNormalisedGraph(TGraph *grIn) 00534 { 00535 Double_t rms=grIn->GetRMS(2); 00536 Double_t mean=grIn->GetMean(2); 00537 Double_t *xVals = grIn->GetX(); 00538 Double_t *yVals = grIn->GetY(); 00539 Int_t numPoints = grIn->GetN(); 00540 Double_t *newY = new Double_t [numPoints]; 00541 for(int i=0;i<numPoints;i++) { 00542 newY[i]=(yVals[i]-mean)/rms; 00543 } 00544 TGraph *grOut = new TGraph(numPoints,xVals,newY); 00545 delete [] newY; 00546 return grOut; 00547 } 00548 00549 Double_t AraEventCorrelator::fastEvalForEvenSampling(TGraph *grIn, Double_t xvalue) 00550 { 00551 Int_t numPoints=grIn->GetN(); 00552 if(numPoints<2) return 0; 00553 Double_t *xVals=grIn->GetX(); 00554 Double_t *yVals=grIn->GetY(); 00555 Double_t dx=xVals[1]-xVals[0]; 00556 if(dx<=0) return 0; 00557 00558 Int_t p0=Int_t((xvalue-xVals[0])/dx); 00559 if(p0<0) p0=0; 00560 if(p0>=numPoints) p0=numPoints-2; 00561 return FFTtools::simpleInterploate(xVals[p0],yVals[p0],xVals[p0+1],yVals[p0+1],xvalue); 00562 }
Generated on Fri Jul 26 15:27:34 2013 for ARA ROOT v3.11 Software by
