FEDRA emulsion software from the OPERA Collaboration
EdbPositionAlignment Class Reference

#include <EdbPositionAlignment.h>

Inheritance diagram for EdbPositionAlignment:
Collaboration diagram for EdbPositionAlignment:

Public Member Functions

bool ActivatePosTree (const char *name="postree")
 
int Align ()
 
void AlignWithTracks (int nang=3, int npos=0)
 
int DoubletsFilterOut (bool checkview=true)
 
int DoubletsFilterOutSide (EdbPatCell2 &pc, bool checkview=true)
 
 EdbPositionAlignment ()
 
int FillArrays (EdbPattern &p1, EdbPattern &p2)
 
int FillArrays (TObjArray &arr1, TObjArray &arr2, float xymin[2], float xymax[2])
 
int FillCombinations ()
 
int FillCombinations (EdbPatCell2 &pc1, EdbPatCell2 &pc2, float dx, float dy, float dtx, float dty)
 
int FillPosTree (float dz1, float dz2, int flag)
 
void FindCorrections (EdbPattern &pat1, EdbPattern &pat2, float DZ, bool doShrink)
 
void FindDiff (TObjArray &arr1, TObjArray &arr2, EdbPatCell2 &pc1, EdbPatCell2 &pc2, float &dx, float &dy, float &dtx, float &dty)
 
void FindDiff10 (float &dx, float &dy, float &dtx, float &dty)
 
void FindDiff12 (float &dx, float &dy, float &dtx, float &dty)
 
void FindDiff20 (float &dx, float &dy, float &dtx, float &dty)
 
int Link ()
 
void PositionPlot (EdbH2 &hd)
 
void PositionPlot (float dz1, float dz2, EdbH2 &hd)
 
void PositionPlotA (EdbH2 &hd, float DR=0, TObjArray *arr1=0, TObjArray *arr2=0)
 
void PrintStat ()
 
void PrintSummary ()
 
void RankCouples ()
 
void RankCouples (TObjArray &arr1, TObjArray &arr2, TObjArray &arrtr)
 
void RankCouples0 ()
 
void RankCouplesFast (TObjArray &arrtr)
 
int ReadPosTree (TTree *tree, EdbPattern *p=0, EdbPattern *p1=0, EdbPattern *p2=0, TEventList *lst=0)
 
void ResetAngularCorr ()
 
void ResetPeak ()
 
void ResetPositionCorr ()
 
void SaveAsTree (EdbPattern &pat, const char *name)
 
int SelectNarrowPeakDXDY (float dr, EdbH2 &hxy)
 
int SelectPeak (EdbPattern &p1, EdbPattern &p2, float dx, float dy, float dz1, float dz2)
 
int SelectPeak (EdbPattern &p1, EdbPattern &p2, float dx=10, float dy=10)
 
int SelectZone (float min[2], float max[2], TObjArray &arr1, TObjArray &arr2, float maxDens)
 
int SelectZoneSide (EdbPatCell2 &pc, float min[2], float max[2], TObjArray &arr, int nmax=kMaxInt)
 
void ShrinkageSelection (float dzbase)
 
int ShrinkageSelectionSide (EdbPatCell2 &pc1, EdbPatCell2 &pc2, EdbH2 &hshr, int nstep, float deltaShr)
 
int SpotsFilterOut (int nmax)
 
int WideSearchXY (EdbPattern &pat1, EdbPattern &pat2, EdbH2 &hxy, float dz, float xmin, float xmax, float ymin, float ymax)
 
int WritePosTree ()
 
float Xcorr (EdbSegP &s, float dz)
 
float Xcorr (EdbSegP &s, float dz, float dx)
 
float Ycorr (EdbSegP &s, float dz)
 
float Ycorr (EdbSegP &s, float dz, float dy)
 
void Zselection (EdbH2 &hd)
 
virtual ~EdbPositionAlignment ()
 

Static Public Member Functions

static int SelectBestComptons (TObjArray &a, TObjArray &arr, int nmax)
 

Public Attributes

EdbAffine2DeAff
 
Float_t eBinX
 
Float_t eBinY
 
Float_t eChi2Max
 
TObjArray eComb1
 
TObjArray eComb2
 
Bool_t eDoRot
 
Float_t eDTXmax
 
Float_t eDTXmin
 
Float_t eDTYmax
 
Float_t eDTYmin
 
Float_t eDXmin
 
Float_t eDYmin
 
EdbH2 eHDZ
 
EdbH2 eHpeak
 
EdbH2 eHShr1
 
EdbH2 eHShr2
 
Int_t eNpeak
 
Int_t eNShr1step
 
Int_t eNShr2step
 
Int_t eNZ1step
 
Int_t eNZ2step
 
EdbPatCell2 ePC
 
EdbPatCell2 ePC1
 
EdbPatCell2 ePC2
 
TTree * ePosTree
 
EdbH1 eRot
 
Float_t eRpeak
 
Float_t eS0tx
 
Float_t eS0ty
 
Float_t eS0x
 
Float_t eS0y
 
TObjArray eSegCouples
 
Float_t eShr1from
 
Float_t eShr1to
 
Float_t eShr2from
 
Float_t eShr2to
 
TString eSmoothKernel
 
TObjArray eTracks
 
Float_t eWbaseMin
 
float eX0
 
Float_t eXcell
 
Float_t eXpeak
 
float eY0
 
Float_t eYcell
 
Float_t eYpeak
 
Float_t eZ1from
 
Float_t eZ1peak
 
Float_t eZ1to
 
Float_t eZ2from
 
Float_t eZ2peak
 
Float_t eZ2to
 

Constructor & Destructor Documentation

◆ EdbPositionAlignment()

EdbPositionAlignment::EdbPositionAlignment ( )
31 {
32  eXcell=eYcell=50; // bin size (for example 50 microns)
33  eDTXmax=eDTYmax=0.15; // max angular acceptance (ex: 0.15) for the coincidence
34  eDXmin=eDYmin=5; // min position difference for the doublets cutout
35  eDTXmin=eDTYmin=0.005; // min angular difference for the doublets cutout
36 
37  eX0=eY0=0;
38 
42  eNpeak = 0;
43  eAff=0;
44 
45  eSmoothKernel = "0";
46  ePosTree=0;
47 
48  // linking parameters
49  eS0x = eS0y = 2.;
50  eS0tx = eS0ty = 0.01; // sigmas at 0 angle for the chi2 calculation
51  eWbaseMin = 12; // cut for the w of basetrack to accept it
52  eChi2Max = 3.; // cut for the chi2 of the basetrack
53 
54 }
TTree * ePosTree
Definition: EdbPositionAlignment.h:49
Float_t eDTXmin
Definition: EdbPositionAlignment.h:31
Float_t eZ1to
Definition: EdbPositionAlignment.h:35
Float_t eDTYmin
Definition: EdbPositionAlignment.h:31
Float_t eZ2to
Definition: EdbPositionAlignment.h:36
Float_t eDTYmax
Definition: EdbPositionAlignment.h:27
Int_t eNpeak
Definition: EdbPositionAlignment.h:42
Float_t eZ1from
Definition: EdbPositionAlignment.h:35
Float_t eWbaseMin
Definition: EdbPositionAlignment.h:53
Float_t eS0tx
Definition: EdbPositionAlignment.h:52
Float_t eDXmin
Definition: EdbPositionAlignment.h:30
Float_t eZ2from
Definition: EdbPositionAlignment.h:36
float eY0
Definition: EdbPositionAlignment.h:24
TString eSmoothKernel
Definition: EdbPositionAlignment.h:47
Float_t eDTXmax
Definition: EdbPositionAlignment.h:27
Float_t eZ1peak
Definition: EdbPositionAlignment.h:40
float eX0
Definition: EdbPositionAlignment.h:24
Float_t eXcell
Definition: EdbPositionAlignment.h:26
Float_t eChi2Max
Definition: EdbPositionAlignment.h:54
Float_t eS0x
Definition: EdbPositionAlignment.h:52
Float_t eYcell
Definition: EdbPositionAlignment.h:26
Float_t eS0y
Definition: EdbPositionAlignment.h:52
Float_t eS0ty
Definition: EdbPositionAlignment.h:52
Int_t eNZ2step
Definition: EdbPositionAlignment.h:37
EdbAffine2D * eAff
Definition: EdbPositionAlignment.h:43
Float_t eDYmin
Definition: EdbPositionAlignment.h:30
Int_t eNZ1step
Definition: EdbPositionAlignment.h:37
Float_t eZ2peak
Definition: EdbPositionAlignment.h:40

◆ ~EdbPositionAlignment()

EdbPositionAlignment::~EdbPositionAlignment ( )
virtual
58 {
59  eComb1.Clear();
60  eComb2.Clear();
61  SafeDelete(eAff);
62  eTracks.Delete();
63 }
TObjArray eComb1
Definition: EdbPositionAlignment.h:18
TObjArray eComb2
Definition: EdbPositionAlignment.h:18
TObjArray eTracks
Definition: EdbPositionAlignment.h:19

Member Function Documentation

◆ ActivatePosTree()

bool EdbPositionAlignment::ActivatePosTree ( const char *  name = "postree")
105 {
106  if(ePosTree) SafeDelete(ePosTree);
107  ePosTree = new TTree(name,"postree (s1:s2)");
108  EdbSegP *s1 =0, *s2 =0, *s=0;
109  EdbSegCouple *cp=0;
110  Float_t dz1,dz2;
111  Int_t flag;
112  Float_t chi2;
113  int pid1=0,pid2=0;
114  float xv=0,yv=0;
115 
116  ePosTree->Branch("pid1", &pid1,"pid1/I");
117  ePosTree->Branch("pid2", &pid2,"pid2/I");
118  ePosTree->Branch("xv", &xv,"xv/F");
119  ePosTree->Branch("yv", &yv,"yv/F");
120  ePosTree->Branch("cp", "EdbSegCouple",&cp,32000,99);
121  ePosTree->Branch("s1.", "EdbSegP",&s1,32000,99);
122  ePosTree->Branch("s2.", "EdbSegP",&s2,32000,99);
123  ePosTree->Branch("s." , "EdbSegP",&s ,32000,99);
124 
125  ePosTree->Branch("dz1", &dz1,"dz1/F");
126  ePosTree->Branch("dz2", &dz2,"dz2/F");
127  ePosTree->Branch("flag", &flag,"flag/I");
128  ePosTree->Branch("chi2", &chi2,"chi2/F");
129  return true;
130 }
Definition: EdbSegCouple.h:14
Definition: EdbSegP.h:18
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24
Float_t chi2
Definition: testBGReduction_By_ANN.C:14
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31
EdbSegP * s
Definition: tlg2pattern.C:32
EdbSegCouple * cp
Definition: tlg2pattern.C:29

◆ Align()

int EdbPositionAlignment::Align ( )
695 {
696  // find the best alignment of the given zone
697 
698  int n[2] = { (int)(2*(eXcell/eBinX)+1), (int)(2*(eYcell/eBinY)+1) };
699  float min[2] = {-eXcell,-eYcell};
700  float max[2] = { eXcell, eYcell};
701  EdbH2 hd; // define the differential hist for the peaks search
702  hd.InitH2(n, min, max);
703  Zselection(hd); // roughly define eZ1peak, eZ2peak, eXpeak,eYpeak
704 
705  if(ePosTree) FillPosTree( eZ1peak, eZ2peak, 0); // flag=0
706 
707  EdbPattern p1, p2;
708  int npeak = 0;
709  npeak = SelectPeak(p1,p2, eRpeak, eRpeak );
710  p1.Clear(); p2.Clear();
711  npeak = SelectPeak(p1,p2, eRpeak, eRpeak );
712  //if(ePosTree) FillPosTree( p1, p2, 0, 0, 1); // flag=1
713 
714  return npeak;
715 }
float min(TClonesArray *t)
Definition: bitview.cxx:275
int max
Definition: check_shower.C:41
Definition: EdbCell2.h:19
int InitH2(const EdbH2 &h)
Definition: EdbCell2.cpp:79
Definition: EdbPattern.h:280
Float_t eRpeak
Definition: EdbPositionAlignment.h:32
int SelectPeak(EdbPattern &p1, EdbPattern &p2, float dx, float dy, float dz1, float dz2)
Definition: EdbPositionAlignment.cxx:718
Float_t eBinY
Definition: EdbPositionAlignment.h:28
Float_t eBinX
Definition: EdbPositionAlignment.h:28
int FillPosTree(float dz1, float dz2, int flag)
Definition: EdbPositionAlignment.cxx:188
void Zselection(EdbH2 &hd)
Definition: EdbPositionAlignment.cxx:623

◆ AlignWithTracks()

void EdbPositionAlignment::AlignWithTracks ( int  nang = 3,
int  npos = 0 
)
919 {
920  // assuming that the combinations are found and tracks are reconstructed
921  // correct DTX,DTY of the sides in respect of the tracks
922 
923  for(int i=0; i<nang; i++) {
924  float dx, dy, dtx, dty;
925  FindDiff10(dx, dy, dtx, dty);
926  Log(3,"AlignWithTracks", "%d angle side 1 diff: %f %f %f %f with %d ", i,dx, dy, dtx, dty, eComb1.GetEntries());
927  ePC1.eDTX += dtx;
928  ePC1.eDTY += dty;
929  FindDiff20(dx, dy, dtx, dty);
930  Log(3,"AlignWithTracks", "%d angle side 2 diff: %f %f %f %f with %d ", i,dx, dy, dtx, dty, eComb2.GetEntries());
931  ePC2.eDTX += dtx;
932  ePC2.eDTY += dty;
933  }
934 
935  for(int i=0; i<npos; i++) {
936  float dx, dy, dtx, dty;
937  FindDiff12(dx, dy, dtx, dty);
938  Log(3,"AlignWithTracks", "%d pos side 1 diff: %f %f %f %f with %d ", i, dx, dy, dtx, dty, eComb1.GetEntries());
939  ePC1.eDX += dx/2.;
940  ePC1.eDY += dy/2.;
941  ePC2.eDX -= dx/2.;
942  ePC2.eDY -= dy/2.;
943  }
944 
945 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
float eDX
Definition: EdbPatCell2.h:18
float eDTX
Definition: EdbPatCell2.h:20
float eDY
Definition: EdbPatCell2.h:18
float eDTY
Definition: EdbPatCell2.h:20
void FindDiff10(float &dx, float &dy, float &dtx, float &dty)
Definition: EdbPositionAlignment.cxx:954
void FindDiff12(float &dx, float &dy, float &dtx, float &dty)
Definition: EdbPositionAlignment.cxx:948
void FindDiff20(float &dx, float &dy, float &dtx, float &dty)
Definition: EdbPositionAlignment.cxx:960
EdbPatCell2 ePC2
Definition: EdbPositionAlignment.h:17
EdbPatCell2 ePC1
Definition: EdbPositionAlignment.h:17

◆ DoubletsFilterOut()

int EdbPositionAlignment::DoubletsFilterOut ( bool  checkview = true)
765 {
766  return DoubletsFilterOutSide(ePC1,checkview) + DoubletsFilterOutSide(ePC2,checkview);
767 }
int DoubletsFilterOutSide(EdbPatCell2 &pc, bool checkview=true)
Definition: EdbPositionAlignment.cxx:770

◆ DoubletsFilterOutSide()

int EdbPositionAlignment::DoubletsFilterOutSide ( EdbPatCell2 pc,
bool  checkview = true 
)
771 {
772  // assign flag = -10 for the duplicated segments
773  // if(checkview) - do not remove close segments if them are in the same view
774 
775  int nout =0;
776  int n = FillCombinations(pc, pc, eDXmin, eDYmin, eDTXmin, eDTYmin);
777  EdbSegP *s1,*s2;
778  for(int i=0; i<n; i++) {
779  s1 = (EdbSegP*)eComb1.UncheckedAt(i);
780  s2 = (EdbSegP*)eComb2.UncheckedAt(i);
781  if(checkview) if( s2->Aid(0)==s1->Aid(0) && s2->Aid(1)==s1->Aid(1) && s2->Side()==s1->Side() ) continue;
782  if( s2->W()>s1->W() ) s1->SetFlag(-10);
783  else s2->SetFlag(-10);
784  nout++;
785  }
786 
787  if(ePosTree) FillPosTree( 0., 0., -10);
788 
789  Log(2,"DubletsFilterOut","%d segments discarded with DX,DY,DTX,DTY: (%5.1f %5.1f %5.3f %5.3f) checkview =%d",
790  nout,eDXmin, eDYmin, eDTXmin, eDTYmin, checkview );
791  return nout;
792 }
int FillCombinations()
Definition: EdbPositionAlignment.cxx:533
Int_t Side() const
Definition: EdbSegP.h:167
Float_t W() const
Definition: EdbSegP.h:148
Int_t Aid(int i) const
Definition: EdbSegP.h:166
void SetFlag(int flag)
Definition: EdbSegP.h:127

◆ FillArrays() [1/2]

int EdbPositionAlignment::FillArrays ( EdbPattern p1,
EdbPattern p2 
)
416 {
417  ePC1.Reset();
418  ePC2.Reset();
419 
420  float marg = eXcell/2.;
421  float min1[2] = { Min(p1.Xmin(),p2.Xmin())-marg, Min(p1.Ymin(),p2.Ymin())-marg };
422  float max1[2] = { Max(p1.Xmax(),p2.Xmax())+marg, Max(p1.Ymax(),p2.Ymax())+marg };
423  int n1[2] = { (int)((max1[0]-min1[0])/eXcell+1), (int)((max1[1]-min1[1])/eYcell+1) };
424  //eXcell = Max((max1[0]-min1[0])/n1[0],mincell);
425  //eYcell = Max((max1[1]-min1[1])/n1[1],mincell);
426  float min2[2] = { min1[0]-eXcell, min1[1]-eYcell };
427  float max2[2] = { max1[0]+eXcell, max1[1]+eYcell };
428  int n2[2] = { n1[0]+2 , n1[1]+2 };
429 
430  if( n1[0]<1 || n1[1]<1 ) return 0;
431  int meancell1 = (int)(p1.N()/n1[0]/n1[1]);
432  int meancell2 = (int)(p2.N()/n2[0]/n2[1]);
433  int maxcell1 = (int)(10 + meancell1 + 5*Sqrt(meancell1));
434  int maxcell2 = (int)(10 + meancell2 + 5*Sqrt(meancell2));
435 
436  ePC1.InitCell(maxcell1, n1, min1, max1);
437  ePC2.InitCell(maxcell2, n2, min2, max2);
438 
439  int nc1 = ePC1.FillCell(p1);
440  int nc2 = ePC2.FillCell(p2);
441 
442  Log(3,"FillArrays","filled objects/cells: %d / %d and %d / %d in cells of (%6.1f x %6.1f)",
443  p1.N(), nc1, p2.N(), nc2, eXcell, eYcell);
444  return nc1+nc2;
445 }
void Reset()
Definition: EdbCell2.h:174
int InitCell(EdbCell2 &c)
Definition: EdbCell2.h:170
int FillCell(EdbPattern &pat)
Definition: EdbPatCell2.cxx:96
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

◆ FillArrays() [2/2]

int EdbPositionAlignment::FillArrays ( TObjArray &  arr1,
TObjArray &  arr2,
float  xymin[2],
float  xymax[2] 
)
449 {
450  ePC1.Reset();
451  ePC2.Reset();
452 
453  float marg = 0.0001;
454  float min1[2] = { xymin[0]-marg, xymin[1]-marg };
455  float max1[2] = { xymax[0]+marg, xymax[1]+marg };
456  int n1[2] = { (int)((max1[0]-min1[0])/eXcell+1), (int)((max1[1]-min1[1])/eYcell+1) };
457  eXcell = (max1[0]-min1[0])/n1[0];
458  eYcell = (max1[1]-min1[1])/n1[1];
459  float min2[2] = { min1[0]-eXcell, min1[1]-eYcell };
460  float max2[2] = { max1[0]+eXcell, max1[1]+eYcell };
461  int n2[2] = { n1[0]+2 , n1[1]+2 };
462 
463  if( n1[0]<1 || n1[1]<1 ) return 0;
464  int entr1 = arr1.GetEntriesFast();
465  int entr2 = arr2.GetEntriesFast();
466  int meancell1 = (int)(entr1/n1[0]/n1[1]);
467  int meancell2 = (int)(entr2/n2[0]/n2[1]);
468  int maxcell = (int)Max(meancell1,meancell2)+10;
469  maxcell += (int)(5*Sqrt(maxcell)); // define safe value for max/cell limit
470 
471  ePC1.InitCell(maxcell, n1, min1, max1);
472  ePC2.InitCell(maxcell, n2, min2, max2);
473 
474  int nc1 = ePC1.FillCell(arr1);
475  int nc2 = ePC2.FillCell(arr2);
476 
477  Log(3,"FillArrays","%d and %d cells filled", nc1,nc2);
478  return nc1;
479 }

◆ FillCombinations() [1/2]

int EdbPositionAlignment::FillCombinations ( )
534 {
536 }

◆ FillCombinations() [2/2]

int EdbPositionAlignment::FillCombinations ( EdbPatCell2 pc1,
EdbPatCell2 pc2,
float  dx,
float  dy,
float  dtx,
float  dty 
)
540 {
541  // the cells must be already filled
542  pc1.eDXlim = dx; pc1.eDYlim = dy;
543  pc1.eDTXlim = dtx; pc1.eDTYlim = dty;
544  eComb1.Clear();
545  eComb2.Clear();
546  int ir[2] = { int((dx-0.0001)/eXcell)+1, int((dy-0.0001)/eYcell)+1 };
547  int ncomb = pc1.FillCombinations(pc2, ir, eComb1, eComb2);
548  Log(3,"FillCombinations","%d selected with the acceptance: %7.2f %7.2f ( %d x %4.1f, %d x %4.1f ) and %7.4f %7.4f ",
549  ncomb, dx,dy, ir[0], eXcell, ir[1], eYcell, dtx, dty );
550  return ncomb;
551 }
int FillCombinations(EdbPatCell2 &cell, int ir2[2], TObjArray &arrC1, TObjArray &arrC2, bool doFill=1)
Definition: EdbPatCell2.cxx:122
float eDYlim
Definition: EdbPatCell2.h:12
float eDXlim
Definition: EdbPatCell2.h:12
float eDTYlim
Definition: EdbPatCell2.h:13
float eDTXlim
Definition: EdbPatCell2.h:13

◆ FillPosTree()

int EdbPositionAlignment::FillPosTree ( float  dz1,
float  dz2,
int  flag 
)
189 {
190  if(!ePosTree) return 0;
191  EdbSegP *sb1 = new EdbSegP();
192  EdbSegP *sb2 = new EdbSegP();
193  EdbSegP *sb = new EdbSegP();
194  EdbSegCouple *cp = new EdbSegCouple();
195 
196  ePosTree->SetBranchAddress("cp" , &cp );
197  ePosTree->SetBranchAddress("s1." , &sb1);
198  ePosTree->SetBranchAddress("s2." , &sb2);
199  ePosTree->SetBranchAddress("s." , &sb);
200  ePosTree->SetBranchAddress("dz1" , &dz1);
201  ePosTree->SetBranchAddress("dz2" , &dz2);
202  ePosTree->SetBranchAddress("flag", &flag);
203  Float_t chi2;
204  ePosTree->SetBranchAddress("chi2", &chi2);
205 
206  EdbSegCouple *cpt=0;
207  EdbSegP *s1, *s2;
208  EdbTrackP *t;
209  int nsaved = 0;
210 
211  int n = eComb1.GetEntries();
212  int nt = eTracks.GetEntries();
213  int ncp = eSegCouples.GetEntries();
214 
215  for(int i=0; i<n; i++) {
216  s1 = (EdbSegP*)eComb1.UncheckedAt(i);
217  s2 = (EdbSegP*)eComb2.UncheckedAt(i);
218  if(nt==n) {
219  t = (EdbTrackP*)eTracks.UncheckedAt(i);
220  if(t->Chi2()>eChi2Max) continue;
221  sb->Copy( *((EdbSegP*)t) );
222  }
223  if(ncp==n) {
224  cpt = (EdbSegCouple*)eSegCouples.UncheckedAt(i);
225  *cp = *cpt;
226  }
227  sb1->Copy(*s1);
228  sb2->Copy(*s2);
229  ePosTree->Fill();
230  nsaved++;
231  }
232  Log(2,"FillPosTree","%s %d couples saved with chi2 <= %f", ePosTree->GetName(), nsaved, eChi2Max);
233  return n;
234 }
TTree * t
Definition: check_shower.C:4
TObjArray eSegCouples
Definition: EdbPositionAlignment.h:20
void Copy(const EdbSegP &s)
Definition: EdbSegP.cxx:104
Definition: EdbPattern.h:118

◆ FindCorrections()

void EdbPositionAlignment::FindCorrections ( EdbPattern pat1,
EdbPattern pat2,
float  DZ,
bool  doShrink 
)
1008 {
1009  // find corrections assuming the patterns already closely aligned (linking case)
1010  // DZ is the distance between patterns(fixed)
1011 
1012  FillArrays(pat1, pat2); // fill at nominal quote - important for doublets and for shrinkage check
1013  //DoubletsFilterOut(true);
1014  if(doShrink) ShrinkageSelection(DZ);
1015 
1016  ePC1.eDZ = DZ/2;
1017  ePC2.eDZ = -DZ/2;
1018  ePC1.eApplyCorr = ePC2.eApplyCorr = true;
1019  FillArrays(pat1, pat2); // fill at the same quote - to increase the coinsidences
1020  FillCombinations();
1021  //Link();
1022 
1023  int nxy[2] = {51,51}; // TODO
1024  float min[2] = {-2*eXcell, -2*eXcell };
1025  float max[2] = { 2*eXcell, 2*eXcell };
1026  EdbH2 hxy;
1027  hxy.InitH2(nxy, min, max);
1028 
1029  SelectNarrowPeakDXDY(10., hxy); // only peak couples remaining in eComb1/2
1030  RankCouples0(); // construct tracks (without correction)
1031 
1032  if(ActivatePosTree("postreeDXDY")) { FillPosTree(0, 0, 9); WritePosTree(); }
1033 
1035  ResetAngularCorr();
1036 
1037 
1038  AlignWithTracks(3,0); // only angular correction of segments to keep original basetrack angle
1039 
1040  if(ActivatePosTree("postreeDXDYalign")) { FillPosTree(0, 0, 8); WritePosTree(); }
1041 
1042  Log(3,"FindCorrections","side1 (shr,dx,dy,dtx,dty): %f %f %f %f %f", ePC1.eShr, ePC1.eDX, ePC1.eDY, ePC1.eDTX, ePC1.eDTY);
1043  Log(3,"FindCorrections","side2 (shr,dx,dy,dtx,dty): %f %f %f %f %f", ePC2.eShr, ePC2.eDX, ePC2.eDY, ePC2.eDTX, ePC2.eDTY);
1044 }
float eShr
Definition: EdbPatCell2.h:19
float eDZ
Definition: EdbPatCell2.h:18
bool eApplyCorr
Definition: EdbPatCell2.h:17
void ResetPositionCorr()
Definition: EdbPositionAlignment.h:130
void AlignWithTracks(int nang=3, int npos=0)
Definition: EdbPositionAlignment.cxx:918
void ShrinkageSelection(float dzbase)
Definition: EdbPositionAlignment.cxx:805
bool ActivatePosTree(const char *name="postree")
Definition: EdbPositionAlignment.cxx:104
int FillArrays(EdbPattern &p1, EdbPattern &p2)
Definition: EdbPositionAlignment.cxx:415
void ResetAngularCorr()
Definition: EdbPositionAlignment.h:131
void RankCouples0()
Definition: EdbPositionAlignment.cxx:293
int WritePosTree()
Definition: EdbPositionAlignment.cxx:133
int SelectNarrowPeakDXDY(float dr, EdbH2 &hxy)
Definition: EdbPositionAlignment.cxx:877
float DZ
Definition: hwinit.C:66

◆ FindDiff()

void EdbPositionAlignment::FindDiff ( TObjArray &  arr1,
TObjArray &  arr2,
EdbPatCell2 pc1,
EdbPatCell2 pc2,
float &  dx,
float &  dy,
float &  dtx,
float &  dty 
)
968 {
969  Log(3,"FindDiff","pc1: %f %f %f %f %f %f %f",pc1.eDX, pc1.eDY, pc1.eDZ, pc1.eDTX, pc1.eDTY, pc1.ePhi, pc1.eShr);
970  Log(3,"FindDiff","pc2: %f %f %f %f %f %f %f",pc2.eDX, pc2.eDY, pc2.eDZ, pc2.eDTX, pc2.eDTY, pc2.ePhi, pc2.eShr);
971 
972  int n = arr1.GetEntries();
973  EdbSegP *s1,*s2;
974  Double_t sdx=0, sdy=0, sdtx=0, sdty=0;
975  for(int i=0; i<n; i++) {
976  s1 = (EdbSegP*)arr1.UncheckedAt(i);
977  s2 = (EdbSegP*)arr2.UncheckedAt(i);
978  sdx += pc2.Xs(*s2)-pc1.Xs(*s1);
979  sdy += pc2.Ys(*s2)-pc1.Ys(*s1);
980  sdtx += pc2.TXs(*s2)-pc1.TXs(*s1);
981  sdty += pc2.TYs(*s2)-pc1.TYs(*s1);
982  }
983  if(Abs(sdtx)>10) Log(1,"FindDiff","%f %f %f %f",sdx,sdy,sdtx,sdty);
984  dx = sdx/n;
985  dy = sdy/n;
986  dtx = sdtx/n;
987  dty = sdty/n;
988 }
float TYs(EdbSegP &s)
Definition: EdbPatCell2.h:50
float Xs(EdbSegP &s)
Definition: EdbPatCell2.h:40
float TXs(EdbSegP &s)
Definition: EdbPatCell2.h:49
float ePhi
Definition: EdbPatCell2.h:21
float Ys(EdbSegP &s)
Definition: EdbPatCell2.h:41

◆ FindDiff10()

void EdbPositionAlignment::FindDiff10 ( float &  dx,
float &  dy,
float &  dtx,
float &  dty 
)
955 {
956  FindDiff(eComb1, eTracks, ePC1, ePC, dx,dy,dtx,dty);
957 }
EdbPatCell2 ePC
Definition: EdbPositionAlignment.h:21
void FindDiff(TObjArray &arr1, TObjArray &arr2, EdbPatCell2 &pc1, EdbPatCell2 &pc2, float &dx, float &dy, float &dtx, float &dty)
Definition: EdbPositionAlignment.cxx:966

◆ FindDiff12()

void EdbPositionAlignment::FindDiff12 ( float &  dx,
float &  dy,
float &  dtx,
float &  dty 
)
949 {
950  FindDiff(eComb1, eComb2, ePC1, ePC2, dx,dy,dtx,dty);
951 }

◆ FindDiff20()

void EdbPositionAlignment::FindDiff20 ( float &  dx,
float &  dy,
float &  dtx,
float &  dty 
)
961 {
962  FindDiff(eComb2, eTracks, ePC2, ePC, dx,dy,dtx,dty);
963 }

◆ Link()

int EdbPositionAlignment::Link ( )
992 {
993  //FillArrays(p1, p2);
994  eComb1.Clear();
995  eComb2.Clear();
996  ePC1.eDXlim = 2*eXcell; ePC1.eDYlim = 2*eYcell;
997  ePC1.eDTXlim = 0.12; ePC1.eDTYlim = 0.12;
998  int ir[2] = {2,2};
999  int ncomb = ePC1.FillCombinations(ePC2, ir, eComb1, eComb2);
1000  //RankCouples();
1001 
1002  Log(1,"WARNING: deprecated function: EdbPositionAlignment::Link"," %8d combinations found", ncomb );
1003  return ncomb;
1004 }

◆ PositionPlot() [1/2]

void EdbPositionAlignment::PositionPlot ( EdbH2 hd)
599 {
600  // output: hd - differential hist, should be already defined
601  // use correction defined in ePC1, ePC2 if requested
602 
603  int n1 = eComb1.GetEntries();
604  EdbSegP *s1,*s2;
605  for(int i=0; i<n1; i++) {
606  s1 = (EdbSegP*)eComb1.UncheckedAt(i);
607  s2 = (EdbSegP*)eComb2.UncheckedAt(i);
608  hd.Fill( ePC2.Xs(*s2) - ePC1.Xs(*s1),
609  ePC2.Ys(*s2) - ePC1.Ys(*s1) );
610  }
611 }
int Fill(float x, float y)
Definition: EdbCell2.h:88

◆ PositionPlot() [2/2]

void EdbPositionAlignment::PositionPlot ( float  dz1,
float  dz2,
EdbH2 hd 
)
584 {
585  // dz1,dz2 offsets in Z,
586  // output: hd - differential hist, should be already defined
587 
588  int n1 = eComb1.GetEntries();
589  EdbSegP *s1,*s2;
590  for(int i=0; i<n1; i++) {
591  s1 = (EdbSegP*)eComb1.UncheckedAt(i);
592  s2 = (EdbSegP*)eComb2.UncheckedAt(i);
593  hd.Fill( Xcorr(*s2,dz2)-Xcorr(*s1,dz1), Ycorr(*s2,dz2)-Ycorr(*s1,dz1) );
594  }
595 }
float Ycorr(EdbSegP &s, float dz)
Definition: EdbPositionAlignment.h:115
float Xcorr(EdbSegP &s, float dz)
Definition: EdbPositionAlignment.h:114

◆ PositionPlotA()

void EdbPositionAlignment::PositionPlotA ( EdbH2 hd,
float  DR = 0,
TObjArray *  arr1 = 0,
TObjArray *  arr2 = 0 
)
555 {
556  // dz1,dz2 offsets in Z should be defined in ePC1, ePC2
557  // output: hd - differential hist, should be already defined
558  //
559  // fill arr1 and arr2 if requested, using dr
560 
561  hd.CleanCells();
562  int n1 = eComb1.GetEntries();
563  EdbSegP *s1,*s2;
564  bool fillarr=false;
565  if(arr1&&arr2&&DR>0) fillarr=true;
566  float dx, dy, dr;
567  for(int i=0; i<n1; i++) {
568  s1 = (EdbSegP*)eComb1.UncheckedAt(i);
569  s2 = (EdbSegP*)eComb2.UncheckedAt(i);
570  dx = ePC2.Xs(*s2)-ePC1.Xs(*s1);
571  dy = ePC2.Ys(*s2)-ePC1.Ys(*s1);
572  hd.Fill( dx, dy );
573  if(fillarr) {
574  dr = Sqrt(dx*dx+dy*dy);
575  if(dr>DR) continue;
576  arr1->Add(s1);
577  arr2->Add(s2);
578  }
579  }
580 }
void CleanCells()
Definition: EdbCell2.cpp:115

◆ PrintStat()

void EdbPositionAlignment::PrintStat ( )
67 {
68  ePC1.PrintStat();
69  ePC2.PrintStat();
70  printf("Z variate as: pat1: %d (%6.1f %6.1f) pat2: %d (%6.1f %6.1f) \n",
72 }
void PrintStat()
Definition: EdbCell2.cpp:711

◆ PrintSummary()

void EdbPositionAlignment::PrintSummary ( )
76 {
77  printf("Alignment summary: ncomb = %7d\n",eComb1.GetEntries());
78  printf("%5d coinsidence in the peak with dXY: (%6.2f %6.2f) dz12: (%6.1f %6.1f) at XY: (%10.1f %10.1f)\n",
80 }
Float_t eXpeak
Definition: EdbPositionAlignment.h:41
Float_t eYpeak
Definition: EdbPositionAlignment.h:41

◆ RankCouples() [1/2]

void EdbPositionAlignment::RankCouples ( )
287 {
288  eTracks.Clear();
290 }
void RankCouples()
Definition: EdbPositionAlignment.cxx:286

◆ RankCouples() [2/2]

void EdbPositionAlignment::RankCouples ( TObjArray &  arr1,
TObjArray &  arr2,
TObjArray &  arrtr 
)
323 {
324  int n = arr1.GetEntries();
325  Log(3,"RankCouples","%d" ,n);
326 
327  EdbSegP *s1, *s2;
328  EdbTrackP *t;
329  EdbTrackFitter tf;
330  EdbScanCond cond1,cond2;
331  cond1.SetSigma0(1.,1., 0.010,0.010); cond1.SetDegrad(4); cond1.SetPulsRamp0(6,9); cond1.SetPulsRamp04(6,9);
332  cond2.SetSigma0(1.,1., 0.010,0.010); cond2.SetDegrad(4); cond2.SetPulsRamp0(6,9); cond2.SetPulsRamp04(6,9);
333  EdbSegP seg;
334  for(int i=0; i<n; i++) {
335  s1 = (EdbSegP*)arr1.At(i);
336  s2 = (EdbSegP*)arr2.At(i);
337  seg.Copy(*s1); // to set correctly vid, aid, etc
338  //tf.Chi2SegM( *s1, *s2, seg, cond1, cond2);
339  tf.Chi2ASeg( *s1, *s2, seg, cond1, cond2);
340  //seg.SetChi2( tf.Chi2ACP( *s1, *s2, cond1) ); //TODO test!!
341 
342  t = new EdbTrackP(seg);
343  t->AddSegment(s1);
344  t->AddSegment(s2);
345  // s2->SetMC(s.MCEvt(),s.MCTrack());
346  arrtr.Add( t );
347  }
348 
350  Log(2,"RankCouples","%d tracks ok", arrtr.GetEntriesFast() );
351 }
TObjArray * arrtr
Definition: RecDispMC.C:129
void RankCouplesFast(TObjArray &arrtr)
Definition: EdbPositionAlignment.cxx:354
Definition: EdbScanCond.h:10
void SetPulsRamp0(float p1, float p2)
Definition: EdbScanCond.h:74
void SetDegrad(float d)
Definition: EdbScanCond.h:71
void SetSigma0(float x, float y, float tx, float ty)
Definition: EdbScanCond.h:62
void SetPulsRamp04(float p1, float p2)
Definition: EdbScanCond.h:75
Definition: EdbTrackFitter.h:16
static float Chi2ASeg(EdbSegP &s1, EdbSegP &s2, EdbSegP &s, EdbScanCond &cond1, EdbScanCond &cond2)
Definition: EdbTrackFitter.cxx:216

◆ RankCouples0()

void EdbPositionAlignment::RankCouples0 ( )
294 {
295  // construct basetracks only using the position information
296 
297  eTracks.Clear();
298  int n = eComb1.GetEntries();
299  Log(3,"RankCouples0","%d" ,n);
300  EdbSegP *s1, *s2, *s;
301  float dz;
302  for(int i=0; i<n; i++) {
303  s1 = (EdbSegP*)eComb1.At(i);
304  s2 = (EdbSegP*)eComb2.At(i);
305  dz = s2->Z()-s1->Z();
306  s = new EdbSegP( i,
307  0.5*(s1->X() + s2->X()),
308  0.5*(s1->Y() + s2->Y()),
309  (s2->X() - s1->X())/dz,
310  (s2->Y() - s1->Y())/dz,
311  s1->W() + s2->W()
312  );
313  s->SetZ(0.5*(s1->Z() + s2->Z()));
314  eTracks.Add( s );
315  }
316 
317  Log(2,"RankCouples0","%d tracks ok", eTracks.GetEntriesFast() );
318 
319 }
brick dz
Definition: RecDispMC.C:107
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
void SetZ(float z)
Definition: EdbSegP.h:122
Float_t Y() const
Definition: EdbSegP.h:171

◆ RankCouplesFast()

void EdbPositionAlignment::RankCouplesFast ( TObjArray &  arrtr)
355 {
356  int ntr = arrtr.GetEntries();
357  Log(1,"RankCouplesFast","%d tracks", ntr );
358  TArrayF chi2arr(ntr);
359  TArrayI ind(ntr);
360  eSegCouples.Delete();
361  eSegCouples.Expand(ntr);
362  EdbTrackP *t=0;
363  for(int i=0; i<ntr; i++) {
364  t = ((EdbTrackP*)arrtr.At(i));
365  chi2arr[i]= t->Chi2();
366  t->GetSegment(0)->SetFlag(0); //use flag as a counter
367  t->GetSegment(1)->SetFlag(0);
368  }
369  Sort(ntr,chi2arr.GetArray(),ind.GetArray(),0);
370 
371  EdbSegP *s0=0, *s1=0;
372  for(int i=0; i<ntr; i++) {
373  t = ((EdbTrackP*)arrtr.At(ind[i]));
374  s0 = t->GetSegment(0);
375  s1 = t->GetSegment(1);
376  s0->SetFlag( s0->Flag()+1 );
377  s1->SetFlag( s1->Flag()+1 );
378  EdbSegCouple *sc = new EdbSegCouple();
379  sc->SetN1(s0->Flag());
380  sc->SetN2(s1->Flag());
381  eSegCouples.Add(sc);
382  }
383 
384  for(int i=0; i<ntr; i++) {
385  t = ((EdbTrackP*)arrtr.At(ind[i]));
386  s0 = t->GetSegment(0);
387  s1 = t->GetSegment(1);
388  EdbSegCouple *sc = (EdbSegCouple *)eSegCouples.UncheckedAt(i);
389  sc->SetCHI2P( t->Chi2() );
390  sc->SetN1tot(s0->Flag());
391  sc->SetN2tot(s1->Flag());
392  s0->SetFlag(0);
393  s1->SetFlag(0);
394  }
395 
396 }
void SetN1(int n1)
Definition: EdbSegCouple.h:40
void SetN2(int n2)
Definition: EdbSegCouple.h:41
void SetN1tot(int n)
Definition: EdbSegCouple.h:42
void SetN2tot(int n)
Definition: EdbSegCouple.h:43
void SetCHI2P(float chi2)
Definition: EdbSegCouple.h:45
Int_t Flag() const
Definition: EdbSegP.h:146

◆ ReadPosTree()

int EdbPositionAlignment::ReadPosTree ( TTree *  tree,
EdbPattern p = 0,
EdbPattern p1 = 0,
EdbPattern p2 = 0,
TEventList *  lst = 0 
)
238 {
239  if(!tree) return 0;
240  EdbSegP *sb1 = 0;//new EdbSegP();
241  EdbSegP *sb2 = 0;//new EdbSegP();
242  EdbSegP *sb = 0;//new EdbSegP();
243  Float_t dz1,dz2;
244  Int_t flag;
245  tree->SetBranchAddress("s1." , &sb1);
246  tree->SetBranchAddress("s2." , &sb2);
247  tree->SetBranchAddress("s." , &sb);
248  tree->SetBranchAddress("dz1" , &dz1);
249  tree->SetBranchAddress("dz2" , &dz2);
250  tree->SetBranchAddress("flag", &flag);
251  Float_t chi2;
252  tree->SetBranchAddress("chi2", &chi2);
253 
254  int n = tree->GetEntries();
255  if(lst) n = lst->GetN();
256 
257  for(int i=0; i<n; i++) {
258  if(lst) tree->GetEntry(lst->GetEntry(i));
259  else tree->GetEntry(i);
260  if(p) p->AddSegment( *sb );
261  if(p1) p1->AddSegment( *sb1 );
262  if(p2) p2->AddSegment( *sb2 );
263  }
264  Log(2,"ReadPosTree","%d basetracks read from %s", n,tree->GetName());
265  return n;
266 }
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71
p
Definition: testBGReduction_AllMethods.C:8

◆ ResetAngularCorr()

void EdbPositionAlignment::ResetAngularCorr ( )
inline
131 { ePC1.eDTX = ePC1.eDTY = ePC2.eDTX = ePC2.eDTY = 0;}

◆ ResetPeak()

void EdbPositionAlignment::ResetPeak ( )
inline

◆ ResetPositionCorr()

void EdbPositionAlignment::ResetPositionCorr ( )
inline
130 { ePC1.eDX = ePC1.eDY = ePC2.eDX = ePC2.eDY = 0;}

◆ SaveAsTree()

void EdbPositionAlignment::SaveAsTree ( EdbPattern pat,
const char *  name 
)
270 {
271  TTree *tree = new TTree(name,"pattern tree");
272  EdbSegP *s=new EdbSegP();
273  tree->Branch("s" , "EdbSegP",&s ,32000,99);
274  int n = pat.N(), nsaved=0;
275  for(int i=0; i<n; i++) {
276  s->Copy( *(pat.GetSegment(i)) );
277  tree->Fill();
278  nsaved++;
279  }
280  tree->Write();
281  SafeDelete(tree);
282  Log(2,"SaveAsTree","%d segments saved", nsaved);
283 }
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66

◆ SelectBestComptons()

int EdbPositionAlignment::SelectBestComptons ( TObjArray &  a,
TObjArray &  arr,
int  nmax 
)
static
505 {
506  int ic=0;
507  int n = a.GetEntriesFast();
508  EdbSegP *s;
509  if(n>nmax) {
510  TArrayF comptonity(n); // should be defined as: the bigger - the better
511  TArrayI ind(n);
512  for(int i=0; i<n; i++) {
513  s = (EdbSegP*)a.At(i);
514  if(s->Flag()<0) comptonity[i] =0;
515  else comptonity[i] = s->W()*100 - s->Theta(); // proportional to ngrains and low theta
516  }
517  Sort(n,comptonity.GetArray(),ind.GetArray(),1); // sort in decreasing order
518  for(int i=0; i<nmax; i++) {
519  s = (EdbSegP*)a.At(ind[i]);
520  arr.Add(s); ic++;
521  }
522  }
523  else {
524  for(int i=0; i<n; i++) {
525  s = (EdbSegP*)a.UncheckedAt(i);
526  if(s->Flag()>-1) { arr.Add(s); ic++; }
527  }
528  }
529  return ic;
530 }
void a()
Definition: check_aligned.C:59
Float_t Theta() const
Definition: EdbSegP.h:181

◆ SelectNarrowPeakDXDY()

int EdbPositionAlignment::SelectNarrowPeakDXDY ( float  dr,
EdbH2 hxy 
)
878 {
879  // assuming that the combinations are found
880  // make the position plot and find the maximum,
881  // select only the combinations belongs to the maximum cutting out the tails
882 
883  float vpeak[2]={0,0};
884  PositionPlotA(hxy);
885  EdbPeak2 p2d(hxy);
886  p2d.FindPeak(vpeak);
887  ePC1.eDX += vpeak[0];
888  ePC1.eDY += vpeak[1];
889 
890  for(int i=0; i<6; i++) {
891  TObjArray comb1,comb2;
892  PositionPlotA(hxy, dr, &comb1, &comb2);
893  float dx, dy, dtx, dty;
894  FindDiff(comb1,comb2,ePC1,ePC2, dx, dy, dtx, dty);
895  Log(3,"SelectNarrowPeakDXDY", "diff: %f %f %f %f with %d eDX,eDY = %f %f", dx, dy, dtx, dty, comb1.GetEntries(), ePC1.eDX,ePC1.eDY);
896  ePC1.eDX += dx;
897  ePC1.eDY += dy;
898  }
899 
900  TObjArray comb1,comb2;
901  PositionPlotA(hxy, dr, &comb1, &comb2);
902  hxy.DrawH2("dxdy")->Write("dxdy");
903 
904  if(ActivatePosTree("postreeDXDYwide")) { FillPosTree(0, 0, 9); WritePosTree(); }
905 
906  eComb1.Clear(); eComb2.Clear();
907  int nsel = comb1.GetEntries();
908  for(int i=0; i<nsel; i++) {
909  eComb1.Add(comb1.UncheckedAt(i));
910  eComb2.Add(comb2.UncheckedAt(i));
911  }
912 
913  Log(2,"SelectNarrowPeakDXDY", "peak of %d found at %f %f with dr = %f", eComb1.GetEntries(), ePC1.eDX,ePC1.eDY, dr);
914  return comb1.GetEntries();
915 }
TH2F * DrawH2(const char *name="plot2d", const char *title="EdbH2plot2D")
Definition: EdbCell2.cpp:197
Definition: EdbCell2.h:104
void PositionPlotA(EdbH2 &hd, float DR=0, TObjArray *arr1=0, TObjArray *arr2=0)
Definition: EdbPositionAlignment.cxx:554

◆ SelectPeak() [1/2]

int EdbPositionAlignment::SelectPeak ( EdbPattern p1,
EdbPattern p2,
float  dx,
float  dy,
float  dz1,
float  dz2 
)
720 {
721  // Select the couples formed the peak
722  // assumed that the peak eXpeak, eYpeak is approximately found
723  // Input: dz1,dz2 - for projection
724  // dxMax, dYmax - for selection
725  // Output p1,p2 with found segments
726 
727  int n1 = eComb1.GetEntries();
728 
729  TH2F *hpeak = new TH2F("hpeak","Selected peak",100,-dxMax+eXpeak,dxMax+eXpeak,100,-dyMax+eYpeak,dyMax+eYpeak);
730  int ic=0;
731  EdbSegP *s1,*s2;
732  EdbSegP s;
733  float dx,dy;
734  for(int i=0; i<n1; i++) {
735  s1 = (EdbSegP*)eComb1.At(i);
736  s2 = (EdbSegP*)eComb2.At(i);
737  dx = Xcorr(*s2,dz2) - Xcorr(*s1,dz1);
738  dy = Ycorr(*s2,dz2) - Ycorr(*s1,dz1);
739  if(Abs(dx-eXpeak)>dxMax) continue;
740  if(Abs(dy-eYpeak)>dyMax) continue;
741  s.Copy(*s1); s.SetX(Xcorr(*s1,dz1)); s.SetY(Ycorr(*s1,dz1)); s.SetZ(0); p1.AddSegment(s);
742  s.Copy(*s2); s.SetX(Xcorr(*s2,dz2)); s.SetY(Ycorr(*s2,dz2)); s.SetZ(0); p2.AddSegment(s);
743  hpeak->Fill(dx,dy);
744  ic++;
745  }
746  eNpeak = ic;
747  eXpeak = hpeak->GetMean(1);
748  eYpeak = hpeak->GetMean(2);
749  Log(2,"SelectPeak","%4d coincidences selected at XY:(%8.2f %8.2f) +-%6.2f with RMS:(%5.2f %5.2f) Uniformity:(%5.2f %5.2f)",
750  ic, hpeak->GetMean(1), hpeak->GetMean(2), dxMax, hpeak->GetRMS(1), hpeak->GetRMS(2),
751  hpeak->GetRMS(1)/(2*dxMax/Sqrt(12)), hpeak->GetRMS(2)/(2*dyMax/Sqrt(12)) );
752 
753  SafeDelete(eAff);
754  eAff = new EdbAffine2D();
755  eAff->ShiftX(hpeak->GetMean(1));
756  eAff->ShiftY(hpeak->GetMean(2));
757 
758  SafeDelete(hpeak);
759 
760  return ic;
761 }
Definition: EdbAffine.h:17
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void SetY(Float_t y)
Definition: EdbSegP.h:175
void SetX(Float_t x)
Definition: EdbSegP.h:174

◆ SelectPeak() [2/2]

int EdbPositionAlignment::SelectPeak ( EdbPattern p1,
EdbPattern p2,
float  dx = 10,
float  dy = 10 
)
inline
121  { return SelectPeak(p1,p2,dx,dy,eZ1peak,eZ2peak); }

◆ SelectZone()

int EdbPositionAlignment::SelectZone ( float  min[2],
float  max[2],
TObjArray &  arr1,
TObjArray &  arr2,
float  maxDens 
)
483 {
484  // density unit is N/100/100 microns
485  int ic=0;
486  int nmax = (int)(maxDens*(max[0]-min[0])*(max[1]-min[1]) /100/100);
487  ic += SelectZoneSide(ePC1, min, max, arr1, nmax);
488  float min2[2] = {min[0]-eXcell, min[1]-eYcell };
489  float max2[2] = {max[0]+eXcell, max[1]+eYcell };
490  nmax = (int)(maxDens*(max2[0]-min2[0])*(max2[1]-min2[1]) /100/100);
491  ic += SelectZoneSide(ePC2, min2, max2, arr2, nmax);
492  return ic;
493 }
int SelectZoneSide(EdbPatCell2 &pc, float min[2], float max[2], TObjArray &arr, int nmax=kMaxInt)
Definition: EdbPositionAlignment.cxx:496

◆ SelectZoneSide()

int EdbPositionAlignment::SelectZoneSide ( EdbPatCell2 pc,
float  min[2],
float  max[2],
TObjArray &  arr,
int  nmax = kMaxInt 
)
497 {
498  TObjArray a(arr.GetSize());
499  pc.SelectObjects(min,max,a);
500  return SelectBestComptons(a,arr,nmax);
501 }
int SelectObjects(TObjArray &arr)
Definition: EdbCell2.cpp:797
static int SelectBestComptons(TObjArray &a, TObjArray &arr, int nmax)
Definition: EdbPositionAlignment.cxx:504

◆ ShrinkageSelection()

void EdbPositionAlignment::ShrinkageSelection ( float  dzbase)
806 {
807  // select the shrinkage
808  ePC1.eShr=ePC2.eShr=1;
809 
810  ePC1.eDZ = dzbase; ePC2.eDZ = 0;
811  ShrinkageSelectionSide( *(&ePC1), *(&ePC2), eHShr1, 10, 0.5);
812  ePC2.eDZ = -dzbase; ePC1.eDZ = 0;
813  ShrinkageSelectionSide( *(&ePC2), *(&ePC1), eHShr2, 10, 0.5);
814 
815  ePC1.eDZ = dzbase; ePC2.eDZ = 0;
816  ShrinkageSelectionSide( *(&ePC1), *(&ePC2), eHShr1, 50, 0.5);
817  ePC2.eDZ = -dzbase; ePC1.eDZ = 0;
818  ShrinkageSelectionSide( *(&ePC2), *(&ePC1), eHShr2, 50, 0.5);
819 
820  Log(2,"ShrinkageSelection","found %7.3f %7.3f", ePC1.eShr, ePC2.eShr );
821 }
EdbH2 eHShr2
Definition: EdbPositionAlignment.h:62
EdbH2 eHShr1
Definition: EdbPositionAlignment.h:61
int ShrinkageSelectionSide(EdbPatCell2 &pc1, EdbPatCell2 &pc2, EdbH2 &hshr, int nstep, float deltaShr)
Definition: EdbPositionAlignment.cxx:824

◆ ShrinkageSelectionSide()

int EdbPositionAlignment::ShrinkageSelectionSide ( EdbPatCell2 pc1,
EdbPatCell2 pc2,
EdbH2 hshr,
int  nstep,
float  deltaShr 
)
825 {
826  // select the shrinkage for one side
827 
828  int npeak=0;
829 
830  int n[2] = { nstep, 1 };
831  float min[2] = {pc1.eShr-deltaShr, pc2.eShr-0.001};
832  float max[2] = {pc1.eShr+deltaShr, pc2.eShr+0.001};
833  EdbH2 h12;
834 
835  h12.InitH2(n, min, max);
836 
837  //pc1.eDXlim = eXcell; pc1.eDYlim = eYcell;
838  //pc1.eDTXlim = 0.1; pc1.eDTYlim = 0.1;
839  //int ir[2] = {1,1};
840 
841  pc1.eDXlim = pc1.eDYlim = 15;
842  pc1.eDTXlim = 0.1; pc1.eDTYlim = 0.1;
843  int ir[2] = {0,0};
844 
845  pc1.eApplyCorr = pc2.eApplyCorr = true;
846 
847  eComb1.Clear();
848  eComb2.Clear();
849 
850  float x1,x2;
851  for(int i1=0; i1<n[0]; i1++)
852  {
853  for(int i2=0; i2<n[1]; i2++)
854  {
855  x1 = pc1.eShr = h12.X(i1);
856  x2 = pc2.eShr = h12.Y(i2);
857  int ncomb = pc1.FillCombinations(pc2, ir, eComb1, eComb2, 0);
858  h12.Fill(x1,x2,ncomb);
859  Log(3,"ShrinkageSelection:","ncomb = %6d at (%7.2f %7.2f)", ncomb, x1, x2);
860  }
861  }
862 
863  if(gEDBDEBUGLEVEL>2) h12.PrintStat();
864 
865  hshr.Copy(h12);
866 
867  float vpeak[2];
868  EdbPeak2 p2d(h12);
869  npeak = p2d.FindPeak(vpeak);
870  pc1.eShr = vpeak[0];
871 
872  Log(3,"ShrSelection","maxcomb: %6d (%7.2f %7.2f)", npeak,vpeak[0],vpeak[1]);
873  return npeak;
874 }
float X(int ix) const
Definition: EdbCell2.h:60
float Y(int iy) const
Definition: EdbCell2.h:61
void Copy(const EdbH2 &h)
Definition: EdbCell2.cpp:46
void PrintStat()
Definition: EdbCell2.cpp:209
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ SpotsFilterOut()

int EdbPositionAlignment::SpotsFilterOut ( int  nmax)
796 {
797  // discard cells with nenries > nmax
798  int nout1 = ePC1.DiscardHighCells(nmax);
799  int nout2 = ePC2.DiscardHighCells(nmax);
800  Log(3,"SpotsFilterOut","%d and %d cells discarded", nout1, nout2);
801  return nout1+nout2;
802 }
int DiscardHighCells(int nmax)
Definition: EdbCell2.cpp:142

◆ WideSearchXY()

int EdbPositionAlignment::WideSearchXY ( EdbPattern pat1,
EdbPattern pat2,
EdbH2 hxy,
float  dz,
float  xmin,
float  xmax,
float  ymin,
float  ymax 
)
1048 {
1049  // wide prealignment (in case of the basetracks)
1050 
1051  int npeak=0;
1052 
1053  ePC1.eDZ = dz/2;
1054  ePC2.eDZ = -dz/2;
1055  ePC1.eApplyCorr = ePC.eApplyCorr = true;
1056  FillArrays(pat1, pat2); // fill at central quote
1057  DoubletsFilterOut(false);
1058 
1059  int n[2] = { (int)((xmax-xmin)/eXcell) +1 , (int)((ymax-ymin)/eYcell) +1 };
1060  float min[2] = { -((int)(n[0]/2)+0.5)*eXcell , -((int)(n[1]/2)+0.5)*eYcell };
1061  float max[2] = { ((int)(n[0]/2)+0.5)*eXcell , ((int)(n[1]/2)+0.5)*eYcell };
1062  EdbH2 h12;
1063  h12.InitH2(n, min, max);
1064 
1066  ePC1.eDTXlim = 0.01; ePC1.eDTYlim = 0.01;
1067 
1068  int ir[2] = {1,1};
1069  float x1,x2;
1070  for(int i1=0; i1<n[0]; i1++)
1071  {
1072  for(int i2=0; i2<n[1]; i2++)
1073  {
1074  x1 = ePC1.eDX = h12.X(i1);
1075  x2 = ePC1.eDY = h12.Y(i2);
1076  eComb1.Clear();
1077  eComb2.Clear();
1078  int ncomb = ePC1.FillCombinations(ePC2, ir, eComb1, eComb2);
1079  h12.Fill(x1,x2,ncomb);
1080  Log(3,"WideSearchXY:","ncomb = %6d at (%7.2f %7.2f)", ncomb, x1, x2);
1081  }
1082  }
1083 
1084  h12.PrintStat();
1085  hxy.Copy(h12);
1086 
1087  float vpeak[2];
1088  EdbPeak2 p2d(h12);
1089  npeak = p2d.FindPeak(vpeak);
1090  ePC1.eDX = vpeak[0];
1091  ePC1.eDY = vpeak[1];
1092  eComb1.Clear();
1093  eComb2.Clear();
1094  int ncomb = ePC1.FillCombinations(ePC2, ir, eComb1, eComb2);
1095  Log(3,"WideSearchXY","ncomb = %d",ncomb);
1096 
1097  int nxy[2] = {21,21}; // TODO
1098  float minxy[2] = {-1000, -1000 };
1099  float maxxy[2] = { 1000, 1000 };
1100  EdbH2 hxyn;
1101  hxyn.InitH2(nxy, minxy, maxxy);
1102  SelectNarrowPeakDXDY(1000, hxyn);
1103 
1104  Log(2,"WideSearchXY","PC1: %f %f %f %f PC2:%f %f %f %f ", ePC1.eDX, ePC1.eDY, ePC1.eDZ,ePC1.eShr, ePC2.eDX, ePC2.eDY, ePC2.eDZ, ePC2.eShr);
1105 
1106  hxyn.DrawH2("hxyn")->Write("hxyn");
1107 
1108  ActivatePosTree("align");
1109  FillPosTree(dz/2, -dz/2, 0);
1110  WritePosTree();
1111 
1112  Log(2,"WideSearchXY","maxcomb: %6d (%7.2f %7.2f)", npeak,vpeak[0],vpeak[1]);
1113  return npeak;
1114 }
int DoubletsFilterOut(bool checkview=true)
Definition: EdbPositionAlignment.cxx:764
float xmin
Definition: emthickness.cpp:61
float ymin
Definition: emthickness.cpp:63
float xmax
Definition: emthickness.cpp:61
float ymax
Definition: emthickness.cpp:63

◆ WritePosTree()

Int_t EdbPositionAlignment::WritePosTree ( )
134 {
135  if(!ePosTree) return 0;
136  ePosTree->SetAlias("x1","s1.eX+dz1*s1.eTX");
137  ePosTree->SetAlias("x2","s2.eX+dz2*s2.eTX");
138  ePosTree->SetAlias("y1","s1.eY+dz1*s1.eTY");
139  ePosTree->SetAlias("y2","s2.eY+dz2*s2.eTY");
140 
141  ePosTree->SetAlias( "tx1c" , Form("s1.eTX/(%f)+(%f)",ePC1.eShr,ePC1.eDTX) );
142  ePosTree->SetAlias( "ty1c" , Form("s1.eTY/(%f)+(%f)",ePC1.eShr,ePC1.eDTY) );
143  ePosTree->SetAlias( "tx2c" , Form("s2.eTX/(%f)+(%f)",ePC2.eShr,ePC2.eDTX) );
144  ePosTree->SetAlias( "ty2c" , Form("s2.eTY/(%f)+(%f)",ePC2.eShr,ePC2.eDTY) );
145 
146  ePosTree->SetAlias("x1c" , Form("(%f) + s1.eX + tx1c*(%f)",ePC1.eDX,ePC1.eDZ) );
147  ePosTree->SetAlias("y1c" , Form("(%f) + s1.eY + ty1c*(%f)",ePC1.eDY,ePC1.eDZ) );
148  ePosTree->SetAlias("x2c" , Form("(%f) + s2.eX + tx2c*(%f)",ePC2.eDX,ePC2.eDZ) );
149  ePosTree->SetAlias("y2c" , Form("(%f) + s2.eY + ty2c*(%f)",ePC2.eDY,ePC2.eDZ) );
150 
151  ePosTree->SetAlias("dx" , "x2c-x1c" );
152  ePosTree->SetAlias("dy" , "y2c-y1c" );
153  ePosTree->SetAlias("dtx" , "tx2c-tx1c" );
154  ePosTree->SetAlias("dty" , "ty2c-ty1c" );
155 
156  ePosTree->SetAlias("dr" , "sqrt(dx*dx+dy*dy)" );
157  ePosTree->SetAlias("dt" , "sqrt(dtx*dtx+dty*dty)" );
158 
159  ePosTree->Write();
160  SafeDelete(ePosTree);
161  return 1;
162 }

◆ Xcorr() [1/2]

float EdbPositionAlignment::Xcorr ( EdbSegP s,
float  dz 
)
inline
114 {return s.X() + dz*s.TX();}
Float_t TX() const
Definition: EdbSegP.h:172

◆ Xcorr() [2/2]

float EdbPositionAlignment::Xcorr ( EdbSegP s,
float  dz,
float  dx 
)
inline
116 {return dx + s.X() + dz*s.TX();}

◆ Ycorr() [1/2]

float EdbPositionAlignment::Ycorr ( EdbSegP s,
float  dz 
)
inline
115 {return s.Y() + dz*s.TY();}
Float_t TY() const
Definition: EdbSegP.h:173

◆ Ycorr() [2/2]

float EdbPositionAlignment::Ycorr ( EdbSegP s,
float  dz,
float  dy 
)
inline
117 {return dy + s.Y() + dz*s.TY();}

◆ Zselection()

void EdbPositionAlignment::Zselection ( EdbH2 hd)
624 {
625  if(eNZ1step<1 || eNZ2step<1) {
626  Log(1,"Zselection","ERROR: eNZ1step = %d, eNZ2step = %d",eNZ1step,eNZ2step);
627  return;
628  }
629 
630  float maxMax=0, meanMax=0, meanMean=0, meanbin=0;
631  int maxbin=0,ic=0;
632  //float maxPeak = 0;
633 
634  int nz[2] = {eNZ1step,eNZ2step};
635  float minz[2] = {Min(eZ1from,eZ1to), Min(eZ2from,eZ2to)};
636  float maxz[2] = {Max(eZ1from,eZ1to), Max(eZ2from,eZ2to)};
637  EdbH2 hz12;
638  hz12.InitH2(nz, minz, maxz);
639  //hz12.PrintStat();
640 
641  float dz1,dz2;
642  for(int i1=0; i1<nz[0]; i1++)
643  {
644  for(int i2=0; i2<nz[1]; i2++)
645  {
646  dz1 = hz12.X(i1);
647  dz2 = hz12.Y(i2);
648  hd.CleanCells();
649  PositionPlot(dz1,dz2,hd);
650 
651  EdbPeak2 p2di(hd);
652  p2di.Smooth(eSmoothKernel);
653  //maxbin = hd.MaxBin();
654  maxbin = p2di.MaxBin();
655  if(maxbin>maxMax) maxMax=maxbin;
656  hz12.Fill(dz1,dz2,maxbin);
657  //meanbin = hd.Mean();
658  meanbin = p2di.Mean();
659  meanMax += maxbin;
660  meanMean += meanbin;
661  ic++;
662  Log(3,"Zselection","max: %5d mean: %8.4f at dZ(%7.2f %7.2f)", maxbin,meanbin, dz1, dz2);
663  }
664  }
665  meanMax /= ic;
666  meanMean /= ic;
667 
668  EdbPeak2 p2z(hz12);
669  p2z.Smooth("k5a");
670  eHDZ.Copy(*((EdbH2*)(&p2z)));
671  p2z.FindGlobalPeak(eZ1peak, eZ2peak, 0.05);
672 
673  hd.CleanCells();
675 
676  EdbPeak2 p2d(hd);
677  p2d.Smooth(eSmoothKernel);
678  eHpeak.Copy(*((EdbH2*)(&p2d)));
679  p2d.FindPeak(eXpeak, eYpeak);
680 
681  // eHpeak.Copy(hd);
682  //float vpeak[2];
683  //EdbPeak2 p2d(eHpeak);
684  //p2d.FindPeak(vpeak);
685  //eXpeak=vpeak[0];
686  //eYpeak=vpeak[1];
687 
688  Log(2,"Zselection","maxMax: %8.2f meanMax: %8.4f meanMean: %8.4f at dZ(%7.2f %7.2f) XY(%7.2f %7.2f)",
689  maxMax, meanMax, meanMean, eZ1peak, eZ2peak, eXpeak,eYpeak);
690 }
EdbH2 eHDZ
Definition: EdbPositionAlignment.h:45
void PositionPlot(float dz1, float dz2, EdbH2 &hd)
Definition: EdbPositionAlignment.cxx:583
EdbH2 eHpeak
Definition: EdbPositionAlignment.h:44

Member Data Documentation

◆ eAff

EdbAffine2D* EdbPositionAlignment::eAff

◆ eBinX

Float_t EdbPositionAlignment::eBinX

◆ eBinY

Float_t EdbPositionAlignment::eBinY

◆ eChi2Max

Float_t EdbPositionAlignment::eChi2Max

◆ eComb1

TObjArray EdbPositionAlignment::eComb1

◆ eComb2

TObjArray EdbPositionAlignment::eComb2

◆ eDoRot

Bool_t EdbPositionAlignment::eDoRot

◆ eDTXmax

Float_t EdbPositionAlignment::eDTXmax

◆ eDTXmin

Float_t EdbPositionAlignment::eDTXmin

◆ eDTYmax

Float_t EdbPositionAlignment::eDTYmax

◆ eDTYmin

Float_t EdbPositionAlignment::eDTYmin

◆ eDXmin

Float_t EdbPositionAlignment::eDXmin

◆ eDYmin

Float_t EdbPositionAlignment::eDYmin

◆ eHDZ

EdbH2 EdbPositionAlignment::eHDZ

◆ eHpeak

EdbH2 EdbPositionAlignment::eHpeak

◆ eHShr1

EdbH2 EdbPositionAlignment::eHShr1

◆ eHShr2

EdbH2 EdbPositionAlignment::eHShr2

◆ eNpeak

Int_t EdbPositionAlignment::eNpeak

◆ eNShr1step

Int_t EdbPositionAlignment::eNShr1step

◆ eNShr2step

Int_t EdbPositionAlignment::eNShr2step

◆ eNZ1step

Int_t EdbPositionAlignment::eNZ1step

◆ eNZ2step

Int_t EdbPositionAlignment::eNZ2step

◆ ePC

EdbPatCell2 EdbPositionAlignment::ePC

◆ ePC1

EdbPatCell2 EdbPositionAlignment::ePC1

◆ ePC2

EdbPatCell2 EdbPositionAlignment::ePC2

◆ ePosTree

TTree* EdbPositionAlignment::ePosTree

◆ eRot

EdbH1 EdbPositionAlignment::eRot

◆ eRpeak

Float_t EdbPositionAlignment::eRpeak

◆ eS0tx

Float_t EdbPositionAlignment::eS0tx

◆ eS0ty

Float_t EdbPositionAlignment::eS0ty

◆ eS0x

Float_t EdbPositionAlignment::eS0x

◆ eS0y

Float_t EdbPositionAlignment::eS0y

◆ eSegCouples

TObjArray EdbPositionAlignment::eSegCouples

◆ eShr1from

Float_t EdbPositionAlignment::eShr1from

◆ eShr1to

Float_t EdbPositionAlignment::eShr1to

◆ eShr2from

Float_t EdbPositionAlignment::eShr2from

◆ eShr2to

Float_t EdbPositionAlignment::eShr2to

◆ eSmoothKernel

TString EdbPositionAlignment::eSmoothKernel

◆ eTracks

TObjArray EdbPositionAlignment::eTracks

◆ eWbaseMin

Float_t EdbPositionAlignment::eWbaseMin

◆ eX0

float EdbPositionAlignment::eX0

◆ eXcell

Float_t EdbPositionAlignment::eXcell

◆ eXpeak

Float_t EdbPositionAlignment::eXpeak

◆ eY0

float EdbPositionAlignment::eY0

◆ eYcell

Float_t EdbPositionAlignment::eYcell

◆ eYpeak

Float_t EdbPositionAlignment::eYpeak

◆ eZ1from

Float_t EdbPositionAlignment::eZ1from

◆ eZ1peak

Float_t EdbPositionAlignment::eZ1peak

◆ eZ1to

Float_t EdbPositionAlignment::eZ1to

◆ eZ2from

Float_t EdbPositionAlignment::eZ2from

◆ eZ2peak

Float_t EdbPositionAlignment::eZ2peak

◆ eZ2to

Float_t EdbPositionAlignment::eZ2to

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