FEDRA emulsion software from the OPERA Collaboration
EdbAlignment Class Reference

#include <EdbAlignment.h>

Inheritance diagram for EdbAlignment:
Collaboration diagram for EdbAlignment:

Public Member Functions

 EdbAlignment ()
 
 ~EdbAlignment ()
 

Static Public Member Functions

static int Calculate (const TObjArray &segarr1, const TObjArray &segarr2, EdbAffine2D &aff)
 
static int Calculate (TArrayF &X1, TArrayF &Y1, TArrayF &X2, TArrayF &Y2, EdbAffine2D &aff)
 
static int CalculateM (const TObjArray &segarr1, const TObjArray &segarr2, EdbAffine2D &aff, int flag=0)
 
static float DTX (const TObjArray &segarr1, const TObjArray &segarr2)
 
static float DTY (const TObjArray &segarr1, const TObjArray &segarr2)
 
static float DVAR (const TObjArray &segarr1, const TObjArray &segarr2, int ivar)
 
static float DX (const TObjArray &segarr1, const TObjArray &segarr2)
 
static float DY (const TObjArray &segarr1, const TObjArray &segarr2)
 
static void MakeAff (Double_t X0, Double_t Y0, Double_t dX, Double_t dY, Double_t dPhi, EdbAffine2D &aff)
 

Constructor & Destructor Documentation

◆ EdbAlignment()

EdbAlignment::EdbAlignment ( )
inline
17 {}

◆ ~EdbAlignment()

EdbAlignment::~EdbAlignment ( )
inline
18 {}

Member Function Documentation

◆ Calculate() [1/2]

int EdbAlignment::Calculate ( const TObjArray &  segarr1,
const TObjArray &  segarr2,
EdbAffine2D aff 
)
static
52 {
53  // aff applied to pattern 1 gives pattern 2
54  int n = Min( segarr1.GetEntriesFast(), segarr2.GetEntriesFast() );
55  if(n<1) return 0;
56  TArrayF X1(n), Y1(n), X2(n), Y2(n);
57  for(int i=0; i<n; i++) {
58  X1[i] = ((EdbSegP *)segarr1.At(i))->X();
59  Y1[i] = ((EdbSegP *)segarr1.At(i))->Y();
60  X2[i] = ((EdbSegP *)segarr2.At(i))->X();
61  Y2[i] = ((EdbSegP *)segarr2.At(i))->Y();
62  }
63  return Calculate( X1,Y1, X2,Y2, aff );
64 }
static int Calculate(const TObjArray &segarr1, const TObjArray &segarr2, EdbAffine2D &aff)
Definition: EdbAlignment.cxx:51
Definition: EdbSegP.h:18
Double_t X
Definition: tlg2pattern.C:77
Double_t Y
Definition: tlg2pattern.C:77
Float_t X2
Definition: testChi2Ordering.C:24

◆ Calculate() [2/2]

int EdbAlignment::Calculate ( TArrayF &  X1,
TArrayF &  Y1,
TArrayF &  X2,
TArrayF &  Y2,
EdbAffine2D aff 
)
static
68 {
69  // this function do not use the matrix inversion for the precision reasons
70  // aff applied to pattern 1 gives pattern 2
71 
72  int n = Min( X1.GetSize(), X2.GetSize() );
73  if(n<1) return 0;
74 
75  Double_t dX = 0, dY=0, dPhi=0;
76  Double_t X0 = 0, Y0=0;
77 
78  for(int i=0; i<n; i++) {
79  dX += X2[i] - X1[i];
80  dY += Y2[i] - Y1[i];
81  X0 += X1[i];
82  Y0 += Y1[i];
83  }
84  dX /= n; dY /= n; X0 /= n; Y0 /= n;
85 
86  if(n<2) return n;
87 
88  Double_t x1 = 0, y1=0, x2=0, y2=0;
89  Double_t R=0, r=0;
90  for(int i=0; i<n; i++) {
91  x1 = X1[i] -X0;
92  y1 = Y1[i] -Y0;
93  x2 = X2[i] -X0 -dX;
94  y2 = Y2[i] -Y0 -dY;
95 
96  r = Sqrt(x1*x1+y1*y1);
97  dPhi += (ATan2(-y2,-x2) - ATan2(-y1,-x1)) * r;
98  R += r;
99  }
100  dPhi /= R;
101 
102  MakeAff(X0,Y0, dX,dY, dPhi, aff);
103 
104  printf("X0,Y0 = %f %f dX,dY= %f %f dPhi = %f\n",X0,Y0,dX,dY,dPhi);
105  return n;
106 }
static void MakeAff(Double_t X0, Double_t Y0, Double_t dX, Double_t dY, Double_t dPhi, EdbAffine2D &aff)
Definition: EdbAlignment.cxx:109
float X0
Definition: emthickness.cpp:69
float Y0
Definition: emthickness.cpp:70
void r(int rid=2)
Definition: test.C:201

◆ CalculateM()

int EdbAlignment::CalculateM ( const TObjArray &  segarr1,
const TObjArray &  segarr2,
EdbAffine2D aff,
int  flag = 0 
)
static
36 {
37  // interface to the matrix procedure
38  int n = Min( segarr1.GetEntriesFast(), segarr2.GetEntriesFast() );
39  if(n<1) return 0;
40  TArrayF X1(n), Y1(n), X2(n), Y2(n);
41  for(int i=0; i<n; i++) {
42  X1[i] = ((EdbSegP *)segarr1.At(i))->X();
43  Y1[i] = ((EdbSegP *)segarr1.At(i))->Y();
44  X2[i] = ((EdbSegP *)segarr2.At(i))->X();
45  Y2[i] = ((EdbSegP *)segarr2.At(i))->Y();
46  }
47  return aff.Calculate( n, X1.fArray,Y1.fArray, X2.fArray,Y2.fArray , flag);
48 }
Int_t Calculate(EdbPointsBox2D *b1, EdbPointsBox2D *b2)
Definition: EdbAffine.cxx:260

◆ DTX()

static float EdbAlignment::DTX ( const TObjArray &  segarr1,
const TObjArray &  segarr2 
)
inlinestatic
23 { return DVAR(segarr1,segarr2,3); }
static float DVAR(const TObjArray &segarr1, const TObjArray &segarr2, int ivar)

◆ DTY()

static float EdbAlignment::DTY ( const TObjArray &  segarr1,
const TObjArray &  segarr2 
)
inlinestatic
24 { return DVAR(segarr1,segarr2,4); }

◆ DVAR()

static float EdbAlignment::DVAR ( const TObjArray &  segarr1,
const TObjArray &  segarr2,
int  ivar 
)
static

◆ DX()

static float EdbAlignment::DX ( const TObjArray &  segarr1,
const TObjArray &  segarr2 
)
inlinestatic
21 { return DVAR(segarr1,segarr2,1); }

◆ DY()

static float EdbAlignment::DY ( const TObjArray &  segarr1,
const TObjArray &  segarr2 
)
inlinestatic
22 { return DVAR(segarr1,segarr2,2); }

◆ MakeAff()

void EdbAlignment::MakeAff ( Double_t  X0,
Double_t  Y0,
Double_t  dX,
Double_t  dY,
Double_t  dPhi,
EdbAffine2D aff 
)
static
110 {
111  aff.Reset();
112  aff.Rotate(dPhi);
113  Double_t x1new = X0*Cos(dPhi)-Y0*Sin(dPhi);
114  Double_t y1new = X0*Sin(dPhi)+Y0*Cos(dPhi);
115  aff.ShiftX(X0-x1new+dX);
116  aff.ShiftY(Y0-y1new+dY);
117 }
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void Reset()
Definition: EdbAffine.cxx:72
void Rotate(float angle)
Definition: EdbAffine.cxx:383

The documentation for this class was generated from the following files: