00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00014 #include "BField/BfldMeshRect2d.h"
00015
00016 #include "MessageService/MsgService.h"
00017 CVSID("$Id: BfldMeshRect2d.cxx,v 1.8 2007/02/04 06:23:28 rhatcher Exp $");
00018
00019 #include "TClass.h"
00020 #include "TMath.h"
00021
00022 ClassImp(BfldMeshRect2d)
00023
00024
00025 BfldMeshRect2d::BfldMeshRect2d()
00026 : BfldMesh()
00027 {
00028
00029 }
00030
00031
00032 BfldMeshRect2d::BfldMeshRect2d(BfldMapRect2d* bmap)
00033 : BfldMesh(bmap->GetGrid(),bmap->GetVariant())
00034 {
00035 CopyMapRect2d(bmap);
00036 }
00037
00038
00039 BfldMeshRect2d::~BfldMeshRect2d()
00040 {
00041 MSG("Bfld",Msg::kDebug)
00042 << "~BfldMeshRect2d grid " << BfldGrid::AsString(fGrid)
00043 << " variant " << fVariant
00044 << endl;
00045 }
00046
00047
00048 TVector3 BfldMeshRect2d::GetGeneratorPosition(Int_t generator)
00049 {
00050
00051
00052 Float_t x, y;
00053 GeneratorToXY(generator,x,y);
00054 return TVector3(x,y,0.);
00055 }
00056
00057
00058 Bool_t BfldMeshRect2d::InBounds(Float_t x, Float_t y)
00059 {
00060
00061
00062 if (fQuadrant) {
00063 x = TMath::Abs(x);
00064 y = TMath::Abs(y);
00065 }
00066
00067
00068
00069
00070 return ( x >= fX0 && x < fXmax && y >= fY0 && y < fYmax );
00071
00072 }
00073
00074
00075 Int_t BfldMeshRect2d::InQuadrant(Float_t x, Float_t y)
00076 {
00077
00078
00079
00080
00081
00082
00083 if (fQuadrant) {
00084 if (x >= fX0) {
00085 if (y >= fY0) {
00086 return 0;
00087 } else {
00088 return 3;
00089 }
00090 } else {
00091 if (y >= fY0) {
00092 return 1;
00093 } else {
00094 return 2;
00095 }
00096 }
00097
00098 } else return 0;
00099
00100 }
00101
00102
00103 void BfldMeshRect2d::CopyMapRect2d(BfldMapRect2d *map)
00104 {
00105
00106
00107
00108
00109 BfldMapRect2d *fMap;
00110 fMap = map;
00111
00112
00113 fX0 = fMap->GetX0();
00114 fY0 = fMap->GetY0();
00115 fDx = fMap->GetDx();
00116 fDy = fMap->GetDy();
00117 fNx = fMap->GetNx();
00118 fNy = fMap->GetNy();
00119
00120
00121 fXmax = fX0 + (fNx-1)*fDx;
00122 fYmax = fY0 + (fNy-1)*fDy;
00123
00124 fIsUVZ = fMap->GetIsUVZ();
00125
00126
00127 fQuadrant = ( 0 == fX0 && 0 == fY0 );
00128
00129 fQuadFlags[0] = fMap->GetQuadFlags()[0];
00130 fQuadFlags[1] = fMap->GetQuadFlags()[1];
00131 fQuadFlags[2] = fMap->GetQuadFlags()[2];
00132 fQuadFlags[3] = fMap->GetQuadFlags()[3];
00133
00134 }
00135
00136
00137 void BfldMeshRect2d::Pick3Generators(Float_t x, Float_t y,
00138 Int_t& gen_near,
00139 Int_t& gen_cw, Int_t& gen_ccw)
00140 {
00141
00142
00143
00144
00145 if ( fQuadrant ) {
00146
00147 x = TMath::Abs(x);
00148 y = TMath::Abs(y);
00149 }
00150
00151
00152 Int_t llgen = LowerLeftGenerator(x,y);
00153
00154 Int_t dnx = 0;
00155 Int_t dny = 0;
00156
00157 Float_t xllgen = 0;
00158 Float_t yllgen = 0;
00159 GeneratorToXY(llgen,xllgen,yllgen);
00160
00161 if ( x - xllgen > 0.5*fDx) dnx = 1;
00162 if ( y - yllgen > 0.5*fDy) dny = 1;
00163
00164
00165
00166
00167
00168 Int_t sval = dny<<1 | dnx;
00169 switch (sval) {
00170 case 0:
00171
00172 gen_near = llgen;
00173 gen_cw = NeighborGenerator(llgen,1,0);
00174 gen_ccw = NeighborGenerator(llgen,0,1);
00175 break;
00176 case 1:
00177
00178 gen_near = NeighborGenerator(llgen,1,0);
00179 gen_cw = NeighborGenerator(llgen,1,1);
00180 gen_ccw = llgen;
00181 break;
00182 case 2:
00183
00184 gen_near = NeighborGenerator(llgen,0,1);
00185 gen_cw = llgen;
00186 gen_ccw = NeighborGenerator(llgen,1,1);
00187 break;
00188 case 3:
00189
00190 gen_near = NeighborGenerator(llgen,1,1);
00191 gen_cw = NeighborGenerator(llgen,0,1);
00192 gen_ccw = NeighborGenerator(llgen,1,0);
00193 break;
00194 default:
00195 MSG("Bfld",Msg::kFatal) <<
00196 "BfldMeshRect2d.cxx::Pick3Generators sval " << sval << endl;
00197 gen_near = llgen;
00198 gen_cw = NeighborGenerator(llgen,1,0);
00199 gen_ccw = NeighborGenerator(llgen,0,1);
00200 break;
00201 }
00202
00203
00204 Int_t generator = NeighborGenerator(llgen,dnx,dny);
00205 if (generator < 0) generator = llgen;
00206
00207
00208 }
00209
00210
00211 void BfldMeshRect2d::Pick4Generators(Float_t x, Float_t y,
00212 Int_t& gen_ll, Int_t& gen_lr,
00213 Int_t& gen_ur, Int_t& gen_ul)
00214 {
00215
00216
00217 if ( fQuadrant ) {
00218
00219 x = TMath::Abs(x);
00220 y = TMath::Abs(y);
00221 }
00222
00223 gen_ll = LowerLeftGenerator(x,y);
00224 gen_lr = NeighborGenerator(gen_ll,1,0);
00225 gen_ur = NeighborGenerator(gen_ll,1,1);
00226 gen_ul = NeighborGenerator(gen_ll,0,1);
00227
00228 }
00229
00230
00231 void BfldMeshRect2d::GeneratorToXY(Int_t generator, Float_t &x, Float_t &y)
00232 {
00233
00234
00235
00236
00237 Int_t ix,iy;
00238 GeneratorToIndices(generator,ix,iy);
00239
00240 x = ix * fDx + fX0;
00241 y = iy * fDy + fY0;
00242
00243 }
00244
00245
00246 Int_t BfldMeshRect2d::IndicesToGenerator(Int_t ix, Int_t iy)
00247 {
00248
00249
00250 return ix*fNy + iy;
00251 }
00252
00253
00254 void BfldMeshRect2d::GeneratorToIndices(Int_t gen, Int_t &ix, Int_t &iy)
00255 {
00256
00257
00258
00259
00260 ix = gen/fNy;
00261 iy = gen%fNy;
00262
00263 }
00264
00265
00266 Int_t BfldMeshRect2d::NearestGenerator(Float_t x, Float_t y)
00267 {
00268
00269
00270 if ( fQuadrant ) {
00271
00272 x = TMath::Abs(x);
00273 y = TMath::Abs(y);
00274 }
00275
00276 Float_t xx = (x - fX0) / fDx;
00277 Float_t yy = (y - fY0) / fDy;
00278
00279
00280 Int_t ix = TMath::Nint(xx);
00281 Int_t iy = TMath::Nint(yy);
00282
00283 ix = TMath::Min(ix,fNx-1);
00284 iy = TMath::Min(iy,fNy-1);
00285
00286 ix = TMath::Max(ix,0);
00287 iy = TMath::Max(iy,0);
00288
00289 return IndicesToGenerator(ix,iy);
00290 }
00291
00292
00293 Int_t BfldMeshRect2d::NearestGenerator(TVector3 xyz)
00294 {
00295
00296
00297 return NearestGenerator(xyz.X(),xyz.Y());
00298 }
00299
00300
00301 Int_t BfldMeshRect2d::LowerLeftGenerator(Float_t x, Float_t y)
00302 {
00303
00304
00305 if ( fQuadrant ) {
00306
00307 x = TMath::Abs(x);
00308 y = TMath::Abs(y);
00309 }
00310
00311 Float_t xx = (x - fX0) / fDx;
00312 Float_t yy = (y - fY0) / fDy;
00313
00314
00315 Int_t ix = TMath::Nint(floor(xx));
00316 Int_t iy = TMath::Nint(floor(yy));
00317
00318 ix = TMath::Min(ix,fNx-1);
00319 iy = TMath::Min(iy,fNy-1);
00320
00321 ix = TMath::Max(ix,0);
00322 iy = TMath::Max(iy,0);
00323
00324 return IndicesToGenerator(ix,iy);
00325 }
00326
00327
00328 Int_t BfldMeshRect2d::LowerLeftGenerator(TVector3 xyz)
00329 {
00330
00331
00332 return LowerLeftGenerator(xyz.X(),xyz.Y());
00333 }
00334
00335
00336 Int_t BfldMeshRect2d::NeighborGenerator(Int_t gen, Int_t dnx, Int_t dny)
00337 {
00338
00339
00340
00341 Int_t ix = 0;
00342 Int_t iy = 0;
00343
00344 GeneratorToIndices(gen,ix,iy);
00345
00346 ix = ix + dnx;
00347 iy = iy + dny;
00348
00349 if (ix<0 || ix>=fNx) return -1;
00350 if (iy<0 || iy>=fNy) return -1;
00351
00352 return IndicesToGenerator(ix,iy);
00353
00354 }
00355
00356