FEDRA emulsion software from the OPERA Collaboration
EdbPlateAlignment Class Reference

#include <EdbPlateAlignment.h>

Inheritance diagram for EdbPlateAlignment:
Collaboration diagram for EdbPlateAlignment:

Public Member Functions

void Align (EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
 
void CoarseAl (EdbPattern &p1, EdbPattern &p2)
 
void DoubletsFilterOut (EdbPattern &p1, EdbPattern &p2)
 
 EdbPlateAlignment ()
 
void FineAl (EdbPattern &p1, EdbPattern &p2)
 
void FineAlAff (EdbPattern &p1, EdbPattern &p2, EdbLayer &la1)
 
void ProduceReport ()
 
void RankCouples (TObjArray &arr1, TObjArray &arr2)
 
void SaveCouplesTree ()
 
void SetDoublets (float dx, float dy, float dtx, float dty)
 
void SetParCoarseAl (float zcorr, float dpos=300, float dang=0.015, float dz=122, float dphi=0.01)
 
void SetParFineAl ()
 
void SetParTestAl (float zcorr, float dz=500, float dphi=0.03)
 
void SetSigma (float spos, float sang)
 
void SlowAlignXY (EdbPattern &p1, EdbPattern &p2, EdbH2 &hxy, EdbH1 &hphi, const char *name="slowal")
 
void TestAl (EdbPattern &p1, EdbPattern &p2)
 
virtual ~EdbPlateAlignment ()
 
- Public Member Functions inherited from EdbAlignmentV
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 ()
 

Public Attributes

Int_t eCoarseMin
 
Bool_t eCoarseOK
 
Bool_t eDoCoarse
 
Bool_t eDoCorrectAngle
 
Bool_t eDoCorrectBeforeSaving
 
Bool_t eDoFine
 
Bool_t eDoTestAl
 
Float_t eDoublets [4]
 
Float_t eDPHI
 
Float_t eDZ
 
Int_t eFineMin
 
Bool_t eFineOK
 
EdbPeak2 eH_xy_coarse
 
EdbPeak2 eH_xy_final
 
EdbPeak2 eH_zphi_coarse
 
Int_t eNcoins
 
Int_t eNiter
 
Bool_t eNoScale
 
Bool_t eNoScaleRot
 
Float_t eOffsetMax
 
Bool_t eRankCouples
 
Bool_t eSaveCouples
 
TObjArray eSegCouples
 
Float_t eSigma [2]
 
Bool_t eStatus
 
Bool_t eTestAlOK
 
- Public Attributes inherited from EdbAlignmentV
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
 

Additional Inherited Members

- Static Public Member Functions inherited from EdbAlignmentV
static Int_t CheckEqualArr (TObjArray &arr1, TObjArray &arr2)
 

Constructor & Destructor Documentation

◆ EdbPlateAlignment()

EdbPlateAlignment::EdbPlateAlignment ( )
31 {
32  SetSigma( 10, 0.005 );
33  eOffsetMax = 500.;
34  eDZ = 120;
35  eDPHI = 0.009;
36  eDoublets[0]=eDoublets[1]=5;
37  eDoublets[2]=eDoublets[3]=0.003;
38 
39  eStatus =false;
40  eDoTestAl =false; eTestAlOK =true;
41  eDoCoarse =true; eCoarseOK =false;
42  eDoFine =true; eFineOK =false;
43  eSaveCouples=false;
44  eRankCouples=false;
46  eDoCorrectAngle=true; // keep true for compatibility
47  eNoScale=0;
48 
49  eNcoins = 0;
50  eCoarseMin = 5;
51  eFineMin = 5;
52  eNiter = 3;
53 }
Float_t eOffsetMax
Definition: EdbPlateAlignment.h:12
Bool_t eCoarseOK
Definition: EdbPlateAlignment.h:21
Int_t eNiter
Definition: EdbPlateAlignment.h:38
Bool_t eSaveCouples
Definition: EdbPlateAlignment.h:24
Bool_t eFineOK
Definition: EdbPlateAlignment.h:22
void SetSigma(float spos, float sang)
Definition: EdbPlateAlignment.h:56
Bool_t eDoFine
Definition: EdbPlateAlignment.h:22
Int_t eFineMin
Definition: EdbPlateAlignment.h:28
Float_t eDZ
Definition: EdbPlateAlignment.h:14
Int_t eCoarseMin
Definition: EdbPlateAlignment.h:29
Bool_t eDoCorrectAngle
Definition: EdbPlateAlignment.h:37
Bool_t eStatus
Definition: EdbPlateAlignment.h:25
Float_t eDoublets[4]
Definition: EdbPlateAlignment.h:16
Float_t eDPHI
Definition: EdbPlateAlignment.h:15
Int_t eNcoins
Definition: EdbPlateAlignment.h:26
Bool_t eDoTestAl
Definition: EdbPlateAlignment.h:20
Bool_t eTestAlOK
Definition: EdbPlateAlignment.h:20
Bool_t eDoCoarse
Definition: EdbPlateAlignment.h:21
Bool_t eRankCouples
Definition: EdbPlateAlignment.h:23
Bool_t eDoCorrectBeforeSaving
Definition: EdbPlateAlignment.h:36
Bool_t eNoScale
Definition: EdbPlateAlignment.h:19

◆ ~EdbPlateAlignment()

EdbPlateAlignment::~EdbPlateAlignment ( )
virtual
57 {
59 }
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:64

Member Function Documentation

◆ Align()

void EdbPlateAlignment::Align ( EdbPattern p1,
EdbPattern p2,
float  dz,
int  flag = 0 
)
63 {
64  // if flag is different from 0 assign it to the selected segments
65  //
66  eStatus = false;
67  eHxy.Delete();
71 
72  Log(2,"EdbPlateAlignment::Align","pattern 1 with %d in limits x:(%12.2f %12.2f) y:(%12.2f %12.2f)",
73  p1.N(), p1.Xmin(),p1.Xmax(),p1.Ymin(),p1.Ymax() );
74  Log(2,"EdbPlateAlignment::Align","pattern 2 with %d in limits x:(%12.2f %12.2f) y:(%12.2f %12.2f)",
75  p2.N(), p2.Xmin(),p2.Xmax(),p2.Ymin(),p2.Ymax() );
76 
77  if(p1.N()<1||p2.N()<1) return;
78  DoubletsFilterOut(p1,p2);
79 
81  if(eDoTestAl) {
82  TestAl(p1,p2);
83  if(!eTestAlOK) goto END;
84  }
85 
86  CorrToCoG(1,p2);
87 
88  if(eDoCoarse) {
89  SetParCoarseAl( eCorr[0].V(2) , eOffsetMax, 3*eSigma[1], eDZ, eDPHI );
90  CoarseAl(p1,p2);
91  if(!eCoarseOK) goto END;
92  }
93 
94  if(eDoFine) {
95  SetParFineAl();
96  for(int i=0; i<eNiter; i++) FineAl(p1,p2);
97 
98  eUseAffCorr=true;
99  Corr2Aff( eCorrL[0] );
100 
101  for(int i=0; i<eNiter; i++) FineAlAff(p1,p2,eCorrL[0] );
103  if(!eFineOK) goto END;
104  }
105 
106  END:
107 
108  if(eRankCouples) {
109 // eCorr[0].SetV(2,0); eCorr[1].SetV(2, 0); ??
110  RankCouples( eS[0], eS[1] );
111  }
112  ProduceReport();
113  if(flag) AssignFlagToS(flag); // assign particular flag to the selected segments
115 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
brick dz
Definition: RecDispMC.C:107
EdbH2 eHxy
Definition: EdbAlignmentV.h:31
void CorrToCoG(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:456
void Corr2Aff(EdbLayer &layer)
Definition: EdbAlignmentV.cxx:1118
Bool_t eUseAffCorr
Definition: EdbAlignmentV.h:23
void AssignFlagToS(int flag)
Definition: EdbAlignmentV.cxx:224
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
EdbSegCorr eCorr[2]
Definition: EdbAlignmentV.h:24
TObjArray eS[2]
Definition: EdbAlignmentV.h:21
void Delete()
Definition: EdbCell2.cpp:69
void Init(const EdbH2 &h, int npeaks=10)
Definition: EdbCell2.cpp:372
void Delete()
Definition: EdbCell2.cpp:365
EdbPeak2 eH_zphi_coarse
Definition: EdbPlateAlignment.h:31
void FineAlAff(EdbPattern &p1, EdbPattern &p2, EdbLayer &la1)
Definition: EdbPlateAlignment.cxx:340
Float_t eSigma[2]
Definition: EdbPlateAlignment.h:11
void TestAl(EdbPattern &p1, EdbPattern &p2)
Definition: EdbPlateAlignment.cxx:481
void SetParFineAl()
Definition: EdbPlateAlignment.cxx:534
void FineAl(EdbPattern &p1, EdbPattern &p2)
Definition: EdbPlateAlignment.cxx:382
void SetParCoarseAl(float zcorr, float dpos=300, float dang=0.015, float dz=122, float dphi=0.01)
Definition: EdbPlateAlignment.cxx:543
EdbPeak2 eH_xy_coarse
Definition: EdbPlateAlignment.h:32
void ProduceReport()
Definition: EdbPlateAlignment.cxx:136
void SetParTestAl(float zcorr, float dz=500, float dphi=0.03)
Definition: EdbPlateAlignment.cxx:569
void DoubletsFilterOut(EdbPattern &p1, EdbPattern &p2)
Definition: EdbPlateAlignment.cxx:325
void CoarseAl(EdbPattern &p1, EdbPattern &p2)
Definition: EdbPlateAlignment.cxx:431
void SaveCouplesTree()
Definition: EdbPlateAlignment.cxx:118
EdbPeak2 eH_xy_final
Definition: EdbPlateAlignment.h:33
void RankCouples(TObjArray &arr1, TObjArray &arr2)
Definition: EdbPlateAlignment.cxx:635
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
Int_t N() const
Definition: EdbPattern.h:89

◆ CoarseAl()

void EdbPlateAlignment::CoarseAl ( EdbPattern p1,
EdbPattern p2 
)
432 {
433  // all pars should be already defined
434 
435  if( Log(3, "CoarseAl","with patterns %d %d", p1.N(), p2.N() ) ) {
436  eCorr[0].Print(); eCorr[1].Print();
437  }
438  FillGuessCell(p1,p2,1.,eOffsetMax);
440  int n[2] = { eH[0][0].N() , eH[0][1].N() };
441  float min[2] = { eH[0][0].Xmin(), eH[0][1].Xmin() };
442  float max[2] = { eH[0][0].Xmax(), eH[0][1].Xmax() };
443  eHxy.InitH2(n, min, max);
444 
445  //OptimiseVar1(0, 6, &eHxy);
446  //OptimiseVar1(0, 2, &eHxy);
447 
448  EdbH2 h_z_phi;
449  OptimiseVar2( 0, 6, 0, 2, h_z_phi, &eHxy ); // variate rotation and z of the p1
450 
451  eH_zphi_coarse.Init(h_z_phi);
452 
453  EdbPeak2 pk2z(h_z_phi);
454  float dphi, dz;
455  pk2z.FindPeak( dphi, dz );
456  pk2z.ProbPeak();
457  eCorr[0].SetV(2, dz );
458  eCorr[0].SetV(6, dphi);
459 
460  Ncoins(eDVsame, &eHxy);
461  Log(2,"CoarseAl","DVsame: %s",StrDVsame());
463 
464  EdbPeak2 pk2(eHxy);
465  float dx, dy;
466  int npk = (int)pk2.FindPeak9( dx, dy );
467  eCorr[0].AddV(0,dx); eCorr[0].AddV(1,dy);
468  pk2.ProbPeak();
469  //pk2.Print();
470 
471  Log(2,"CoarseAl","%d coins with peak of %d/%6.3f with offsets (dx:dy:dz:dphi): %7.2f %7.2f %8.2f %7.3f with patterns of: %d %d",
472  npk, (int)pk2.ePeak[0], pk2.eMean[0],
473  eCorr[0].V(0)-eCorr[1].V(0), eCorr[0].V(1)-eCorr[1].V(1), eCorr[0].V(2), eCorr[0].V(6),
474  p1.N(),p2.N() );
475 
476  if(npk>3) eCoarseOK = true;
477  else eCoarseOK = false;
478 }
float min(TClonesArray *t)
Definition: bitview.cxx:275
int max
Definition: check_shower.C:41
char * StrDVsame() const
Definition: EdbAlignmentV.h:50
Int_t Ncoins(float dvlim[4], EdbH2 *hdxy=0, EdbH2 *hdtxty=0, TObjArray *sel1=0, TObjArray *sel2=0)
Definition: EdbAlignmentV.cxx:763
Float_t eDVsame[4]
Definition: EdbAlignmentV.h:16
EdbH1 eH[2][7]
Definition: EdbAlignmentV.h:27
void OptimiseVar2(int side1, int ivar1, int side2, int ivar2, EdbH2 &h12, EdbH2 *hdxy=0, EdbH2 *hdtxty=0)
Definition: EdbAlignmentV.cxx:349
void FillGuessCell(EdbPattern &p1, EdbPattern &p2, float binOK=1., float offsetMax=2000.)
Definition: EdbAlignmentV.cxx:919
int FillCombinations()
Definition: EdbAlignmentV.cxx:234
int N() const
Definition: EdbCell1.h:48
float Xmax() const
Definition: EdbCell1.h:55
float Xmin() const
Definition: EdbCell1.h:54
Definition: EdbCell2.h:19
int InitH2(const EdbH2 &h)
Definition: EdbCell2.cpp:79
Definition: EdbCell2.h:104
void Print()
float V(int i)
Definition: EdbSegCorr.h:23
void SetV(int i, float x)
Definition: EdbSegCorr.h:21
void AddV(int i, float x)
Definition: EdbSegCorr.h:22

◆ DoubletsFilterOut()

void EdbPlateAlignment::DoubletsFilterOut ( EdbPattern p1,
EdbPattern p2 
)
326 {
327  EdbAlignmentV adup;
328  for(int i=0; i<4; i++) adup.eDVsame[i]=eDoublets[i];
329 
330  adup.FillGuessCell(p1,p1,1.,eOffsetMax);
331  adup.FillCombinations();
332  adup.DoubletsFilterOut(0); // assign flag -10 to the duplicated segments
333 
334  adup.FillGuessCell(p2,p2,1.,eOffsetMax);
335  adup.FillCombinations();
336  adup.DoubletsFilterOut(0); // assign flag -10 to the duplicated segments
337 }
Definition: EdbAlignmentV.h:13
int DoubletsFilterOut(int checkview, TH2F *hxy=0, TH2F *htxty=0)
Definition: EdbAlignmentV.cxx:83

◆ FineAl()

void EdbPlateAlignment::FineAl ( EdbPattern p1,
EdbPattern p2 
)
383 {
384  Log(3, "FineAl","with patterns %d %d", p1.N(), p2.N() );
385  FillGuessCell(p1,p2,1.,eOffsetMax);
386  float dxlim = eH[0][0].Xmax()-eH[0][0].Xmin();
387  float dylim = eH[0][1].Xmax()-eH[0][1].Xmin();
388 
389  eDVsame[0] = dxlim/2.; eDVsame[1] = dylim/2.;
390  //eDVsame[0] = dxlim; eDVsame[1] = dylim;
391 
392  //eDVsame[2]=eDVsame[3]=0.01;
393  eDVsame[2]=eDVsame[3]=3.*eSigma[1];
394  FillCombinations( eDVsame, dxlim, dylim, 1);
395 
396  int n[2] = { 9,9 };
397  float min[2] = { eH[0][0].Xmin(), eH[0][1].Xmin() };
398  float max[2] = { eH[0][0].Xmax(), eH[0][1].Xmax() };
399  eHxy.InitH2(n, min, max);
400 
401  for(int i=0; i<3; i++) FindCorrDiff(eDVsame);
402 
403  TObjArray sel1,sel2;
404  Ncoins(eDVsame, &eHxy, 0, &sel1, &sel2);
405 
406  if( eDZ>0.0001 ) {
407  for(int i=0; i<3; i++) {
408  float dz = FineCorrZ(sel1,sel2);
409  eCorr[0].AddV(2,dz);
410  }
411  }
412 
413 // for(int i=0; i<3; i++) {
414 // float dphi = FineCorrPhi(sel1,sel2);
415 // eCorr[0].AddV(6,dphi);
416 // }
417 
418  int npk=Ncoins(eDVsame, &eHxy);
419 
420  Log(2,"FineAl","peak of %d with offsets (dx:dy:dz:dphi): %7.2f %7.2f %8.2f %7.3f with patterns of: %d %d",
421  npk,
422  eCorr[0].V(0)-eCorr[1].V(0), eCorr[0].V(1)-eCorr[1].V(1), eCorr[0].V(2), eCorr[0].V(6),
423  p1.N(),p2.N() );
424 
425 
426  if(npk>3) eFineOK = true;
427  else eFineOK = false;
428 }
float FineCorrZ()
Definition: EdbAlignmentV.h:91
Int_t FindCorrDiff(float dvsame[4], int side=0, int nlim=10)
Definition: EdbAlignmentV.cxx:706

◆ FineAlAff()

void EdbPlateAlignment::FineAlAff ( EdbPattern p1,
EdbPattern p2,
EdbLayer la1 
)
341 {
342  // assuming that the patterns are already aligned with the accuracy of a few
343  // microns or the corrections are setted.
344  // find affine transfornations
345  Log(3, "FineAlAff","with patterns %d %d", p1.N(), p2.N() );
346  FillGuessCell(p1,p2,1.,eOffsetMax);
347  float dxlim = eH[0][0].Xmax()-eH[0][0].Xmin();
348  float dylim = eH[0][1].Xmax()-eH[0][1].Xmin();
349 
350  eDVsame[0] = dxlim/2.; eDVsame[1] = dylim/2.;
351  //eDVsame[0] = dxlim; eDVsame[1] = dylim;
352  eDVsame[2]=eDVsame[3]=3.*eSigma[1];
353  FillCombinations( eDVsame, dxlim, dylim, 1);
354 
355  int n[2] = { 9,9 };
356  float min[2] = { eH[0][0].Xmin(), eH[0][1].Xmin() };
357  float max[2] = { eH[0][0].Xmax(), eH[0][1].Xmax() };
358  eHxy.InitH2(n, min, max);
359 
360  TObjArray sel1, sel2;
361  int npk= Ncoins(eDVsame, &eHxy, 0, &sel1, &sel2);
362  EdbAffine2D aff;
363  if(eNoScale) CalculateAffXYTurn(sel1,sel2,aff);
364  else if(eNoScaleRot) CalculateAffXYShift(sel1,sel2,aff);
365  else CalculateAffXY(sel1,sel2,aff);
366  la1.GetAffineXY()->Transform(&aff);
367 
368  if(eDoCorrectAngle) {
369  EdbAffine2D afftxty;
370  CalculateAffTXTYTurn(sel1,sel2,afftxty);
371  la1.GetAffineTXTY()->Transform(&afftxty);
372  }
373 
374  Log(2,"FineAlAff","peak of %d with patterns of: %d %d", npk, p1.N(),p2.N() );
375  if(gEDBDEBUGLEVEL>2) la1.GetAffineXY()->Print();
376 
377  if(npk>3) eFineOK = true;
378  else eFineOK = false;
379 }
Definition: EdbAffine.h:17
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
Int_t CalculateAffXYShift(TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
Definition: EdbAlignmentV.cxx:1044
Int_t CalculateAffXY(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:97
Int_t CalculateAffTXTYTurn(TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
Definition: EdbAlignmentV.cxx:1074
Int_t CalculateAffXYTurn(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:96
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
Bool_t eNoScaleRot
Definition: EdbPlateAlignment.h:18
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ ProduceReport()

void EdbPlateAlignment::ProduceReport ( )
137 {
138  TH2F *zphiCoarse=0, *xyCoarse=0;
139  TH2F *xyFine=0;
140  gStyle->SetPalette(1);
141  if( eDoTestAl&&eTestAlOK ) {
142  Log(1,"Alignment Report","TestAl OK");
143  }
144  if( eDoCoarse&&eCoarseOK ) {
145  zphiCoarse = eH_zphi_coarse.DrawH2("zphi_coarse", "Z vs Phi after coarse align");
146  xyCoarse = eH_xy_coarse.DrawH2("xy_coarse", "dY vs dX after coarse align");
147  float dx,dy;
148  int npk = (int)eH_xy_coarse.FindPeak9( dx, dy );
150 
151  if (npk<eCoarseMin) eStatus = false; // too few coinsidences
152  else if(npk < 3*Sqrt(eH_xy_coarse.eMean[0]) ) eStatus = false; // too small signal/noise
153  else eStatus = true; // good alignment
154 
155  if(eStatus)
156  Log(2,"Alignment Report","Coarse %s: %d coins with peak of %d/%6.3f","OK",
157  npk, (int)eH_xy_coarse.ePeak[0], eH_xy_coarse.eMean[0]);
158  else {
159  Log(1,"Alignment Report","Coarse %s: %d coins with peak of %d/%6.3f","FAILED!",
160  npk, (int)eH_xy_coarse.ePeak[0], eH_xy_coarse.eMean[0]);
161  return;
162  }
163  }
164 
165 
166  if( eDoFine&&eFineOK ) {
167  xyFine = eH_xy_final.DrawH2("xy_final","dY vs dX after final alignment");
169  if( eNcoins < eFineMin ) eStatus = false; // too few coinsidences
170  else eStatus = true; // good alignment
171 
172  if(eStatus)
173  Log(2,"Alignment Report","Fine %s: %d coins inside (%6.1f %6.1f) with angular acc: (%6.3f %6.3f)", "OK",
174  (int)(eH_xy_final.Integral()),
176  eDVsame[2], eDVsame[3] );
177  else {
178  Log(2,"Alignment Report","Fine %s: %d coins inside (%6.1f %6.1f) with angular acc: (%6.3f %6.3f)", "FAILED!",
179  (int)(eH_xy_final.Integral()),
181  eDVsame[2], eDVsame[3] );
182  return;
183  }
184  }
185 
186  EdbAffine2D *aXY = eCorrL[0].GetAffineXY();
187  float xcenter1 = (ePC[0].Xmin()+ePC[0].Xmax())/2.;
188  float ycenter1 = (ePC[0].Ymin()+ePC[0].Ymax())/2.;
189  float xoffset= aXY->A11()*xcenter1 + aXY->A12()*ycenter1 + aXY->B1() - xcenter1;
190  float yoffset= aXY->A21()*xcenter1 + aXY->A22()*ycenter1 + aXY->B2() - ycenter1;
191 
192  eCorrL[0].SetXY( xcenter1, ycenter1 );
193 
194  const char *str = Form( "Nfinal= %5d Peak: %5d/%6.3f dx,dy,dz = %7.3f %7.3f %7.3f",
195  eS[0].GetEntries(),(int)eH_xy_coarse.ePeak[0], eH_xy_coarse.eMean[0],
196  xoffset, yoffset, eCorrL[0].Zcorr() );
197  Log(1,"Alignment Report","%s", str);
198 
199  if(eOutputFile) {
200  Log(2,"Alignment Report","Save to file %s", eOutputFile->GetName());
201  gStyle->SetPalette(1);
202  bool batch = gROOT->IsBatch();
203  gROOT->SetBatch();
204 
205  TCanvas *cc = new TCanvas("cc","Alignment report",800,800);
206 
207 
208  TPaveText *ctit = new TPaveText(0.01,0.943,0.99,0.998);
209  ctit->AddText( Form("Alignment of %s",eOutputFile->GetName()) );
210  ctit->AddText( str );
211  ctit->Draw();
212 
213  TPad *c = new TPad("c","plots",0.01,0.05,0.99,0.94);
214  c->Divide(3,3);
215  c->Draw();
216  TH2F *hp1 = ePC[0].DrawH2("hp1","Pattern1"); c->cd(1); hp1->SetStats(0); hp1->Draw("colz");
217  TH2F *hp2 = ePC[1].DrawH2("hp2","Pattern2"); c->cd(2); hp2->SetStats(0); hp2->Draw("colz");
218  if(zphiCoarse) { c->cd(3); zphiCoarse->SetStats(0); zphiCoarse->Draw("colz"); }
219  if(xyCoarse) { c->cd(4); xyCoarse->SetStats(0); xyCoarse->Draw("colz"); }
220  if(xyFine) { c->cd(5); xyFine->SetStats(0); xyFine->Draw("colz"); }
221 
222 
223  float xmin = Min( ePC[0].Xmin(), ePC[1].Xmin() );
224  float xmax = Max( ePC[0].Xmax(), ePC[1].Xmax() );
225  float ymin = Min( ePC[0].Ymin(), ePC[1].Ymin() );
226  float ymax = Max( ePC[0].Ymax(), ePC[1].Ymax() );
227 
228  Log(2,"Alignment Report","xmax-xmin: %f (%f-%f) ymax-ymin: %f (%f-%f)",
230 
231 
232  int n = CheckEqualArr(eS[0],eS[1]);
233 
234  c->cd(6);
235 
236  TH2I *hdtxy = new TH2I("dTXdTY","dTY vs dTX after final alignment",25,-3*eSigma[1], 3*eSigma[1], 25, -3*eSigma[1], 3*eSigma[1]);
237  for(int i=0; i<n; i++) {
238  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
239  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
240  float dtx = TX(1,*s2) - TX(0,*s1);
241  float dty = TY(1,*s2) - TY(0,*s1);
242  hdtxy->Fill(dtx,dty);
243  }
244  hdtxy->SetStats(0); hdtxy->Draw("colz");
245 
246  c->cd(8);
247 
248  TH2I *h2 = new TH2I("plateXY","plateXY",100,xmin-10, xmax+10, 100, ymin-10,ymax+10);
249  h2->SetStats(0);
250  h2->Draw();
251 
252  if(n<1000) {
253  for(int i=0; i<n; i++) {
254  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
255  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
256  float x1 = X(0,*s1), y1 = Y(0,*s1);
257  float x2 = X(1,*s2), y2 = Y(1,*s2);
258  TMarker *m1 = new TMarker(x1,y1,22);
259  m1->SetMarkerColor(kRed);
260  m1->SetMarkerSize(0.6);
261  m1->Draw();
262  TMarker *m2 = new TMarker(x2,y2,23);
263  m2->SetMarkerColor(kBlue);
264  m2->SetMarkerSize(0.6);
265  m2->Draw();
266  }
267  }
268 
269  c->cd(9);
270  TH2I *h2t = new TH2I("plateTXTY","plateTXTY",100,-1, 1, 100, -1,1 );
271  h2t->SetStats(0);
272  h2t->Draw();
273  if(n<1000) {
274  for(int i=0; i<n; i++) {
275  EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
276  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
277  float tx1 = TX(0, *s1), ty1 = TY(0, *s1);
278  float tx2 = TX(1, *s2), ty2 = TY(1, *s2);
279  TMarker *m1 = new TMarker(tx1,ty1,22);
280  m1->SetMarkerColor(kRed);
281  m1->SetMarkerSize(0.6);
282  m1->Draw();
283  TMarker *m2 = new TMarker(tx2,ty2,23);
284  m2->SetMarkerColor(kBlue);
285  m2->SetMarkerSize(0.6);
286  m2->Draw();
287  }
288  }
289 
290 
291  c->cd(7);
292  int nbin=25;
293  TArrayF xbins(nbin+1);
294  xbins[0]= 0.15;
295  float s0 = xbins[0]*xbins[0];
296  for(int i=1; i<nbin+1; i++) xbins[i] = Sqrt( xbins[i-1]*xbins[i-1] + s0 );
297 
298  TH1F *thetadens = new TH1F("thetadens","theta density",nbin,xbins.GetArray() );
299  for(int i=0; i<n; i++) {
300  //EdbSegP *s1 = (EdbSegP*)eS[0].UncheckedAt(i);
301  EdbSegP *s2 = (EdbSegP*)eS[1].UncheckedAt(i);
302  float tx = TX(1,*s2), ty = TY(1,*s2);
303  float theta = Sqrt(tx*tx+ty*ty);
304  thetadens->Fill(theta);
305  }
306  thetadens->Draw();
307 
308  eH_xy_coarse.Write("peak2c");
309  cc->Write("report_al");
310  eCorrL[0].Write("corr_layer1");
311  eCorrL[1].Write("corr_layer2");
312  SafeDelete(c);
313 
314  SafeDelete(cc);
315 
316  gROOT->SetBatch(batch);
317  }
318 
319  SafeDelete(zphiCoarse);
320  SafeDelete(xyCoarse);
321  SafeDelete(xyFine);
322 }
cout<< tr-> GetEntries()<< endl
Float_t B2() const
Definition: EdbAffine.h:48
Float_t A22() const
Definition: EdbAffine.h:46
Float_t A21() const
Definition: EdbAffine.h:45
Float_t A12() const
Definition: EdbAffine.h:44
Float_t B1() const
Definition: EdbAffine.h:47
Float_t A11() const
Definition: EdbAffine.h:43
float Y(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:123
static Int_t CheckEqualArr(TObjArray &arr1, TObjArray &arr2)
Definition: EdbAlignmentV.cxx:415
float TY(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:125
float Ymin(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1158
TFile * eOutputFile
Definition: EdbAlignmentV.h:35
EdbCell2 ePC[2]
Definition: EdbAlignmentV.h:18
float Xmax(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1146
float X(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:122
float Ymax(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1170
float TX(int side, EdbSegP &s)
Definition: EdbAlignmentV.h:124
float Xmin(int side, EdbPattern &p)
Definition: EdbAlignmentV.cxx:1134
float Xmax() const
Definition: EdbCell2.h:65
float Ymin() const
Definition: EdbCell2.h:66
Long_t Integral()
Definition: EdbCell2.cpp:226
TH2F * DrawH2(const char *name="plot2d", const char *title="EdbH2plot2D")
Definition: EdbCell2.cpp:197
float Xmin() const
Definition: EdbCell2.h:64
float Ymax() const
Definition: EdbCell2.h:67
float Zcorr() const
Definition: EdbLayer.h:91
void SetXY(float x, float y)
Definition: EdbLayer.h:97
TArrayF eMean
Definition: EdbCell2.h:110
TArrayF ePeak
Definition: EdbCell2.h:108
float ProbPeak()
Definition: EdbCell2.cpp:411
float FindPeak9(float &x, float &y)
Definition: EdbCell2.cpp:473
Definition: EdbSegP.h:18
float xmin
Definition: emthickness.cpp:61
float ymin
Definition: emthickness.cpp:63
float xmax
Definition: emthickness.cpp:61
float ymax
Definition: emthickness.cpp:63
TH1F * h2
Definition: energy.C:19
new TCanvas()
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ RankCouples()

void EdbPlateAlignment::RankCouples ( TObjArray &  arr1,
TObjArray &  arr2 
)
636 {
637  int n = arr1.GetEntries();
638  Log(3,"RankCouples","%d" ,n);
639 
640  EdbTrackFitter tf;
641  EdbScanCond cond;
642  cond.SetSigma0(eSigma[0],eSigma[0],eSigma[1],eSigma[1]);
643  eSegCouples.Delete();
644  EdbSegP seg, seg1, seg2;
645  for(int i=0; i<n; i++) {
646  EdbSegP *s1 = ((EdbSegP*)arr1.UncheckedAt(i));
647  EdbSegP *s2 = ((EdbSegP*)arr2.UncheckedAt(i));
648 
649  seg.Copy(*s1); // to set correctly vid, aid, etc
650  seg1.Copy(*s1);
651  seg2.Copy(*s2);
652 
653  eCorr[0].ApplyCorrections(seg1);
654  eCorr[1].ApplyCorrections(seg2);
655 
656  tf.Chi2PSeg( seg1, seg2, seg, cond, cond);
657 
658  s1->SetFlag(0);
659  s2->SetFlag(0);
660  seg.SetFlag(0);
661  seg.SetSide(0);
662  seg.SetVolume(seg1.Volume()+seg2.Volume());
663  seg.SetDZ( Abs(seg1.eZ - seg2.eZ) );
664 
665  seg.SetDZem( seg1.Chi2() + seg2.Chi2() ); // HACK: use eDZem variable to keep microtracking Likelihood
666 
667  EdbSegCouple *sc=new EdbSegCouple();
668  sc->eS1=s1;
669  sc->eS2=s2;
670  sc->eS = new EdbSegP(seg);
671  sc->SetCHI2P( seg.Chi2() );
672  eSegCouples.Add(sc);
673  }
674 
675  EdbSegCouple::SetSortFlag(0); // sort by CHI2P
676  eSegCouples.UnSort();
677  eSegCouples.Sort();
678 
679  int ncp = eSegCouples.GetEntries();
680 
681  for(int i=0; i<ncp; i++) {
682  EdbSegCouple *sc = (EdbSegCouple*)(eSegCouples.UncheckedAt(i));
683  sc->eS1->SetFlag( sc->eS1->Flag()+1 );
684  sc->eS2->SetFlag( sc->eS2->Flag()+1 );
685  sc->SetN1(sc->eS1->Flag());
686  sc->SetN2(sc->eS2->Flag());
687  }
688 
689  for(int i=0; i<ncp; i++) {
690  EdbSegCouple *sc = (EdbSegCouple*)(eSegCouples.UncheckedAt(i));
691  sc->SetN1tot(sc->eS1->Flag());
692  sc->SetN2tot(sc->eS2->Flag());
693  }
694 
695  Log(2,"RankCouples","%d couples ok", ncp );
696 }
TObjArray eSegCouples
Definition: EdbPlateAlignment.h:35
Definition: EdbScanCond.h:10
void SetSigma0(float x, float y, float tx, float ty)
Definition: EdbScanCond.h:62
void ApplyCorrections(EdbSegP &s)
Definition: EdbSegCorr.cxx:13
Definition: EdbSegCouple.h:14
void SetN1(int n1)
Definition: EdbSegCouple.h:40
void SetN2(int n2)
Definition: EdbSegCouple.h:41
EdbSegP * eS
Definition: EdbSegCouple.h:24
void SetN1tot(int n)
Definition: EdbSegCouple.h:42
EdbSegP * eS2
pointers - useful when all segments are in memory
Definition: EdbSegCouple.h:26
void SetN2tot(int n)
Definition: EdbSegCouple.h:43
void SetCHI2P(float chi2)
Definition: EdbSegCouple.h:45
static void SetSortFlag(int s=0)
Definition: EdbSegCouple.cxx:61
EdbSegP * eS1
the result of the fit
Definition: EdbSegCouple.h:25
void SetVolume(float w)
Definition: EdbSegP.h:133
void SetSide(int side=0)
Definition: EdbSegP.h:136
void SetDZem(float dz)
Definition: EdbSegP.h:124
Float_t eZ
Definition: EdbSegP.h:28
Float_t Volume() const
Definition: EdbSegP.h:155
Float_t Chi2() const
Definition: EdbSegP.h:154
void SetDZ(float dz)
Definition: EdbSegP.h:123
void Copy(const EdbSegP &s)
Definition: EdbSegP.cxx:104
void SetFlag(int flag)
Definition: EdbSegP.h:127
Int_t Flag() const
Definition: EdbSegP.h:146
Definition: EdbTrackFitter.h:16
static float Chi2PSeg(EdbSegP &s1, EdbSegP &s2, EdbSegP &seg, EdbScanCond &cond1, EdbScanCond &cond2)
Definition: EdbTrackFitter.cxx:262

◆ SaveCouplesTree()

void EdbPlateAlignment::SaveCouplesTree ( )
119 {
120  EdbCouplesTree ect;
121  ect.InitCouplesTree("couples",0,"NEW");
122  int nseg = CheckEqualArr(eS[0],eS[1]);
123  for(int i=0; i<nseg; i++)
124  if(eDoCorrectBeforeSaving) eCorrL[0].CorrectSeg(*(EdbSegP*)eS[0].UncheckedAt(i));
125  for(int i=0; i<nseg; i++) {
126  if( eRankCouples ) {
127  EdbSegCouple *sc = (EdbSegCouple *)eSegCouples.At(i);
128  ect.Fill( sc->eS1, sc->eS2, sc->eS, sc );
129  }
130  else ect.Fill( (EdbSegP*)eS[0].UncheckedAt(i), (EdbSegP*)eS[1].UncheckedAt(i) );
131  }
132  ect.eTree->AutoSave();
133 }
Definition: EdbCouplesTree.h:17
bool InitCouplesTree(const char *name="couples", const char *fname=0, Option_t *mode="READ")
Definition: EdbCouplesTree.cxx:87
TTree * eTree
Definition: EdbCouplesTree.h:25
Int_t Fill(EdbSegP *s1, EdbSegP *s2, EdbSegP *s=0, EdbSegCouple *cp=0, float xv=0, float yv=0, int pid1=0, int pid2=0)
Definition: EdbCouplesTree.cxx:200
void CorrectSeg(EdbSegP &s)
Definition: EdbLayer.cxx:70

◆ SetDoublets()

void EdbPlateAlignment::SetDoublets ( float  dx,
float  dy,
float  dtx,
float  dty 
)
inline
58  { eDoublets[0]=dx; eDoublets[1]=dy; eDoublets[2]=dtx; eDoublets[3]=dty; }

◆ SetParCoarseAl()

void EdbPlateAlignment::SetParCoarseAl ( float  zcorr,
float  dpos = 300,
float  dang = 0.015,
float  dz = 122,
float  dphi = 0.01 
)
544 {
545  // medium-wide parameters setting for the coarse alignment
546  Log(3,"EdbPlateAlignment::SetParCoarseAl","zcorr = %f dpos = %f dang=%f dz=%f dphi=%f",zcorr, dpos, dang, dz, dphi);
547  eDVsame[0] = eDVsame[1] = dpos;
548  //eDVsame[0] = eDVsame[1] = 3*eSigma[0];
549  eDVsame[2] = eDVsame[3] = dang;
550  int n = (int)( 2*dpos/ (4*eSigma[0]) );
551  n = n%2 ? n : n+1; // make n - odd
552  Log(3, "SetParCoarseAl"," n = %d dpos = %f ", n, dpos);
553  InitHx( n, -dpos, dpos );
554  InitHy( n, -dpos, dpos );
555 
556  float zstepmin=0.5; // 0.5 microns is the minimum step size
557  int nz = Min( (int)( 2*dz/ zstepmin ), 51);
558  nz = nz%2 ? nz : nz+1; // make n - odd
559  InitHz( nz, zcorr-dz, zcorr+dz );
560  eCorr[0].SetV(2,zcorr);
561 
562  float phimin=0.00001; // minimum step size
563  int nphi = Min( (int)( 2*dphi/ phimin ), 51);
564  nphi = nphi%2 ? nphi : nphi+1; // make n - odd
565  InitHphi( nphi, eCorr[0].V(6)-dphi, eCorr[0].V(6)+dphi );
566 }
void InitHz(int n, float min, float max)
Definition: EdbAlignmentV.h:46
void InitHphi(int n, float min, float max)
Definition: EdbAlignmentV.h:47
void InitHx(int n, float min, float max)
Definition: EdbAlignmentV.h:44
void InitHy(int n, float min, float max)
Definition: EdbAlignmentV.h:45

◆ SetParFineAl()

void EdbPlateAlignment::SetParFineAl ( )
535 {
536  // narrow parameters setting for the fine alignment
537  InitHx( 1, -4.*eSigma[0], 4.*eSigma[0] );
538  InitHy( 1, -4.*eSigma[0], 4.*eSigma[0] );
539 }

◆ SetParTestAl()

void EdbPlateAlignment::SetParTestAl ( float  zcorr,
float  dz = 500,
float  dphi = 0.03 
)
570 {
571  // wide parameters setting for the test pre-alignment
572  InitHx( 81, -2000, 2000 );
573  InitHy( 81, -2000, 2000 );
574  int nbinz = Min(101, Max(21, (int)(dz/50.) ));
575  InitHz( nbinz, zcorr-dz, zcorr+dz );
576  int nbinphi = Min(101, Max(21, (int)(dphi/0.0001) ));
577  InitHphi( nbinphi, -dphi, dphi );
578  eCorr[0].SetV(2,zcorr);
579 }

◆ SetSigma()

void EdbPlateAlignment::SetSigma ( float  spos,
float  sang 
)
inline
56 { eSigma[0]=spos; eSigma[1]=sang; }

◆ SlowAlignXY()

void EdbPlateAlignment::SlowAlignXY ( EdbPattern p1,
EdbPattern p2,
EdbH2 hxy,
EdbH1 hphi,
const char *  name = "slowal" 
)
583 {
584  int n1= pat1.N();
585  int n2= pat2.N();
586  float x0 = (Min(pat1.Xmin(),pat2.Xmin())+Max(pat1.Xmax(),pat2.Xmax()))/2;
587  float y0 = (Min(pat1.Ymin(),pat2.Ymin())+Max(pat1.Ymax(),pat2.Ymax()))/2;
588  struct point{ int i; float x; float y; };
589  point **p1 = new point*[n1];
590  point **p2 = new point*[n2];
591 
592  std::unique_ptr<TFile> f(TFile::Open(name,"RECREATE"));
593  if (!f || f->IsZombie()) Log(1,"EdbPlateAlignment::SlowAlignXY","ERROR! can not open file %s", name);
594 
595  TNtuple *ntpeak = new TNtuple("ntpeak","","phi:dx:dy:peak");
596  for(int i=0; i<n1; i++) p1[i] = new point;
597  for(int i=0; i<n2; i++) p2[i] = new point;
598 
599  for(int iphi=0; iphi<hphi.N(); iphi++) {
600  float phi=hphi.X(iphi);
601  for(int i=0; i<n1; i++) {
602  EdbSegP *s= pat1.GetSegment(i);
603  p1[i]->x = (s->X()-x0)*Cos(phi) - (s->Y()-y0)*Sin(phi);
604  p1[i]->y = (s->X()-x0)*Sin(phi) + (s->Y()-y0)*Cos(phi);
605  p1[i]->i = i;
606  }
607  for(int i=0; i<n2; i++) {
608  EdbSegP *s= pat2.GetSegment(i);
609  p2[i]->x = (s->X()-x0);
610  p2[i]->y = (s->Y()-y0);
611  p2[i]->i = i;
612  }
613 
614  for(int i1=0; i1<n1; i1++) {
615  for(int i2=0; i2<n2; i2++) {
616  float dx= p2[i2]->x-p1[i1]->x;
617  float dy= p2[i2]->y-p1[i1]->y;
618  hxy.Fill(dx,dy);
619  }
620  }
621  EdbPeak2 pk2(hxy);
622  float dx, dy;
623  int npk = pk2.FindPeak( dx, dy );
624  printf("phi = %f dx = %f dy = %f npk = %d\n",phi,dx,dy,npk);
625  hphi.Fill(phi,npk);
626  ntpeak->Fill(phi,dx,dy,npk);
627  hxy.Write(Form("hxy%d",iphi));
628  hxy.CleanCells();
629  }
630  hphi.Write("hphi");
631  ntpeak->Write();
632 }
FILE * f
Definition: RecDispMC.C:150
float X(int i) const
Definition: EdbCell1.h:53
int Fill(float x)
Definition: EdbCell1.h:63
void CleanCells()
Definition: EdbCell2.cpp:115
int Fill(float x, float y)
Definition: EdbCell2.h:88
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24
EdbSegP * s
Definition: tlg2pattern.C:32

◆ TestAl()

void EdbPlateAlignment::TestAl ( EdbPattern p1,
EdbPattern p2 
)
482 {
483  // alignment of 2 plates with testal-like preselection.
484  // Application: basetracks patterns with: well defined angles, big possible offsets,
485  // big possible rotations; z-variation
486  // Result: find best dz and rotation and position offset and set them as:
487  // eCorr[0].SetV(2, dz), eCorr[0].SetV(6, dphi); eCorr[0].AddV(0, dx); eCorr[0].AddV(1, dy);
488 
489  float dxlim = eH[0][0].Xmax()-eH[0][0].Xmin();
490  float dylim = eH[0][1].Xmax()-eH[0][1].Xmin();
491  HDistance(p1,p2, dxlim, dylim );
492 
493  float x0 = p2.Xmean(), y0 = p2.Ymean(); // centralize patterns
494  eCorr[0].SetV(0,-x0); eCorr[0].SetV(1,-y0);
495  eCorr[1].SetV(0,-x0); eCorr[1].SetV(1,-y0);
496 
497  int n[2] = { eH[0][0].N() , eH[0][1].N() };
498  float min[2] = { eH[0][0].Xmin(), eH[0][1].Xmin() };
499  float max[2] = { eH[0][0].Xmax(), eH[0][1].Xmax() };
500  eHxy.InitH2(n, min, max);
501 
502  eDVsame[0] = dxlim/2.;
503  eDVsame[1] = dylim/2.;
504  eDVsame[2]=eDVsame[3]=eSigma[1];
505 
506  EdbH2 h_z_phi;
507  OptimiseVar2( 0, 6, 0, 2, h_z_phi, &eHxy ); // variate rotation and z of the p1
508 
509  h_z_phi.DrawH2()->Draw("colz");
510 
511  EdbPeak2 pk2z(h_z_phi);
512  float dphi, dz;
513  pk2z.FindPeak( dphi, dz );
514  pk2z.ProbPeak();
515 
516  eCorr[0].SetV(2, dz );
517  eCorr[0].SetV(6, dphi);
518 
519  Ncoins(eDVsame, &eHxy);
520  EdbPeak2 pk2(eHxy);
521  float dx, dy;
522  pk2.FindPeak( dx, dy );
523  pk2.ProbPeak();
524  eCorr[0].AddV(0,dx); // set x-y corrections
525  eCorr[0].AddV(1,dy);
526 
527  Log(2,"TestAl","peak of %d/%6.3f with offsets (dx:dy:dz:dphi): %7.2f %7.2f %8.2f %7.3f with patterns of: %d %d",
528  (int)pk2.ePeak[0], pk2.eMean[0],
529  eCorr[0].V(0)-eCorr[1].V(0), eCorr[0].V(1)-eCorr[1].V(1), eCorr[0].V(2), eCorr[0].V(6),
530  p1.N(),p2.N() );
531 }
void HDistance(EdbPattern &p1, EdbPattern &p2, float dxMax, float dyMax)
Definition: EdbAlignmentV.cxx:793
float Xmean()
Definition: EdbPattern.cxx:1640
float Ymean()
Definition: EdbPattern.cxx:1687

Member Data Documentation

◆ eCoarseMin

Int_t EdbPlateAlignment::eCoarseMin

◆ eCoarseOK

Bool_t EdbPlateAlignment::eCoarseOK

◆ eDoCoarse

Bool_t EdbPlateAlignment::eDoCoarse

◆ eDoCorrectAngle

Bool_t EdbPlateAlignment::eDoCorrectAngle

◆ eDoCorrectBeforeSaving

Bool_t EdbPlateAlignment::eDoCorrectBeforeSaving

◆ eDoFine

Bool_t EdbPlateAlignment::eDoFine

◆ eDoTestAl

Bool_t EdbPlateAlignment::eDoTestAl

◆ eDoublets

Float_t EdbPlateAlignment::eDoublets[4]

◆ eDPHI

Float_t EdbPlateAlignment::eDPHI

◆ eDZ

Float_t EdbPlateAlignment::eDZ

◆ eFineMin

Int_t EdbPlateAlignment::eFineMin

◆ eFineOK

Bool_t EdbPlateAlignment::eFineOK

◆ eH_xy_coarse

EdbPeak2 EdbPlateAlignment::eH_xy_coarse

◆ eH_xy_final

EdbPeak2 EdbPlateAlignment::eH_xy_final

◆ eH_zphi_coarse

EdbPeak2 EdbPlateAlignment::eH_zphi_coarse

◆ eNcoins

Int_t EdbPlateAlignment::eNcoins

◆ eNiter

Int_t EdbPlateAlignment::eNiter

◆ eNoScale

Bool_t EdbPlateAlignment::eNoScale

◆ eNoScaleRot

Bool_t EdbPlateAlignment::eNoScaleRot

◆ eOffsetMax

Float_t EdbPlateAlignment::eOffsetMax

◆ eRankCouples

Bool_t EdbPlateAlignment::eRankCouples

◆ eSaveCouples

Bool_t EdbPlateAlignment::eSaveCouples

◆ eSegCouples

TObjArray EdbPlateAlignment::eSegCouples

◆ eSigma

Float_t EdbPlateAlignment::eSigma[2]

◆ eStatus

Bool_t EdbPlateAlignment::eStatus

◆ eTestAlOK

Bool_t EdbPlateAlignment::eTestAlOK

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