Changeset 3769 in Sophya for trunk/Cosmo/RadioBeam/mdish.cc
- Timestamp:
- May 7, 2010, 6:44:43 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cosmo/RadioBeam/mdish.cc
r3756 r3769 108 108 : nx(0),ny(0),xmin(0),xmax(0),ymin(0),ymax(0),sumw0(0.) 109 109 { 110 ixb0 = jyb0 = 0; 110 111 } 111 112 QHis2D::QHis2D(r_8 xMin,r_8 xMax,int_4 nxb,r_8 yMin,r_8 yMax,int_4 nyb) … … 123 124 sa_size_t sz[5]; sz[0]=nx; sz[1]=ny; 124 125 aw.ReSize(2,sz); 126 SetZeroBin(); 125 127 sumw0=0.; 126 128 return; … … 131 133 sa_size_t jy = (sa_size_t)((y-ymin)/dyb); 132 134 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.; 134 136 sumw0 += rw; 135 137 if (fgfh) aw(ix,jy) += w; 136 138 return rw; 137 139 } 140 void 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 } 138 145 Histo2D QHis2D::Convert() 139 146 { 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; 140 151 Histo2D h2(xmin,xmax,nx,ymin,ymax,ny); 141 152 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; 143 167 return h2; 144 168 } … … 159 183 cout << " MultiDish::GetResponse() - NDishes=" << dishes_.size() << " nx=" << nx_ << " ny=" << ny_ << endl; 160 184 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.); 168 191 169 192 double dold = dishes_[0].D/lambda_; … … 184 207 sumw += CumulResp(rd, (double)kt*dtet, (double)jp*dphi); 185 208 186 double kx 0 = DeuxPI*fabs(dishes_[1].X-dishes_[0].X)/lambda_;187 double ky 0 = DeuxPI*fabs(dishes_[1].Y-dishes_[0].Y)/lambda_;188 int_4 ib, 209 double kx1 = DeuxPI*(dishes_[0].DiameterX())/lambda_; 210 double ky1 = DeuxPI*(dishes_[0].DiameterY())/lambda_; 211 int_4 ib,jb; 189 212 // h2w_ /= h2cnt_; 190 213 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; 194 222 // double fnorm=sqrt((double)dishes_.size())/h2.VMax(); 195 223 double fnorm=1.; 196 if ( h2.VMax()> sumw) {224 if (vmax > sumw) { 197 225 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; 200 229 } 201 230 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; 205 234 } 206 235 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)=" 208 237 << h2(0,0) << endl; 209 238 return h2; 210 239 } 211 240 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 */ 241 Histo2D 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 } 254 251 255 252 double MultiDish::AddToHisto(double kx0, double ky0, double x, double y, double w, bool fgfh) … … 261 258 double xxm=kx0-x; 262 259 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); 268 267 return sumw; 269 268 } … … 275 274 double dx = h2w_.WBinX()/5; 276 275 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; 279 278 dx = DeuxPI*rd.Dx()/(double)nbx; 280 279 dy = DeuxPI*rd.Dy()/(double)nby; … … 287 286 288 287 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_; 292 291 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; 295 294 bool fgfh= (!fgnoauto_ || (dishes_[i].ReflectorId()!=dishes_[j].ReflectorId())); 296 295 for(int ix=0; ix<nbx; ix++) 297 296 for(int jy=0; jy<nby; jy++) { 298 297 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 } 301 318 } 302 }303 319 // if (i%10==0) 304 320 // cout << " MultiDish::CumulResp() done i=" << i << " / imax=" << dishes_.size() 305 321 // << " theta=" << theta << " phi=" << phi << endl; 322 } 306 323 } 307 324 return sumw;
Note:
See TracChangeset
for help on using the changeset viewer.