Changeset 3769 in Sophya for trunk/Cosmo/RadioBeam/mdish.cc


Ignore:
Timestamp:
May 7, 2010, 6:44:43 PM (15 years ago)
Author:
ansari
Message:

Corrections/amelioration du programme de calcul de la sensibilite interfero, Reza 07/05/2010

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cosmo/RadioBeam/mdish.cc

    r3756 r3769  
    108108  : nx(0),ny(0),xmin(0),xmax(0),ymin(0),ymax(0),sumw0(0.)
    109109{
     110  ixb0 = jyb0 = 0;
    110111}
    111112QHis2D::QHis2D(r_8 xMin,r_8 xMax,int_4 nxb,r_8 yMin,r_8 yMax,int_4 nyb)
     
    123124  sa_size_t sz[5];  sz[0]=nx;  sz[1]=ny;
    124125  aw.ReSize(2,sz);
     126  SetZeroBin();
    125127  sumw0=0.;
    126128  return;
     
    131133  sa_size_t jy = (sa_size_t)((y-ymin)/dyb);
    132134  if ((ix<0)||(ix>=nx)||(jy<0)||(jy>=ny))  return 0.;
    133   double rw = ((ix==0)&&(jy==0)) ? w : 0.;
     135  double rw = ((ix==ixb0)&&(jy==jyb0)) ? w : 0.;
    134136  sumw0 += rw;
    135137  if (fgfh) aw(ix,jy) += w;
    136138  return rw;
    137139}
     140void QHis2D::SetZeroBin(r_8 x, r_8 y)
     141{
     142  ixb0 = (sa_size_t)((x-xmin)/dxb);
     143  jyb0 = (sa_size_t)((y-ymin)/dyb);
     144}
    138145Histo2D QHis2D::Convert()
    139146{
     147  int_4 imn,jmn,imx,jmx;
     148  r_8 min = aw(0,0);
     149  r_8 max = aw(0,0);
     150  imn=jmn=imx=jmx=0;
    140151  Histo2D h2(xmin,xmax,nx,ymin,ymax,ny);
    141152  for(int_4 j=0; j<ny; j++)
    142     for(int_4 i=0; i<nx; i++)  h2(i,j) = aw(i,j);
     153    for(int_4 i=0; i<nx; i++) {
     154      h2(i,j) = aw(i,j);
     155      if (aw(i,j)>max) {
     156        imx=i;  jmx=j;  max=aw(i,j);
     157      }
     158      if (aw(i,j)<min) {
     159        imn=i;  jmn=j;  min=aw(i,j);
     160      }
     161    }
     162  cout << "QHis2D::Convert()/Info: Nx,Ny=" << nx << "," << ny << " SumW=" << sumw0
     163       << "\n ... Max:" << imx << "," << jmx << " ->" << max
     164       << " @" << imx*dxb+xmin << "," << jmx*dyb+ymin
     165       << "\n ...Min:" << imn << "," << jmn << " ->" << min
     166       << " @" << imn*dxb+xmin << "," << jmn*dyb+ymin << endl;
    143167  return h2;
    144168}
     
    159183  cout << " MultiDish::GetResponse() - NDishes=" << dishes_.size() << " nx=" << nx_ << " ny=" << ny_ << endl;
    160184  double kmx = 1.2*DeuxPI*dmax_/lambda_;
    161   /*
    162   h2w_= Histo2D(0.,kmx,nx_,0.,kmx,ny_);
    163   h2cnt_= Histo2D(0.,kmx,nx_,0.,kmx,ny_);
    164   h2w_.Zero();
    165   h2cnt_.Zero();
    166   */
    167   h2w_.Define(0.,kmx,nx_,0.,kmx,ny_);
     185  double dkmx = kmx/(double)nx_;
     186  double dkmy = kmx/(double)ny_;
     187  double kmxx = ((double)nx_+0.5)*dkmx;
     188  double kmxy = ((double)ny_+0.5)*dkmy;
     189  h2w_.Define(-kmxx,kmxx,2*nx_+1,-kmxy,kmxy,2*ny_+1);
     190  h2w_.SetZeroBin(0.,0.);
    168191
    169192  double dold = dishes_[0].D/lambda_;
     
    184207      sumw += CumulResp(rd, (double)kt*dtet, (double)jp*dphi);
    185208
    186   double kx0 = DeuxPI*fabs(dishes_[1].X-dishes_[0].X)/lambda_;
    187   double ky0 = DeuxPI*fabs(dishes_[1].Y-dishes_[0].Y)/lambda_;
    188   int_4 ib, jb;
     209  double kx1 = DeuxPI*(dishes_[0].DiameterX())/lambda_;
     210  double ky1 = DeuxPI*(dishes_[0].DiameterY())/lambda_;
     211  int_4 ib,jb;
    189212  //  h2w_ /= h2cnt_;
    190213  Histo2D h2 = h2w_.Convert();
    191   h2.FindBin(kx0, ky0, ib, jb);
    192   cout << " ---- MultiDish::GetResponse() VMin=" << h2.VMin() << " VMax= " << h2.VMax()
    193        << " h(0,0)=" << h2(0,0) << " h(" << ib <<"," << jb << ")=" << h2(ib,jb) <<endl;
     214  h2.FindBin(kx1, ky1, ib, jb);
     215  if ((kx1<0)||(ky1<0)||(kx1>=h2.NBinX())||(ky1>=h2.NBinY())) {
     216    cout << " MultiDish::GetResponse[1]/ERROR kx1,ky1=" << kx1 <<","<< ky1 << " --> ib,jb=" << ib <<","<< jb << endl;
     217    ib=jb=0;
     218  }
     219  double vmax=h2.VMax();
     220  cout << " MultiDish::GetResponse[1] VMin=" << h2.VMin() << " VMax= " << vmax 
     221       << " h(0,0)=" << h2(0,0) << " kx1,ky1->h(" << ib <<"," << jb << ")=" << h2(ib,jb) <<endl;
    194222  //  double fnorm=sqrt((double)dishes_.size())/h2.VMax();
    195223  double fnorm=1.;
    196   if (h2.VMax() > sumw) {
     224  if (vmax > sumw) {
    197225    fnorm=(double)dishes_.size()/h2.VMax();
    198     cout << " ---- MultiDish::GetResponse() NDishes=" << dishes_.size() << " sumw=" << sumw
    199          << " Renormalizing x NDishes/sumw  " << fnorm << endl;
     226    cout << " MultiDish::GetResponse[2]/Warning h2.VMax()=" << vmax << " >  sumw=" << sumw << endl; 
     227    cout << "   ... NDishes=" << dishes_.size() << " sumw=" << sumw
     228         << " Renormalizing x NDishes/VMax  " << fnorm << endl;
    200229  }
    201230  else {
    202     fnorm=(double)dishes_.size()/h2.VMax();
    203     cout << " ---- MultiDish::GetResponse() NDishes=" << dishes_.size() << " VMax=" << h2.VMax() 
    204          << " Renormalizing x NDishes/h2.VMax()   " << fnorm << endl;
     231    fnorm=(double)dishes_.size()/sumw;
     232    cout << " MultiDish::GetResponse[3] NDishes=" << dishes_.size() << " sumw=" << sumw 
     233         << " Renormalizing x NDishes/sumw   " << fnorm << endl;
    205234  }
    206235  h2 *= fnorm;
    207   cout << " ---- MultiDish::GetResponse() APRES VMin=" << h2.VMin() << " VMax= " << h2.VMax() << " h(0,0)="
     236  cout << " ---- MultiDish::GetResponse/[4] APRES VMin=" << h2.VMin() << " VMax= " << h2.VMax() << " h(0,0)="
    208237       << h2(0,0) << endl;
    209238  return h2;
    210239}
    211240
    212 /*
    213 double MultiDish::AddToHisto(double kx0, double ky0, double x, double y, double w, bool fgfh)
    214 {
    215   double xxp = kx0+x;
    216   double yyp = ky0+y;
    217   double sumw=0.;
    218   int_4 ib, jb;
    219   h2w_.FindBin(xxp, yyp, ib, jb);
    220   if ((ib==0)&&(jb==0))  sumw+=w;
    221   if (fgfh) {
    222     h2w_.Add(xxp, yyp, w);
    223     h2cnt_.Add(xxp, yyp, 1.);
    224   }
    225   double xxm=kx0-x;
    226   double yym=ky0-y;
    227   if (xxm>0.)  {
    228     h2w_.FindBin(xxm, yyp, ib, jb);
    229     if ((ib==0)&&(jb==0))  sumw+=w;
    230     if (fgfh) {
    231       h2w_.Add(xxm, yyp, w);
    232       h2cnt_.Add(xxm, yyp, 1.);
    233     }
    234     if (yym>0.) {
    235       h2w_.FindBin(xxm, yym, ib, jb);
    236       if ((ib==0)&&(jb==0))  sumw+=w;
    237       if (fgfh) {
    238         h2w_.Add(xxm, yym, w);
    239         h2cnt_.Add(xxm, yym, 1.);
    240       }
    241     }
    242   }
    243   if (yym>0.)  {
    244     h2w_.FindBin(xxp, yym, ib, jb);
    245     if ((ib==0)&&(jb==0))  sumw+=w;
    246     if (fgfh) {
    247       h2w_.Add(xxp, yym, w);
    248       h2cnt_.Add(xxp, yym, 1.);
    249     }
    250   }
    251   return sumw;
    252 }
    253 */
     241Histo2D MultiDish::PosDist(int nx, int ny, double dmax)
     242{
     243  if (dmax<1e-3)  dmax=nx*dishes_[0].Diameter();
     244  double dd = dmax/nx/2.;
     245  Histo2D hpos(-dd,dmax+dd,nx+1,-dd,dmax+dd,ny+1);
     246  for(size_t i=0; i<NbDishes(); i++) {
     247    hpos.Add(dishes_[i].X, dishes_[i].Y);
     248  }
     249  return hpos;
     250}
    254251
    255252double MultiDish::AddToHisto(double kx0, double ky0, double x, double y, double w, bool fgfh)
     
    261258  double xxm=kx0-x;
    262259  double yym=ky0-y;
    263   if (xxm>0.)  {
    264     sumw += h2w_.Add(xxm, yyp, w, fgfh);
    265     if (yym>0.)  sumw += h2w_.Add(xxm, yym, w, fgfh);
    266   }
    267   if (yym>0.)  sumw += h2w_.Add(xxp, yym, w, fgfh);
     260  //  if (xxm>0.)  {
     261  sumw += h2w_.Add(xxm, yyp, w, fgfh);
     262  // if (yym>0.) 
     263  sumw += h2w_.Add(xxm, yym, w, fgfh);
     264  //  }
     265  // if (yym>0.) 
     266  sumw += h2w_.Add(xxp, yym, w, fgfh);
    268267  return sumw;
    269268}
     
    275274  double dx = h2w_.WBinX()/5;
    276275  double dy = h2w_.WBinY()/5;
    277   int nbx = DeuxPI*rd.Dx()/dx;
    278   int nby = DeuxPI*rd.Dy()/dy;
     276  int nbx = DeuxPI*rd.Dx()/dx+1;
     277  int nby = DeuxPI*rd.Dy()/dy+1;
    279278  dx = DeuxPI*rd.Dx()/(double)nbx;
    280279  dy = DeuxPI*rd.Dy()/(double)nby;
     
    287286
    288287  for(size_t i=0; i<dishes_.size(); i++) {
    289     for(size_t j=i; j<dishes_.size(); j++) {
    290       double kx0 = DeuxPI*fabs(dishes_[i].X-dishes_[j].X)/lambda_;
    291       double ky0 = DeuxPI*fabs(dishes_[i].Y-dishes_[j].Y)/lambda_;
     288    for(size_t j=0; j<dishes_.size(); j++) {
     289      double kx0 = DeuxPI*(dishes_[i].X-dishes_[j].X)/lambda_;
     290      double ky0 = DeuxPI*(dishes_[i].Y-dishes_[j].Y)/lambda_;
    292291      rot.Do(kx0, ky0);
    293       if (kx0<0) kx0=-kx0;
    294       if (ky0<0) ky0=-ky0;
     292      //    if (kx0<0) kx0=-kx0;
     293      //    if (ky0<0) ky0=-ky0;
    295294      bool fgfh= (!fgnoauto_ || (dishes_[i].ReflectorId()!=dishes_[j].ReflectorId()));
    296295      for(int ix=0; ix<nbx; ix++)
    297296        for(int jy=0; jy<nby; jy++) {
    298297          double x = ix*dx; 
    299           double y = jy*dy; 
    300           sumw += AddToHisto(kx0, ky0, x, y, rd(x,y), fgfh);
     298          double y = jy*dy;
     299          if ((ix>0)&&(jy>0)) {
     300            sumw += AddToHisto(kx0, ky0, x, y, rd(x,y), fgfh);
     301          }
     302          else {
     303            if ((ix==0)&&(jy==0))
     304              sumw += h2w_.Add(kx0, ky0, rd(0.,0.), fgfh);
     305            else {
     306              double w = rd(x,y);
     307              if (ix==0) {
     308                sumw += h2w_.Add(kx0, ky0+y, w, fgfh);
     309                sumw += h2w_.Add(kx0, ky0-y, w, fgfh);
     310              }
     311              else {
     312                sumw += h2w_.Add(kx0+x, ky0, w, fgfh);
     313                sumw += h2w_.Add(kx0-x, ky0, w, fgfh);
     314              }
     315            }
     316            //   
     317          }
    301318        }
    302     }
    303319    //    if (i%10==0)
    304320    //      cout << " MultiDish::CumulResp() done i=" << i << " / imax=" << dishes_.size()
    305321    //     << " theta=" << theta << " phi=" << phi << endl;
     322    }
    306323  }
    307324  return sumw;
Note: See TracChangeset for help on using the changeset viewer.