FEDRA emulsion software from the OPERA Collaboration
EdbAlignmentV Class Reference

#include <EdbAlignmentV.h>

Inheritance diagram for EdbAlignmentV:
Collaboration diagram for EdbAlignmentV:

Public Member Functions

void AddSegCouple (EdbSegP *s1, EdbSegP *s2)
 
void ApplyLimitsOffset (float &xmin1, float &xmax1, float &xmin2, float &xmax2, float offsetMax)
 
void AssignFlagToS (int flag)
 
Int_t CalcAffFull ()
 
Int_t CalcApplyFractMeanDiff ()
 
Int_t CalcApplyMeanDiff ()
 
Float_t CalcFractMeanDiff (int ivar, float fraction)
 
Float_t CalcMeanDiff (int ivar)
 
Float_t CalcMeanDiff2Const (int ivar, int side, float mean)
 
Float_t CalcMeanDZ (float tmin=0.1, float tmax=2.)
 
Float_t CalcMeanShr (float tmin=0.1, float tmax=2.)
 
Int_t CalculateAffTXTY (EdbAffine2D &aff)
 
Int_t CalculateAffTXTY (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
Int_t CalculateAffTXTYShift (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
Int_t CalculateAffTXTYTurn (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
Int_t CalculateAffXY (EdbAffine2D &aff)
 
Int_t CalculateAffXY (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
Int_t CalculateAffXYShift (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
Int_t CalculateAffXYTurn (EdbAffine2D &aff)
 
Int_t CalculateAffXYTurn (TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
 
void CloseOutputFile ()
 
void Corr2Aff (EdbLayer &layer)
 
void Corr2Aff (EdbSegCorr &corr, EdbLayer &layer)
 
void CorrToCoG (int side, EdbPattern &p)
 
void CorrToCoG (int side, TObjArray &p)
 
float CoupleQuality (EdbSegP &s1, EdbSegP &s2)
 
bool DefineGuessCell (float xmin1, float xmax1, float ymin1, float ymax1, float xmin2, float xmax2, float ymin2, float ymax2, int np1, int np2, float binOK)
 
int DoubletsFilterOut (int checkview, TH2F *hxy=0, TH2F *htxty=0)
 
 EdbAlignmentV ()
 
void FillCell (int side, EdbPattern &pat)
 
void FillCell (int side, TObjArray &pat)
 
int FillCombinations ()
 
int FillCombinations (float dv[4], float dxMax, float dyMax, bool doFill)
 
void FillGuessCell (EdbPattern &p1, EdbPattern &p2, float binOK=1., float offsetMax=2000.)
 
void FillGuessCell (TObjArray &p1, TObjArray &p2, float binOK=1., float offsetMax=2000.)
 
void FillThetaHist (int side, EdbH2 &htxy)
 
Int_t FindCorrDiff (float dvsame[4], int side=0, int nlim=10)
 
Float_t FindDensityPeak (TArrayF &arr, float fraction)
 
Int_t FindDiff (TObjArray &arr1, TObjArray &arr2, float dvlim[4], float dvfound[4])
 
float FineCorrPhi (TObjArray &sel1, TObjArray &sel2)
 
float FineCorrZ ()
 
float FineCorrZ (TObjArray &sel1, TObjArray &sel2)
 
void HDistance (EdbPattern &p1, EdbPattern &p2, float dxMax, float dyMax)
 
void InitHphi (int n, float min, float max)
 
void InitHshr0 (int n, float min, float max)
 
void InitHshr1 (int n, float min, float max)
 
void InitHx (int n, float min, float max)
 
void InitHy (int n, float min, float max)
 
void InitHz (int n, float min, float max)
 
void InitOutputFile (const char *file="report_al.root", const char *option="RECREATE")
 
void InitPatCellBin (int side, EdbPattern &pat, float binx, float biny)
 
void InitPatCellN (EdbCell2 &cell, EdbPattern &pat, int nx, int ny)
 
Bool_t IsInsideDVsame (EdbSegP &s1, EdbSegP &s2)
 
Int_t Ncoins (float dvlim[4], EdbH2 *hdxy=0, EdbH2 *hdtxty=0, TObjArray *sel1=0, TObjArray *sel2=0)
 
Int_t Ncp ()
 
int OptimiseVar1 (int side, int ivar, EdbH2 *hdxy=0, EdbH2 *hdtxy=0)
 
void OptimiseVar2 (int side1, int ivar1, int side2, int ivar2, EdbH2 &h12, EdbH2 *hdxy=0, EdbH2 *hdtxty=0)
 
void PrintCorr ()
 
int SelectBestCouple ()
 
int SelectIsolated ()
 
Bool_t SideOK (int side)
 
char * StrDVsame () const
 
float TX (int side, EdbSegP &s)
 
float TY (int side, EdbSegP &s)
 
Bool_t ValidCoinsidence (EdbSegP &s1, EdbSegP &s2, float dvlim[4], float dvfound[4])
 
float Var (int side, EdbSegP &s, int ivar)
 
float Var (int side, int iseg, int ivar)
 
float X (int side, EdbSegP &s)
 
float Xmax (int side, EdbPattern &p)
 
float Xmax (int side, TObjArray &p)
 
float Xmin (int side, EdbPattern &p)
 
float Xmin (int side, TObjArray &p)
 
float Y (int side, EdbSegP &s)
 
float Ymax (int side, EdbPattern &p)
 
float Ymax (int side, TObjArray &p)
 
float Ymin (int side, EdbPattern &p)
 
float Ymin (int side, TObjArray &p)
 
virtual ~EdbAlignmentV ()
 

Static Public Member Functions

static Int_t CheckEqualArr (TObjArray &arr1, TObjArray &arr2)
 

Public Attributes

EdbSegCorr eCorr [2]
 
EdbLayer eCorrL [2]
 
TH1I * eDoubletsRate
 
Float_t eDVsame [4]
 
EdbH1 eH [2][7]
 
EdbH2 eHxy
 
TFile * eOutputFile
 
EdbCell2 ePC [2]
 
TObjArray eS [2]
 
Bool_t eUseAffCorr
 
Float_t eXmarg
 
Float_t eYmarg
 

Constructor & Destructor Documentation

◆ EdbAlignmentV()

EdbAlignmentV::EdbAlignmentV ( )
24 {
25  eXmarg = eYmarg = 0.0001; // margins for the cell definition
26  eDoubletsRate=0;
27  eUseAffCorr = false; // by default use eCorr (separated corrections)
28  eOutputFile=0;
29 }
TFile * eOutputFile
Definition: EdbAlignmentV.h:35
TH1I * eDoubletsRate
Definition: EdbAlignmentV.h:33
Bool_t eUseAffCorr
Definition: EdbAlignmentV.h:23
Float_t eYmarg
Definition: EdbAlignmentV.h:19
Float_t eXmarg
Definition: EdbAlignmentV.h:19

◆ ~EdbAlignmentV()

EdbAlignmentV::~EdbAlignmentV ( )
virtual
33 {
34  eS[0].Clear();
35  eS[1].Clear();
36  SafeDelete(eDoubletsRate);
37 }
TObjArray eS[2]
Definition: EdbAlignmentV.h:21

Member Function Documentation

◆ AddSegCouple()

void EdbAlignmentV::AddSegCouple ( EdbSegP s1,
EdbSegP s2 
)
inline
78 { eS[0].Add(s1); eS[1].Add(s2); }
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ ApplyLimitsOffset()

void EdbAlignmentV::ApplyLimitsOffset ( float &  xmin1,
float &  xmax1,
float &  xmin2,
float &  xmax2,
float  offsetMax 
)
889 {
890  if(Abs(xmin2-xmin1)>offsetMax) // cut useless patterns margins
891  if(xmin2>xmin1) xmin1=xmin2-offsetMax;
892  else xmin2=xmin1-offsetMax;
893  if(Abs(xmax2-xmax1)>offsetMax)
894  if(xmax2>xmax1) xmax2=xmax1+offsetMax;
895  else xmax1=xmax2+offsetMax;
896 }

◆ AssignFlagToS()

void EdbAlignmentV::AssignFlagToS ( int  flag)
225 {
226  int n = CheckEqualArr(eS[0], eS[1]);
227  for(int i=0; i<n; i++) {
228  ((EdbSegP*)eS[0].UncheckedAt(i))->SetFlag(flag);
229  ((EdbSegP*)eS[1].UncheckedAt(i))->SetFlag(flag);
230  }
231 }
static Int_t CheckEqualArr(TObjArray &arr1, TObjArray &arr2)
Definition: EdbAlignmentV.cxx:415
Definition: EdbSegP.h:18

◆ CalcAffFull()

Int_t EdbAlignmentV::CalcAffFull ( )
656 {
657  eUseAffCorr=true;
658  eCorrL[0].SetZcorr( FineCorrZ( eS[0], eS[1] ) );
659  EdbAffine2D aff1to2XY;
660  CalculateAffXY( eS[0], eS[1], aff1to2XY);
661  eCorrL[0].GetAffineXY()->Transform(&aff1to2XY);
662  EdbAffine2D aff2to1TXTY;
663  CalculateAffTXTY( eS[1], eS[0], aff2to1TXTY);
664  eCorrL[1].GetAffineTXTY()->Transform(&aff2to1TXTY);
665 }
Definition: EdbAffine.h:17
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
Int_t CalculateAffXY(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:97
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
Int_t CalculateAffTXTY(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:98
float FineCorrZ()
Definition: EdbAlignmentV.h:91
void SetZcorr(float zcorr)
Definition: EdbLayer.h:107
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121

◆ CalcApplyFractMeanDiff()

Int_t EdbAlignmentV::CalcApplyFractMeanDiff ( )
633 {
634  // by default apply it to side 0
635  int side=0;
636  int n = CheckEqualArr(eS[0],eS[1]);
637 
638 // if(n<nlim) return 0; //TODO
639 
640  eCorr[side].AddV( 3, CalcFractMeanDiff( 2, 0.4 ) ); // calc and apply angles
641  eCorr[side].AddV( 4, CalcFractMeanDiff( 3, 0.4 ) );
642 
643  //eCorr[side].SetV( 2, CalcMeanDZ() ); // calc and apply DZ
644 
645  //eCorr[side].SetV( 5, eCorr[side].V(5) * CalcMeanShr() ); // calc and apply shrinkage
646 
647 
648  eCorr[side].AddV( 0, CalcFractMeanDiff( 0, 0.4 ) ); // then apply coord
649  eCorr[side].AddV( 1, CalcFractMeanDiff( 1, 0.4 ) );
650 
651  return n;
652 }
Float_t CalcFractMeanDiff(int ivar, float fraction)
Definition: EdbAlignmentV.cxx:592
EdbSegCorr eCorr[2]
Definition: EdbAlignmentV.h:24
void AddV(int i, float x)
Definition: EdbSegCorr.h:22

◆ CalcApplyMeanDiff()

Int_t EdbAlignmentV::CalcApplyMeanDiff ( )
684 {
685  // by default apply it to side 0
686  int side=0;
687  int n = CheckEqualArr(eS[0],eS[1]);
688 
689 // if(n<nlim) return 0; //TODO
690 
691  eCorr[side].AddV( 3, CalcMeanDiff(2) ); // then apply angles
692  eCorr[side].AddV( 4, CalcMeanDiff(3) );
693 
694  eCorr[side].SetV( 2, CalcMeanDZ() ); // at first calc and apply DZ
695 
696  eCorr[side].SetV( 5, eCorr[side].V(5) * CalcMeanShr() ); // second calc and apply shrinkage
697 
698 
699  eCorr[side].AddV( 0, CalcMeanDiff(0) ); // then apply coord
700  eCorr[side].AddV( 1, CalcMeanDiff(1) );
701 
702  return n;
703 }
Float_t CalcMeanDZ(float tmin=0.1, float tmax=2.)
Definition: EdbAlignmentV.cxx:535
Float_t CalcMeanDiff(int ivar)
Definition: EdbAlignmentV.cxx:562
Float_t CalcMeanShr(float tmin=0.1, float tmax=2.)
Definition: EdbAlignmentV.cxx:514
void SetV(int i, float x)
Definition: EdbSegCorr.h:21

◆ CalcFractMeanDiff()

Float_t EdbAlignmentV::CalcFractMeanDiff ( int  ivar,
float  fraction 
)
593 {
594  // Calculate mean difference for the highest density region
595  int n = CheckEqualArr(eS[0],eS[1]);
596  TArrayF arr(n);
597  for(int i=0; i<n; i++) {
598  arr[i] = ( Var( 1, i, ivar ) - Var( 0, i, ivar) );
599  }
600  return FindDensityPeak( arr, fraction);
601 }
Float_t FindDensityPeak(TArrayF &arr, float fraction)
Definition: EdbAlignmentV.cxx:604
float Var(int side, EdbSegP &s, int ivar)
Definition: EdbAlignmentV.h:126
float fraction
Definition: emthickness.cpp:50

◆ CalcMeanDiff()

Float_t EdbAlignmentV::CalcMeanDiff ( int  ivar)
563 {
564  // Calculate mean difference for the given variable taking into account corrections
565  int n = CheckEqualArr(eS[0],eS[1]);
566  int ic=0;
567  Double_t sd=0;
568  for(int i=0; i<n; i++) {
569  sd += ( Var( 1, i, ivar ) - Var( 0, i, ivar) );
570  ic++;
571  }
572  sd /= ic;
573  return sd;
574 }
void sd()
Definition: check_vertex.C:185

◆ CalcMeanDiff2Const()

Float_t EdbAlignmentV::CalcMeanDiff2Const ( int  ivar,
int  side,
float  mean 
)
578 {
579  // Calculate mean difference to the the given constant taking into account corrections
580  int n = Ncp();
581  int ic=0;
582  Double_t sd=0;
583  for(int i=0; i<n; i++) {
584  sd += ( Var( side, i, ivar ) - mean );
585  ic++;
586  }
587  sd /= ic;
588  return sd;
589 }
Int_t Ncp()
Definition: EdbAlignmentV.h:77

◆ CalcMeanDZ()

Float_t EdbAlignmentV::CalcMeanDZ ( float  tmin = 0.1,
float  tmax = 2. 
)
536 {
537  // Calculate mean shrinkage (to be applied to side 0 to get side 1)
538  int n = CheckEqualArr(eS[0],eS[1]);
539  int ic=0;
540  float dz = eCorr[0].V(2); if(Abs(dz)<0.000001) return 0;
541  eCorr[0].SetV(2,0.);
542  Double_t dzn=0;
543  for(int i=0; i<n; i++) {
544  EdbSegP *s1=(EdbSegP*)eS[0].UncheckedAt(i);
545  float t1 = eCorr[0].T(*s1);
546  if(t1<tmin) continue;
547  if(t1>tmax) continue;
548  EdbSegP *s2=(EdbSegP*)eS[1].UncheckedAt(i);
549  float tx = ( X(1,*s2) - X(0,*s1) ) / dz;
550  float ty = ( Y(1,*s2) - Y(0,*s1) ) / dz;
551  float t = TMath::Sqrt(tx*tx+ty*ty);
552  dzn += dz*t/t1;
553  ic++;
554  }
555  dzn /= ic;
556  eCorr[0].SetV(2,dz);
557  Log(3,"CalcMeanDZ","dz = %f dzn = %f n=%d",dz,dzn,ic);
558  return dzn;
559 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
brick dz
Definition: RecDispMC.C:107
TTree * t
Definition: check_shower.C:4
float Y(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:123
float X(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:122
float T(EdbSegP &s)
Definition: EdbSegCorr.h:36
float V(int i)
Definition: EdbSegCorr.h:23

◆ CalcMeanShr()

Float_t EdbAlignmentV::CalcMeanShr ( float  tmin = 0.1,
float  tmax = 2. 
)
515 {
516  // Calculate mean shrinkage (to be applied to side 0 to get side 1)
517  int n = CheckEqualArr(eS[0],eS[1]);
518  int ic=0;
519  Double_t shr=0;
520  for(int i=0; i<n; i++) {
521  float t1 = eCorr[0].T(*((EdbSegP*)eS[0].UncheckedAt(i)));
522  //float t1 = ((EdbSegP*)eS[0].UncheckedAt(i))->Theta();
523  if(t1<tmin) continue;
524  if(t1>tmax) continue;
525  float t2 = eCorr[1].T(*((EdbSegP*)eS[1].UncheckedAt(i)));
526  //float t2 = ((EdbSegP*)eS[1].UncheckedAt(i))->Theta();
527  shr += (t1/t2); // the angle is divided by shr - that's why it is inverse
528  ic++;
529  }
530  shr /= ic;
531  return shr;
532 }

◆ CalculateAffTXTY() [1/2]

Int_t EdbAlignmentV::CalculateAffTXTY ( EdbAffine2D aff)
inline
98 {return CalculateAffTXTY( eS[0], eS[1], aff);}

◆ CalculateAffTXTY() [2/2]

Int_t EdbAlignmentV::CalculateAffTXTY ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1060 {
1061  int n = CheckEqualArr(arr1,arr2);
1062  TArrayF x1(n), x2(n), y1(n), y2(n);
1063  for(int i=0; i<n; i++ ) {
1064  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1065  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1066  x1[i] = TX(0, *s1); y1[i] = TY(0, *s1);
1067  x2[i] = TX(1, *s2); y2[i] = TY(1, *s2);
1068  }
1069  aff.Calculate(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray(),0);
1070  return n;
1071 }
Int_t Calculate(EdbPointsBox2D *b1, EdbPointsBox2D *b2)
Definition: EdbAffine.cxx:260
float TY(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:125
float TX(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:124

◆ CalculateAffTXTYShift()

Int_t EdbAlignmentV::CalculateAffTXTYShift ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1090 {
1091  int n = CheckEqualArr(arr1,arr2);
1092  TArrayF x1(n), x2(n), y1(n), y2(n);
1093  for(int i=0; i<n; i++ ) {
1094  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1095  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1096  x1[i] = TX(0, *s1); y1[i] = TY(0, *s1);
1097  x2[i] = TX(1, *s2); y2[i] = TY(1, *s2);
1098  }
1099  aff.CalculateShift(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray());
1100  return n;
1101 }
Int_t CalculateShift(int n, float *x0, float *y0, float *x1, float *y1)
Definition: EdbAffine.cxx:135

◆ CalculateAffTXTYTurn()

Int_t EdbAlignmentV::CalculateAffTXTYTurn ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1075 {
1076  int n = CheckEqualArr(arr1,arr2);
1077  TArrayF x1(n), x2(n), y1(n), y2(n);
1078  for(int i=0; i<n; i++ ) {
1079  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1080  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1081  x1[i] = TX(0, *s1); y1[i] = TY(0, *s1);
1082  x2[i] = TX(1, *s2); y2[i] = TY(1, *s2);
1083  }
1084  aff.Calculate(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray(),2);
1085  return n;
1086 }

◆ CalculateAffXY() [1/2]

Int_t EdbAlignmentV::CalculateAffXY ( EdbAffine2D aff)
inline
97 {return CalculateAffXY( eS[0], eS[1], aff);}

◆ CalculateAffXY() [2/2]

Int_t EdbAlignmentV::CalculateAffXY ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1015 {
1016  int n = CheckEqualArr(arr1,arr2);
1017  TArrayF x1(n), x2(n), y1(n), y2(n);
1018  for(int i=0; i<n; i++ ) {
1019  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1020  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1021  x1[i] = X(0,*s1); y1[i] = Y(0,*s1);
1022  x2[i] = X(1,*s2); y2[i] = Y(1,*s2);
1023  }
1024  aff.Calculate(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray(),0);
1025  return n;
1026 }

◆ CalculateAffXYShift()

Int_t EdbAlignmentV::CalculateAffXYShift ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1045 {
1046  int n = CheckEqualArr(arr1,arr2);
1047  TArrayF x1(n), x2(n), y1(n), y2(n);
1048  for(int i=0; i<n; i++ ) {
1049  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1050  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1051  x1[i] = X(0,*s1); y1[i] = Y(0,*s1);
1052  x2[i] = X(1,*s2); y2[i] = Y(1,*s2);
1053  }
1054  aff.CalculateShift(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray());
1055  return n;
1056 }

◆ CalculateAffXYTurn() [1/2]

Int_t EdbAlignmentV::CalculateAffXYTurn ( EdbAffine2D aff)
inline
96 {return CalculateAffXYTurn( eS[0], eS[1], aff);}
Int_t CalculateAffXYTurn(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:96

◆ CalculateAffXYTurn() [2/2]

Int_t EdbAlignmentV::CalculateAffXYTurn ( TObjArray &  arr1,
TObjArray &  arr2,
EdbAffine2D aff 
)
1030 {
1031  int n = CheckEqualArr(arr1,arr2);
1032  TArrayF x1(n), x2(n), y1(n), y2(n);
1033  for(int i=0; i<n; i++ ) {
1034  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
1035  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
1036  x1[i] = X(0,*s1); y1[i] = Y(0,*s1);
1037  x2[i] = X(1,*s2); y2[i] = Y(1,*s2);
1038  }
1039  aff.Calculate(n,x1.GetArray(),y1.GetArray(),x2.GetArray(),y2.GetArray(),2);
1040  return n;
1041 }

◆ CheckEqualArr()

Int_t EdbAlignmentV::CheckEqualArr ( TObjArray &  arr1,
TObjArray &  arr2 
)
static
416 {
417  int n1 = arr1.GetEntries();
418  int n2 = arr2.GetEntries();
419  int n = Min(n1,n2);
420  if(n1!=n2) Log(1,"CheckEqualArr","WARNING: arrays are not equal: %d %d, take first %d segs", n1,n2,n );
421  return n;
422 }

◆ CloseOutputFile()

void EdbAlignmentV::CloseOutputFile ( )
65 {
66  if(eOutputFile) {
67  eOutputFile->Close();
68  SafeDelete(eOutputFile);
69  }
70 }

◆ Corr2Aff() [1/2]

void EdbAlignmentV::Corr2Aff ( EdbLayer layer)
1119 {
1120 /* EdbAffine2D &a0 = *(layer.GetAffineXY());
1121  a0.Reset();
1122  a0.ShiftX( eCorr[0].V(0) ); a0.ShiftY( eCorr[0].V(1) );
1123  a0.Rotate( eCorr[0].V(6) );
1124  a0.ShiftX( -eCorr[1].V(0) ); a0.ShiftY( -eCorr[1].V(1) );
1125  layer.SetShrinkage( eCorr[0].V(5) );
1126  layer.SetZcorr( eCorr[0].V(2) );*/
1127 
1128  Corr2Aff(eCorr[0],layer);
1129  layer.GetAffineXY()->ShiftX( -eCorr[1].V(0) );
1130  layer.GetAffineXY()->ShiftY( -eCorr[1].V(1) );
1131 }
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void Corr2Aff(EdbLayer &layer)
Definition: EdbAlignmentV.cxx:1118

◆ Corr2Aff() [2/2]

void EdbAlignmentV::Corr2Aff ( EdbSegCorr corr,
EdbLayer layer 
)
1105 {
1106  EdbAffine2D &a0 = *(layer.GetAffineXY());
1107  a0.Reset();
1108  a0.ShiftX( corr.V(0) ); a0.ShiftY( corr.V(1) );
1109  a0.Rotate( corr.V(6) );
1110  EdbAffine2D &atxty = *(layer.GetAffineTXTY());
1111  atxty.Reset();
1112  atxty.ShiftX(corr.V(3)); atxty.ShiftY(corr.V(4));
1113  layer.SetShrinkage( corr.V(5) );
1114  layer.SetZcorr( corr.V(2) );
1115 }
void Reset()
Definition: EdbAffine.cxx:72
void Rotate(float angle)
Definition: EdbAffine.cxx:383
void SetShrinkage(float shr)
Definition: EdbLayer.h:100

◆ CorrToCoG() [1/2]

void EdbAlignmentV::CorrToCoG ( int  side,
EdbPattern p 
)
457 {
458  int n=p.N();
459  Double_t x0=0, y0=0;
460  for(int i=0; i<n; i++) {
461  EdbSegP *s = p.GetSegment(i);
462  x0 += X(side, *s);
463  y0 += Y(side, *s);
464  }
465  x0/=n; y0/=n;
466  eCorr[0].AddV(0, -x0);
467  eCorr[0].AddV(1, -y0);
468  eCorr[1].AddV(0, -x0);
469  eCorr[1].AddV(1, -y0);
470 }
p
Definition: testBGReduction_AllMethods.C:8
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CorrToCoG() [2/2]

void EdbAlignmentV::CorrToCoG ( int  side,
TObjArray &  p 
)
474 {
475  int n=p.GetEntries();
476  Double_t x0=0, y0=0;
477  for(int i=0; i<n; i++) {
478  EdbSegP *s = (EdbSegP*)p.UncheckedAt(i);
479  x0 += X(side,*s);
480  y0 += Y(side,*s);
481  }
482  x0/=n; y0/=n;
483  eCorr[0].AddV(0, -x0);
484  eCorr[0].AddV(1, -y0);
485  eCorr[1].AddV(0, -x0);
486  eCorr[1].AddV(1, -y0);
487 }

◆ CoupleQuality()

float EdbAlignmentV::CoupleQuality ( EdbSegP s1,
EdbSegP s2 
)
206 {
207  // TODO
208  return s1.W()+s2.W();
209 }
Float_t W() const
Definition: EdbSegP.h:148

◆ DefineGuessCell()

bool EdbAlignmentV::DefineGuessCell ( float  xmin1,
float  xmax1,
float  ymin1,
float  ymax1,
float  xmin2,
float  xmax2,
float  ymin2,
float  ymax2,
int  np1,
int  np2,
float  binOK 
)
901 {
902  float s1 = (xmax1-xmin1)*(ymax1-ymin1);
903  float xbin1 = Sqrt( s1/(np1/binOK) );
904  float s2 = (xmax2-xmin2)*(ymax2-ymin2);
905  float xbin2 = Sqrt( s2/(np2/binOK) );
906  float xbin = Min(xbin1,xbin2);
907  float min[2] = { Min(xmin1,xmin2)-eXmarg, Min(ymin1,ymin2)-eYmarg };
908  float max[2] = { Max(xmax1,xmax2)+eXmarg, Max(ymax1,ymax2)+eYmarg };
909  int n[2] = { (int)((max[0]-min[0])/xbin+1), (int)((max[1]-min[1])/xbin+1) };
910  if(n[0]<=0||n[1]<=0) return false;
911  int maxcell1 = np1/n[0]/n[1]+10; maxcell1 += (int)(5*Sqrt(maxcell1));
912  ePC[0].InitCell(maxcell1,n,min,max);
913  int maxcell2 = np2/n[0]/n[1]+10; maxcell2 += (int)(5*Sqrt(maxcell2));
914  ePC[1].InitCell(maxcell2,n,min,max);
915  return true;
916 }
float min(TClonesArray *t)
Definition: bitview.cxx:275
int max
Definition: check_shower.C:41
EdbCell2 ePC[2]
Definition: EdbAlignmentV.h:18
int InitCell(EdbCell2 &c)
Definition: EdbCell2.h:170
float xbin
Definition: emthickness.cpp:61

◆ DoubletsFilterOut()

int EdbAlignmentV::DoubletsFilterOut ( int  checkview,
TH2F *  hxy = 0,
TH2F *  htxty = 0 
)
84 {
85  // assumed the same pattern's segments in eS[0] and eS[1]
86  // checkview = 0 do not check if close tracks belongs to different views
87  // checkview = 1 check views, select best and cancel the worst candidate
88  // checkview = 2 check views but do not cancell worst candidate (debug option)
89 
90  int nout=0;
91  int n = CheckEqualArr(eS[0], eS[1]);
92  for(int i=0; i<n; i++) {
93  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
94  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
95  if( s1->Flag()==-10 && s2->Flag()==-10) continue;
96  if(checkview>0) if( s2->Aid(0)==s1->Aid(0) && s2->Aid(1)==s1->Aid(1) && s2->Side()==s1->Side() ) continue;
97  if( !IsInsideDVsame(*s1,*s2) ) continue;
98  if(s1->Flag()>-10 && s2->Flag()>-10) {
99  if(hxy) hxy->Fill( s1->X()-s2->X() , s1->Y()-s2->Y());
100  if(htxty) htxty->Fill(s1->TX()-s2->TX(),s1->TY()-s2->TY());
101  }
102  if(checkview==1||checkview==0) {
103  if( s2->W()>s1->W() ) s1->SetFlag(-10);
104  else if( s2->W() == s1->W() && s2->Chi2() < s1->Chi2() ) s1->SetFlag(-10);
105  else if( s2->W() == s1->W() && s2->Chi2() >= s1->Chi2() ) s2->SetFlag(-10);
106  else if( s2->W()<s1->W() ) s2->SetFlag(-10);
107  nout++;
108  }
109  }
110 
111  //check
112  int miss=0, wrong=0;
113  for(int i=0; i<n; i++) {
114  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
115  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
116  if( s1->Flag()==-10 && s2->Flag()==-10 ) continue;
117  if( s1->Flag()!=-10 && s2->Flag()!=-10 ) { miss++; continue;}
118  if( s1->Flag()==-10 && (s1->W() > s2->W()) ) {
119  wrong++;
120  s1->SetFlag(0);
121  s2->SetFlag(-10);
122  }
123  }
124  Log(2,"DubletsFilterOut","miss: %d wrong: %d",miss,wrong);
125 
126  Log(2,"DubletsFilterOut","%d segments discarded with DX,DY,DTX,DTY: (%8.4f %8.4f %7.5f %7.5f) checkview =%d",
127  nout,eDVsame[0],eDVsame[1],eDVsame[2],eDVsame[3], checkview );
128  return nout;
129 }
Float_t eDVsame[4]
Definition: EdbAlignmentV.h:16
Bool_t IsInsideDVsame(EdbSegP &s1, EdbSegP &s2)
Definition: EdbAlignmentV.cxx:73
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Chi2() const
Definition: EdbSegP.h:154
Int_t Side() const
Definition: EdbSegP.h:167
Float_t Y() const
Definition: EdbSegP.h:171
Float_t TY() const
Definition: EdbSegP.h:173
Int_t Aid(int i) const
Definition: EdbSegP.h:166
void SetFlag(int flag)
Definition: EdbSegP.h:127
Int_t Flag() const
Definition: EdbSegP.h:146

◆ FillCell() [1/2]

void EdbAlignmentV::FillCell ( int  side,
EdbPattern pat 
)
989 {
990  // assume that the cell is already initialized
991  if(!SideOK(side)) return;
992  EdbSegP *s=0;
993  int n = pat.N();
994  for(int i=0; i<n; i++) {
995  s = pat.GetSegment(i);
996  ePC[side].AddObject( X(side,*s), Y(side,*s), (TObject*)s );
997  }
998 }
Bool_t SideOK(int side)
Definition: EdbAlignmentV.cxx:405
bool AddObject(float v[2], TObject *obj)
Definition: EdbCell2.h:176
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66

◆ FillCell() [2/2]

void EdbAlignmentV::FillCell ( int  side,
TObjArray &  pat 
)
1002 {
1003  // assume that the cell is already initialized
1004  if(!SideOK(side)) return;
1005  EdbSegP *s=0;
1006  int n = pat.GetEntriesFast();
1007  for(int i=0; i<n; i++) {
1008  s = (EdbSegP*)pat.UncheckedAt(i);
1009  ePC[side].AddObject( X(side,*s), Y(side,*s), (TObject*)s );
1010  }
1011 }

◆ FillCombinations() [1/2]

int EdbAlignmentV::FillCombinations ( )
235 {
236  float dxMax = 2*Max( ePC[0].Xbin(), ePC[1].Xbin() );
237  float dyMax = 2*Max( ePC[0].Ybin(), ePC[1].Ybin() );
238  return FillCombinations( eDVsame, dxMax, dyMax, 1);
239 }
int FillCombinations()
Definition: EdbAlignmentV.cxx:234

◆ FillCombinations() [2/2]

int EdbAlignmentV::FillCombinations ( float  dv[4],
float  dxMax,
float  dyMax,
bool  doFill 
)
243 {
244  // input: dv = coinsidence condition (dx,dy,dtx,dty)
245  // dxMax, dyMax - the area around each segment for the combinations
246  // selection, it can be selected bigger then coinsidence condition due to
247  // corrections displacements
248  //
249  // the cells must be already filled
250 
251  eS[0].Clear();
252  eS[1].Clear();
253  int ir2[2] = { int((dxMax-0.0001)/ePC[0].Xbin())+1, int((dyMax-0.0001)/ePC[0].Ybin())+1 };
254 
255  int nout=0;
256 
257  TObjArray arr1(10000);
258  TObjArray arr2(100);
259  float v[2];
260  EdbSegP *s1,*s2;
261 
262  int ncomb; // combinations rate counter
263  int n1 = ePC[0].SelectObjects(arr1);
264  for(int i=0; i<n1; i++) {
265  ncomb=0;
266  s1 = (EdbSegP*)arr1.UncheckedAt(i);
267  if(s1->Flag()==-10) continue;
268  arr2.Clear();
269  v[0] = X( 0, *s1);
270  v[1] = Y( 0, *s1);
271  int n2 = ePC[1].SelectObjectsC(v,ir2,arr2);
272 
273  if(n2<1) continue;
274  float tx1 = TX(0, *s1);
275  float ty1 = TY(0, *s1);
276  for(int i2=0; i2<n2; i2++) {
277  s2 = (EdbSegP*)arr2.UncheckedAt(i2);
278  if(s2->Flag()==-10) continue;
279  if( s2==s1 ) continue;
280  if( Abs(X(1, *s2) - v[0]) > dv[0] ) continue;
281  if( Abs(Y(1, *s2) - v[1]) > dv[1] ) continue;
282  if( Abs(TX(1, *s2)- tx1) > dv[2] ) continue;
283  if( Abs(TY(1, *s2)- ty1) > dv[3] ) continue;
284 
285  if(doFill) {
286  eS[0].Add(s1);
287  eS[1].Add(s2);
288  }
289  ncomb++;
290  }
291  nout+=ncomb;
292  if(eDoubletsRate) eDoubletsRate->Fill(ncomb);
293  }
294 
295  arr1.Clear();
296  arr2.Clear();
297 
298  Log(3,"FillCombinations","%d selected with the acceptance: %7.2f %7.2f (%d,%d) and tolerance (%7.2f %7.2f %7.4f %7.4f)",
299  nout, dxMax,dyMax, ir2[0], ir2[1], dv[0], dv[1], dv[2], dv[3] );
300  return nout;
301 }
int SelectObjects(TObjArray &arr)
Definition: EdbCell2.cpp:797
int SelectObjectsC(int iv[2], int ir[2], TObjArray &arr)
Definition: EdbCell2.cpp:766
void Clear()
Definition: EdbSegP.h:85

◆ FillGuessCell() [1/2]

void EdbAlignmentV::FillGuessCell ( EdbPattern p1,
EdbPattern p2,
float  binOK = 1.,
float  offsetMax = 2000. 
)
920 {
921  // binOK - is the mean number of entries requested per bin
922 
923  float xmin1=Xmin(0,p1), ymin1=Ymin(0,p1), xmax1=Xmax(0,p1), ymax1=Ymax(0,p1);
924  float xmin2=Xmin(1,p2), ymin2=Ymin(1,p2), xmax2=Xmax(1,p2), ymax2=Ymax(1,p2);
925  Log(3, "FillGuessCell", "x1:(%f %f) y1:(%f %f)",xmin1,xmax1, ymin1, ymax1);
926  Log(3, "FillGuessCell", "x2:(%f %f) y2:(%f %f)",xmin2,xmax2, ymin2, ymax2);
927  ApplyLimitsOffset( xmin1, xmax1, xmin2, xmax2, offsetMax);
928  ApplyLimitsOffset( ymin1, ymax1, ymin2, ymax2, offsetMax);
929  int np1 = p1.N(), np2 = p2.N();
930  if( xmax1<xmin1||ymax1<ymin1||xmax2<xmin2||ymax2<ymin2||np1<1||np2<1 ) {
931  Log(1, "FillGuessCell", "No any overlap! x1:(%f %f) y1:(%f %f) np1:%d",
932  xmin1,xmax1, ymin1, ymax1,np1);
933  Log(1, "FillGuessCell", "No any overlap! x2:(%f %f) y2:(%f %f) np2:%d",
934  xmin2,xmax2, ymin2, ymax2,np2);
935  } else
936  {
937  if(DefineGuessCell(
938  xmin1, xmax1, ymin1, ymax1,
939  xmin2, xmax2, ymin2, ymax2,
940  np1, np2, binOK))
941  {
942  FillCell( 0, p1 );
943  FillCell( 1, p2 );
944  if( Log(3, "FillGuessCell", "with patterns of %d %d statistics:",np1,np2) ) {
945  ePC[0].PrintStat();
946  ePC[1].PrintStat();
947  }
948  }
949  }
950 }
float Ymin(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1158
void ApplyLimitsOffset(float &xmin1, float &xmax1, float &xmin2, float &xmax2, float offsetMax)
Definition: EdbAlignmentV.cxx:888
float Xmax(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1146
bool DefineGuessCell(float xmin1, float xmax1, float ymin1, float ymax1, float xmin2, float xmax2, float ymin2, float ymax2, int np1, int np2, float binOK)
Definition: EdbAlignmentV.cxx:899
float Ymax(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1170
float Xmin(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1134
void FillCell(int side, EdbPattern &pat)
Definition: EdbAlignmentV.cxx:988
void PrintStat()
Definition: EdbCell2.cpp:711

◆ FillGuessCell() [2/2]

void EdbAlignmentV::FillGuessCell ( TObjArray &  p1,
TObjArray &  p2,
float  binOK = 1.,
float  offsetMax = 2000. 
)
954 {
955  // binOK - is the mean number of entries requested per bin
956 
957  float xmin1=Xmin(0,p1), ymin1=Ymin(0,p1), xmax1=Xmax(0,p1), ymax1=Ymax(0,p1);
958  float xmin2=Xmin(1,p2), ymin2=Ymin(1,p2), xmax2=Xmax(1,p2), ymax2=Ymax(1,p2);
959  ApplyLimitsOffset( xmin1, xmax1, xmin2, xmax2, offsetMax);
960  ApplyLimitsOffset( ymin1, ymax1, ymin2, ymax2, offsetMax);
961  int np1 = p1.GetEntries(), np2 = p2.GetEntries();
962 
963  Log(3, "FillGuessCell", "xmin1, xmax1, ymin1, ymax1, xmin2, xmax2, ymin2, ymax2, np1, np2, binOK: %f %f %f %f %f %f %f %f %d %d %f",xmin1, xmax1, ymin1, ymax1, xmin2, xmax2, ymin2, ymax2, np1, np2, binOK);
964  if( xmax1<xmin1||ymax1<ymin1||xmax2<xmin2||ymax2<ymin2||np1<1||np2<1 ) {
965  Log(1, "FillGuessCell", "No any overlap! x1:(%f %f) y1:(%f %f) np1:%d",
966  xmin1,xmax1, ymin1, ymax1,np1);
967  Log(1, "FillGuessCell", "No any overlap! x2:(%f %f) y2:(%f %f) np2:%d",
968  xmin2,xmax2, ymin2, ymax2,np2);
969  } else
970  {
971  if(DefineGuessCell(
972  xmin1, xmax1, ymin1, ymax1,
973  xmin2, xmax2, ymin2, ymax2,
974  np1, np2, binOK))
975  {
976  FillCell( 0, p1 );
977  FillCell( 1, p2 );
978  if( Log(3, "FillGuessCell", "with arrays of %d %d statistics:",np1,np2) ) {
979  ePC[0].PrintStat();
980  ePC[1].PrintStat();
981  }
982  }
983  }
984 
985 }

◆ FillThetaHist()

void EdbAlignmentV::FillThetaHist ( int  side,
EdbH2 htxy 
)
213 {
214  if( side<0 || side>1 ) return;
215  TObjArray arr(10000);
216  int n = ePC[side].SelectObjects(arr);
217  for(int i=0; i<n; i++) {
218  EdbSegP *s = (EdbSegP*)arr.UncheckedAt(i);
219  htxy.Fill( s->TY(), s->TX() );
220  }
221 }
int Fill(float x, float y)
Definition: EdbCell2.h:88

◆ FindCorrDiff()

Int_t EdbAlignmentV::FindCorrDiff ( float  dvsame[4],
int  side = 0,
int  nlim = 10 
)
707 {
708  //find diffs with the default settings and correct requested side
709  if(!SideOK(side)) return 0;
710  float dvf[4];
711  int n = FindDiff(eS[0], eS[1], dvsame, dvf );
712  if(n<nlim) return n;
713  eCorr[side].AddV(0,dvf[0]);
714  eCorr[side].AddV(1,dvf[1]);
715  //eCorr[side].AddV(3,dvf[2]);
716  //eCorr[side].AddV(4,dvf[3]);
717  Log(3,"FindCorrDiff","correct side %d with %11.7f %11.7f %10.7f %10.7f using %5d coinsidences",
718  side, dvf[0] ,dvf[1] ,dvf[2] ,dvf[3],n);
719  return n;
720 }
Int_t FindDiff(TObjArray &arr1, TObjArray &arr2, float dvlim[4], float dvfound[4])
Definition: EdbAlignmentV.cxx:723

◆ FindDensityPeak()

Float_t EdbAlignmentV::FindDensityPeak ( TArrayF &  arr,
float  fraction 
)
605 {
606  if(fraction<=0||fraction>1) Log(1,"EdbAlignmentV::FindDensityPeak","ERROR! fraction out of limits: %f",fraction);
607  TArrayI ind(arr.fN);
608  Sort( arr.fN, arr.GetArray(), ind.GetArray(), 0 );
609  int nfra = (int)(fraction*arr.fN);
610  float dxmin = arr[ ind[nfra] ] - arr[ ind[0] ];
611  int ibest=0;
612  for(int i=1; i<arr.fN-nfra; i++) {
613  float dx = arr[ ind[nfra+i] ] - arr[ind[i]];
614  if( dx < dxmin) {
615  dxmin = dx;
616  ibest=i;
617  }
618  }
619 
620  Double_t sd=0;
621  int ic=0;
622  for(int i=ibest; i<ibest+nfra-1; i++) {
623  sd += arr[ ind[i] ];
624  ic++;
625  }
626  sd /= ic;
627  Log(2,"EdbAlignmentV::FindDensityPeak", "nfra/n: %d/%d dxmin = %g sd = %g",nfra,arr.fN,dxmin,sd);
628  return (Float_t)sd;
629 }

◆ FindDiff()

Int_t EdbAlignmentV::FindDiff ( TObjArray &  arr1,
TObjArray &  arr2,
float  dvlim[4],
float  dvfound[4] 
)
724 {
725  int n = CheckEqualArr(arr1,arr2);
726  int ic=0;
727  EdbSegP *s1,*s2;
728  Double_t sdx=0, sdy=0, sdtx=0, sdty=0;
729  float dvf[4];
730  for(int i=0; i<n; i++) {
731  s1 = (EdbSegP*)arr1.UncheckedAt(i);
732  s2 = (EdbSegP*)arr2.UncheckedAt(i);
733  if( ValidCoinsidence(*s1, *s2, dvlim, dvf) ) {
734  sdx += dvf[0];
735  sdy += dvf[1];
736  sdtx += dvf[2];
737  sdty += dvf[3];
738  ic++;
739  }
740  }
741  dvfound[0] = sdx/ic;
742  dvfound[1] = sdy/ic;
743  dvfound[2] = sdtx/ic;
744  dvfound[3] = sdty/ic;
745  return ic;
746 }
Bool_t ValidCoinsidence(EdbSegP &s1, EdbSegP &s2, float dvlim[4], float dvfound[4])
Definition: EdbAlignmentV.cxx:750

◆ FineCorrPhi()

Float_t EdbAlignmentV::FineCorrPhi ( TObjArray &  sel1,
TObjArray &  sel2 
)
491 {
492  // for the correct answer the O,O should be in the CoG of the second pattern
493  int n = CheckEqualArr(arr1,arr2);
494  if(n<3) return 0;
495  double x1=0, y1=0, x2=0,y2=0;
496  Double_t R=0, r=0, dPhi=0;
497  for(int i=0; i<n; i++) {
498  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
499  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
500  x1 = X(0,*s1);
501  y1 = Y(0,*s1);
502  x2 = X(1,*s2);
503  y2 = Y(1,*s2);
504  r = Sqrt(x1*x1+y1*y1);
505  dPhi += (ATan2(-y2,-x2) - ATan2(-y1,-x1)) * r;
506  R += r;
507  }
508  dPhi /= R;
509  Log(3,"FineCorrPhi","dPhi =%f with %d segments", (float)dPhi, n );
510  return (float)dPhi;
511 }
void r(int rid=2)
Definition: test.C:201

◆ FineCorrZ() [1/2]

float EdbAlignmentV::FineCorrZ ( )
inline
91 { return FineCorrZ(eS[0], eS[1]); }

◆ FineCorrZ() [2/2]

Float_t EdbAlignmentV::FineCorrZ ( TObjArray &  sel1,
TObjArray &  sel2 
)
426 {
427  double dzz=0, dzx=0, dzy=0;
428  int n = CheckEqualArr(arr1,arr2);
429  int icx=0, icy=0;
430  for(int i=0; i<n; i++) {
431  EdbSegP *s1 = (EdbSegP*)arr1.UncheckedAt(i);
432  EdbSegP *s2 = (EdbSegP*)arr2.UncheckedAt(i);
433  float tx1 = TX(0, *s1), ty1 = TY(0, *s1);
434  float x1 = X(0,*s1), y1 = Y(0,*s1);
435  float x2 = X(1,*s2), y2 = Y(1,*s2);
436 
437  if(tx1>0.1) {
438  dzx += (x2-x1)/tx1;
439  icx++;
440  }
441  if(ty1>0.1) {
442  dzy += (y2-y1)/ty1;
443  icy++;
444  }
445  }
446 
447  if(icx+icy>3) dzz = (dzx+dzy)/(icx+icy);
448 
449  Log(3,"FineCorrZ","dzz =%f with icx=%d and icy=%d (of %d) segments",
450  (float)dzz, icx,icy, n );
451 
452  return (float)dzz;
453 }

◆ HDistance()

void EdbAlignmentV::HDistance ( EdbPattern p1,
EdbPattern p2,
float  dxMax,
float  dyMax 
)
794 {
795  Log(3,"HDistance","preselection for patterns with %d and %d segments",p1.N(), p2.N());
796 
797  int eITMAX=51; // angular normalization (def=50) (the step is ~1./eITMAX)
798  int eOCMAX=100; // occupancy (def=100)
799  int nx=201, ny=201, no=eOCMAX;
800 
801  Long_t *ind1 = new Long_t[nx*ny*no];
802  Long_t *ind2 = new Long_t[nx*ny*no];
803  Int_t *oc1 = new Int_t[nx*ny];
804  Int_t *oc2 = new Int_t[nx*ny];
805  memset(ind1,0,nx*ny*no*sizeof(Long_t));
806  memset(ind2,0,nx*ny*no*sizeof(Long_t));
807  memset( oc1,0,nx*ny*sizeof(Int_t));
808  memset( oc2,0,nx*ny*sizeof(Int_t));
809 
810  int itx,ity;
811 
812  for(int i=0;i<eITMAX;i++) for(int j=0;j<eITMAX;j++) { oc1[i*nx+j]=0; oc2[i*nx+j]=0;}
813  for(int i=0;i<p1.N();i++){
814  itx=int( (p1.GetSegment(i)->TX()+1.)*eITMAX/2. );
815  ity=int( (p1.GetSegment(i)->TY()+1.)*eITMAX/2. );
816  if(itx<eITMAX)
817  if(ity<eITMAX)
818  if(itx>=0)
819  if(ity>=0)
820  if(oc1[itx*nx+ity]<eOCMAX-1)
821  { ind1[itx*nx*ny+ity*ny+oc1[itx*nx+ity]]=i; (oc1[itx*nx+ity])++;}
822  }
823  for(int i=0;i<p2.N();i++){
824  itx=int( (p2.GetSegment(i)->TX()+1.)*eITMAX/2 );
825  ity=int( (p2.GetSegment(i)->TY()+1.)*eITMAX/2 );
826  if(itx<eITMAX)
827  if(ity<eITMAX)
828  if(itx>=0)
829  if(ity>=0)
830  if(oc2[itx*nx+ity]<eOCMAX-1)
831  { ind2[itx*nx*ny+ity*ny+oc2[itx*nx+ity]]=i; (oc2[itx*nx+ity])++;}
832  }
833 
834  eS[0].Clear();
835  eS[1].Clear();
836 
837  EdbSegP *s1,*s2;
838  for(int itx=0;itx<eITMAX;itx++) for(int ity=0;ity<eITMAX;ity++)
839  for(int i=0;i<oc1[itx*nx+ity];i++) {
840  s1 = p1.GetSegment(ind1[itx*nx*ny+ity*ny+i]);
841  for(int j=0;j<oc2[itx*nx+ity];j++)
842  {
843  s2 = p2.GetSegment(ind2[itx*nx*ny+ity*ny+j]);
844  if(Abs(s2->eX-s1->eX)>dxMax) continue;
845  if(Abs(s2->eY-s1->eY)>dyMax) continue;
846  eS[0].Add( s1 );
847  eS[1].Add( s2 );
848  }
849  }
850  delete [] ind1;
851  delete [] ind2;
852  delete [] oc1;
853  delete [] oc2;
854  Log(3,"HDistance","preselection for patterns with %d and %d segments: %d comb",p1.N(), p2.N(), eS[0].GetEntries());
855 }
Float_t eX
Definition: EdbSegP.h:28
Float_t eY
Definition: EdbSegP.h:28
int nx
Definition: emthickness.cpp:60
int ny
Definition: emthickness.cpp:62

◆ InitHphi()

void EdbAlignmentV::InitHphi ( int  n,
float  min,
float  max 
)
inline
47 { eH[0][6].InitH1(n, min, max); }
EdbH1 eH[2][7]
Definition: EdbAlignmentV.h:27
int InitH1(const EdbH1 &h)
Definition: EdbCell1.h:38

◆ InitHshr0()

void EdbAlignmentV::InitHshr0 ( int  n,
float  min,
float  max 
)
inline
48 { eH[0][5].InitH1(n, min, max); }

◆ InitHshr1()

void EdbAlignmentV::InitHshr1 ( int  n,
float  min,
float  max 
)
inline
49 { eH[1][5].InitH1(n, min, max); }

◆ InitHx()

void EdbAlignmentV::InitHx ( int  n,
float  min,
float  max 
)
inline
44 { eH[0][0].InitH1(n, min, max); }

◆ InitHy()

void EdbAlignmentV::InitHy ( int  n,
float  min,
float  max 
)
inline
45 { eH[0][1].InitH1(n, min, max); }

◆ InitHz()

void EdbAlignmentV::InitHz ( int  n,
float  min,
float  max 
)
inline
46 { eH[0][2].InitH1(n, min, max); }

◆ InitOutputFile()

void EdbAlignmentV::InitOutputFile ( const char *  file = "report_al.root",
const char *  option = "RECREATE" 
)
56 {
58  eOutputFile = TFile::Open(file,option);
59  if (!eOutputFile || !eOutputFile->IsOpen() || eOutputFile->IsZombie())
60  Log(1, "EdbAlignmentV::InitOutputFile", "Failed open file: %s", file);
61 }
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:64
TFile * file
Definition: write_pvr.C:3

◆ InitPatCellBin()

void EdbAlignmentV::InitPatCellBin ( int  side,
EdbPattern pat,
float  binx,
float  biny 
)
872 {
873  if(!SideOK(side)) return;
874 
875  EdbSegP s1min(0,pat.Xmin(), pat.Ymin(), 0,0 );
876  EdbSegP s1max(0,pat.Xmax(), pat.Ymax(), 0,0 );
877  float min[2] = { X(side,s1min)-eXmarg, X(side,s1min)-eYmarg };
878  float max[2] = { X(side,s1max)+eXmarg, X(side,s1max)+eYmarg };
879 
880  int n[2] = { (int)((max[0]-min[0])/binx+1), (int)((max[1]-min[1])/biny+1) };
881  int maxcell = pat.N()/n[0]/n[1]+10;
882  maxcell += (int)(5*Sqrt(maxcell));
883  Log(2, "InitPatCellBin", "maxcell = %d\n",maxcell);
884  ePC[side].InitCell(maxcell,n,min,max);
885 }
virtual Float_t Xmax() const
Definition: EdbVirtual.cxx:195
virtual Float_t Ymin() const
Definition: EdbVirtual.cxx:205
virtual Float_t Xmin() const
Definition: EdbVirtual.cxx:185
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:215

◆ InitPatCellN()

void EdbAlignmentV::InitPatCellN ( EdbCell2 cell,
EdbPattern pat,
int  nx,
int  ny 
)
859 {
860  // note: no correction (do we need tis function?)
861  float min[2] = {pat.Xmin()-eXmarg, pat.Ymin()-eYmarg };
862  float max[2] = {pat.Xmax()+eXmarg, pat.Ymax()+eYmarg };
863  int n[2] = {nx,ny};
864  int maxcell = pat.N()/n[0]/n[1]+10;
865  maxcell += (int)(5*Sqrt(maxcell));
866  Log(2, "InitPatCellN", "maxcell = %d\n",maxcell);
867  cell.InitCell(maxcell,n,min,max);
868 }

◆ IsInsideDVsame()

Bool_t EdbAlignmentV::IsInsideDVsame ( EdbSegP s1,
EdbSegP s2 
)
74 {
75  if( Abs(s1.X()-s2.X()) > eDVsame[0] ) return 0;
76  if( Abs(s1.Y()-s2.Y()) > eDVsame[1] ) return 0;
77  if( Abs(s1.TX()-s2.TX()) > eDVsame[2] ) return 0;
78  if( Abs(s1.TY()-s2.TY()) > eDVsame[3] ) return 0;
79  return 1;
80 }

◆ Ncoins()

Int_t EdbAlignmentV::Ncoins ( float  dvlim[4],
EdbH2 hdxy = 0,
EdbH2 hdtxty = 0,
TObjArray *  sel1 = 0,
TObjArray *  sel2 = 0 
)
764 {
765  // calculate all coinsidences inside dv:(dx,dy, dtx,dty)
766  // fill position and angular 2-d plots if requested
767  // fill arrays with selected segments sel1, sel2 if requested
768 
769  int ic = 0; // counter
770  int n = CheckEqualArr(eS[0],eS[1]);
771 
772  if(hdxy) hdxy->CleanCells();
773  if(hdtxy) hdtxy->CleanCells();
774 
775  float dfound[4];
776  for(int i=0; i<n; i++)
777  {
778  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
779  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
780 
781  if( !ValidCoinsidence(*s1, *s2, dv, dfound) ) continue;
782 
783  ic++;
784  if(sel1) sel1->Add(s1);
785  if(sel2) sel2->Add(s2);
786  if(hdxy) hdxy->Fill(dfound[0],dfound[1]);
787  if(hdtxy) hdtxy->Fill(dfound[2],dfound[3]);
788  }
789  return ic;
790 }
void CleanCells()
Definition: EdbCell2.cpp:115

◆ Ncp()

Int_t EdbAlignmentV::Ncp ( )
inline
77 {return CheckEqualArr( eS[0], eS[1]); }

◆ OptimiseVar1()

int EdbAlignmentV::OptimiseVar1 ( int  side,
int  ivar,
EdbH2 hdxy = 0,
EdbH2 hdtxy = 0 
)
305 {
306  // use already preselected "couples" - useful to test small variations of parameters
307  if(!SideOK(side)) return 0;
308 
309  EdbH1 &h = eH[side][ivar];
310  if( h.N() < 1 ) {
311  Log(1,"OptimiseVar1","ERROR: var %d of side %d have %d steps - skipped", ivar,side, h.N() );
312  return 0;
313  }
314 
315  h.CleanCells();
316 
317  int npk0=0;
318  float dx0=0,dy0=0; //the position of the highest peak in xy
319  float var0=0; //the position of the highest peak on var
320  for(int i=0; i<h.N(); i++)
321  {
322  float var= h.X(i);
323  eCorr[side].SetV( ivar, var );
324 
325  int npk = Ncoins(eDVsame, hdxy);
326 
327  float dx=0, dy=0;
328  if(hdxy){
329  EdbPeak2 pk2(*hdxy);
330  npk = (int)(pk2.ProbPeak( dx, dy ));
331  //hdxy->DrawH2(Form("hdxy%d_%2.2d",side,i),Form("OptimiseVar1: ivar=%d var=%f npk=%d",ivar, var,npk) )->Write();
332  }
333  h.SetBin( i, npk );
334  if( npk > npk0 ) { npk0=npk; dx0 = dx; dy0=dy; var0 = var; }
335  Log(4,"OptimiseVar1"," %d %f %d (%f %f)", i, h.X(i), h.Bin(i), dx,dy );
336  }
337 
338  //eCorr[side].AddV(0,dx0); // set x-y corrections if any
339  //eCorr[side].AddV(1,dy0);
340  eCorr[side].SetV(ivar,var0);
341  if(hdxy) Ncoins(eDVsame, hdxy); // to keep the optimal histogram in hdxy
342 
343  Log(3,"OptimiseVar1"," side:var (%d:%d): found %d at var=%f xy:(%f %f)", side, ivar, npk0, var0, dx0,dy0 );
344  return npk0;
345 }
Int_t Ncoins(float dvlim[4], EdbH2 *hdxy=0, EdbH2 *hdtxty=0, TObjArray *sel1=0, TObjArray *sel2=0)
Definition: EdbAlignmentV.cxx:763
Definition: EdbCell1.h:17
float X(int i) const
Definition: EdbCell1.h:53
int Bin(int ix) const
Definition: EdbCell1.h:57
int N() const
Definition: EdbCell1.h:48
void CleanCells()
Definition: EdbCell1.cpp:84
void SetBin(int ix, int n)
Definition: EdbCell1.h:65
Definition: EdbCell2.h:104

◆ OptimiseVar2()

void EdbAlignmentV::OptimiseVar2 ( int  side1,
int  ivar1,
int  side2,
int  ivar2,
EdbH2 h12,
EdbH2 hdxy = 0,
EdbH2 hdtxty = 0 
)
351 {
352  // use already preselected "couples" - useful to test small variations of parameters
353  // especially after Hdistance preselection
354  // Input: 2 variables defoned as side1/ivar1 and side1/ivar1
355  // Output: h12 - filled selections histo
356  // Optional: hdxy, hdtxy - 2d- histograms defined outside and used for the peak selection
357  if(!SideOK(side1)) return;
358  if(!SideOK(side2)) return;
359  EdbH1 &h1 = eH[side1][ivar1];
360  EdbH1 &h2 = eH[side2][ivar2];
361  if( h1.N() < 1 || h2.N() < 1) {
362  Log(1,"OptimiseVar2","ERROR: var %d of side %d have %d steps - skipped", ivar1,side1, h1.N() );
363  Log(1,"OptimiseVar2","ERROR: var %d of side %d have %d steps - skipped", ivar2,side2, h2.N() );
364  return;
365  }
366  Log(3,"OptimiseVar2","side/var: %d/%d and %d/%d with %d x %d = %d attempts",
367  side1, ivar1, side2, ivar2, h1.N(), h2.N(), h1.N()*h2.N() );
368 
369  //h12.Delete();
370  int n12[2] = { h1.N(), h2.N() };
371  float min[2] = { h1.Xmin(), h2.Xmin() };
372  float max[2] = { h1.Xmax(), h2.Xmax() };
373  h12.InitH2(n12, min, max);
374 
375  h1.CleanCells();
376  h2.CleanCells();
377 
378  int npk0=0;
379  float dx0=0,dy0=0; //the position of the highest peak
380 
381  for(int i1=0; i1<h1.N(); i1++)
382  {
383  eCorr[side1].SetV( ivar1, h1.X(i1) );
384  for(int i2=0; i2<h2.N(); i2++)
385  {
386  eCorr[side2].SetV( ivar2, h2.X(i2) );
387  int nc = Ncoins(eDVsame, hdxy);
388  if(!hdxy) h12.SetBin( i1, i2, nc );
389  else {
390  EdbPeak2 pk2(*hdxy);
391  float dx, dy;
392  int npk = pk2.FindPeak( dx, dy );
393  //int npk = pk2.FindPeak9( dx, dy );
394  if( npk > npk0 ) { npk0=npk; dx0 = dx; dy0=dy; }
395  h12.SetBin( i1, i2, npk );
396  }
397  }
398  }
399 
400  eCorr[side1].AddV(0,dx0); // set x-y corrections
401  eCorr[side1].AddV(1,dy0);
402 }
void SetBin(int ix, int iy, int n)
Definition: EdbCell2.h:91
int InitH2(const EdbH2 &h)
Definition: EdbCell2.cpp:79
TH1F * h2
Definition: energy.C:19
TH1F * h1
Definition: energy.C:16

◆ PrintCorr()

void EdbAlignmentV::PrintCorr ( )
41 {
42  printf("eUseAffCorr = %d\n",eUseAffCorr);
43  if(eUseAffCorr) {
44  printf("use layers:\n");
45  eCorrL[0].Print();
46  eCorrL[1].Print();
47  } else {
48  printf("use eCorr offsets:\n");
49  eCorrL[0].Print();
50  eCorrL[1].Print();
51  }
52 }
void Print()
Definition: EdbLayer.cxx:150

◆ SelectBestCouple()

int EdbAlignmentV::SelectBestCouple ( )
169 {
170  // assume the different pattern's segments in eS[0] and eS[1]
171  // assume that the selection method in FillCombinations - "first s1 then s2"
172 
173  int nrem=0;
174  int n = CheckEqualArr(eS[0], eS[1]);
175  EdbSegP *s1=0,*s2=0;
176  EdbSegP *s1ok=0,*s2ok=0;
177  int iok=-1;
178  for(int i=0; i<n; i++) {
179  s1 = (EdbSegP*)eS[0].UncheckedAt(i);
180  s2 = (EdbSegP*)eS[1].UncheckedAt(i);
181  if(s1==s1ok) {
182  if( CoupleQuality(*s1,*s2) > CoupleQuality(*s1ok,*s2ok) ) {
183  s1ok = s1, s2ok = s2;
184  eS[0].RemoveAt(iok);
185  eS[1].RemoveAt(iok);
186  iok=i;
187  }
188  else {
189  eS[0].RemoveAt(i);
190  eS[1].RemoveAt(i);
191  }
192  nrem++;
193  }
194  else { s1ok = s1, s2ok = s2; iok=i; }
195  }
196 
197  eS[0].Compress();
198  eS[1].Compress();
199 
200  Log(2,"SelectBestCouple","%d couples discarded with", nrem );
201  return nrem;
202 }
float CoupleQuality(EdbSegP &s1, EdbSegP &s2)
Definition: EdbAlignmentV.cxx:205

◆ SelectIsolated()

int EdbAlignmentV::SelectIsolated ( )
133 {
134  // assume the different pattern's segments in eS[0] and eS[1]
135  // assume that the selection method in FillCombinations - "first s1 then s2"
136  // remove all duplicated combs
137 
138  int nrem=0;
139  int n = CheckEqualArr(eS[0], eS[1]);
140  EdbSegP *s1=0,*s2=0;
141  EdbSegP *s1ok=0,*s2ok=0;
142  int iok=-1;
143  for(int i=0; i<n; i++) {
144  s1 = (EdbSegP*)eS[0].UncheckedAt(i);
145  s2 = (EdbSegP*)eS[1].UncheckedAt(i);
146  if(s1==s1ok) {
147  eS[0].RemoveAt(i);
148  eS[1].RemoveAt(i);
149  nrem++;
150  }
151  else if(s1ok!=0) {
152  eS[0].RemoveAt(iok);
153  eS[1].RemoveAt(iok);
154  s1ok=0;
155  nrem++;
156  }
157  else { s1ok = s1, s2ok = s2; iok=i; }
158  }
159 
160  eS[0].Compress();
161  eS[1].Compress();
162 
163  Log(2,"SelectIsolated","%d couples discarded with", nrem );
164  return nrem;
165 }

◆ SideOK()

bool EdbAlignmentV::SideOK ( int  side)
406 {
407  if(side==0||side==1) return 1;
408  else {
409  Log(1,"SideOK","ERROR: invalid side index %d",side);
410  return 0;
411  }
412 }

◆ StrDVsame()

char* EdbAlignmentV::StrDVsame ( ) const
inline
50 {return Form("%7.2f %7.2f %8.5f %8.5f",eDVsame[0],eDVsame[1],eDVsame[2],eDVsame[3]); }

◆ TX()

float EdbAlignmentV::TX ( int  side,
EdbSegP s 
)
inline
124 { return eUseAffCorr? eCorrL[side].TX(s) : eCorr[side].TX(s); }
float TX() const
Definition: EdbLayer.h:79
float TX(EdbSegP &s)
Definition: EdbSegCorr.h:34

◆ TY()

float EdbAlignmentV::TY ( int  side,
EdbSegP s 
)
inline
125 { return eUseAffCorr? eCorrL[side].TY(s) : eCorr[side].TY(s); }
float TY() const
Definition: EdbLayer.h:80
float TY(EdbSegP &s)
Definition: EdbSegCorr.h:35

◆ ValidCoinsidence()

Bool_t EdbAlignmentV::ValidCoinsidence ( EdbSegP s1,
EdbSegP s2,
float  dvlim[4],
float  dvfound[4] 
)
751 {
752  if(&s1==&s2) return 0;
753  if(s1.Flag()==-10) return 0;
754  if(s2.Flag()==-10) return 0;
755  dfound[0] = X(1,s2) - X(0,s1); if(Abs(dfound[0]) > dv[0]) return 0;
756  dfound[1] = Y(1,s2) - Y(0,s1); if(Abs(dfound[1]) > dv[1]) return 0;
757  dfound[2] = TX(1,s2) - TX(0,s1); if(Abs(dfound[2]) > dv[2]) return 0;
758  dfound[3] = TY(1,s2) - TY(0,s1); if(Abs(dfound[3]) > dv[3]) return 0;
759  return 1;
760 }

◆ Var() [1/2]

float EdbAlignmentV::Var ( int  side,
EdbSegP s,
int  ivar 
)
inline
126  {switch(ivar) {
127  case(0): return X(side,s);
128  case(1): return Y(side,s);
129  case(2): return TX(side,s);
130  case(3): return TY(side,s); } return 0;
131  }

◆ Var() [2/2]

float EdbAlignmentV::Var ( int  side,
int  iseg,
int  ivar 
)
inline
132 { return Var(side,*((EdbSegP*)eS[side].UncheckedAt(iseg)),ivar); }

◆ X()

float EdbAlignmentV::X ( int  side,
EdbSegP s 
)
inline
122 { return eUseAffCorr? eCorrL[side].X(s) : eCorr[side].X(s); }
float X() const
Definition: EdbLayer.h:76
float X(EdbSegP &s)
Definition: EdbSegCorr.h:25

◆ Xmax() [1/2]

float EdbAlignmentV::Xmax ( int  side,
EdbPattern p 
)
1147 {
1148  int n=p.N(); float xmax = kMinInt;
1149  if(n>0)
1150  for(int i=0; i<n; i++) {
1151  EdbSegP *s = p.GetSegment(i);
1152  float x=X(side,*s);
1153  if(x<kMaxInt) xmax=(x>xmax)?x:xmax;
1154  }
1155  return xmax;
1156 }
float xmax
Definition: emthickness.cpp:61

◆ Xmax() [2/2]

float EdbAlignmentV::Xmax ( int  side,
TObjArray &  p 
)
1232 {
1233  int n=p.GetEntries(); float xmax = 0;
1234  for(int i=0; i<n; i++) {
1235  EdbSegP *s = (EdbSegP*)(p.At(i));
1236  float x=X(side,*s);
1237  if(!i) xmax=x; else if( x>xmax) xmax=x;
1238  }
1239  return xmax;
1240 }

◆ Xmin() [1/2]

float EdbAlignmentV::Xmin ( int  side,
EdbPattern p 
)
1135 {
1136  int n=p.N(); float xmin = kMaxInt;
1137  if(n>0)
1138  for(int i=0; i<n; i++) {
1139  EdbSegP *s = p.GetSegment(i);
1140  float x=X(side,*s);
1141  if(x>kMinInt) xmin=(x<xmin)?x:xmin;
1142  }
1143  return xmin;
1144 }
float xmin
Definition: emthickness.cpp:61

◆ Xmin() [2/2]

float EdbAlignmentV::Xmin ( int  side,
TObjArray &  p 
)
1221 {
1222  int n=p.GetEntries(); float xmin = 0;
1223  for(int i=0; i<n; i++) {
1224  EdbSegP *s = (EdbSegP*)(p.At(i));
1225  float x=X(side,*s);
1226  if(!i) xmin=x; else if( x<xmin) xmin=x;
1227  }
1228  return xmin;
1229 }

◆ Y()

float EdbAlignmentV::Y ( int  side,
EdbSegP s 
)
inline
123 { return eUseAffCorr? eCorrL[side].Y(s) : eCorr[side].Y(s); }
float Y() const
Definition: EdbLayer.h:77
float Y(EdbSegP &s)
Definition: EdbSegCorr.h:26

◆ Ymax() [1/2]

float EdbAlignmentV::Ymax ( int  side,
EdbPattern p 
)
1171 {
1172  int n=p.N(); float ymax = kMinInt;
1173  if(n>0)
1174  for(int i=0; i<n; i++) {
1175  EdbSegP *s = p.GetSegment(i);
1176  float y=Y(side,*s);
1177  if(y<kMaxInt) ymax=(y>ymax)?y:ymax;
1178  }
1179  return ymax;
1180 }
float ymax
Definition: emthickness.cpp:63

◆ Ymax() [2/2]

float EdbAlignmentV::Ymax ( int  side,
TObjArray &  p 
)
1254 {
1255  int n=p.GetEntries(); float ymax = 0;
1256  for(int i=0; i<n; i++) {
1257  EdbSegP *s = (EdbSegP*)(p.At(i));
1258  float y=Y(side,*s);
1259  if(!i) ymax=y; else if( y>ymax) ymax=y;
1260  }
1261  return ymax;
1262 }

◆ Ymin() [1/2]

float EdbAlignmentV::Ymin ( int  side,
EdbPattern p 
)
1159 {
1160  int n=p.N(); float ymin = kMaxInt;
1161  if(n>0)
1162  for(int i=0; i<n; i++) {
1163  EdbSegP *s = p.GetSegment(i);
1164  float y=Y(side,*s);
1165  if(y>kMinInt) ymin=(y<ymin)?y:ymin;
1166  }
1167  return ymin;
1168 }
float ymin
Definition: emthickness.cpp:63

◆ Ymin() [2/2]

float EdbAlignmentV::Ymin ( int  side,
TObjArray &  p 
)
1243 {
1244  int n=p.GetEntries(); float ymin = 0;
1245  for(int i=0; i<n; i++) {
1246  EdbSegP *s = (EdbSegP*)(p.At(i));
1247  float y=Y(side,*s);
1248  if(!i) ymin=y; else if( y<ymin) ymin=y;
1249  }
1250  return ymin;
1251 }

Member Data Documentation

◆ eCorr

EdbSegCorr EdbAlignmentV::eCorr[2]

◆ eCorrL

EdbLayer EdbAlignmentV::eCorrL[2]

◆ eDoubletsRate

TH1I* EdbAlignmentV::eDoubletsRate

◆ eDVsame

Float_t EdbAlignmentV::eDVsame[4]

◆ eH

EdbH1 EdbAlignmentV::eH[2][7]

◆ eHxy

EdbH2 EdbAlignmentV::eHxy

◆ eOutputFile

TFile* EdbAlignmentV::eOutputFile

◆ ePC

EdbCell2 EdbAlignmentV::ePC[2]

◆ eS

TObjArray EdbAlignmentV::eS[2]

◆ eUseAffCorr

Bool_t EdbAlignmentV::eUseAffCorr

◆ eXmarg

Float_t EdbAlignmentV::eXmarg

◆ eYmarg

Float_t EdbAlignmentV::eYmarg

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