9 #include "AnitaGeomTool.h" 10 #include "AnitaVersion.h" 14 #define INCHTOMETER 0.0254 16 Double_t deltaRL = 0.0;
17 Double_t deltaUD = 0.0;
32 Int_t
antToSurfMap[NUM_SEAVEYS]={11,5,10,4,11,4,10,5,11,5,10,4,11,4,10,5,
33 9,3,8,2,8,3,9,2,9,3,8,2,8,3,9,2,
34 6,0,7,1,6,1,7,0,6,0,7,1,6,1,7,0};
37 Int_t vAntToChanAnita3[NUM_SEAVEYS]={3,1,3,5,1,3,1,3,2,0,2,0,0,2,0,2,
38 1,3,1,3,3,1,3,1,0,2,0,2,2,0,2,0,
39 3,1,3,1,1,3,1,3,2,0,2,0,0,2,0,2};
40 Int_t
vAntToChan[NUM_SEAVEYS]={3,1,3,5,1,3,1,3,2,0,2,0,0,2,0,2,
41 1,3,1,3,3,1,3,1,0,2,0,2,2,0,2,0,
42 3,1,3,1,1,3,1,3,2,0,2,0,0,2,0,2};
45 Int_t hAntToChanAnita3[NUM_SEAVEYS]={7,5,7,1,5,7,5,7,6,4,6,4,4,6,4,6,
46 5,7,5,7,7,5,7,5,4,6,4,6,6,4,6,4,
47 7,5,7,5,5,7,5,7,6,4,6,4,4,6,4,6};
48 Int_t
hAntToChan[NUM_SEAVEYS]={7,5,7,1,5,7,5,7,6,4,6,4,4,6,4,6,
49 5,7,5,7,7,5,7,5,4,6,4,6,6,4,6,4,
50 7,5,7,5,5,7,5,7,6,4,6,4,4,6,4,6};
55 Int_t antOrientationMapAnita3[NUM_SEAVEYS] =
56 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
57 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
58 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
61 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
62 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
63 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
69 Int_t surfToAntMapAnita4[ACTIVE_SURFS][RFCHAN_PER_SURF]= {{-42,-34,-48,-40,42,34,48,40},
70 {-44,-36,-46,-38,44,36,46,38},
71 {-32,-24,-28,-20,32,24,28,20},
72 {-30,-22,-26,-18,30,22,26,18},
73 {-12, 4,-14,-6,12,-4,14,6},
74 {-10,-2,-16,-8,10,2,16,8},
75 {-45,-37,-41,-33,45,37,41,33},
76 {-47,-39,-43,-35,47,39,43,35},
77 {-27,-19,-29,-21,27,19,29,21},
78 {-25,-17,-31,-23,25,17,31,23},
79 {-15,-7,-11,-3,15,7,11,3},
80 {-13,-5,-9,-1,13,5,9,1}};
83 {-44,-36,-46,-38,44,36,46,38},
84 {-32,-24,-28,-20,32,24,28,20},
85 {-30,-22,-26,-18,30,22,26,18},
86 {-12,4,-14,-6,12,-4,14,6},
87 {-10,-2,-16,-8,10,2,16,8},
88 {-45,-37,-41,-33,45,37,41,33},
89 {-47,-39,-43,-35,47,39,43,35},
90 {-27,-19,-29,-21,27,19,29,21},
91 {-25,-17,-31,-23,25,17,31,23},
92 {-15,-7,-11,-3,15,7,11,3},
93 {-13,-5,-9,-1,13,5,9,1}};
96 Int_t topAntNums[NUM_PHI] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
97 Int_t middleAntNums[NUM_PHI] = {16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
98 Int_t
bottomAntNums[NUM_PHI] = {32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47};
101 Int_t topPhiNums[NUM_PHI] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
102 Int_t middlePhiNums[NUM_PHI] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
103 Int_t
bottomPhiNums[NUM_PHI] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
107 Int_t surfToPhiTriggerMapAnita3[ACTIVE_SURFS][2]={{-1,-1}, {-1,-1}, { 0, 4}, { 2, 6},
108 { 1, 5}, { 3, 7}, {15,11}, {13, 9},
109 {14,10}, {12, 8}, {-1,-1}, {-1,-1}};
110 Int_t surfToPhiTriggerMapAnita4[ACTIVE_SURFS][2]={{-1,-1}, {-1,-1}, { 0, 1}, { 8, 9},
111 { 2, 3}, { 10,11}, {4,5}, {12, 13},
112 {6,7}, {14, 15}, {-1,-1}, {-1,-1}};
121 kTopRing, kMiddleRing, kBottomRing,
122 kTopRing, kMiddleRing, kBottomRing,
123 kTopRing, kMiddleRing, kBottomRing};
130 kVertical, kVertical, kVertical,
131 kHorizontal, kHorizontal, kHorizontal,
132 kHorizontal, kHorizontal, kHorizontal};
141 Int_t phiToSurfTriggerMapAnita4[NUM_PHI] = {2,2,4,4,6,6,8,8,3,3,5,5,7,7,9,9};
142 Int_t phiToSurfHalfAnita4[NUM_PHI] = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
147 Int_t phiToSurfTriggerMapAnita3[NUM_PHI] = {2,4,3,5,2,4,3,5,9,7,8,6,9,7,8,6};
148 Int_t phiToSurfHalfAnita3[NUM_PHI] = {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0};
157 AnitaGeomTool::AnitaGeomTool()
159 int v = AnitaVersion::get();
162 ringPhaseCentreOffset[0]=0.2-0.042685;
163 ringPhaseCentreOffset[1]=0.2+0.00653;
164 ringPhaseCentreOffset[2]=0.2+0.1927;
170 fUsePhotogrammetryNumbers=0;
172 readPhaseCenterNumbers(v);
173 readPhotogrammetry(v);
177 fHeadingRotationAxis.SetXYZ(0.,0.,1.);
178 fPitchRotationAxis.SetXYZ(0.,1.,0.);
179 fRollRotationAxis=fPitchRotationAxis.Cross(fHeadingRotationAxis);
180 aftForeOffsetAngleVertical=TMath::DegToRad()*45;
216 Double_t phiArrayDeg[NUM_SEAVEYS]={0,22.5,45,67.5,90,112.5,135,157.5,180,
217 202.5,225,247.5,270,292.5,315,337.5,
218 0,22.5,45,67.5,90,112.5,135,157.5,180,
219 202.5,225,247.5,270,292.5,315,337.5,
220 0,22.5,45,67.5,90,112.5,135,157.5,180,
221 202.5,225,247.5,270,292.5,315,337.5};
223 Double_t rArray[NUM_SEAVEYS]={0.9675,0.7402,0.9675,0.7402,0.9675,0.7402,0.9675,0.7402,
224 0.9675,0.7402,0.9675,0.7402,0.9675,0.7402,0.9675,0.7402,
225 2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,
226 2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,
227 2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,
228 2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447,2.0447};
229 Double_t zArray[NUM_SEAVEYS]={-1.4407,-2.4135,-1.4407,-2.4135,-1.4407,-2.4135,-1.4407,-2.4135,
230 -1.4407,-2.4135,-1.4407,-2.4135,-1.4407,-2.4135,-1.4407,-2.4135,
231 -5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,
232 -5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,-5.1090,
233 -6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951,
234 -6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951,-6.1951};
237 for(Int_t ant=0;ant<NUM_SEAVEYS;ant++) {
238 for(Int_t pol=0;pol<2;pol++) {
239 zPhaseCentreFromVerticalHorn[ant][pol]=zArray[ant];
240 rPhaseCentreFromVerticalHorn[ant][pol]=rArray[ant];
241 azPhaseCentreFromVerticalHorn[ant][pol]=phiArrayDeg[ant]*TMath::DegToRad();
242 xPhaseCentreFromVerticalHorn[ant][pol]=rArray[ant]*TMath::Cos(azPhaseCentreFromVerticalHorn[ant][pol]);
243 yPhaseCentreFromVerticalHorn[ant][pol]=rArray[ant]*TMath::Sin(azPhaseCentreFromVerticalHorn[ant][pol]);
247 aftForeOffsetAngleVertical=TMath::DegToRad()*45;
249 fHeadingRotationAxis.SetXYZ(0.,0.,1.);
250 fPitchRotationAxis.SetXYZ(0.,1.,0.);
251 fRollRotationAxis=fPitchRotationAxis.Cross(fHeadingRotationAxis);
264 if(surf<0 || surf>=ACTIVE_SURFS)
return -1;
265 if(chan<0 || chan>=SCALERS_PER_SURF)
return -1;
268 if((chan%6)>=3) surfHalf=1;
270 Int_t v = AnitaVersion::get();
272 phi = v == 4 ? AnitaGeom::surfToPhiTriggerMapAnita4[surf][surfHalf] :
273 v == 3 ? AnitaGeom::surfToPhiTriggerMapAnita3[surf][surfHalf] :
278 pol = v == 4 ? AnitaGeom::surfTriggerChanToPolAnita4[chan] :
291 if(phi<0 || phi>=NUM_PHI)
return -1;
292 Int_t surfHalf=l1Chan>2;
294 Int_t v = AnitaVersion::get();
298 phi = AnitaGeom::surfToPhiTriggerMapAnita4[surf][surfHalf] ;
312 if(phi<0 || phi>=NUM_PHI)
return -1;
314 Int_t v = AnitaVersion::get();
319 Int_t surfHalf=l1Chan%2;
320 phi=AnitaGeom::surfToPhiTriggerMapAnita3[surf][surfHalf];
330 if(phi<0 || phi>=NUM_PHI)
return -1;
332 Int_t v = AnitaVersion::get();
334 surf = v == 4 ? AnitaGeom::phiToSurfTriggerMapAnita4[phi] :
335 v == 3 ? AnitaGeom::phiToSurfTriggerMapAnita3[phi] :
338 Int_t surfHalf = v == 4 ? AnitaGeom::phiToSurfHalfAnita4[phi] :
339 v == 3 ? AnitaGeom::phiToSurfHalfAnita3[phi] :
342 chan = (6-6*(pol % 2))+ ring + 3*surfHalf;
358 if(phi<0 || phi>=NUM_PHI)
return -1;
360 Int_t v = AnitaVersion::get();
363 surf = v == 4 ? AnitaGeom::phiToSurfTriggerMapAnita4[phi] :
364 v == 3 ? AnitaGeom::phiToSurfTriggerMapAnita3[phi] :
367 Int_t surfHalf = v == 4 ? AnitaGeom::phiToSurfHalfAnita4[phi] :
368 v == 3 ? AnitaGeom::phiToSurfHalfAnita3[phi] :
376 l1Chan=1+(3*surfHalf);
379 l1Chan=2+(3*surfHalf);
382 std::cerr <<
"Unknown ring " << ring <<
"\n";
387 Int_t AnitaGeomTool::getSurfL1TriggerChanFromPhiPol(Int_t phi,
AnitaPol::AnitaPol_t pol, Int_t &surf, Int_t &l1Chan)
389 if(phi<0 || phi>=NUM_PHI)
return -1;
391 Int_t v = AnitaVersion::get();
394 surf=AnitaGeom::phiToSurfTriggerMapAnita3[phi];
395 Int_t surfHalf=AnitaGeom::phiToSurfHalfAnita3[phi];
413 if(phi<0 || phi>=NUM_PHI)
return -1;
415 Int_t v = AnitaVersion::get();
417 surf = AnitaGeom::phiToSurfTriggerMapAnita4[phi] ;
418 Int_t surfHalf= AnitaGeom::phiToSurfHalfAnita4[phi] ;
427 static TMutex instance_lock;
445 if (!v) v = AnitaVersion::get();
449 __asm__ __volatile__ (
"" :::
"memory");
452 instance_lock.Lock();
457 __asm__ __volatile__ (
"" :::
"memory");
460 instance_lock.UnLock();
469 return chan+(CHANNELS_PER_SURF*surf);
474 void AnitaGeomTool::getCartesianCoords(Double_t lat, Double_t lon, Double_t alt, Double_t p[3])
478 lat*=TMath::DegToRad();
479 lon*=TMath::DegToRad();
481 Double_t C2=pow(cos(lat)*cos(lat)+(1-FLATTENING_FACTOR)*(1-FLATTENING_FACTOR)*sin(lat)*sin(lat),-0.5);
482 Double_t Q2=(1-FLATTENING_FACTOR)*(1-FLATTENING_FACTOR)*C2;
483 p[1]=(R_EARTH*C2+alt)*TMath::Cos(lat)*TMath::Cos(lon);
484 p[0]=(R_EARTH*C2+alt)*TMath::Cos(lat)*TMath::Sin(lon);
485 p[2]=(R_EARTH*Q2+alt)*TMath::Sin(lat);
488 void AnitaGeomTool::getLatLonAltFromCartesian(Double_t p[3], Double_t &lat, Double_t &lon, Double_t &alt)
495 static Double_t cosaeSq=(1-FLATTENING_FACTOR)*(1-FLATTENING_FACTOR);
496 Double_t lonVal=TMath::ATan2(yt,xt);
497 Double_t xySq=TMath::Sqrt(xt*xt+yt*yt);
498 Double_t tanPsit=zt/xySq;
499 Double_t latGuess=TMath::ATan(tanPsit/cosaeSq);
500 Double_t nextLat=latGuess;
501 Double_t geomBot=R_EARTH*R_EARTH*xySq;
504 Double_t N=R_EARTH/TMath::Sqrt(cos(latGuess)*cos(latGuess)+(1-FLATTENING_FACTOR)*(1-FLATTENING_FACTOR)*sin(latGuess)*sin(latGuess));
505 Double_t top=(R_EARTH*R_EARTH*zt + (1-cosaeSq)*cosaeSq*TMath::Power(N*TMath::Sin(latGuess),3));
506 Double_t bottom=geomBot-(1-cosaeSq)*TMath::Power(N*TMath::Cos(latGuess),3);
507 nextLat=TMath::ATan(top/bottom);
510 }
while(TMath::Abs(nextLat-latGuess)>0.0001);
512 Double_t N=R_EARTH/TMath::Sqrt(cos(latGuess)*cos(latGuess)+(1-FLATTENING_FACTOR)*(1-FLATTENING_FACTOR)*sin(latGuess)*sin(latGuess));
513 Double_t height=(xySq/TMath::Cos(nextLat))-N;
515 lat=latGuess*TMath::RadToDeg();
516 lon=lonVal*TMath::RadToDeg();
522 Double_t AnitaGeomTool::getDistanceToCentreOfEarth(Double_t lat)
525 this->getCartesianCoords(lat,0,0,pVec);
535 return TMath::Sqrt(pVec[0]*pVec[0]+pVec[1]*pVec[1]+pVec[2]*pVec[2]);
591 Double_t phiDiff=firstPhi-secondPhi;
592 if(TMath::Abs(phiDiff)>TMath::Abs(phiDiff+TMath::TwoPi()))
593 phiDiff+=TMath::TwoPi();
594 if(TMath::Abs(phiDiff)>TMath::Abs(phiDiff-TMath::TwoPi()))
595 phiDiff-=TMath::TwoPi();
605 if(phi<0 || phi>15)
return -1;
608 ant=AnitaGeom::topAntNums[phi];
611 ant=AnitaGeom::middleAntNums[phi];
626 if(ant<0 || ant>(NUM_SEAVEYS-1))
return -1;
657 Int_t AnitaGeomTool::getSurfFromAnt(Int_t ant)
659 if(ant<0 || ant>(NUM_SEAVEYS-1))
return -1;
684 return AnitaGeom::middleAntNums[AnitaGeom::topPhiNums[rx]];
686 return AnitaGeom::topAntNums[AnitaGeom::middlePhiNums[rx-16]];
704 rxleft = (rx + 14)%16;
705 rxright = (rx + 2)%16;
711 rxleft = ring * 16 + (ant +15) % 16;
712 rxright = ring * 16 + (ant +1) % 16;
720 if (rx<0 || rx>(NUM_SEAVEYS-1))
721 std::cerr <<
"Antenna number out of range!\n";
723 Int_t phi=AnitaGeom::topPhiNums[rx];
725 if(phiLeft<0) phiLeft=15;
726 Int_t phiRight=phi+1;
727 if(phiRight>15) phiRight=0;
728 rxleft=AnitaGeom::topAntNums[phiLeft];
729 rxright=AnitaGeom::topAntNums[phiRight];
732 Int_t phi=AnitaGeom::middlePhiNums[rx-16];
734 if(phiLeft<0) phiLeft=15;
735 Int_t phiRight=phi+1;
736 if(phiRight>15) phiRight=0;
737 rxleft=AnitaGeom::middleAntNums[phiLeft];
738 rxright=AnitaGeom::middleAntNums[phiRight];
743 if(phiLeft<0) phiLeft=15;
744 Int_t phiRight=phi+1;
745 if(phiRight>15) phiRight=0;
755 return AnitaGeom::topPhiNums[rx];
757 return AnitaGeom::middlePhiNums[rx-16];
767 if(phiSector<0 || phiSector>=NUM_PHI)
return -1.;
773 Double_t direction = heading + aftForeOffsetAngleVertical*TMath::RadToDeg() - (phiSector*360./NUM_PHI);
778 else if(direction < 0){
789 Int_t &surf,Int_t &chan)
791 if(chanIndex<0 || chanIndex>=NUM_DIGITZED_CHANNELS)
795 chan=chanIndex%CHANNELS_PER_SURF;
796 surf=(chanIndex-chan)/CHANNELS_PER_SURF;
804 int v = AnitaVersion::get();
806 if (v >4 && v < 3)
return 0;
808 ant= v == 4 ? AnitaGeom::surfToAntMapAnita4[surf][chan] :
826 if(ant<0 || ant>=NUM_SEAVEYS)
836 else if (irx>=8 && irx<16)
848 else if (ant>=8 && ant<16)
872 Int_t &surf, Int_t &chan, Int_t &ant)
880 void AnitaGeomTool::readAnita2Photogrammetry()
883 char calibDir[FILENAME_MAX];
884 char fileName[FILENAME_MAX];
885 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
887 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
889 sprintf(calibDir,
"calib");
891 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
894 strncpy(calibDir,calibEnv,FILENAME_MAX);
897 sprintf(fileName,
"%s/antennaPositionTables.csv",calibDir);
898 std::ifstream AntennaFile(fileName);
900 std::cerr <<
"Couldn't open:\t" << fileName <<
"\n";
907 for(Int_t i=0;i<4;i++) {
908 line.ReadLine(AntennaFile);
912 for(Int_t ant=0;ant<32;ant++) {
913 line.ReadLine(AntennaFile);
915 TObjArray *tokens = line.Tokenize(
",");
916 for(Int_t j=0;j<8;j++) {
917 const TString subString = ((TObjString*)tokens->At(j))->GetString();
922 if (ant+1 != subString.Atoi()) {
923 std::cerr <<
"Antenna number mismatch\n";
927 xAntFromDeckHorn[ant]=subString.Atof()*INCHTOMETER;
930 yAntFromDeckHorn[ant]=subString.Atof()*INCHTOMETER;
933 zAntFromDeckHorn[ant]=subString.Atof()*INCHTOMETER;
936 rAntFromDeckHorn[ant]=subString.Atof()*INCHTOMETER;
940 azCentreFromDeckHorn[ant]=subString.Atof()*TMath::DegToRad();
943 apertureAzFromDeckHorn[ant]=subString.Atof()*TMath::DegToRad();
946 apertureElFromDeckHorn[ant]=subString.Atof()*TMath::DegToRad();
959 for(Int_t ant=32;ant<48;ant++) {
960 rAntFromDeckHorn[ant]=(101*INCHTOMETER)-0.38;
961 zAntFromDeckHorn[ant]=(-21*INCHTOMETER)-1.8;
962 azCentreFromDeckHorn[ant]=(-67.5 + 45*(ant-32))*TMath::DegToRad();
963 apertureAzFromDeckHorn[ant]=azCentreFromDeckHorn[ant];
964 apertureElFromDeckHorn[ant]=-10*TMath::DegToRad();
965 xAntFromDeckHorn[ant]=rAntFromDeckHorn[ant]*TMath::Cos(azCentreFromDeckHorn[ant]);
966 yAntFromDeckHorn[ant]=rAntFromDeckHorn[ant]*TMath::Sin(azCentreFromDeckHorn[ant]);
971 for(Int_t ant=0;ant<NUM_SEAVEYS;ant++) {
972 Double_t phaseCentreToAntFront=ringPhaseCentreOffset[Int_t(this->
getRingFromAnt(ant))];
975 Double_t deltaXRL = -deltaRL*TMath::Sin(apertureAzFromDeckHorn[ant]);
976 Double_t deltaYRL = deltaRL*TMath::Cos(apertureAzFromDeckHorn[ant]);
978 Double_t deltaZUD = deltaUD*TMath::Cos(apertureElFromDeckHorn[ant]);
979 Double_t deltaXUD = deltaUD*TMath::Sin(apertureElFromDeckHorn[ant])*TMath::Cos(apertureAzFromDeckHorn[ant]);
980 Double_t deltaYUD = deltaUD*TMath::Sin(apertureElFromDeckHorn[ant])*TMath::Sin(apertureAzFromDeckHorn[ant]);
992 xPhaseCentreFromDeckHorn[ant][pol]=(xAntFromDeckHorn[ant] + deltaXRL + deltaXUD) -
993 phaseCentreToAntFront*TMath::Cos( apertureAzFromDeckHorn[ant])*TMath::Cos(apertureElFromDeckHorn[ant]);
994 yPhaseCentreFromDeckHorn[ant][pol]=(yAntFromDeckHorn[ant] + deltaYRL + deltaYUD) -
995 phaseCentreToAntFront*TMath::Sin( apertureAzFromDeckHorn[ant])*TMath::Cos(apertureElFromDeckHorn[ant]);
996 zPhaseCentreFromDeckHorn[ant][pol]=(zAntFromDeckHorn[ant] + deltaZUD) -phaseCentreToAntFront*TMath::Sin(apertureElFromDeckHorn[ant]);
1004 rPhaseCentreFromDeckHorn[ant][pol]=TMath::Sqrt(xPhaseCentreFromDeckHorn[ant][pol]*xPhaseCentreFromDeckHorn[ant][pol]+
1005 yPhaseCentreFromDeckHorn[ant][pol]*yPhaseCentreFromDeckHorn[ant][pol]);
1006 azPhaseCentreFromDeckHorn[ant][pol]=TMath::ATan(yPhaseCentreFromDeckHorn[ant][pol]/xPhaseCentreFromDeckHorn[ant][pol]);
1007 if(xPhaseCentreFromDeckHorn[ant][pol]<0)
1008 azPhaseCentreFromDeckHorn[ant][pol]+=TMath::Pi();
1009 if(azPhaseCentreFromDeckHorn[ant][pol]<0)
1010 azPhaseCentreFromDeckHorn[ant][pol]+=TMath::TwoPi();
1024 for(Int_t i=0;i<2;i++) {
1025 line.ReadLine(AntennaFile);
1030 for(Int_t ant=0;ant<4;ant++) {
1031 line.ReadLine(AntennaFile);
1033 TObjArray *tokens = line.Tokenize(
",");
1034 for(Int_t j=0;j<4;j++) {
1035 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1042 xAntFromDeckBicone[ant]=subString.Atof()*INCHTOMETER;
1045 yAntFromDeckBicone[ant]=subString.Atof()*INCHTOMETER;
1048 zAntFromDeckBicone[ant]=subString.Atof()*INCHTOMETER;
1058 for(Int_t ant=0;ant<4;ant++) {
1059 line.ReadLine(AntennaFile);
1061 TObjArray *tokens = line.Tokenize(
",");
1062 for(Int_t j=0;j<4;j++) {
1063 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1070 xAntFromDeckDiscone[ant]=subString.Atof()*INCHTOMETER;
1073 yAntFromDeckDiscone[ant]=subString.Atof()*INCHTOMETER;
1076 zAntFromDeckDiscone[ant]=subString.Atof()*INCHTOMETER;
1086 for(Int_t i=0;i<2;i++) {
1087 line.ReadLine(AntennaFile);
1090 for(Int_t corner=0;corner<4;corner++) {
1091 line.ReadLine(AntennaFile);
1093 TObjArray *tokens = line.Tokenize(
",");
1094 for(Int_t j=0;j<4;j++) {
1095 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1102 xAnitaBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1105 yAnitaBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1108 zAnitaBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1117 for(Int_t i=0;i<2;i++) {
1118 line.ReadLine(AntennaFile);
1121 for(Int_t corner=0;corner<4;corner++) {
1122 line.ReadLine(AntennaFile);
1124 TObjArray *tokens = line.Tokenize(
",");
1125 for(Int_t j=0;j<4;j++) {
1126 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1133 xBatteryBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1136 yBatteryBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1139 zBatteryBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1148 for(Int_t i=0;i<2;i++) {
1149 line.ReadLine(AntennaFile);
1152 for(Int_t corner=0;corner<4;corner++) {
1153 line.ReadLine(AntennaFile);
1155 TObjArray *tokens = line.Tokenize(
",");
1156 for(Int_t j=0;j<4;j++) {
1157 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1164 xSipBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1167 ySipBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1170 zSipBoxFromDeckCorner[corner]=subString.Atof()*INCHTOMETER;
1180 for(Int_t i=0;i<2;i++) {
1181 line.ReadLine(AntennaFile);
1185 line.ReadLine(AntennaFile);
1187 TObjArray *tokens = line.Tokenize(
",");
1188 for(Int_t j=0;j<4;j++) {
1189 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1198 gpsPlaneFromDeck[j-1]=subString.Atof();
1208 line.ReadLine(AntennaFile);
1210 TObjArray *tokens = line.Tokenize(
",");
1211 for(Int_t j=0;j<4;j++) {
1212 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1221 gpsHeadingFromDeck[j-1]=subString.Atof();
1231 aftForeOffsetAngleDeck=TMath::ATan(gpsHeadingFromDeck[1]/gpsHeadingFromDeck[0]);
1235 for(Int_t i=0;i<5;i++) {
1236 line.ReadLine(AntennaFile);
1240 for(Int_t ant=0;ant<32;ant++) {
1241 line.ReadLine(AntennaFile);
1243 TObjArray *tokens = line.Tokenize(
",");
1244 for(Int_t j=0;j<8;j++) {
1245 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1250 if (ant+1 != subString.Atoi()) {
1251 std::cerr <<
"Antenna number mismatch\n";
1255 xAntFromVerticalHorn[ant]=subString.Atof()*INCHTOMETER;
1258 yAntFromVerticalHorn[ant]=subString.Atof()*INCHTOMETER;
1261 zAntFromVerticalHorn[ant]=subString.Atof()*INCHTOMETER;
1264 rAntFromVerticalHorn[ant]=subString.Atof()*INCHTOMETER;
1267 azCentreFromVerticalHorn[ant]=subString.Atof()*TMath::DegToRad();
1268 if(azCentreFromVerticalHorn[ant]<0)
1269 azCentreFromVerticalHorn[ant]+=TMath::TwoPi();
1272 apertureAzFromVerticalHorn[ant]=subString.Atof()*TMath::DegToRad();
1275 apertureElFromVerticalHorn[ant]=subString.Atof()*TMath::DegToRad();
1285 for(Int_t ant=0;ant<32;ant++) {
1287 Double_t phaseCentreToAntFront=ringPhaseCentreOffset[Int_t(this->
getRingFromAnt(ant))];
1289 Double_t deltaXRL = -deltaRL*TMath::Sin(apertureAzFromVerticalHorn[ant]);
1290 Double_t deltaYRL = deltaRL*TMath::Cos(apertureAzFromVerticalHorn[ant]);
1292 Double_t deltaZUD = deltaUD*TMath::Cos(apertureElFromVerticalHorn[ant]);
1293 Double_t deltaXUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Cos(apertureAzFromVerticalHorn[ant]);
1294 Double_t deltaYUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Sin(apertureAzFromVerticalHorn[ant]);
1299 xPhaseCentreFromVerticalHorn[ant][pol]=(xAntFromVerticalHorn[ant] + deltaXRL + deltaXUD) -
1300 phaseCentreToAntFront*TMath::Cos( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1301 yPhaseCentreFromVerticalHorn[ant][pol]=(yAntFromVerticalHorn[ant] + deltaYRL + deltaYUD) -
1302 phaseCentreToAntFront*TMath::Sin( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1303 zPhaseCentreFromVerticalHorn[ant][pol]=(zAntFromVerticalHorn[ant] + deltaZUD) -phaseCentreToAntFront*TMath::Sin(apertureElFromVerticalHorn[ant]);
1311 rPhaseCentreFromVerticalHorn[ant][pol]=TMath::Sqrt(xPhaseCentreFromVerticalHorn[ant][pol]*xPhaseCentreFromVerticalHorn[ant][pol]+
1312 yPhaseCentreFromVerticalHorn[ant][pol]*yPhaseCentreFromVerticalHorn[ant][pol]);
1313 azPhaseCentreFromVerticalHorn[ant][pol]=TMath::ATan(yPhaseCentreFromVerticalHorn[ant][pol]/xPhaseCentreFromVerticalHorn[ant][pol]);
1314 if(xPhaseCentreFromVerticalHorn[ant][pol]<0)
1315 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::Pi();
1316 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
1317 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
1334 for(Int_t ant=32;ant<NUM_SEAVEYS;ant++) {
1335 Double_t phaseCentreToAntFront=ringPhaseCentreOffset[Int_t(this->
getRingFromAnt(ant))];
1337 Double_t deltaXRL = 0;
1338 Double_t deltaYRL = 0;
1340 Double_t deltaZUD = 0;
1341 Double_t deltaXUD = 0;
1342 Double_t deltaYUD = 0;
1346 rAntFromVerticalHorn[ant]=(101*INCHTOMETER)-0.3;
1348 zAntFromVerticalHorn[ant]=(-21*INCHTOMETER)-1.8;
1349 azCentreFromVerticalHorn[ant]=(-67.5 + 45*(ant-32))*TMath::DegToRad();
1351 apertureAzFromVerticalHorn[ant]=azCentreFromVerticalHorn[ant];
1352 apertureElFromVerticalHorn[ant]=-10*TMath::DegToRad();
1353 xAntFromVerticalHorn[ant]=rAntFromVerticalHorn[ant]*TMath::Cos(azCentreFromVerticalHorn[ant]);
1354 yAntFromVerticalHorn[ant]=rAntFromVerticalHorn[ant]*TMath::Sin(azCentreFromVerticalHorn[ant]);
1357 xPhaseCentreFromVerticalHorn[ant][pol]=(xAntFromVerticalHorn[ant] + deltaXRL + deltaXUD) -
1358 phaseCentreToAntFront*TMath::Cos( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1359 yPhaseCentreFromVerticalHorn[ant][pol]=(yAntFromVerticalHorn[ant] + deltaYRL + deltaYUD) -
1360 phaseCentreToAntFront*TMath::Sin( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1361 zPhaseCentreFromVerticalHorn[ant][pol]=(zAntFromVerticalHorn[ant] + deltaZUD) -phaseCentreToAntFront*TMath::Sin(apertureElFromVerticalHorn[ant]);
1369 rPhaseCentreFromVerticalHorn[ant][pol]=TMath::Sqrt(xPhaseCentreFromVerticalHorn[ant][pol]*xPhaseCentreFromVerticalHorn[ant][pol]+
1370 yPhaseCentreFromVerticalHorn[ant][pol]*yPhaseCentreFromVerticalHorn[ant][pol]);
1371 azPhaseCentreFromVerticalHorn[ant][pol]=TMath::ATan(yPhaseCentreFromVerticalHorn[ant][pol]/xPhaseCentreFromVerticalHorn[ant][pol]);
1372 if(xPhaseCentreFromVerticalHorn[ant][pol]<0)
1373 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::Pi();
1374 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
1375 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
1388 for(Int_t i=0;i<2;i++) {
1389 line.ReadLine(AntennaFile);
1394 for(Int_t ant=0;ant<4;ant++) {
1395 line.ReadLine(AntennaFile);
1397 TObjArray *tokens = line.Tokenize(
",");
1398 for(Int_t j=0;j<4;j++) {
1399 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1406 xAntFromVerticalBicone[ant]=subString.Atof()*INCHTOMETER;
1409 yAntFromVerticalBicone[ant]=subString.Atof()*INCHTOMETER;
1412 zAntFromVerticalBicone[ant]=subString.Atof()*INCHTOMETER;
1422 for(Int_t ant=0;ant<4;ant++) {
1423 line.ReadLine(AntennaFile);
1425 TObjArray *tokens = line.Tokenize(
",");
1426 for(Int_t j=0;j<4;j++) {
1427 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1434 xAntFromVerticalDiscone[ant]=subString.Atof()*INCHTOMETER;
1437 yAntFromVerticalDiscone[ant]=subString.Atof()*INCHTOMETER;
1440 zAntFromVerticalDiscone[ant]=subString.Atof()*INCHTOMETER;
1451 for(Int_t i=0;i<2;i++) {
1452 line.ReadLine(AntennaFile);
1455 for(Int_t corner=0;corner<4;corner++) {
1456 line.ReadLine(AntennaFile);
1458 TObjArray *tokens = line.Tokenize(
",");
1459 for(Int_t j=0;j<4;j++) {
1460 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1467 xAnitaBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1470 yAnitaBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1473 zAnitaBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1482 for(Int_t i=0;i<2;i++) {
1483 line.ReadLine(AntennaFile);
1486 for(Int_t corner=0;corner<4;corner++) {
1487 line.ReadLine(AntennaFile);
1489 TObjArray *tokens = line.Tokenize(
",");
1490 for(Int_t j=0;j<4;j++) {
1491 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1498 xBatteryBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1501 yBatteryBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1504 zBatteryBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1513 for(Int_t i=0;i<2;i++) {
1514 line.ReadLine(AntennaFile);
1517 for(Int_t corner=0;corner<4;corner++) {
1518 line.ReadLine(AntennaFile);
1520 TObjArray *tokens = line.Tokenize(
",");
1521 for(Int_t j=0;j<4;j++) {
1522 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1529 xSipBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1532 ySipBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1535 zSipBoxFromVerticalCorner[corner]=subString.Atof()*INCHTOMETER;
1545 for(Int_t i=0;i<2;i++) {
1546 line.ReadLine(AntennaFile);
1550 line.ReadLine(AntennaFile);
1552 TObjArray *tokens = line.Tokenize(
",");
1553 for(Int_t j=0;j<4;j++) {
1554 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1563 gpsPlaneFromVertical[j-1]=subString.Atof();
1573 line.ReadLine(AntennaFile);
1575 TObjArray *tokens = line.Tokenize(
",");
1576 for(Int_t j=0;j<4;j++) {
1577 const TString subString = ((TObjString*)tokens->At(j))->GetString();
1586 gpsHeadingFromVertical[j-1]=subString.Atof();
1595 aftForeOffsetAngleVertical=TMath::ATan(gpsHeadingFromVertical[1]/gpsHeadingFromVertical[0]);
1603 fHeadingRotationAxis.SetXYZ(0.,0.,1.);
1604 fPitchRotationAxis.SetXYZ(0.,1.,0.);
1605 fRollRotationAxis=fPitchRotationAxis.Cross(fHeadingRotationAxis);
1629 for(Int_t ant=0;ant<NUM_SEAVEYS;ant++) {
1630 rPhaseCentreFromVerticalHorn[ant][pol]+=deltaRPhaseCentre[ant][pol];
1632 azPhaseCentreFromVerticalHorn[ant][pol]+=deltaPhiPhaseCentre[ant][pol];
1633 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
1634 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
1635 if(azPhaseCentreFromVerticalHorn[ant][pol]>TMath::TwoPi())
1636 azPhaseCentreFromVerticalHorn[ant][pol]-=TMath::TwoPi();
1637 zPhaseCentreFromVerticalHorn[ant][pol]+=deltaZPhaseCentre[ant][pol];
1638 xPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Cos(azPhaseCentreFromVerticalHorn[ant][pol]);
1639 yPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Sin(azPhaseCentreFromVerticalHorn[ant][pol]);
1654 if(ant>=0 && ant<NUM_SEAVEYS) {
1655 x=xPhaseCentreFromVerticalHorn[ant][pol];
1656 y=yPhaseCentreFromVerticalHorn[ant][pol];
1657 z=zPhaseCentreFromVerticalHorn[ant][pol];
1663 if(fUsePhotogrammetryNumbers==0) {
1664 if(ant>=0 && ant<NUM_SEAVEYS) {
1666 return zPhaseCentreFromVerticalHorn[ant][pol];
1670 if(ant>=0 && ant<NUM_SEAVEYS) {
1672 return zPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
1679 if(fUsePhotogrammetryNumbers==0) {
1681 if(ant>=0 && ant<NUM_SEAVEYS) {
1682 return rPhaseCentreFromVerticalHorn[ant][pol];
1687 if(ant>=0 && ant<NUM_SEAVEYS) {
1688 return rPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
1696 if(fUsePhotogrammetryNumbers==0) {
1698 if(ant>=0 && ant<NUM_SEAVEYS) {
1699 return azPhaseCentreFromVerticalHorn[ant][pol];
1703 if(ant>=0 && ant<NUM_SEAVEYS) {
1705 return azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
1713 if(fUsePhotogrammetryNumbers==0) {
1715 if(ant>=0 && ant<NUM_SEAVEYS) {
1716 Double_t phi=azPhaseCentreFromVerticalHorn[ant][pol]-aftForeOffsetAngleVertical;
1718 phi+=TMath::TwoPi();
1719 if(phi>TMath::TwoPi())
1720 phi-=TMath::TwoPi();
1725 if(ant>=0 && ant<NUM_SEAVEYS) {
1727 Double_t phi=azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]-aftForeOffsetAngleVerticalPhotogrammetry;
1731 phi+=TMath::TwoPi();
1732 if(phi>TMath::TwoPi())
1733 phi-=TMath::TwoPi();
1742 if(firstAnt>=0 && firstAnt<NUM_SEAVEYS && secondAnt>=0 && secondAnt<NUM_SEAVEYS) {
1765 if(phiWave<0) phiWave+=TMath::TwoPi();
1766 if(phiWave>TMath::TwoPi()) phiWave-=TMath::TwoPi();
1767 Double_t minDiff=TMath::TwoPi();
1769 for(Int_t ant=0;ant<16;ant++) {
1798 if(ant>=0 && ant<NUM_SEAVEYS) {
1799 x=xAntFromVerticalHorn[ant];
1800 y=yAntFromVerticalHorn[ant];
1801 z=zAntFromVerticalHorn[ant];
1806 if(ant>=0 && ant<NUM_SEAVEYS) {
1807 return zAntFromVerticalHorn[ant];
1814 if(ant>=0 && ant<NUM_SEAVEYS) {
1815 return rAntFromVerticalHorn[ant];
1822 if(ant>=0 && ant<NUM_SEAVEYS) {
1823 return azCentreFromVerticalHorn[ant];
1829 if(ant>=0 && ant<NUM_SEAVEYS) {
1830 Double_t phi=azCentreFromVerticalHorn[ant]-aftForeOffsetAngleVertical;
1832 phi+=TMath::TwoPi();
1839 Double_t phiPrime=phiWave+aftForeOffsetAngleVertical;
1840 if(phiPrime>TMath::TwoPi())
1841 phiPrime-=TMath::TwoPi();
1842 Double_t minDiff=TMath::TwoPi();
1844 for(Int_t ant=0;ant<16;ant++) {
1846 if(TMath::Abs(azCentreFromVerticalHorn[ant]-phiPrime)<minDiff) {
1847 minDiff=TMath::Abs(azCentreFromVerticalHorn[ant]-phiPrime);
1854 void AnitaGeomTool::updateAnt(Double_t deltaR,Double_t deltaRL,Double_t deltaUD){
1856 Double_t phaseCentreToAntFront=0.2+deltaR;
1858 Double_t deltaXRL = 0;
1859 Double_t deltaYRL = 0;
1861 Double_t deltaZUD = 0;
1862 Double_t deltaXUD = 0;
1863 Double_t deltaYUD = 0;
1865 std::cout << deltaXRL <<
" " << deltaXUD <<
" "<< deltaYUD <<
" "<< deltaYRL <<
" " << deltaZUD <<
" " << deltaRL << std::endl;
1868 for(Int_t ant=0;ant<32;ant++) {
1873 deltaZUD = deltaUD*TMath::Cos(apertureElFromVerticalHorn[ant]);
1874 deltaXUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Cos(apertureAzFromVerticalHorn[ant]);
1875 deltaYUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Sin(apertureAzFromVerticalHorn[ant]);
1880 xPhaseCentreFromVerticalHorn[ant][pol]=(xAntFromVerticalHorn[ant] + deltaXRL + deltaXUD) -
1881 phaseCentreToAntFront*TMath::Cos( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1882 yPhaseCentreFromVerticalHorn[ant][pol]=(yAntFromVerticalHorn[ant] + deltaYRL + deltaYUD) -
1883 phaseCentreToAntFront*TMath::Sin( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1884 zPhaseCentreFromVerticalHorn[ant][pol]=(zAntFromVerticalHorn[ant] + deltaZUD) -phaseCentreToAntFront*TMath::Sin(apertureElFromVerticalHorn[ant]);
1887 rPhaseCentreFromVerticalHorn[ant][pol]=TMath::Sqrt(xPhaseCentreFromVerticalHorn[ant][pol]*xPhaseCentreFromVerticalHorn[ant][pol]+
1888 yPhaseCentreFromVerticalHorn[ant][pol]*yPhaseCentreFromVerticalHorn[ant][pol]);
1889 azPhaseCentreFromVerticalHorn[ant][pol]=TMath::ATan(yPhaseCentreFromVerticalHorn[ant][pol]/xPhaseCentreFromVerticalHorn[ant][pol]);
1890 if(xPhaseCentreFromVerticalHorn[ant][pol]<0)
1891 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::Pi();
1892 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
1893 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
1900 for(Int_t ant=32;ant<48;ant++) {
1902 Double_t deltaXRL = 0;
1903 Double_t deltaYRL = 0;
1905 Double_t deltaZUD = 0;
1906 Double_t deltaXUD = 0;
1907 Double_t deltaYUD = 0;
1909 deltaZUD = deltaUD*TMath::Cos(apertureElFromVerticalHorn[ant]);
1910 deltaXUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Cos(apertureAzFromVerticalHorn[ant]);
1911 deltaYUD = -deltaUD*TMath::Sin(apertureElFromVerticalHorn[ant])*TMath::Sin(apertureAzFromVerticalHorn[ant]);
1914 rAntFromVerticalHorn[ant]=(101*INCHTOMETER)-0.3;
1915 zAntFromVerticalHorn[ant]=(-21*INCHTOMETER)-1.8;
1916 azCentreFromVerticalHorn[ant]=(-67.5 + 45*(ant-32))*TMath::DegToRad();
1917 apertureAzFromVerticalHorn[ant]=azCentreFromVerticalHorn[ant];
1918 apertureElFromVerticalHorn[ant]=-10*TMath::DegToRad();
1919 xAntFromVerticalHorn[ant]=rAntFromVerticalHorn[ant]*TMath::Cos(azCentreFromVerticalHorn[ant]);
1920 yAntFromVerticalHorn[ant]=rAntFromVerticalHorn[ant]*TMath::Sin(azCentreFromVerticalHorn[ant]);
1923 xPhaseCentreFromVerticalHorn[ant][pol]=(xAntFromVerticalHorn[ant] + deltaXRL + deltaXUD) -
1924 phaseCentreToAntFront*TMath::Cos( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1925 yPhaseCentreFromVerticalHorn[ant][pol]=(yAntFromVerticalHorn[ant] + deltaYRL + deltaYUD) -
1926 phaseCentreToAntFront*TMath::Sin( apertureAzFromVerticalHorn[ant])*TMath::Cos(apertureElFromVerticalHorn[ant]);
1927 zPhaseCentreFromVerticalHorn[ant][pol]=(zAntFromVerticalHorn[ant] + deltaZUD) -phaseCentreToAntFront*TMath::Sin(apertureElFromVerticalHorn[ant]);
1935 rPhaseCentreFromVerticalHorn[ant][pol]=TMath::Sqrt(xPhaseCentreFromVerticalHorn[ant][pol]*xPhaseCentreFromVerticalHorn[ant][pol]+
1936 yPhaseCentreFromVerticalHorn[ant][pol]*yPhaseCentreFromVerticalHorn[ant][pol]);
1937 azPhaseCentreFromVerticalHorn[ant][pol]=TMath::ATan(yPhaseCentreFromVerticalHorn[ant][pol]/xPhaseCentreFromVerticalHorn[ant][pol]);
1938 if(xPhaseCentreFromVerticalHorn[ant][pol]<0)
1939 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::Pi();
1940 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
1941 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
1956 void AnitaGeomTool::printAntPos(){
1959 for(Int_t ant = 0; ant < 32; ant++){
1960 std::cout << rPhaseCentreFromVerticalHorn[ant][pol] << std::endl;
1970 return AnitaGeom::topPhiNums[ant];
1972 return AnitaGeom::middlePhiNums[ant-16];
1975 std::cerr <<
"There isn't an antenna " << ant <<
" (0-47 only)\n";
1985 return AnitaGeom::topAntNums[phi];
1987 return AnitaGeom::middleAntNums[phi];
1996 void AnitaGeomTool::readSimonsNumbers() {
1998 char calibDir[FILENAME_MAX];
1999 char fileName[FILENAME_MAX];
2000 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
2002 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
2004 sprintf(calibDir,
"calib");
2006 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
2009 strncpy(calibDir,calibEnv,FILENAME_MAX);
2012 sprintf(fileName,
"%s/simonsPositionAndTimingOffsets.dat",calibDir);
2013 std::ifstream SimonFile(fileName);
2015 std::cerr <<
"Couldn't open:\t" << fileName <<
"\n";
2020 Double_t deltaT,deltaR,deltaPhi,deltaZ;
2021 char firstLine[180];
2023 SimonFile.getline(firstLine,179);
2024 while(SimonFile >> antNum >> deltaT >> deltaR >> deltaPhi >> deltaZ) {
2033 sprintf(fileName,
"%s/simonsHPolPositionAndTimingOffsets.dat",calibDir);
2034 std::ifstream SimonHPolFile(fileName);
2035 if(!SimonHPolFile) {
2036 std::cerr <<
"Couldn't open:\t" << fileName <<
"\n";
2040 SimonHPolFile.getline(firstLine,179);
2041 while(SimonHPolFile >> antNum >> deltaT >> deltaR >> deltaPhi >> deltaZ) {
2055 void AnitaGeomTool::readPhaseCenterNumbers(
int version) {
2057 char calibDir[FILENAME_MAX];
2058 char fileName[FILENAME_MAX];
2059 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
2061 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
2063 sprintf(calibDir,
"calib");
2065 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
2068 strncpy(calibDir,calibEnv,FILENAME_MAX);
2072 case 3 : sprintf(fileName,
"%s/phaseCenterPositionsRelativeToPhotogrammetryAnita3.dat",calibDir);
2074 case 4 : sprintf(fileName,
"%s/phaseCenterPositionsRelativeToPhotogrammetryAnita4.dat",calibDir);
2077 std::cerr <<
"Unknown AnitaVersion " << version <<
"\n";
2082 std::ifstream PhaseCenterFile(fileName);
2083 if(!PhaseCenterFile) {
2084 std::cerr <<
"Couldn't open:\t" << fileName <<
"\n";
2089 Double_t deltaR,deltaPhi,deltaZ;
2090 char firstLine[180];
2092 PhaseCenterFile.getline(firstLine,179);
2093 while(PhaseCenterFile >> antNum >> pol >> deltaR >> deltaPhi >> deltaZ) {
2094 deltaRPhaseCentre[antNum][pol]=deltaR;
2095 deltaPhiPhaseCentre[antNum][pol]=deltaPhi*TMath::DegToRad();
2096 deltaZPhaseCentre[antNum][pol]=deltaZ;
2108 void AnitaGeomTool::readPhotogrammetry(
int version)
2111 char calibDir[FILENAME_MAX];
2112 char fileName[FILENAME_MAX];
2113 char *calibEnv=getenv(
"ANITA_CALIB_DIR");
2115 char *utilEnv=getenv(
"ANITA_UTIL_INSTALL_DIR");
2117 sprintf(calibDir,
"calib");
2119 sprintf(calibDir,
"%s/share/anitaCalib",utilEnv);
2122 strncpy(calibDir,calibEnv,FILENAME_MAX);
2127 case 3 : sprintf(fileName,
"%s/anitaIIIPhotogrammetry.csv",calibDir);
2129 case 4 : sprintf(fileName,
"%s/anitaIVPhotogrammetry.csv",calibDir);
2132 std::cerr <<
"Unknown AnitaVersion " << version <<
"\n";
2136 std::ifstream AnitaPhotoFile(fileName);
2137 if(!AnitaPhotoFile) {
2138 std::cerr <<
"Couldn't open:\t" << fileName <<
"\n";
2145 for(
int i=0;i<2;i++) {
2146 line.ReadLine(AnitaPhotoFile);
2150 for(
int ant=0;ant<48;ant++) {
2151 line.ReadLine(AnitaPhotoFile);
2153 TObjArray *tokens = line.Tokenize(
",");
2154 for(
int j=0;j<8;j++) {
2155 const TString subString = ((TObjString*)tokens->At(j))->GetString();
2160 if (ant+1 != subString.Atoi()) {
2161 std::cerr <<
"Antenna number mismatch\n";
2165 xAntFromVerticalHornPhotogrammetry[ant]=subString.Atof()*INCHTOMETER;
2168 yAntFromVerticalHornPhotogrammetry[ant]=subString.Atof()*INCHTOMETER;
2171 zAntFromVerticalHornPhotogrammetry[ant]=subString.Atof()*INCHTOMETER;
2174 rAntFromVerticalHornPhotogrammetry[ant]=subString.Atof()*INCHTOMETER;
2178 azCentreFromVerticalHornPhotogrammetry[ant]=subString.Atof()*TMath::DegToRad();
2181 apertureAzFromVerticalHornPhotogrammetry[ant]=subString.Atof()*TMath::DegToRad();
2184 apertureElFromVerticalHornPhotogrammetry[ant]=subString.Atof()*TMath::DegToRad();
2196 for(
int ant=0;ant<NUM_SEAVEYS;ant++) {
2197 Double_t phaseCentreToAntFront=ringPhaseCentreOffset[Int_t(this->
getRingFromAnt(ant))];
2199 phaseCentreToAntFront=0.2;
2203 xPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]=xAntFromVerticalHornPhotogrammetry[ant] -
2204 phaseCentreToAntFront*TMath::Cos( apertureAzFromVerticalHornPhotogrammetry[ant])*TMath::Cos(apertureElFromVerticalHornPhotogrammetry[ant]);
2205 yPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]=yAntFromVerticalHornPhotogrammetry[ant] -
2206 phaseCentreToAntFront*TMath::Sin( apertureAzFromVerticalHornPhotogrammetry[ant])*TMath::Cos(apertureElFromVerticalHornPhotogrammetry[ant]);
2207 zPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]=zAntFromVerticalHornPhotogrammetry[ant] - phaseCentreToAntFront*TMath::Sin(apertureElFromVerticalHornPhotogrammetry[ant]);
2209 rPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]=TMath::Sqrt(xPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]*xPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+yPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]*yPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]);
2210 azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]=TMath::ATan(yPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]/xPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]);
2211 if(xPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]<0)
2212 azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+=TMath::Pi();
2213 if(azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]<0)
2214 azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+=TMath::TwoPi();
2220 aftForeOffsetAngleVerticalPhotogrammetry= +45*TMath::DegToRad();
2221 aftForeOffsetAngleVertical=aftForeOffsetAngleVerticalPhotogrammetry;
2226 for(
int ant=0;ant<NUM_SEAVEYS;ant++) {
2227 rPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
2228 azPhaseCentreFromVerticalHorn[ant][pol]=azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
2229 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
2230 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
2231 if(azPhaseCentreFromVerticalHorn[ant][pol]>TMath::TwoPi())
2232 azPhaseCentreFromVerticalHorn[ant][pol]-=TMath::TwoPi();
2233 zPhaseCentreFromVerticalHorn[ant][pol]=zPhaseCentreFromVerticalHornPhotogrammetry[ant][pol];
2234 xPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Cos(azPhaseCentreFromVerticalHorn[ant][pol]);
2235 yPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Sin(azPhaseCentreFromVerticalHorn[ant][pol]);
2241 if (fUsePhotogrammetryNumbers==0){
2249 void AnitaGeomTool::addPhaseCenters(){
2256 for(
int ant=0;ant<NUM_SEAVEYS;ant++) {
2257 rPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+deltaRPhaseCentre[ant][pol];
2258 azPhaseCentreFromVerticalHorn[ant][pol]=azPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+deltaPhiPhaseCentre[ant][pol];
2259 if(azPhaseCentreFromVerticalHorn[ant][pol]<0)
2260 azPhaseCentreFromVerticalHorn[ant][pol]+=TMath::TwoPi();
2261 if(azPhaseCentreFromVerticalHorn[ant][pol]>TMath::TwoPi())
2262 azPhaseCentreFromVerticalHorn[ant][pol]-=TMath::TwoPi();
2263 zPhaseCentreFromVerticalHorn[ant][pol]=zPhaseCentreFromVerticalHornPhotogrammetry[ant][pol]+deltaZPhaseCentre[ant][pol];
2264 xPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Cos(azPhaseCentreFromVerticalHorn[ant][pol]);
2265 yPhaseCentreFromVerticalHorn[ant][pol]=rPhaseCentreFromVerticalHorn[ant][pol]*TMath::Sin(azPhaseCentreFromVerticalHorn[ant][pol]);
AnitaRing::AnitaRing_t surfTriggerChanToRing[SCALERS_PER_SURF]
< Map from SURF trigger channel to ring
Int_t surfToAntMapAnita3[ACTIVE_SURFS][RFCHAN_PER_SURF]
Map from phi-sector to antenna. Both start counting at zero.
Left-circular polarisation (e.g. A4)
Int_t vAntToChan[NUM_SEAVEYS]
Map for HPOL channel of antenna to channel on SURF. (HPOL channels are 4-7)
Horizontal Polarisation (e.g. A3)
Right-circular polarisation (e.g. A4)
Int_t bottomPhiNums[NUM_PHI]
Map from SURF and polarization to phi-sector.
enum AnitaRing::EAnitaRing AnitaRing_t
Ring enumeration.
enum AnitaTrigPol::EAnitaTrigPol AnitaTrigPol_t
Polarisation enumeration.
AnitaTrigPol::AnitaTrigPol_t surfTriggerChanToPolAnita3[SCALERS_PER_SURF]
< Map from SURF trigger channel to polarization
AnitaGeom – Namespace used inside AnitaGeomTool.
Int_t hAntToChan[NUM_SEAVEYS]
1 is Normal orientation, -1 is 180 degree flip. (Top ring needs to be inverted in software when signa...
Int_t antToSurfMap[NUM_SEAVEYS]
< Map from antenna to SURF. Both polarizations from an antenna go to the same SURF.
Int_t bottomAntNums[NUM_PHI]
And the inverse, a map from antenna to phi-sector (using ANT-1 and ANT-17 and ANT-33 with the arrays)...
Vertical Polarisation (e.g. A3)
Int_t antOrientationMap[NUM_SEAVEYS]
enum AnitaPol::EAnitaPol AnitaPol_t
Polarisation enumeration.