10 #include "MagicDisplayConventions.h" 11 #include "AnitaGpsCanvasMaker.h" 12 #include "AnitaConventions.h" 13 #include "AnitaGeomTool.h" 14 #include "UsefulAnitaEvent.h" 15 #include "RawAnitaHeader.h" 25 #include "TObjArray.h" 26 #include "TObjString.h" 29 #include "TPaveText.h" 34 #include "WaveformGraph.h" 42 #include "TTimeStamp.h" 45 #include "TMultiGraph.h" 55 fDisplayOpt=MagicDisplayGpsDisplay::kSatView;
84 canGps = (TPad*) gROOT->FindObject(
"canGps");
86 canGps =
new TCanvas(
"canGps",
"canGps",1000,600);
89 canGps->SetTopMargin(0);
90 plotPad =
new TPad(
"canGpsMain",
"canGpsMain",0,0,1,0.9);
98 if(fDisplayOpt!=lastDisplayOpt) {
102 lastDisplayOpt=fDisplayOpt;
104 if(fDisplayOpt==MagicDisplayGpsDisplay::kSatView) {
105 addSatellitesToTimeArray(adu5ASatPtr,adu5BSatPtr,g12SatPtr);
106 getSatelliteView(adu5ASatPtr,adu5BSatPtr,g12SatPtr,plotPad);
108 else if(fDisplayOpt==MagicDisplayGpsDisplay::kMapView) {
110 getMapView(adu5APatPtr,plotPad);
112 getMapView(adu5BPatPtr,plotPad);
118 getMapView(&tempPat,plotPad);
121 std::cout <<
"No ADU5 attitude data available will give up";
137 topPad =
new TPad(
"padGpsInfo",
"padGpsInfo",0.2,0.9,0.8,1);
144 topPad->SetTopMargin(0.05);
147 TPaveText *leftPave =
new TPaveText(0.05,0,0.95,0.9);
148 leftPave->SetBorderSize(0);
149 leftPave->SetFillColor(0);
150 leftPave->SetTextAlign(13);
152 sprintf(textLabel,
"Run: %d",adu5APatPtr->run);
153 TText *runText = leftPave->AddText(textLabel);
154 runText->SetTextColor(50);
155 TTimeStamp g12PosTime((time_t)adu5APatPtr->
realTime,0);
156 sprintf(textLabel,
"Time: %s",g12PosTime.AsString(
"s"));
157 TText *timeText = leftPave->AddText(textLabel);
158 timeText->SetTextColor(1);
160 else if(adu5BPatPtr) {
161 sprintf(textLabel,
"Run: %d",adu5BPatPtr->run);
162 TText *runText = leftPave->AddText(textLabel);
163 runText->SetTextColor(50);
164 TTimeStamp g12PosTime((time_t)adu5BPatPtr->
realTime,0);
165 sprintf(textLabel,
"Time: %s",g12PosTime.AsString(
"s"));
166 TText *timeText = leftPave->AddText(textLabel);
167 timeText->SetTextColor(1);
171 sprintf(textLabel,
"Run: %d",g12PosPtr->
run);
172 TText *runText = leftPave->AddText(textLabel);
173 runText->SetTextColor(50);
174 TTimeStamp g12PosTime((time_t)g12PosPtr->
realTime,0);
175 sprintf(textLabel,
"Time: %s",g12PosTime.AsString(
"s"));
176 TText *timeText = leftPave->AddText(textLabel);
177 timeText->SetTextColor(1);
183 TPaveText *rightPave =
new TPaveText(0.05,0,0.95,0.9);
184 rightPave->SetBorderSize(0);
185 rightPave->SetFillColor(0);
186 rightPave->SetTextAlign(13);
188 sprintf(textLabel,
"G12 Sats: %d",g12SatPtr->
numSats);
190 sprintf(textLabel,
"G12 Sats: %d",g12PosPtr->
numSats);
191 TText *g12Text = rightPave->AddText(textLabel);
192 g12Text->SetTextColor(1);
193 sprintf(textLabel,
"ADU5 A Sats: %d %d %d %d",adu5ASatPtr->
numSats[0],
195 TText *adu5aText = rightPave->AddText(textLabel);
196 adu5aText->SetTextColor(1);
197 sprintf(textLabel,
"ADU5 B Sats: %d %d %d %d",adu5BSatPtr->
numSats[0],
199 TText *adu5bText = rightPave->AddText(textLabel);
200 adu5bText->SetTextColor(1);
206 void AnitaGpsCanvasMaker::getSatelliteView(
Adu5Sat *adu5ASatPtr,
Adu5Sat *adu5BSatPtr,
G12Sat *g12SatPtr, TPad *plotPad)
208 if(mgSat)
delete mgSat;
210 plotPad->Divide(1,2);
211 TPad *topHalf=(TPad*)plotPad->cd(1);
212 topHalf->Divide(3,1);
213 TPad *g12Pad=(TPad*)topHalf->cd(1);
215 g12Pad->SetEditable(0);
216 TPad *adu5aPad=(TPad*)topHalf->cd(2);
218 adu5aPad->SetEditable(0);
219 TPad *adu5bPad=(TPad*)topHalf->cd(3);
221 adu5bPad->SetEditable(0);
223 mgSat =
new TMultiGraph();
226 TGraph *grG12=
new TGraph(fNumG12Sat,fG12SatTimeArray,fG12SatNumArray);
227 grG12->SetLineColor(getNiceColour(0));
228 grG12->SetMarkerColor(getNiceColour(0));
229 grG12->SetMarkerStyle(getMarker(0));
230 grG12->SetName(
"G12");
231 mgSat->Add(grG12,
"p");
236 for(
int ant=0;ant<4;ant++) {
238 TGraph *grAdu5=
new TGraph(fNumAdu5ASat,fAdu5ASatTimeArray,fAdu5ASatNumArray[ant]);
239 grAdu5->SetLineColor(getNiceColour(1));
240 grAdu5->SetMarkerColor(getNiceColour(1));
241 grAdu5->SetMarkerStyle(getMarker(1+ant));
242 sprintf(graphName,
"ADU5A_%d",ant+1);
243 grAdu5->SetName(graphName);
244 mgSat->Add(grAdu5,
"p");
248 TGraph *grAdu5=
new TGraph(fNumAdu5BSat,fAdu5BSatTimeArray,fAdu5BSatNumArray[ant]);
249 grAdu5->SetLineColor(getNiceColour(2));
250 grAdu5->SetMarkerColor(getNiceColour(2));
251 grAdu5->SetMarkerStyle(getMarker(2+ant));
252 sprintf(graphName,
"ADU5B_%d",ant+1);
253 grAdu5->SetName(graphName);
254 mgSat->Add(grAdu5,
"p");
259 mgSat->SetTitle(
"Number of Satellites Used");
261 mgSat->GetXaxis()->SetTitle(
"Time");
262 mgSat->GetYaxis()->SetTitle(
"Number");
263 mgSat->GetXaxis()->SetTimeDisplay(1);
272 void AnitaGpsCanvasMaker::addSatellitesToTimeArray(
Adu5Sat *adu5ASatPtr,
Adu5Sat *adu5BSatPtr,
G12Sat *g12SatPtr) {
274 if(fNumAdu5ASat>=MAX_GPS_TIME_POINTS) {
277 for(
int i=0;i<MAX_GPS_TIME_POINTS/2;i++) {
278 fAdu5ASatTimeArray[i]=0.5*(fAdu5ASatTimeArray[2*i]+fAdu5ASatTimeArray[(2*i)+1]);
279 for(
int ant=0;ant<4;ant++) {
280 fAdu5ASatNumArray[ant][i]=0.5*(fAdu5ASatNumArray[ant][2*i]+fAdu5ASatNumArray[ant][(2*i)+1]);
285 fAdu5ASatTimeArray[fNumAdu5ASat]=adu5ASatPtr->realTime;
286 for(
int ant=0;ant<4;ant++) {
287 fAdu5ASatNumArray[ant][fNumAdu5ASat]=adu5ASatPtr->
numSats[ant];
292 if(fNumAdu5BSat>=MAX_GPS_TIME_POINTS) {
295 for(
int i=0;i<MAX_GPS_TIME_POINTS/2;i++) {
296 fAdu5BSatTimeArray[i]=0.5*(fAdu5BSatTimeArray[2*i]+fAdu5BSatTimeArray[(2*i)+1]);
297 for(
int ant=0;ant<4;ant++) {
298 fAdu5BSatNumArray[ant][i]=0.5*(fAdu5BSatNumArray[ant][2*i]+fAdu5BSatNumArray[ant][(2*i)+1]);
303 fAdu5BSatTimeArray[fNumAdu5BSat]=adu5BSatPtr->realTime;
304 for(
int ant=0;ant<4;ant++) {
305 fAdu5BSatNumArray[ant][fNumAdu5BSat]=adu5BSatPtr->
numSats[ant];
311 if(fNumG12Sat>=MAX_GPS_TIME_POINTS) {
314 for(
int i=0;i<MAX_GPS_TIME_POINTS/2;i++) {
315 fG12SatTimeArray[i]=0.5*(fG12SatTimeArray[2*i]+fG12SatTimeArray[(2*i)+1]);
316 fG12SatNumArray[i]=0.5*(fG12SatNumArray[2*i]+fG12SatNumArray[(2*i)+1]);
321 fG12SatTimeArray[fNumG12Sat]=g12SatPtr->
realTime;
322 fG12SatNumArray[fNumG12Sat]=g12SatPtr->
numSats;
332 void AnitaGpsCanvasMaker::getMapView(
Adu5Pat *adu5PatPtr, TPad *plotPad)
336 char mapFileName[FILENAME_MAX];
339 plotPad->SetTopMargin(0);
340 plotPad->SetBottomMargin(0);
341 plotPad->SetLeftMargin(0);
342 plotPad->SetRightMargin(0);
343 char *installDir=getenv(
"ANITA_UTIL_INSTALL_DIR");
345 sprintf(mapFileName,
"%s/share/anitaMap/antarcticaIceMap.png",installDir);
348 sprintf(mapFileName,
"antarcticaIceMap.png");
350 TImage *img = TImage::Open(mapFileName);
352 std::cout <<
"Couldn't create an image\n";
355 img->SetConstRatio(kFALSE);
360 float xBalloon,yBalloon;
362 static int wentNegative=0;
364 static int lastChange=0;
365 static float lastLong=0;
371 getRelXYFromLatLong(adu5PatPtr->
latitude,tempLong,xBalloon,yBalloon);
373 if(tempLong<0) wentNegative=1;
375 if(lastLong>167 || lastLong<0) {
377 if(tempLong<167 && tempLong>0) {
378 if(point>lastChange+10) {
388 int gpsPointerColours[5]={6,2,1,49,46};
390 TMarker *mark =
new TMarker();
391 if(loop>=0 && loop<=4)
392 mark->SetMarkerColor(gpsPointerColours[loop]);
393 mark->SetMarkerStyle(26);
394 mark->SetMarkerSize(1);
395 mark->DrawMarker(xBalloon,yBalloon);
403 const float TrueScaleLat=71;
404 const float CentralMeridian=0;
405 const float RadiusOfEarth=6378.1e3;
406 const float xOffest=375;
407 const float yOffset=312.5;
408 const float scale=271.5/2.19496e+06;
410 void AnitaGpsCanvasMaker::getXYFromLatLong(
double latitude,
double longitude,
411 double &x,
double &y)
415 double absLat=TMath::Abs(latitude);
416 double r=RadiusOfEarth*TMath::Cos((90.-TrueScaleLat)*TMath::DegToRad())*TMath::Tan((90-absLat)*TMath::DegToRad());
417 y=r*TMath::Cos(longitude*TMath::DegToRad());
418 x=r*TMath::Sin(longitude*TMath::DegToRad());
425 void AnitaGpsCanvasMaker::getRelXYFromLatLong(
float latitude,
float longitude,
430 float absLat=TMath::Abs(latitude);
431 float r=RadiusOfEarth*TMath::Cos((90.-TrueScaleLat)*TMath::DegToRad())*TMath::Tan((90-absLat)*TMath::DegToRad());
432 y=r*TMath::Cos(longitude*TMath::DegToRad());
433 x=r*TMath::Sin(longitude*TMath::DegToRad());
~AnitaGpsCanvasMaker()
Destructor.
Adu5Pat – The ADU5 Position and Attitude Data.
Adu5Sat – The ADU5 Satellite Information.
TPad * getGpsMainCanvas(Adu5Sat *adu5SatAPtr, Adu5Sat *adu5SatBPtr, G12Sat *g12SatPtr, Adu5Pat *adu5PatAPtr, Adu5Pat *adu5PatBPtr, G12Pos *g12PosPtr, TPad *useCan=0)
Returns the main GPS canvas.
UInt_t numSats
Number of visible satellites.
Int_t run
Run number assigned offline.
Float_t latitude
In degrees.
UInt_t numSats
Number of satellites visible.
void getCirclePlot(TPad *padSat, const char *title=0)
Creates a 2D elevation-azimuth plot.
G12Pos – The position data from the G12.
static AnitaGpsCanvasMaker * Instance()
Instance generator.
Float_t longitude
In degrees.
G12Sat – The satellite data from the G12.
UInt_t realTime
Time from the GPS unit.
UInt_t realTime
Time in unixtime from CPU.
AnitaGpsCanvasMaker()
Constructor.
UInt_t numSats[4]
The number of satellites each of the antennas can see.
UInt_t realTime
Time in unixtime.
Float_t latitude
Latitude in degrees.
Float_t altitude
In metres.
void getCirclePlot(TPad *padSat)
Fills the TPad with a 2D azimuth-elevation plot.
enum MagicDisplayGpsDisplay::EMagicDisplayGpsDisplay MagicDisplayGpsDisplay_t
Enumeration for plot style.
Float_t longitude
Longitude in degrees.
Float_t altitude
Altitude in metres.
TPad * getGpsInfoCanvas(Adu5Sat *adu5SatAPtr, Adu5Sat *adu5SatBPtr, G12Sat *g12SatPtr, Adu5Pat *adu5PatAPtr, Adu5Pat *adu5PatBPtr, G12Pos *g12PosPtr, TPad *useCan)
Returns the GPS info canvas, the canvas can be provided in useCan
static AnitaGpsCanvasMaker * fgInstance
Protect against multiple instances.