Ignore:
Timestamp:
03/11/03 13:52:48 (22 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Cosy/gui/MGPngReader.cc

    r1802 r1810  
    33#include <fstream.h>    // ifstream
    44#include <iostream.h>   // cout
     5#include <iomanip.h>   // cout
    56
    67#include <TTimer.h>
    78
    89#include <TGMenu.h>
     10#include <TGLabel.h>
    911#include <TSystem.h>
    1012#include <TGSplitter.h>    // TGHorizontal3DLine
     
    1315#include "MGImage.h"
    1416#include "MGCoordinates.h"
     17#include "MGDispCoordinates.h"
    1518
    1619#include "coord.h"
     
    255258    fList->Add(fLimMag);
    256259
    257     fSao->SetLimitMag(8.0);
     260    fSao->SetLimitMag(7.0);
    258261
    259262    fInterpol = new MGPopupMenu(p);
     
    314317    fList->Add(fCRaDec);
    315318
    316     fCZdAz = new MGCoordinates(this, kETypeZdAz);
     319    fCZdAz = new MGCoordinates(this, kETypeZdAz, kFALSE);
    317320    fCZdAz->Move(240+12+10, fMenu->GetDefaultHeight()+584);
    318321    AddFrame(fCZdAz);
    319322    fList->Add(fCZdAz);
    320323
     324    fPZdAz = new MGCoordinates(this, kETypeZdAz, kFALSE);
     325    fPZdAz->Move(240+12+10, fMenu->GetDefaultHeight()+630);
     326    AddFrame(fPZdAz);
     327    fList->Add(fPZdAz);
     328
     329    TGLabel *l = new TGLabel(this, "Arb.-Sky Pos");
     330    l->SetTextJustify(kTextLeft);
     331    l->Move(480+32, fMenu->GetDefaultHeight()+590);
     332    AddFrame(l);
     333    fList->Add(l);
     334
     335    l = new TGLabel(this, "arcsec/pix");
     336    l->SetTextJustify(kTextLeft);
     337    l->Move(605, fMenu->GetDefaultHeight()+619);
     338    AddFrame(l);
     339    fList->Add(l);
     340
     341    l = new TGLabel(this, "Pointing Pos");
     342    l->SetTextJustify(kTextLeft);
     343    l->Move(480+32, fMenu->GetDefaultHeight()+655);
     344    AddFrame(l);
     345    fList->Add(l);
     346
    321347    const Double_t pixsize = 23.4;
    322348
     
    328354    fPixSize = new TGTextEntry(this, txt, IDM_kPixSize);
    329355    fPixSize->SetAlignment(kTextCenterX);
    330     fPixSize->Move(600, fMenu->GetDefaultHeight()+584);
     356    fPixSize->Move(547, fMenu->GetDefaultHeight()+617);
    331357    AddFrame(fPixSize);
    332358    fList->Add(fPixSize);
     
    357383    MapSubwindows();
    358384    MapWindow();
     385
     386    //------------------------------------------------------------
     387    //    XY xy(3.819444, 24.05333);
     388    //    fCRaDec->SetCoordinates(xy);
     389    //    fRaDec->Set(xy.X()*360/24, xy.Y());
     390    //------------------------------------------------------------
    359391}
    360392
    361393MGPngReader::MGPngReader(MObservatory::LocationName_t obs)
    362 : TGMainFrame(gClient->GetRoot(), 768, 700), fFile(NULL), fDx((768-kZOOM)/2), fDy((512-kZOOM)/2)
     394: TGMainFrame(gClient->GetRoot(), 768, 740), fFile(NULL), fDx((768-kZOOM)/2), fDy((512-kZOOM)/2)
    363395{
    364396    fSao = new StarCatalog(obs);
     
    811843}
    812844
    813 void MGPngReader::CalcTrackingError(MStarList &spots, MStarList &stars)
    814 {
     845ZdAz MGPngReader::TrackingError(TArrayF &x, TArrayF &y, TArrayF &mag) const
     846{
     847    //
     848    // Viewable area (FIXME: AZ)
     849    //
     850    TH2F h("Hist", "dX/dY",  77, -768/2-.5,  768/2+.5, 58, -576/2-.5,  576/2+.5); // 3
     851
     852    /*
     853    TH1F hmag("HistMag", "Mag", 19, 0, 100);
     854    for (int i=0; i<mag.GetSize(); i++)
     855        hmag.Fill(mag[i]);
     856        */
     857
     858    //
     859    // Search for matching Magnitudes
     860    //
     861    for (int i=0; i<mag.GetSize(); i++)
     862    {
     863        if (mag[i]>48-15 && mag[i]<48+15)
     864            h.Fill(x[i], y[i]);
     865    }
     866
     867    //
     868    // Serach for an excess in the histogram
     869    //
     870    Int_t mx, my, dummy;
     871    h.GetMaximumBin(mx, my, dummy);
     872
     873    const double xmax = h.GetXaxis()->GetBinCenter(mx);
     874    const double dx   = h.GetXaxis()->GetBinWidth(mx);
     875
     876    const double ymax = h.GetYaxis()->GetBinCenter(my);
     877    const double dy   = h.GetYaxis()->GetBinWidth(my);
     878
     879    cout << setprecision(3);
     880    cout << "Cut-XY:       " << xmax << " +- " << dx << " / " << ymax << " +- " << dy << endl;
     881
     882    TGraph g;
     883    for (int i=0; i<mag.GetSize(); i++)
     884    {
     885        if (!(x[i]>xmax-dx && x[i]<xmax+dx &&
     886              y[i]>ymax-dy && y[i]<ymax+dy &&
     887              mag[i]>48-15 && mag[i]<48+15))
     888            continue;
     889
     890        g.SetPoint(g.GetN(), x[i], y[i]);
     891    }
     892
     893    cout << "Offset-XY:    " << g.GetMean(1) << " +- " << g.GetRMS(1) << " / ";
     894    cout << g.GetMean(2) << " +- " << g.GetRMS(2) << endl;
     895
     896    AltAz pos0 = fSao->CalcAltAzFromPix(768/2,              576/2)*kRad2Deg;
     897    AltAz pos1 = fSao->CalcAltAzFromPix(768/2+g.GetMean(1), 576/2+g.GetMean(2))*kRad2Deg;
     898
     899    pos1 -= pos0;
     900
     901    ofstream fout("tracking_error.txt");
     902    fout << setprecision(10) << fSao->GetMjd()-52000 << " " << -pos1.Alt() << " " << pos1.Az() << endl;
     903    fout.close();
     904
     905    return ZdAz(-pos1.Alt(), pos1.Az());
     906}
     907
     908void MGPngReader::CalcTrackingError(Leds &leds, MStarList &stars)
     909{
     910    const Int_t max = leds.GetEntries();
     911
    815912    if (stars.GetRealEntries() < 3)
    816913    {
     
    819916    }
    820917
    821     if (spots.GetRealEntries() < 1)
     918    if (max < 1)
    822919    {
    823920        cout << "Sorry, less than 1 detected spot in FOV!" << endl;
     
    825922    }
    826923
    827     Int_t idx = 0;
    828 
    829     MStarList sortedspots;
     924    stars.Sort(); // Sort by magnitude
     925
     926    TString str = "data/tracking_";
     927    str += fSao->GetMjd()-52000;
     928    str += ".txt";
     929
     930    ofstream fout(str);
     931
     932    TArrayF x, y, mag;
     933
     934    Int_t num = 0;
     935
     936    // FIXME: Is predifined value 3 a good idea?
    830937
    831938    MStar *star;
    832     MStar *spot;
    833939    MStarListIter NextStar(&stars);
    834     MStarListIter NextSpot(&spots);
    835 
    836     while ((spot=NextSpot()))
    837     {
    838         AltAz aa = fSao->CalcAltAzFromPix(spot->GetX(), spot->GetY());
    839         spot->Set(aa.Az(), aa.Alt());
    840     }
    841 
    842     while ((star=NextStar()))
    843     {
    844         AltAz aa = fSao->CalcAltAzFromPix(star->GetX(), star->GetY());
    845         star->Set(aa.Az(), aa.Alt());
    846 
    847         const double aaz   = star->GetX();
    848         const double dphi2 = aaz/2.;
    849         const double cos2  = cos(dphi2)*cos(dphi2);
    850         const double sin2  = sin(dphi2)*sin(dphi2);
    851 
    852         Double_t min = 800;
    853 
    854         NextSpot.Reset();
    855         while ((spot=NextSpot()))
     940    while ((star=NextStar()) && num++<max+3)
     941    {
     942        TIter NextSp(&leds);
     943        Led *spot=NULL;
     944        while ((spot=(Led*)NextSp()))
    856945        {
    857             const double pzd = TMath::Pi()/2-spot->GetY();
    858             const double azd = TMath::Pi()/2-star->GetY();
    859 
    860             const double d = cos(azd)*cos2 - cos(2*pzd+azd)*sin2;
    861 
    862             const Double_t dist = acos(d);
    863 
    864             if (dist>=min)
    865                 continue;
    866 
    867             min = dist;
    868             sortedspots.AddAt(idx, spot->GetX(), spot->GetY(), spot->GetMag());
     946            const XY dpos(spot->GetX()-star->GetX(), spot->GetY()-star->GetY());
     947
     948            const Int_t idx = x.GetSize();
     949
     950            x.Set(idx+1);
     951            y.Set(idx+1);
     952            mag.Set(idx+1);
     953
     954            x.AddAt(dpos.X(), idx);
     955            y.AddAt(dpos.Y(), idx);
     956            mag.AddAt(spot->GetMag()/star->GetMag(), idx);
     957
     958            if (fout)
     959                fout << x[idx] << " " << y[idx] << " " << mag[idx] << endl;
    869960        }
    870         if (min>768)
    871         {
    872             cout << "ERROR!!!!!!!!" << endl;
    873             return;
    874         }
    875         idx++;
    876     }
    877 
    878     //
    879     // Now we have in sortedspots the entries with the shortest distances
    880     // to the corresponding ones in stars.
    881     // Now calculate the tracking error.
    882     //
    883     NextStar.Reset();
    884     MStarListIter NextSpot2(&sortedspots);
    885 
    886     Double_t meanx=0;
    887     Double_t meany=0;
    888 
    889     while ((star=NextStar()))
    890     {
    891         spot = NextSpot2();
    892 
    893         meanx += star->GetX() - spot->GetX();
    894         meany += star->GetY() - spot->GetY();
    895     }
    896 
    897     meanx /= idx;
    898     meany /= idx;
    899 
    900     cout << "Tracking Error:  dAlt=" << meany*180/TMath::Pi();
    901     cout << "°  dAz=" << meanx*180/TMath::Pi() << "°    (calculated";
    902     cout << " with " << idx << " stars/spots)" << endl;
    903 }
    904 
     961    }
     962
     963    ZdAz d = TrackingError(x, y, mag);
     964
     965    //
     966    // Calculated offsets
     967    //
     968
     969    // round= floor(x+.5)
     970    cout << "Offset-ZdAz: " << d.Zd()*60 << "' / " << d.Az()*60 << "'" << endl;
     971    cout << "Offset-ZdAz: " << d.Zd()/360*16384 << " / " << d.Az()/360*16384 << " (SE) " << endl;
     972
     973    //
     974    // Current Pointing position
     975    //
     976    ZdAz cpos = fSao->GetZdAz()-d;
     977    fPZdAz->SetCoordinates(cpos);
     978}
    905979
    906980
     
    9451019
    9461020    MStarList spots;
     1021
     1022    /*
    9471023    if (fDisplay->IsEntryChecked(IDM_kStarguider))
    9481024        Filter2::Execute(spots, c);
    9491025    else
    950         if (fDisplay->IsEntryChecked(IDM_kFilter))
    951             Filter::Execute(c);
     1026     */
     1027    if (fDisplay->IsEntryChecked(IDM_kFilter))
     1028        Filter::Execute(c);
    9521029
    9531030    if (fDisplay->IsEntryChecked(IDM_kCaosFilter))
     
    10311108    if (fDisplay->IsEntryChecked(IDM_kCatalog))
    10321109    {
     1110        Timer time(tm);
     1111
     1112        GetCoordinates();
     1113
     1114        MStarList stars;
     1115        fSao->GetStars(stars, time.GetMjd(), *fRaDec);
     1116
     1117        if (fDisplay->IsEntryChecked(IDM_kStarguider))
     1118        {
     1119            Leds leds;
     1120            CaosFilter::Execute(c, leds, 1);
     1121
     1122            cout << "Found: " << leds.GetEntries() << " leds" << endl;
     1123
     1124            CaosFilter::RemoveTwins(leds, 3);
     1125            leds.Compress();
     1126
     1127            cout << "Rest: " << leds.GetEntries() << " leds" << endl;
     1128
     1129            CalcTrackingError(leds, stars);
     1130        }
     1131
     1132        byte cimg[768*576];
     1133        fSao->GetImg(c, cimg, stars);
     1134
    10331135        DrawCircle(c, 0.5);
    10341136        DrawCircle(c, 1.0);
    10351137        DrawCircle(c, 1.5);
    10361138
    1037         byte cimg[768*576];
    1038 
    1039         GetCoordinates();
    1040 
    1041         Timer time(tm);
    1042 
    1043         MStarList stars;
    1044         fSao->GetStars(stars, time.GetMjd(), *fRaDec);
    1045         fSao->GetImg(c, cimg, stars);
    1046         //fSao->GetImg(c, cimg, time.CalcMjd(), *fRaDec);
     1139        fCZdAz->SetCoordinates(fSao->GetZdAz());
    10471140
    10481141        fImage->DrawColImg(c, cimg);
    1049 
    1050         fCZdAz->SetCoordinates(fSao->GetZdAz());
    1051 
    1052         if (fDisplay->IsEntryChecked(IDM_kStarguider))
    1053             CalcTrackingError(spots, stars);
    10541142    }
    10551143    else
     
    10671155    {
    10681156        const int dy = (int)sqrt(rpix*rpix-dx*dx);
    1069         img[cx+dx + (cy-dy)*768] = 0xd0;
    1070         img[cx+dx + (cy+dy)*768] = 0xd0;
    1071         img[cx-dy + (cy+dx)*768] = 0xd0;
    1072         img[cx+dy + (cy+dx)*768] = 0xd0;
     1157        img[cx+dx + (cy-dy)*768] = 0x40;
     1158        img[cx+dx + (cy+dy)*768] = 0x40;
     1159        img[cx-dy + (cy+dx)*768] = 0x40;
     1160        img[cx+dy + (cy+dx)*768] = 0x40;
    10731161    }
    10741162}
Note: See TracChangeset for help on using the changeset viewer.