Ignore:
Timestamp:
03/10/04 17:07:24 (21 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Mars/mastro
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mastro/MAstroCatalog.cc

    r3415 r3457  
    3434
    3535#include <fstream>
    36 
     36#include <stdlib.h>
     37
     38#include <KeySymbols.h>
     39
     40#include <TPad.h> // TPad::GetMaxPickDistance
    3741#include <TLine.h>
    3842#include <TMarker.h>
     43#include <TCanvas.h>
    3944#include <TArrayI.h>
     45#include <TGToolTip.h>
    4046#include <TRotation.h>
    4147#include <TStopwatch.h>
    42 #include <TVirtualPad.h>
    43 
    44 #include <stdlib.h>
    4548
    4649#include "MLog.h"
    4750#include "MLogManip.h"
    4851
     52#include "MTime.h"
    4953#include "MAstro.h"
    50 #include "MTime.h"
    5154#include "MObservatory.h"
    5255
     
    6669    zdaz.SetZdAz(Theta(), alpha-Phi(), Mag());
    6770    zdaz.RotateY(obs.GetPhi()-TMath::Pi()/2);
     71
    6872    return zdaz;
    6973
     
    8387}
    8488
     89MVector3 MVector3::GetRaDec(const MObservatory &obs, Double_t gmst) const
     90{
     91    if (!fType==kIsZdAz)
     92        return MVector3();
     93
     94    const Double_t alpha = gmst + obs.GetElong();
     95
     96    MVector3 v(*this);
     97    v.RotateY(TMath::Pi()/2-obs.GetPhi());
     98
     99    MVector3 rd;
     100    rd.SetRaDec(alpha-v.Phi(), TMath::Pi()/2-v.Theta(), Mag());
     101    return rd;
     102
     103    /*
     104     // ------ The same using slalib, tested in the drive system -------
     105     const Double_t alpha = slaGmst(mjd) + obs.GetElong();
     106     Double_t el;
     107     slaDe2h(fAlpha-ra, dec, obs.GetPhi(), &az, &el);
     108     zd = TMath::Pi()/2-el;
     109     return;
     110     */
     111}
     112
     113MVector3 MVector3::GetRaDec(const MTime &time, MObservatory &obs) const
     114{
     115    return GetRaDec(obs, time.GetGmst());
     116}
     117
     118MAstroCatalog::MAstroCatalog() : fLimMag(99), fRadiusFOV(99), fToolTip(0), fObservatory(0), fTime(0)
     119{
     120    fList.SetOwner();
     121    fToolTip = new TGToolTip(0, "", 0);
     122}
     123
     124MAstroCatalog::~MAstroCatalog()
     125{
     126    if (fTime)
     127        delete fTime;
     128    if (fObservatory)
     129        delete fObservatory;
     130
     131    fToolTip->Hide();
     132    delete fToolTip;
     133
     134    DeleteMap();
     135
     136    // FIXME: There must be an easier way!
     137    TIter Next(gROOT->GetListOfCanvases());
     138    TCanvas *c;
     139    while ((c=(TCanvas*)Next()))
     140        c->Disconnect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", this,
     141                      "EventInfo(Int_t,Int_t,Int_t,TObject*)");
     142
     143}
     144
    85145TString MAstroCatalog::FindToken(TString &line, Char_t tok)
    86146{
     
    120180Int_t MAstroCatalog::ReadXephem(TString catalog)
    121181{
     182    SetBit(kHasChanged);
     183
    122184    gLog << inf << "Reading Xephem catalog: " << catalog << endl;
    123185
     
    181243        MVector3 *star=new MVector3;
    182244        star->SetRaDec(ra0, dec0, mag);
     245        star->SetName(name);
    183246        if (star->Angle(fRaDec)*TMath::RadToDeg()>fRadiusFOV)
    184247        {
     
    197260Int_t MAstroCatalog::ReadNGC2000(TString catalog)
    198261{
     262    SetBit(kHasChanged);
     263
    199264    gLog << inf << "Reading NGC2000 catalog: " << catalog << endl;
    200265
     
    240305        MVector3 *star=new MVector3;
    241306        star->SetRaDec(ra, dec, mag);
     307        star->SetName(row(0, 8));
    242308        if (star->Angle(fRaDec)*TMath::RadToDeg()>fRadiusFOV)
    243309        {
     
    257323Int_t MAstroCatalog::ReadBSC(TString catalog)
    258324{
     325    SetBit(kHasChanged);
     326
    259327    gLog << inf << "Reading Bright Star Catalog (BSC5) catalog: " << catalog << endl;
    260328
     
    302370        MVector3 *star=new MVector3;
    303371        star->SetRaDec(ra, dec, mag);
     372        star->SetName(row(4,9));
    304373        if (star->Angle(fRaDec)*TMath::RadToDeg()>fRadiusFOV)
    305374        {
     
    317386}
    318387
    319 Bool_t MAstroCatalog::Convert(const TRotation &rot, TVector2 &v, Int_t type)
     388Int_t MAstroCatalog::Convert(const TRotation &rot, TVector2 &v, Int_t type)
    320389{
    321390    MVector3 w;
    322     w.SetRaDec(v.Y(), v.X()-fRaDec.Phi(), v.Y());
     391
     392    switch (type)
     393    {
     394    case 1:
     395        w.SetRaDec(v.X()-fRaDec.Phi(), v.Y(), 1);
     396        break;
     397
     398    case 2:
     399        if (!fTime || !fObservatory)
     400            return kFALSE;
     401        w.SetZdAz(v.Y(), v.X(), 1);
     402        w = w.GetRaDec(*fTime, *fObservatory);
     403        w.RotateZ(-fRaDec.Phi());
     404        break;
     405
     406    default:
     407        return kFALSE;
     408    }
     409
    323410    w *= rot;
    324411
    325     v.Set(w.Phi(), w.Theta());
    326 
    327     return w.Angle(TVector3(1, 0, 0))*TMath::RadToDeg()<=fRadiusFOV;
    328 }
    329 
    330 Bool_t MAstroCatalog::PaintLine(const TVector2 &v, Double_t dx, Double_t dy, const TRotation &rot, Int_t type)
     412    // Stretch such, that the X-component is alwas the same. Now
     413    // Y and Z contains the crossing point between the star-light
     414    // and the plain of a virtual screen (ccd...)
     415    if (TestBit(kPlainScreen))
     416        w *= TMath::RadToDeg()/w.X();
     417    else
     418        w.SetMag(TMath::RadToDeg());
     419
     420    v.Set(w(1), w(2));
     421
     422    if (w(0)<0)
     423        return kERROR;
     424
     425    return w(1)>gPad->GetX1() && w(2)>gPad->GetY1() &&
     426           w(1)<gPad->GetX2() && w(2)<gPad->GetY2();
     427}
     428
     429Bool_t MAstroCatalog::DrawLine(const TVector2 &v, Double_t dx, Double_t dy, const TRotation &rot, Int_t type)
    331430{
    332431    const TVector2 add(dx*TMath::DegToRad(), dy*TMath::DegToRad());
     
    335434    TVector2 v1 = v+add;
    336435
    337     const Bool_t rc0 = Convert(rot, v0, type);
    338     const Bool_t rc1 = Convert(rot, v1, type);
    339     if (!rc0 && !rc1)
     436    const Int_t rc0 = Convert(rot, v0, type);
     437    const Int_t rc1 = Convert(rot, v1, type);
     438    // Both are kFALSE or both are kERROR
     439    if ((rc0|rc1)==kFALSE || (rc0&rc1)==kERROR)
    340440        return kFALSE;
    341441
    342     TLine line;
    343     line.SetLineColor(kGreen);
    344     line.PaintLine(v0.X(), TMath::Pi()/2-v0.Y(),
    345                    v1.X(), TMath::Pi()/2-v1.Y());
     442    TLine *line = new TLine(v0.X(), v0.Y(), v1.X(), v1.Y());
     443    line->SetBit(kCanDelete);
     444    line->SetLineStyle(kDashDotted); //kDashed, kDotted, kDashDotted
     445    line->SetLineColor(kWhite+type*2);
     446    line->SetBit(kCannotPick);
     447    fMapG.Add((Long_t)line, 0);
     448
     449    const TVector2 deg = v*TMath::RadToDeg();
     450    TString txt = type==1 ?
     451        Form("Ra=%.1fh  Dec=%.1fd", fmod(deg.X()/15+48, 24),  fmod(deg.Y()+270,180)-90) :
     452        Form("Zd=%.1fd  Az=%.1fd",  fmod(deg.Y()+270,180)-90, fmod(deg.X()+720, 360));
     453
     454    TMarker *tip=new TMarker(v0.X(), v0.Y(), kDot);
     455    tip->SetBit(kCanDelete);
     456    tip->SetMarkerColor(kWhite+type*2);
     457    fMapG.Add((Long_t)tip, (Long_t)new TString(txt));
    346458
    347459    return kTRUE;
    348460}
    349461
    350 void MAstroCatalog::Paint(const TVector2 &v0, const TRotation &rot, TArrayI &dx, TArrayI &dy, Byte_t type)
    351 {
     462void MAstroCatalog::Draw(const TVector2 &v0, const TRotation &rot, TArrayI &dx, TArrayI &dy, Int_t stepx, Int_t stepy, Int_t type)
     463{
     464    const TVector2 v1 = v0 + TVector2(dx[0]*TMath::DegToRad(), dy[0]*TMath::DegToRad());
     465
     466    //    if (TMath::Abs(v1.Y())>TMath::Pi()/2)
     467    //        return;
     468
     469    const Int_t v0x = (int)(v0.X()*TMath::RadToDeg());
     470    const Int_t v0y = (int)(v0.Y()*TMath::RadToDeg());
     471
    352472    Int_t idx[] = {1, 1, 1, 1};
    353473
    354     Int_t dirs[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
     474    Int_t dirs[4][2] = { {0, stepy}, {stepx, 0}, {0, -stepy}, {-stepx, 0} };
    355475
    356476    for (int i=0; i<dx.GetSize(); i++)
    357477    {
    358478        for (int j=0; j<4; j++)
    359             if (dx[i]==dx[0]+dirs[j][0] && dy[i]==dy[0]+dirs[j][1])
     479        {
     480            const Bool_t rcx0 = (dx[i]+720)%360==(dx[0]+dirs[j][0]+720)%360;
     481            const Bool_t rcy0 = (dy[i]+360)%180==(dy[0]+dirs[j][1]+360)%180;
     482            if (rcx0&&rcy0)
    360483                idx[j] = 0;
    361     }
    362 
    363     TVector2 v1 = v0 + TVector2(dx[0]*TMath::DegToRad(), dy[0]*TMath::DegToRad());
     484        }
     485    }
     486
     487    // Enhance size of array by 1, copy current
     488    // position as last entry
     489    dx.Set(dx.GetSize()+1);
     490    dy.Set(dy.GetSize()+1);
     491
     492    dx[dx.GetSize()-1] = dx[0];
     493    dy[dy.GetSize()-1] = dy[0];
     494
     495    // Store current positon
     496    const Int_t d[2] = { dx[0], dy[0] };
    364497
    365498    for (int i=0; i<4; i++)
    366499        if (idx[i])
    367500        {
    368             dx.Set(dx.GetSize()+1);
    369             dy.Set(dy.GetSize()+1);
    370 
    371             dx[dx.GetSize()-1] = dx[0];
    372             dy[dy.GetSize()-1] = dy[0];
    373 
    374             dx[0] += dirs[i][0];
    375             dy[0] += dirs[i][1];
    376 
    377             if (PaintLine(v1, dirs[i][0], dirs[i][1], rot, type))
    378                 Paint(v0, rot, dx, dy, type);
    379 
    380             dx[0] -= dirs[i][0];
    381             dy[0] -= dirs[i][1];
     501            // Calculate new position
     502            //dx[0] = (d[0]+dirs[i][0]+540-v0x)%360-180+v0x;
     503            //dy[0] = (d[1]+dirs[i][1]+270-v0y)%180- 90+v0y;
     504            dx[0] = d[0]+dirs[i][0];
     505            dy[0] = d[1]+dirs[i][1];
     506
     507            // Draw corresponding line and iterate through grid
     508            if (DrawLine(v1, dirs[i][0], dirs[i][1], rot, type))
     509                Draw(v0, rot, dx, dy, stepx, stepy, type);
     510
     511            dx[0]=d[0]; dy[0]=d[1];
    382512        }
    383513}
    384514
    385 void MAstroCatalog::PaintNet(const TVector2 &v0, const TRotation &rot, Int_t type)
     515void MAstroCatalog::DrawNet(const TVector2 &v0, const TRotation &rot, Int_t type)
    386516{
    387517    //const Double_t step = TMath::DegToRad();
     
    390520    TArrayI dy(1);
    391521
     522    // align to 1deg boundary
    392523    TVector2 v = v0*TMath::RadToDeg();
    393     v.Set(TMath::Floor(v.X()), TMath::Floor(v.Y()));
     524    v.Set((Float_t)TMath::Nint(v.X()), (Float_t)TMath::Nint(v.Y()));
     525
     526    // calculate stepsizes based on visible FOV
     527    Int_t stepx=1;
     528    if (fabs(v.Y())>90-fRadiusFOV || fabs(v.Y())<fRadiusFOV)
     529        stepx = 180/10;
     530    else
     531    {
     532        // This is a rough estimate how many degrees are visible
     533        const Float_t m = log(fRadiusFOV/180.)/log(90./fRadiusFOV-1);
     534        const Float_t t = log(180.)-m*log(fRadiusFOV);
     535        const Int_t n = (Int_t)(exp(m*log(90-fabs(v.Y()))+t)+0.5);
     536        stepx = n<4 ? 1 : n/4;
     537    }
     538
     539    const Int_t n = (Int_t)(fRadiusFOV+1);
     540    Int_t stepy = n<4 ? 1 : n/4;
     541
     542    // align stepsizes to be devisor or 180 and 90
     543    while (180%stepx)
     544        stepx++;
     545    while (90%stepy)
     546        stepy++;
     547
     548    // align to step-size boundary
     549    while ((int)(v.X())%stepx)
     550        v.Set(v.X()+1, v.Y());
     551
     552    while ((int)(v.Y())%stepy)
     553        v.Set(v.X(), v.Y()+1);
     554
     555    // draw...
    394556    v *= TMath::DegToRad();
    395 
    396     Paint(v, rot, dx, dy, type);
     557    Draw(v, rot, dx, dy, stepx, stepy, type);
    397558}
    398559
    399560void MAstroCatalog::Paint(Option_t *o)
    400561{
    401     Double_t ra = fRaDec.Phi();
    402     Double_t dec = TMath::Pi()/2-fRaDec.Theta();
    403 
    404     TIter Next(&fList);
    405     TVector3 *v;
    406 
    407     Double_t minra=360, maxra=0, mindec=360, maxdec=0;
    408 
    409     while ((v=(TVector3*)Next()))
    410     {
    411         minra = TMath::Min(minra, v->Phi());
    412         maxra = TMath::Max(maxra, v->Phi());
    413 
    414         mindec = TMath::Min(mindec, TMath::Pi()/2-v->Theta());
    415         maxdec = TMath::Max(maxdec, TMath::Pi()/2-v->Theta());
    416     }
    417 
    418     cout << gPad << endl;
    419 
    420     cout << "Minra: " << (minra-ra)*TMath::RadToDeg() << endl;
    421     cout << "Maxra: " << (maxra-ra)*TMath::RadToDeg() << endl;
    422 
    423     cout << "Mindec: " << (mindec-dec)*TMath::RadToDeg() << endl;
    424     cout << "Maxdec: " << (maxdec-dec)*TMath::RadToDeg() << endl;
    425 
    426     //gPad->Range(minra-ra, mindec-dec, maxra-ra, maxdec-dec);
    427     gPad->Range(-fRadiusFOV*TMath::DegToRad()/TMath::Sqrt(2.), -fRadiusFOV*TMath::DegToRad()/TMath::Sqrt(2.),
    428                 fRadiusFOV*TMath::DegToRad()/TMath::Sqrt(2.),  fRadiusFOV*TMath::DegToRad()/TMath::Sqrt(2.));
    429 
    430     Next.Reset();
    431 
    432     cout << "Dec: " << dec*TMath::RadToDeg() << endl;
    433     cout << "Ra:  " << ra*TMath::RadToDeg() << endl;
     562    if (!gPad->IsBatch())
     563        gVirtualX->ClearWindow();
     564
     565    if (TestBit(kHasChanged))
     566        DrawPrimitives(o);
     567}
     568
     569void MAstroCatalog::DrawStar(Double_t x, Double_t y, const TVector3 &v, Bool_t transparent)
     570{
     571    const Double_t ra  = v.Phi()*TMath::RadToDeg()/15;
     572    const Double_t dec = (TMath::Pi()/2-v.Theta())*TMath::RadToDeg();
     573
     574    TString str = v.GetName();
     575    str += Form(":  Ra=%.1fh", ra);
     576    str += Form("  Dec=%.1fd", dec);
     577    str += Form("  Mag=%.1f", -2.5*log10(v.Mag()));
     578
     579    // draw star on the camera display
     580    TMarker *tip=new TMarker(x, y, transparent ? kDot : kFullDotLarge);;
     581    tip->SetMarkerColor(kBlack);
     582    tip->SetBit(kCanDelete);
     583    tip->SetBit(kCannotPick);
     584    fMapG.Add((Long_t)tip, (Long_t)new TString(str));
     585}
     586
     587void MAstroCatalog::Update()
     588{
     589    if (gPad && TestBit(kMustCleanup))
     590    {
     591        SetBit(kHasChanged);
     592        gPad->Modified();
     593    }
     594}
     595
     596void MAstroCatalog::SetTime(const MTime &time)
     597{
     598    if (fTime)
     599        delete fTime;
     600    fTime=(MTime*)time.Clone();
     601}
     602
     603void MAstroCatalog::SetObservatory(const MObservatory &obs)
     604{
     605    if (fObservatory)
     606        delete fObservatory;
     607    fObservatory=(MObservatory*)obs.Clone();
     608}
     609
     610void MAstroCatalog::AddPrimitives(Option_t *o)
     611{
     612    const Double_t ra  = fRaDec.Phi();
     613    const Double_t dec = TMath::Pi()/2-fRaDec.Theta();
    434614
    435615    // Precalc Sin/Cos...
     
    437617    trans.Rotate(dec, TVector3(0, 1, 0));
    438618
     619    const TVector3 zdaz0 = fRaDec.GetZdAz(*fTime, *fObservatory);
     620    TVector2 zdaz(zdaz0.Phi(), zdaz0.Theta());
     621    MAstroCatalog::DrawNet(zdaz, trans, 2);
     622
     623    TVector2 radec(ra, dec);
     624    MAstroCatalog::DrawNet(radec, trans, 1);
     625
     626    TIter Next(&fList);
     627    TVector3 *v=0;
     628    while ((v=(TVector3*)Next()))
     629    {
     630        // FIXME: Check Magnitude!
     631        TVector2 s(v->Phi(), TMath::Pi()/2-v->Theta());
     632        if (Convert(trans, s, 1)==kTRUE)
     633            DrawStar(s.X(), s.Y(), *v, kFALSE);
     634    }
     635}
     636
     637void MAstroCatalog::SetRangePad()
     638{
     639     const Double_t edge = fRadiusFOV/TMath::Sqrt(2.);
     640     gPad->Range(-edge, -edge, edge, edge);
     641
     642     cout << gPad->GetWw() << " " << gPad->GetWh() << endl;
     643
     644     const Float_t w = gPad->GetWw();
     645     const Float_t h = gPad->GetWh();
     646
     647     if (w<h)
     648         gPad->Range(-edge, -edge*h/w, edge, edge*h/w);
     649     else
     650         gPad->Range(-edge*w/h, -edge, edge*w/h, edge);
     651}
     652
     653void MAstroCatalog::DrawPrimitives(Option_t *o)
     654{
     655    DeleteMap();
     656
     657    SetRangePad();
     658
    439659    TStopwatch clk;
    440660    clk.Start();
    441 
    442     TMarker mark;
    443     mark.SetMarkerColor(kBlack);
    444     mark.SetMarkerStyle(kCircle);
    445     while ((v=(TVector3*)Next()))
    446     {
    447         MVector3 v0;
    448         v0.SetRaDec(v->Phi()-ra, TMath::Pi()/2-v->Theta(), 1);
    449         v0 *= trans;
    450 
    451         mark.SetMarkerSize((fLimMag-TMath::Log(v->Mag()))/4);
    452         mark.PaintMarker(v0.Phi(), TMath::Pi()/2-v0.Theta());
    453     }
    454 
    455     TMarker m;
    456     m.SetMarkerStyle(kCross);
    457     m.PaintMarker(0, 0);
    458 
    459     m.SetMarkerColor(kRed);
    460     m.SetMarkerStyle(kFullDotSmall);
    461 
    462     TVector2 v0(ra, dec);
    463     PaintNet(v0, trans);
    464 
     661    AddPrimitives(o);
    465662    clk.Stop();
    466663    clk.Print();
    467 }
     664
     665    // Append all objects to pad
     666    DrawMap();
     667
     668    ResetBit(kHasChanged);
     669}
     670
     671void MAstroCatalog::Draw(Option_t *o)
     672{
     673    TObject::Draw(o);
     674
     675    if (!TestBit(kHasChanged))
     676        DrawPrimitives(o);
     677
     678    // Connect all TCanvas::ProcessedEvent to this->EventInfo
     679    // This means, that after TCanvas has processed an event
     680    // EventInfo of this class is called, see TCanvas::HandleInput
     681    gPad->GetCanvas()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
     682                               "MAstroCatalog", this,
     683                               "EventInfo(Int_t,Int_t,Int_t,TObject*)");
     684
     685    // Do this instead of fListG.Draw, because
     686    // TCollection overwrites Draw
     687    // Would be nice, but doesn't work because the single
     688    // graphical object are not handled by TPad anymore...
     689    //    fListG.AppendPad();
     690}
     691
     692// --------------------------------------------------------------------------
     693//
     694// This function was connected to all created canvases. It is used
     695// to redirect GetObjectInfo into our own status bar.
     696//
     697// The 'connection' is done in AddTab
     698//
     699void MAstroCatalog::EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
     700{
     701    if (!selected)
     702        return;
     703
     704    TCanvas *c = (TCanvas*)gTQSender;
     705
     706    TVirtualPad* save=gPad;
     707
     708    gPad = c ? c->GetSelectedPad() : NULL;
     709    if (!gPad)
     710        return;
     711
     712    switch (event)
     713    {
     714    case kMouseMotion:
     715        {
     716            TString *s = (TString*)fMapG.GetValue((Long_t)selected);
     717            if (!fToolTip->IsMapped() && s)
     718                ShowToolTip(px, py, *s);
     719        }
     720        break;
     721
     722    case kMouseLeave:
     723        if (fToolTip->IsMapped())
     724            fToolTip->Hide();
     725        break;
     726
     727    case kKeyPress: // Unresolved keyboard event
     728        /*
     729        switch (px)
     730        {
     731        case kKey_Plus:
     732        case kKey_Minus:*/
     733            ExecuteEvent(kKeyPress, px, py);/*
     734            break;
     735        }
     736        break;*/
     737    }
     738
     739    gPad=save;
     740}
     741
     742void MAstroCatalog::ExecuteEventKbd(Int_t keycode, Int_t keysym)
     743{
     744    Double_t dra =0;
     745    Double_t ddec=0;
     746
     747    switch (keysym)
     748    {
     749    case kKey_Left:
     750        dra = -TMath::DegToRad();
     751        break;
     752    case kKey_Right:
     753        dra = +TMath::DegToRad();
     754        break;
     755    case kKey_Up:
     756        ddec = +TMath::DegToRad();
     757        break;
     758    case kKey_Down:
     759        ddec = -TMath::DegToRad();
     760        break;
     761    case kKey_Plus:
     762        SetRadiusFOV(fRadiusFOV+1);
     763        break;
     764    case kKey_Minus:
     765        SetRadiusFOV(fRadiusFOV-1);
     766        break;
     767
     768    default:
     769        return;
     770    }
     771
     772    const Double_t r = fRaDec.Phi();
     773    const Double_t d = TMath::Pi()/2-fRaDec.Theta();
     774
     775    SetRaDec(r+dra, d+ddec);
     776
     777    gPad->Update();
     778}
     779
     780// ------------------------------------------------------------------------
     781//
     782// Execute a gui event on the camera
     783//
     784void MAstroCatalog::ExecuteEvent(Int_t event, Int_t mp1, Int_t mp2)
     785{
     786    if (!TestBit(kGuiActive))
     787        return;
     788
     789    if (event==kKeyPress)
     790        ExecuteEventKbd(mp1, mp2);
     791
     792}
     793
     794Int_t MAstroCatalog::DistancetoPrimitive(Int_t px, Int_t py)
     795{
     796    Int_t min = INT_MAX;
     797
     798    Long_t key, val;
     799    TExMapIter map(&fMapG);
     800    while (map.Next(key, val))
     801    {
     802        TObject *o=(TObject*)key;
     803
     804        const Int_t d = o->DistancetoPrimitive(px, py);
     805
     806        if (d<TPad::GetMaxPickDistance())
     807            return 0;
     808
     809        if (d<min)
     810            min=d;
     811    }
     812
     813    return min;
     814}
     815
     816void MAstroCatalog::ShowToolTip(Int_t px, Int_t py, const char *txt)
     817{
     818    Int_t x=0;
     819    Int_t y=0;
     820
     821    const Window_t id1 = gVirtualX->GetWindowID(gPad->GetCanvasID());
     822    const Window_t id2 = fToolTip->GetParent()->GetId();
     823
     824    Window_t id3;
     825    gVirtualX->TranslateCoordinates(id1, id2, px, py, x, y, id3);
     826
     827    // Show tool tip
     828    fToolTip->SetText(txt);
     829    fToolTip->Show(x+4, y+4);
     830}
     831
  • trunk/MagicSoft/Mars/mastro/MAstroCatalog.h

    r3402 r3457  
    44#ifndef ROOT_TVector3
    55#include <TVector3.h>
     6#endif
     7#ifndef ROOT_TExMap
     8#include <TExMap.h>
    69#endif
    710#ifndef ROOT_TList
     
    1215class MObservatory;
    1316class TArrayI;
     17class TGToolTip;
    1418
    1519class MVector3 : public TVector3
    1620{
     21private:
    1722    enum VectorType_t
    1823    {
     
    2631    VectorType_t fType;
    2732
     33    TString fName;
     34
    2835public:
    2936    /*
     
    3441    MVector3() { fType=kIsInvalid; }
    3542    MVector3(const TVector3 &v3) : TVector3(v3) { fType=kIsArbitrary; }
    36     Double_t Magnitude() const { return TMath::Log(Mag()); }
     43    Double_t Magnitude() const { return -2.5*TMath::Log10(Mag()); }
    3744
    3845    void SetRaDec(Double_t ra, Double_t dec, Double_t mag)
    3946    {
    4047        fType = kIsRaDec;
    41         SetMagThetaPhi(exp(mag), TMath::Pi()/2-dec, ra);
     48        SetMagThetaPhi(pow(10, -mag/2.5), TMath::Pi()/2-dec, ra);
    4249    }
     50    void SetName(const TString &str) { fName = str.Strip(TString::kBoth); }
    4351    void SetZdAz(Double_t zd, Double_t az, Double_t mag)
    4452    {
    4553        fType = kIsZdAz;
    46         SetMagThetaPhi(exp(mag), zd, az);
     54        SetMagThetaPhi(pow(10, -mag/2.5), zd, az);
    4755    }
    4856    void SetAltAz(Double_t alt, Double_t az, Double_t mag)
    4957    {
    5058        fType = kIsAltAz;
    51         SetMagThetaPhi(exp(mag), TMath::Pi()/2-alt, az);
     59        SetMagThetaPhi(pow(10, -mag/2.5), TMath::Pi()/2-alt, az);
    5260    }
     61
     62    const char *GetName() const { return fName; }
    5363
    5464    MVector3 GetZdAz(const MObservatory &obs, Double_t gmst) const;
    5565    MVector3 GetZdAz(const MTime &time, MObservatory &obs) const;
     66    MVector3 GetRaDec(const MObservatory &obs, Double_t gmst) const;
     67    MVector3 GetRaDec(const MTime &time, MObservatory &obs) const;
    5668
    57     ClassDef(MVector3, 0)
     69    ClassDef(MVector3, 1)
    5870};
    5971
     
    6375    Double_t fLimMag;    // [1]   Limiting Magnitude
    6476    Double_t fRadiusFOV; // [deg] Radius of Field of View
    65     MVector3 fRaDec;     // pointing position
    6677
    67     TList fList;
     78    TGToolTip *fToolTip; //!
     79
     80    void ShowToolTip(Int_t px, Int_t py, const char *txt);
    6881
    6982    TString FindToken(TString &line, Char_t tok=',');
     
    7487    Float_t atof(const TString &s);
    7588
    76 public:
    77     MAstroCatalog() : fLimMag(99), fRadiusFOV(99)
     89    Bool_t fPlainScreen;  //! Just a dummy!!!! ([Set,Is]Freezed)
     90
     91protected:
     92    enum {
     93        kHasChanged  = BIT(15),
     94        kGuiActive   = BIT(16),
     95        kPlainScreen = BIT(17)
     96    };
     97
     98    TExMap   fMapG;
     99    TList    fList;      // List of stars loaded
     100    MVector3 fRaDec;     // pointing position
     101
     102    MObservatory *fObservatory; // Possible obervatora location
     103    MTime        *fTime;        // Possible observation time
     104
     105    virtual Int_t  Convert(const TRotation &rot, TVector2 &v, Int_t type=0);
     106    virtual Bool_t DrawLine(const TVector2 &v0, Double_t dx, Double_t dy, const TRotation &rot, Int_t type);
     107    virtual void   AddPrimitives(Option_t *o);
     108    virtual void   DrawPrimitives(Option_t *o);
     109    virtual void   SetRangePad();
     110    void  Draw(const TVector2 &v0, const TRotation &rot, TArrayI &dx, TArrayI &dy, Int_t stepx, Int_t stepy, Int_t type);
     111    void  DrawNet(const TVector2 &v0, const TRotation &rot, Int_t type);
     112    void  DrawStar(Double_t x, Double_t y, const TVector3 &v, Bool_t t);
     113    void  Paint(Option_t *o="");
     114    Int_t DistancetoPrimitive(Int_t px, Int_t py);
     115    void  Update();
     116
     117    void ExecuteEventKbd(Int_t keycode, Int_t keysym);
     118    void ExecuteEvent(Int_t event, Int_t mp1, Int_t mp2);
     119
     120    void DeleteMap()
    78121    {
    79         fList.SetOwner();
     122        Long_t key, val;
     123        TExMapIter map(&fMapG);
     124        while (map.Next(key, val))
     125        {
     126            delete (TObject*)(key);
     127            if (!val)
     128                continue;
     129
     130            delete (TString*)(val);
     131         /*
     132            Long_t key2, val2;
     133            TExMapIter map2(&fMapG);
     134            while (map2.Next(key2, val2))
     135                if (val==val2)
     136                {
     137                    delete (TObject*)key;
     138                    fMapG.Remove(key);
     139                }*/
     140        }
     141        fMapG.Delete();
     142    }
     143    void DrawMap()
     144    {
     145        Long_t key, val;
     146        TExMapIter map(&fMapG);
     147        while (map.Next(key, val))
     148            ((TObject*)key)->Draw();
    80149    }
    81150
    82     void SetLimMag(Double_t mag)             { fLimMag=mag; }
    83     void SetRadiusFOV(Double_t deg)          { fRadiusFOV=deg; }
    84     void SetRaDec(Double_t ra, Double_t dec) { fRaDec.SetRaDec(ra, dec, 1); }
    85     void SetRaDec(const TVector3 &v)         { fRaDec=v; }
    86     void Delete(Option_t *o="")              { fList.Delete(o); }
     151public:
     152    MAstroCatalog();
     153    ~MAstroCatalog();
     154
     155    void SetTime(const MTime &time);
     156    void SetObservatory(const MObservatory &obs);
     157    void SetLimMag(Double_t mag) { fLimMag=mag;    Update(); } // *MENU* *ARGS={mag=>fLimMag}
     158    void SetRadiusFOV(Double_t deg)
     159    {
     160        //const Double_t max = TestBit(kPlainScreen) ? 90 : 55;
     161        const Double_t max = TestBit(kPlainScreen) ? 180 : 90;
     162        if (deg>max)
     163            deg=max;
     164        if (deg<=0)
     165            deg=1;
     166
     167        fRadiusFOV=deg;
     168
     169        Update();
     170    } // *MENU* *ARGS={deg=>fRadiusFOV}
     171    void SetRaDec(Double_t ra, Double_t dec) { fRaDec.SetRaDec(ra, dec, 1); Update(); }
     172    void SetRaDec(const TVector3 &v)         { fRaDec=v; Update(); }
     173    void SetGuiActive(Bool_t b=kTRUE)        { b ? SetBit(kGuiActive) : ResetBit(kGuiActive); }
     174
     175    void   SetPlainScreen(Bool_t b=kTRUE)    { b ? SetBit(kPlainScreen) : ResetBit(kPlainScreen); Update(); } // *TOGGLE*
     176    Bool_t IsPlainScreen() const             { return TestBit(kPlainScreen); }
     177
     178    Double_t GetLimMag() const { return fLimMag; }
     179    Double_t GetRadiusFOV() const { return fRadiusFOV; }
     180
     181    void Delete(Option_t *o="") { fList.Delete(); DeleteMap(); }
    87182
    88183    Int_t ReadXephem(TString catalog = "/usr/X11R6/lib/xephem/catalogs/YBS.edb");
     
    94189    TList *GetList() { return &fList; }
    95190
    96     virtual Bool_t Convert(const TRotation &rot, TVector2 &v, Int_t type);
    97     virtual Bool_t PaintLine(const TVector2 &v0, Double_t dx, Double_t dy, const TRotation &rot, Int_t type);
     191    void Draw(Option_t *o="");
    98192
    99     void Paint(const TVector2 &v0, const TRotation &rot, TArrayI &dx, TArrayI &dy, Byte_t type);
    100     void PaintNet(const TVector2 &v0, const TRotation &rot, Int_t type=0);
    101     void Paint(Option_t *o="");
     193    void EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected);
    102194
    103     ClassDef(MAstroCatalog, 0)
     195    ClassDef(MAstroCatalog, 1)
    104196};
    105197#endif
Note: See TracChangeset for help on using the changeset viewer.