ARA ROOT Test BEd Software

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 doxygen 1.4.7