//++
// Verbatim	
//

#include <iostream>
#include "sopnamsp.h"
#include "fitsioserver.h" 
#include "tvector.h"
//#include "spheregorski.h"
#include "spherethetaphi.h"
#include "localmap.h"
#include "skymapinit.h"

int main() 
{

  SophyaInit();

   FitsIoServer fserv;
  int nsmax=32;
   // test pour les vecteurs 
   /* 
  double tab[12]={1,2,3,4,5,6,7,8,9,10,11,12};
  TVector<double> V(12,tab);
  delete [] tab;
  cout << " impression du vecteur V" << endl;
  cout << V << endl;
  fserv.save(V, "vecteur.fits");
  TVector<double> W(5);
  fserv.load(W,"vecteur.fits");
  cout << " impression du vecteur W" << endl;
  cout << W << endl;
  */
   // test pour les matrices
   /*
   double tab[12]={1,2,3,4,5,6,7,8,9,10,11,12};
   //TMatrix<double> m(3,4,tab);
   TVector<double> m(12,tab);
   cout << " impression de la matrice m" << endl;
   cout << m << endl;
   fserv.save(m, "matrice.fits");
   TMatrix<double> mm(2,3);
   //TVector<double> mm(12);
   fserv.load(mm,  "matrice.fits"); 
   cout << " impression de la matrice mm" << endl;
   cout << mm << endl;
   */
   // test pour spheres
   /*
  // nsmax est parameter chez Gorski (anafast)
  int bid=0;
  
  //int npixtot=12*32*32;
  //float map[12*32*32];
   // test pour les spheres
  // Définition de la sphère 
   int  m=nsmax;
  double teta,phi;
  SphereGorski<float> sph1(nsmax);
  //SphereThetaPhi sph1(nsmax);
  for (int j=0;j<sph1.NbPixels();j++) 
    {
      sph1.PixThetaPhi(j,teta,phi);
      int bid= sph1.PixIndexSphNest(teta,phi);
      int bid2= sph1. NestToRing(bid);
      sph1(bid2)= 200* cos(3.*teta)*sin(8*phi);
    }
   // test projection sur une image fits
   cout << " je  projette  la sphere 1 " <<endl;
   char fileimg[]="img1.fits";
   fserv.sinus_picture_projection(sph1,fileimg);

   */


   /*
   // test ecriture sur une image
   char fileout[]="out.fits";
   cout << " ecriture dans " << fileout << endl;
   fserv.save(sph1,fileout);   
   cout << "relecture du fichier " << fileout << " qu'on verse dans une autre sphere" << endl;
   m=8;
   //SphereThetaPhi sph2(m);   
   SphereGorski<float> sph2(m);   
   fserv.load(sph2,fileout); 
  
  for (int j=0;j<10;j++) 
    {
      sph2.PixThetaPhi(j,teta,phi);
      int bid= sph2.PixIndexSphNest(teta,phi);
      int bid2= sph2.NestToRing(bid);
      cout << " ring= " << j << " nest= " << bid << " ring= " << bid2 << endl;
    }

   // reprojection sur image
   cout << " je  projette  la sphere 2 " <<endl;
   char fileimg2[]="img2.fits";
   fserv.sinus_picture_projection(sph2,fileimg2);

   */
   // test pour localmap
  int  m=nsmax;
  //SphereGorski<double> sph1(nsmax);
  SphereThetaPhi<double> sph1(nsmax);
  for (int j=0;j<sph1.NbPixels();j++) 
    {
      double teta,phi;
      sph1.PixThetaPhi(j,teta,phi);
      //int bid= sph1.PixIndexSphNest(teta,phi);
      //int bid2= sph1. NestToRing(bid);
      sph1(j)= 200* cos(3.*teta)*sin(8*phi);
    }
  LocalMap<double> lcl(600,300);
  lcl.SetOrigin(90.,180.);
  lcl.SetSize(60.,60.);
  for (int k=0; k< lcl.NbPixels(); k++)
    {
      double theta, phi;
      lcl.PixThetaPhi(k, theta, phi);
      lcl(k)=sph1(sph1.PixIndexSph( theta, phi));
    }
  cout << " dessin sur img5" << endl;
  fserv.picture(lcl,"img5.fits");
  cout << " sauvegarde sur out5" << endl;
  fserv.save(lcl,"out5.fits");
  /*		
  SphereGorski<double> sph3(nsmax);
  lcl.Project(sph3);
  cout << " je  projette  la sphere 3 " <<endl;
  char fileimg3[]="img3.fits";
  fserv.sinus_picture_projection(sph3,fileimg3);
  char fileout3[]="out3.fits";
  fserv.save(lcl,fileout3);
  LocalMap<double> lcl2(3,4);
  fserv.load(lcl2,fileout3);
  SphereGorski<double> sph4(nsmax);
  lcl2.Project(sph4);
  cout << " je  projette  la sphere 4 " <<endl;
  char fileimg4[]="img4.fits";
  fserv.sinus_picture_projection(sph4,fileimg4);
  */
   cout <<  " ===== Fin de testfits ======== " << endl;
   exit( 0 );
}
