AraEvent/AraGeomTool.cxx
00001 00002 00003 00004 00005 00006 00007 00008 00009 #include "AraGeomTool.h" 00010 #include <iostream> 00011 #include <fstream> 00012 #include <cstring> 00013 #include <zlib.h> 00014 00015 #include <cstdlib> 00016 00017 #include "TString.h" 00018 #include "TObjArray.h" 00019 #include "TObjString.h" 00020 00021 AraGeomTool * AraGeomTool::fgInstance=0; 00022 Double_t AraGeomTool::nTopOfIce=1.48; 00023 00024 AraGeomTool::AraGeomTool() 00025 { 00026 //Default Constructor 00027 readChannelMap(); 00028 } 00029 00030 AraGeomTool::~AraGeomTool() { 00031 //Default Destructor 00032 } 00033 00034 //______________________________________________________________________________ 00035 AraGeomTool* AraGeomTool::Instance() 00036 { 00037 //static function 00038 if(fgInstance) 00039 return fgInstance; 00040 00041 fgInstance = new AraGeomTool(); 00042 return fgInstance; 00043 } 00044 00045 void AraGeomTool::readChannelMap() 00046 { 00047 char calibDir[FILENAME_MAX]; 00048 char fileName[FILENAME_MAX]; 00049 char *calibEnv=getenv("ARA_CALIB_DIR"); 00050 if(!calibEnv) { 00051 char *utilEnv=getenv("ARA_UTIL_INSTALL_DIR"); 00052 if(!utilEnv) 00053 sprintf(calibDir,"calib"); 00054 else 00055 sprintf(calibDir,"%s/share/araCalib",utilEnv); 00056 } 00057 else { 00058 strncpy(calibDir,calibEnv,FILENAME_MAX); 00059 } 00060 00061 sprintf(fileName,"%s/Testbed.csv",calibDir); 00062 std::ifstream TestBedMap(fileName); 00063 if(!TestBedMap) { 00064 std::cerr << "Couldn't open:\t" << fileName << " don't know where anything is.\n"; 00065 return; 00066 } 00067 00068 //Now we can try and read the file and parse it something useful 00069 TString line; 00070 line.ReadLine(TestBedMap); 00071 // std::cout << line.Data() << "\n"; 00072 line.ReadLine(TestBedMap); 00073 // std::cout << line.Data() << "\n"; 00074 for(int ant=0;ant<ANTS_PER_STATION;ant++) { 00075 //Loop over the antenna lines; 00076 line.ReadLine(TestBedMap); 00077 // std::cout << line.Data(); 00078 TObjArray *tokens = line.Tokenize(","); 00079 // std::cout << tokens->GetEntries() << "\n"; 00080 for(int j=0;j<tokens->GetEntries();j++) { 00081 const TString subString = ((TObjString*)tokens->At(j))->GetString(); 00082 // std::cout << subString << "\n"; 00083 switch(j) { 00084 case 0: 00085 //Channel number 00086 fAntInfo[ant].antDir=AraAntDir::kReceiver; 00087 fAntInfo[ant].chanNum=subString.Atoi(); 00088 break; 00089 case 1: 00090 //DAQ box channel 00091 if(subString.BeginsWith("DIS")) { 00092 fAntInfo[ant].daqChanType=AraDaqChanType::kDisconeChan; 00093 fAntInfo[ant].daqChanNum=atoi(&subString.Data()[3]); 00094 } 00095 else if(subString.BeginsWith("BAT")) { 00096 fAntInfo[ant].daqChanType=AraDaqChanType::kBatwingChan; 00097 fAntInfo[ant].daqChanNum=atoi(&subString.Data()[3]); 00098 } 00099 00100 break; 00101 case 2: 00102 //High pass filter 00103 fAntInfo[ant].highPassFilterMhz=subString.Atof(); 00104 break; 00105 case 3: 00106 //Low pass filter 00107 fAntInfo[ant].lowPassFilterMhz=subString.Atof(); 00108 break; 00109 case 4: 00110 //ICRR wfm channel 00111 break; 00112 case 5: 00113 //ICRR trig channel 00114 if(subString.BeginsWith("RF_TRIG_DIS")) { 00115 fAntInfo[ant].daqTrigChan=atoi(&subString.Data()[11]); 00116 } 00117 else if(subString.BeginsWith("RF_TRIG_BAT")) { 00118 00119 fAntInfo[ant].daqTrigChan=atoi(&subString.Data()[11]); 00120 } 00121 // std::cout << ant << "\t" << fAntInfo[ant].daqTrigChan << "\n"; 00122 break; 00123 case 6: 00124 //Lab chip and chan(s) 00125 // std::cout << subString.Data() << "\n"; 00126 if(subString.Contains("+")) { 00127 //Two Lab Chans 00128 fAntInfo[ant].numLabChans=2; 00129 if(subString.Contains("A")) { 00130 fAntInfo[ant].labChip=AraLabChip::kA; 00131 } 00132 else if(subString.Contains("B")) { 00133 fAntInfo[ant].labChip=AraLabChip::kB; 00134 } 00135 else if(subString.Contains("C")) { 00136 fAntInfo[ant].labChip=AraLabChip::kC; 00137 } 00138 char test[2]="0"; 00139 test[0]=subString.Data()[2]; 00140 fAntInfo[ant].labChans[0]=atoi(test)-1; 00141 test[0]=subString.Data()[5]; 00142 fAntInfo[ant].labChans[1]=atoi(test)-1; 00143 // std::cout << ant << "\t" << fAntInfo[ant].labChans[0] << "\t" << fAntInfo[ant].labChans[1] << "\n"; 00144 } 00145 else { 00146 //One lab chan 00147 fAntInfo[ant].numLabChans=1; 00148 if(subString.Contains("A")) { 00149 fAntInfo[ant].labChip=AraLabChip::kA; 00150 } 00151 else if(subString.Contains("B")) { 00152 fAntInfo[ant].labChip=AraLabChip::kB; 00153 } 00154 else if(subString.Contains("C")) { 00155 fAntInfo[ant].labChip=AraLabChip::kC; 00156 } 00157 char test[2]="0"; 00158 test[0]=subString.Data()[1]; 00159 fAntInfo[ant].labChans[0]=atoi(test)-1; 00160 } 00161 break; 00162 case 7: 00163 // std::cout << subString.Data() << "\n"; 00164 //Pre amp number 00165 fAntInfo[ant].preAmpNum=subString.Atoi(); 00166 break; 00167 case 8: 00168 // std::cout << subString.Data() << "\n"; 00169 //avg noise figure 00170 fAntInfo[ant].avgNoiseFigure=subString.Atof(); 00171 break; 00172 case 9: 00173 // std::cout << subString.Data() << "\n"; 00174 //RCVR number 00175 fAntInfo[ant].rcvrNum=subString.Atoi(); 00176 break; 00177 case 10: 00178 // std::cout << subString.Data() << "\n"; 00179 //Designator 00180 strncpy(fAntInfo[ant].designator,subString.Data(),3); 00181 { 00182 char test[2]="0"; 00183 test[0]=subString.Data()[1]; 00184 fAntInfo[ant].antPolNum=atoi(test)-1; 00185 // std::cout << fAntInfo[ant].designator << "\t" << fAntInfo[ant].antPolNum << "\n"; 00186 } 00187 break; 00188 case 11: 00189 //Channel Type -- got already 00190 break; 00191 case 12: 00192 //Antenna Type 00193 // std::cout << subString.Data() << "\n"; 00194 if(subString.BeginsWith("Bicone")) 00195 fAntInfo[ant].antType=AraAntType::kBicone; 00196 else if(subString.BeginsWith("Bowtie-slotted")) 00197 fAntInfo[ant].antType=AraAntType::kBowtieSlot; 00198 else if(subString.BeginsWith("Discone")) 00199 fAntInfo[ant].antType=AraAntType::kDiscone; 00200 else if(subString.BeginsWith("Batwing")) 00201 fAntInfo[ant].antType=AraAntType::kBatwing; 00202 else if(subString.BeginsWith("Fat")) 00203 fAntInfo[ant].antType=AraAntType::kFatDipole; 00204 else if(subString.BeginsWith("Quad")) 00205 fAntInfo[ant].antType=AraAntType::kQuadSlot; 00206 00207 break; 00208 case 13: 00209 //Polarisation 00210 // std::cout << subString.Data() << "\n"; 00211 if(subString.BeginsWith("V")) 00212 fAntInfo[ant].polType=AraAntPol::kVertical; 00213 if(subString.BeginsWith("H")) 00214 fAntInfo[ant].polType=AraAntPol::kHorizontal; 00215 break; 00216 case 14: 00217 //Location name 00218 // std::cout << subString.Data() << "\n"; 00219 strncpy(fAntInfo[ant].locationName,subString.Data(),4); 00220 break; 00221 case 15: 00222 //xPos 00223 fAntInfo[ant].antLocation[0]=subString.Atof(); 00224 break; 00225 case 16: 00226 //xPos 00227 fAntInfo[ant].antLocation[1]=subString.Atof(); 00228 break; 00229 case 17: 00230 //xPos 00231 fAntInfo[ant].antLocation[2]=subString.Atof(); 00232 break; 00233 case 18: 00234 //cable delay 00235 fAntInfo[ant].cableDelay=subString.Atof(); 00236 break; 00237 case 19: 00238 //Stuff added by Brendan in rev10 00239 fAntInfo[ant].debugHolePosition[0]=subString.Atof(); 00240 break; 00241 case 20: 00242 //Stuff added by Brendan in rev10 00243 fAntInfo[ant].debugHolePosition[1]=subString.Atof(); 00244 break; 00245 case 21: 00246 //Stuff added by Brendan in rev10 00247 fAntInfo[ant].debugHolePosition[2]=subString.Atof(); 00248 break; 00249 case 22: 00250 //Stuff added by Brendan in rev10 00251 fAntInfo[ant].debugPreAmpDz=subString.Atof(); 00252 break; 00253 case 23: 00254 //Stuff added by Brendan in rev10 00255 fAntInfo[ant].debugHolePositionZft=subString.Atof(); 00256 break; 00257 case 24: 00258 //Stuff added by Brendan in rev10 00259 fAntInfo[ant].debugHolePositionZm=subString.Atof(); 00260 break; 00261 case 25: 00262 //Stuff added by Brendan in rev10 00263 fAntInfo[ant].debugTrueAsBuiltPositon[0]=subString.Atof(); 00264 break; 00265 case 26: 00266 //Stuff added by Brendan in rev10 00267 fAntInfo[ant].debugTrueAsBuiltPositon[1]=subString.Atof(); 00268 break; 00269 case 27: 00270 //Stuff added by Brendan in rev10 00271 fAntInfo[ant].debugTrueAsBuiltPositon[2]=subString.Atof(); 00272 break; 00273 case 28: 00274 //Stuff added by Brendan in rev10 00275 fAntInfo[ant].debugCableDelay2=subString.Atof(); //in ns 00276 break; 00277 case 29: 00278 //Stuff added by Brendan in rev10 00279 fAntInfo[ant].debugFeedPointDelay=subString.Atof(); //in ns 00280 break; 00281 case 30: 00282 fAntInfo[ant].debugTotalCableDelay=subString.Atof(); //in ns 00283 break; 00284 case 31: 00285 //Comments including ant orientation 00286 // std::cout << subString.Data() << "\n"; 00287 if(subString.BeginsWith("oriented EW")) { 00288 fAntInfo[ant].polType=AraAntPol::kSurface; 00289 fAntInfo[ant].antOrient=AraSurfaceOrientation::kEastWest; 00290 } 00291 default: 00292 break; 00293 } 00294 00295 } 00296 // fAntInfo[ant].printAntennaInfo(); 00297 switch(fAntInfo[ant].polType) { 00298 case AraAntPol::kVertical: 00299 fAntLookupTable[0][fAntInfo[ant].antPolNum]=fAntInfo[ant].chanNum-1; 00300 break; 00301 case AraAntPol::kHorizontal: 00302 fAntLookupTable[1][fAntInfo[ant].antPolNum]=fAntInfo[ant].chanNum-1; 00303 break; 00304 case AraAntPol::kSurface: 00305 fAntLookupTable[2][fAntInfo[ant].antPolNum]=fAntInfo[ant].chanNum-1; 00306 break; 00307 default: 00308 std::cerr << "Unknown AraPolType\n"; 00309 } 00310 } 00311 } 00312 00313 int AraGeomTool::getRFChanByPolAndAnt(AraAntPol::AraAntPol_t antPol, int antNum) 00314 { 00315 if(antNum<8 && antNum>=0) 00316 return fAntLookupTable[antPol][antNum]; 00317 return -1; 00318 00319 } 00320 00321 00322 00323 Double_t AraGeomTool::calcDeltaTInfinity(Double_t ant1[3], Double_t ant2[3],Double_t phiWave, Double_t thetaWave) 00324 { 00325 //Calc some cylindrical coordinates 00326 Double_t rho1=TMath::Sqrt(ant1[0]*ant1[0]+ant1[1]*ant1[1]); 00327 Double_t phi1=TMath::ATan2(ant1[1],ant1[0]); 00328 Double_t rho2=TMath::Sqrt(ant2[0]*ant2[0]+ant2[1]*ant2[1]); 00329 Double_t phi2=TMath::ATan2(ant2[1],ant2[0]); 00330 Double_t d1=TMath::Cos(thetaWave)*(ant1[2]*TMath::Tan(thetaWave)+rho1*TMath::Cos(phi1-phiWave)); 00331 Double_t d2=TMath::Cos(thetaWave)*(ant2[2]*TMath::Tan(thetaWave)+rho2*TMath::Cos(phi2-phiWave)); 00332 Double_t t1t2=(d2-d1)*nTopOfIce/TMath::C(); 00333 t1t2*=1e9; 00334 return t1t2; 00335 00336 } 00337 00338 00339 Double_t AraGeomTool::calcDeltaTInfinity(Int_t chan1, Int_t chan2,Double_t phiWave, Double_t thetaWave) 00340 { 00341 if(chan1<0 || chan1>=TOTAL_ANTS) 00342 return 0; 00343 if(chan2<0 || chan2>=TOTAL_ANTS) 00344 return 0; 00345 return calcDeltaTInfinity(fAntInfo[chan1].antLocation,fAntInfo[chan2].antLocation,phiWave,thetaWave); 00346 } 00347 00348 Double_t AraGeomTool::calcDeltaTR(Double_t ant1[3], Double_t ant2[3], Double_t phiWave, Double_t thetaWave,Double_t R) 00349 { 00350 00351 Double_t xs=R*TMath::Cos(thetaWave)*TMath::Cos(phiWave); 00352 Double_t ys=R*TMath::Cos(thetaWave)*TMath::Sin(phiWave); 00353 Double_t zs=R*TMath::Sin(thetaWave); 00354 00355 00356 Double_t d1=TMath::Sqrt((xs-ant1[0])*(xs-ant1[0])+(ys-ant1[1])*(ys-ant1[1])+(zs-ant1[2])*(zs-ant1[2])); 00357 Double_t d2=TMath::Sqrt((xs-ant2[0])*(xs-ant2[0])+(ys-ant2[1])*(ys-ant2[1])+(zs-ant2[2])*(zs-ant2[2])); 00358 00359 Double_t t1t2=(d1-d2)*nTopOfIce/TMath::C(); 00360 t1t2*=1e9; 00361 return t1t2; 00362 00363 } 00364 00365 Double_t AraGeomTool::calcDeltaTR(Int_t chan1, Int_t chan2, Double_t phiWave, Double_t thetaWave,Double_t R) 00366 { 00367 if(chan1<0 || chan1>=TOTAL_ANTS) 00368 return 0; 00369 if(chan2<0 || chan2>=TOTAL_ANTS) 00370 return 0; 00371 return calcDeltaTR(fAntInfo[chan1].antLocation,fAntInfo[chan2].antLocation,phiWave,thetaWave,R); 00372 00373 } 00374
Generated on Wed Aug 8 16:18:55 2012 for ARA ROOT Test Bed Software by
