232{
237
238 int n0 = b0->N();
240 int n = TMath::Min(n0,n1);
241
243 Double_t b=0;
244 Double_t c=0;
248
249 if(n<2) return 0;
250
251 else if(n==2){
252
253 Double_t dx0 = b0->At(1)->X() - b0->At(0)->X();
254 Double_t dy0 = b0->At(1)->Y() - b0->At(0)->Y();
255 Double_t dx1 = b1->
At(1)->
X() - b1->
At(0)->
X();
256 Double_t dy1 = b1->
At(1)->
Y() - b1->
At(0)->
Y();
257
258 Double_t
s = TMath::Sqrt(dx1*dx1+dy1*dy1)/TMath::Sqrt(dx0*dx0+dy0*dy0);
259 Double_t th =
Phi(dx1,dy1)-
Phi(dx0,dy0);
260
261 a =
s*TMath::Cos(th);
262 b = -
s*TMath::Sin(th);
263 c =
s*TMath::Sin(th);
264 d =
s*TMath::Cos(th);
265 p = b1->
At(0)->
X() -
a*b0->At(0)->X() - b*b0->At(0)->Y();
266 q = b1->
At(0)->
Y() - c*b0->At(0)->X() -
d*b0->At(0)->Y();
267
268 }
269 else {
270
271 Double_t
272 sx0 =0,
273 sy0 =0,
274 sx1 =0,
275 sy1 =0,
276 sx0x0 =0,
277 sy0y0 =0,
278 sx0y0 =0,
279 sx0x1 =0,
280 sx0y1 =0,
281 sx1y0 =0,
282 sy0y1 =0,
284
285 for(int i=0; i<n; i++) {
287 sx0 = sx0 *i*
r + b0->At(i)->X() *
r;
288 sy0 = sy0 *i*
r + b0->At(i)->Y() *
r;
289 sx1 = sx1 *i*
r + b1->
At(i)->
X() *
r;
290 sy1 = sy1 *i*
r + b1->
At(i)->
Y() *
r;
291 sx0x0 = sx0x0 *i*
r + b0->At(i)->X() * b0->At(i)->X() *
r;
292 sy0y0 = sy0y0 *i*
r + b0->At(i)->Y() * b0->At(i)->Y() *
r;
293 sx0y0 = sx0y0 *i*
r + b0->At(i)->X() * b0->At(i)->Y() *
r;
294 sx0x1 = sx0x1 *i*
r + b0->At(i)->X() * b1->
At(i)->
X() *
r;
295 sx0y1 = sx0y1 *i*
r + b0->At(i)->X() * b1->
At(i)->
Y() *
r;
296 sx1y0 = sx1y0 *i*
r + b1->
At(i)->
X() * b0->At(i)->Y() *
r;
297 sy0y1 = sy0y1 *i*
r + b0->At(i)->Y() * b1->
At(i)->
Y() *
r;
298 }
299
300 Double_t sp0 = sx0x1 - sx0*sx1;
301 Double_t sp1 = sx1y0 - sx1*sy0;
302 Double_t sq0 = sx0y1 - sx0*sy1;
303 Double_t sq1 = sy0y1 - sy0*sy1;
304
305 Double_t sar = sx0x0 - sx0*sx0;
306 Double_t sbr = sx0y0 - sx0*sy0;
307 Double_t scr = sbr;
308 Double_t sdr = sy0y0 - sy0*sy0;
309 Double_t det = sar*sdr-sbr*scr;
310
311 if ( det < 0.0000000001 ) {
Log(1,
"EdbAffine2D::Calculate",
"determinant is too small: %g",det);
return 0; }
312
313 Double_t sa = sdr/det;
314 Double_t sb = -sbr/det;
315 Double_t sc = -scr/det;
316 Double_t
sd = sar/det;
317
320 c = sa*sq0+sb*sq1;
324 }
325
326 Log(3,
"Calculate",
"Aff2D( %6d ): %9.6f %9.6f %9.6f %9.6f %12.6f %12.6f",
328
330
331 return 1;
332}
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
void d()
Definition: RecDispEX.C:381
void a()
Definition: check_aligned.C:59
Double_t Phi(Double_t x, Double_t y) const
Definition: EdbAffine.cxx:347
virtual Float_t Y() const =0
virtual Float_t X() const =0
virtual Int_t N() const =0
virtual EdbPoint * At(int i) const =0
s
Definition: check_shower.C:55
void sd()
Definition: check_vertex.C:185
q
Definition: testBGReduction_AllMethods.C:55
p
Definition: testBGReduction_AllMethods.C:8
void r(int rid=2)
Definition: test.C:201