1 #include "TH2DAntarctica.h" 2 #include "RampdemReader.h" 3 #include "AntarcticaBackground.h" 4 #include "TGraphAntarctica.h" 6 #include "TVirtualPad.h" 7 #include "TPaletteAxis.h" 9 #include "AntarcticaGeometry.h" 14 const double palX1 = AntarcticaBackgroundDefaults::zAxisRightMargin;
15 const double palX2 = AntarcticaBackgroundDefaults::zAxisRightMargin + AntarcticaBackgroundDefaults::zAxisWidth;
16 const double palY1 = 1 - AntarcticaBackgroundDefaults::zAxisTopBottomMargin - AntarcticaBackgroundDefaults::zAxisHeight;
17 const double palY2 = 1 - AntarcticaBackgroundDefaults::zAxisTopBottomMargin;
19 TProfile2DAntarctica::TProfile2DAntarctica(Int_t nx, Int_t ny)
20 : TProfile2D(), fAntarcticaBackground(NULL){
24 nx = nx <= 0 ? b->GetNbinsX() : nx;
25 ny = ny <= 0 ? b->GetNbinsY() : ny;
26 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
27 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
28 accept_stereographic =
false;
32 TProfile2DAntarctica::TProfile2DAntarctica(
const char* name,
const char* title, Int_t nx, Int_t ny)
33 : TProfile2D(), fAntarcticaBackground(NULL){
35 SetNameTitle(name, title);
38 nx = nx <= 0 ? b->GetNbinsX() : nx;
39 ny = ny <= 0 ? b->GetNbinsY() : ny;
40 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
41 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
42 accept_stereographic =
false;
46 TProfile2DAntarctica::TProfile2DAntarctica(
const char* name,
const char* title,
const std::vector<Double_t>& x,
const std::vector<Double_t>& y)
47 : TProfile2D(), fAntarcticaBackground(NULL){
49 SetNameTitle(name, title);
50 if(x.size() > 1 && y.size() > 1){
51 SetBins(x.size()-1, &x[0], y.size()-1, &y[0]);
56 Int_t nx = b->GetNbinsX();
57 Int_t ny = b->GetNbinsY();
58 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
59 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
62 accept_stereographic =
false;
66 void TProfile2DAntarctica::Draw(Option_t* opt){
69 if(!opt2.Contains(
"same")){
72 b->SetBit(kCanDelete,
false);
75 TList* l = gPad->GetListOfPrimitives();
76 for(
int i=0; i < l->GetEntries(); i++){
77 TString objName = l->At(i)->GetName();
78 if(objName.Contains(
"fAntarctica") && !objName.Contains(
"PalSetter")){
80 delete fAntarcticaBackground;
87 TString sameOpt = opt2.Contains(
"same") ? opt2 : TString::Format(
"%s same", opt);
88 TProfile2D::Draw(sameOpt);
95 Int_t TProfile2DAntarctica::Fill(Double_t lon, Double_t lat, Double_t val){
97 Double_t easting, northing;
98 if (accept_stereographic)
107 return TProfile2D::Fill(easting, northing, val);
120 for(
int i=0; i < nTimes; i++){
122 double lon = randy.Uniform(0, 360);
123 double lat = randy.Uniform(-90, -60);
137 TPaletteAxis *palette = (TPaletteAxis*) GetListOfFunctions()->FindObject(
"palette");
139 palette->SetX1NDC(palX1);
140 palette->SetX2NDC(palX2);
141 palette->SetY1NDC(palY1);
142 palette->SetY2NDC(palY2);
144 TAxis* zAxis = GetZaxis();
146 zAxis->SetTitleSize(AntarcticaBackgroundDefaults::zAxisTextSize);
147 zAxis->SetLabelSize(AntarcticaBackgroundDefaults::zAxisTextSize);
156 void TProfile2DAntarctica::ExecuteEvent(
int event,
int px,
int py){
157 if(event==kButton1Double){
164 TProfile2D::ExecuteEvent(event, px, py);
172 for(
int by=2; by <= GetNbinsY()-1; by++){
173 for(
int bx=2; bx <= GetNbinsX()-1; bx++){
176 double cVal = GetBinContent(bx, by);
179 if(cVal > GetBinContent(bx-1, by-1) &&
180 cVal > GetBinContent(bx-1, by ) &&
181 cVal > GetBinContent(bx-1, by+1) &&
182 cVal > GetBinContent(bx , by-1) &&
183 cVal > GetBinContent(bx , by+1) &&
184 cVal > GetBinContent(bx+1, by-1) &&
185 cVal > GetBinContent(bx+1, by ) &&
186 cVal > GetBinContent(bx+1, by+1)){
188 Double_t easting = fXaxis.GetBinCenter(bx);
189 Double_t northing = fYaxis.GetBinCenter(by);
190 grLocalMaxima->TGraph::SetPoint(grLocalMaxima->GetN(), easting, northing);
194 return grLocalMaxima;
197 TAxis* TProfile2DAntarctica::GetXaxis(){
200 return b->GetXaxis();
207 TAxis* TProfile2DAntarctica::GetYaxis(){
210 return b->GetYaxis();
237 TH2DAntarctica::TH2DAntarctica(Int_t nx, Int_t ny)
238 : TH2D(), fAntarcticaBackground(NULL){
242 nx = nx <= 0 ? b->GetNbinsX() : nx;
243 ny = ny <= 0 ? b->GetNbinsY() : ny;
244 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
245 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
247 accept_stereographic =
false;
251 TH2DAntarctica::TH2DAntarctica(
const char* name,
const char* title, Int_t nx, Int_t ny)
252 : TH2D(), fAntarcticaBackground(NULL){
254 SetNameTitle(name, title);
257 nx = nx <= 0 ? b->GetNbinsX() : nx;
258 ny = ny <= 0 ? b->GetNbinsY() : ny;
259 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
260 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
261 accept_stereographic =
false;
266 TH2DAntarctica::TH2DAntarctica(
const char* name,
const char* title,
const std::vector<Double_t>& x,
const std::vector<Double_t>& y)
267 : TH2D(), fAntarcticaBackground(NULL){
269 SetNameTitle(name, title);
270 if(x.size() > 1 && y.size() > 1){
271 SetBins(x.size()-1, &x[0], y.size()-1, &y[0]);
276 Int_t nx = b->GetNbinsX();
277 Int_t ny = b->GetNbinsY();
278 SetBins(nx, b->GetXaxis()->GetBinLowEdge(1), b->GetXaxis()->GetBinUpEdge(b->GetNbinsX()),
279 ny, b->GetYaxis()->GetBinLowEdge(1), b->GetYaxis()->GetBinUpEdge(b->GetNbinsY()));
282 accept_stereographic =
false;
288 void TH2DAntarctica::Draw(Option_t* opt){
291 if(!opt2.Contains(
"same")){
294 b->SetBit(kCanDelete,
false);
297 TList* l = gPad->GetListOfPrimitives();
298 for(
int i=0; i < l->GetEntries(); i++){
299 TString objName = l->At(i)->GetName();
300 if(objName.Contains(
"fAntarctica") && !objName.Contains(
"PalSetter")){
302 delete fAntarcticaBackground;
309 TString sameOpt = opt2.Contains(
"same") ? opt2 : TString::Format(
"%s same", opt);
317 Int_t TH2DAntarctica::Fill(Double_t lon, Double_t lat, Double_t val){
319 Double_t easting, northing;
321 if (accept_stereographic)
330 return TH2D::Fill(easting, northing, val);
333 void getAngularResolution(Double_t snr, Double_t& sigmaTheta, Double_t& sigmaPhi)
336 sigmaPhi = (AnitaVersion::get() == 3) ? exp(-2.50414e-01 * snr + 3.02406e-01) + 2.43376e-01 : 5.09057/(pow(snr, 8.01369e-01) + 1.);
337 sigmaTheta = (AnitaVersion::get() == 3) ? exp(-3.83773e-01 * snr + -3.00964e-01) + 1.64537e-01 : 1.34307/(pow(snr, 7.09382e-01) + 1.);
341 Double_t sigmaPhi, sigmaTheta;
342 getAngularResolution(snr, sigmaTheta, sigmaPhi);
349 Int_t maxval = ceil(sqrt(ll_thresh)) + 1;
351 Double_t easting, northing;
354 Int_t binX = TH2D::GetXaxis()->FindBin(easting);
355 Int_t binY = TH2D::GetYaxis()->FindBin(northing);
357 bool checking =
true;
379 for(
int i = 0; i < 8*level; i++)
381 Double_t thetaSource, phiSource;
382 Double_t sourceEasting, sourceNorthing;
383 Double_t sourceLon, sourceLat;
384 nrow = 3 + 2*(level-1);
387 Int_t newBinX, newBinY;
396 newBinX = binX-level+i;
397 newBinY = binY+level;
399 else if(i < 2 * nrow){
405 newBinX = binX-level+i-nrow;
406 newBinY = binY-level;
409 Int_t alternator = i%2 ? 1 : -1;
410 if(alternator == 1 && rightdone){
414 if(alternator == -1 && leftdone){
418 curr = alternator == 1 ? 3 : 2;
419 Int_t ypos = level - 1 - (i - 2*nrow)/2;
420 newBinX = binX+(alternator*level);
423 sourceEasting = TH2D::GetXaxis()->GetBinCenter(newBinX);
424 sourceNorthing = TH2D::GetYaxis()->GetBinCenter(newBinY);
431 if(surfaceDist < dist_thresh)
433 Fill(sourceLon, sourceLat, 0.01);
440 thetaSource *= TMath::RadToDeg();
441 phiSource *= TMath::RadToDeg();
443 Double_t dTheta = (thetaSource - theta)/sigmaTheta;
444 Double_t deltaPhi = phiSource - phi;
446 while(deltaPhi >= 180)
448 while(deltaPhi < -180)
451 Double_t dPhi = deltaPhi/sigmaPhi;
453 Double_t ll = dTheta * dTheta + dPhi * dPhi;
467 Fill(sourceLon, sourceLat, maxval - ceil(sqrt(ll)));
470 if(miss_count == 8*level) checking =
false;
471 if(udlr[0] == nrow) updone =
true;
472 if(udlr[1] == nrow) downdone =
true;
473 if(udlr[2] == ncol) leftdone =
true;
474 if(udlr[3] == ncol) rightdone =
true;
477 Fill(lon, lat, maxval);
491 for(
int i=0; i < nTimes; i++){
493 double lon = randy.Uniform(0, 360);
494 double lat = randy.Uniform(-90, -60);
508 TPaletteAxis *palette = (TPaletteAxis*) GetListOfFunctions()->FindObject(
"palette");
510 palette->SetX1NDC(palX1);
511 palette->SetX2NDC(palX2);
512 palette->SetY1NDC(palY1);
513 palette->SetY2NDC(palY2);
514 TAxis* zAxis = GetZaxis();
516 zAxis->SetTitleSize(AntarcticaBackgroundDefaults::zAxisTextSize);
517 zAxis->SetLabelSize(AntarcticaBackgroundDefaults::zAxisTextSize);
527 void TH2DAntarctica::ExecuteEvent(
int event,
int px,
int py){
528 if(event==kButton1Double){
535 TH2D::ExecuteEvent(event, px, py);
543 for(
int by=2; by <= GetNbinsY()-1; by++){
544 for(
int bx=2; bx <= GetNbinsX()-1; bx++){
547 double cVal = GetBinContent(bx, by);
550 if(cVal > GetBinContent(bx-1, by-1) &&
551 cVal > GetBinContent(bx-1, by ) &&
552 cVal > GetBinContent(bx-1, by+1) &&
553 cVal > GetBinContent(bx , by-1) &&
554 cVal > GetBinContent(bx , by+1) &&
555 cVal > GetBinContent(bx+1, by-1) &&
556 cVal > GetBinContent(bx+1, by ) &&
557 cVal > GetBinContent(bx+1, by+1)){
559 Double_t easting = fXaxis.GetBinCenter(bx);
560 Double_t northing = fYaxis.GetBinCenter(by);
561 grLocalMaxima->TGraph::SetPoint(grLocalMaxima->GetN(), easting, northing);
565 return grLocalMaxima;
569 TAxis* TH2DAntarctica::GetXaxis(){
572 return b->GetXaxis();
579 TAxis* TH2DAntarctica::GetYaxis(){
582 return b->GetYaxis();
void ExecuteEvent(Int_t event, Int_t x, Int_t y)
static Double_t SurfaceAboveGeoid(Double_t longitude, Double_t latitude, RampdemReader::dataSet=rampdem)
virtual void Draw(Option_t *opt="")
ClassDef(TGraphAntarctica, 1) private AntarcticaBackground * getBackground() const
Don't persist.
void FillRandomly(Int_t nTimes=5000)
void FillRandomly(Int_t nTimes=5000)
Int_t FillWithErrorContours(Double_t lon, Double_t lat, Double_t phi, Double_t theta, Double_t snr, Double_t ll_thresh, UsefulAdu5Pat upat, Double_t dist_thresh=0)
As UsefulAnitaEvent is to RawAnitaEvent, UsefulAdu5Pat is to Adu5Pat. Well not quite as useful but yo...
static void LonLatToEastingNorthing(Double_t lon, Double_t lat, Double_t &easting, Double_t &northing)
static double surfaceDistance(const AntarcticCoord &a, const AntarcticCoord &b)
void getThetaAndPhiWave2(Double_t sourceLon, Double_t sourceLat, Double_t sourceAlt, Double_t &thetaWave, Double_t &phiWave, TVector3 *sourcePos=NULL) const
static void EastingNorthingToLonLat(Double_t easting, Double_t northing, Double_t &lon, Double_t &lat)