FEDRA emulsion software from the OPERA Collaboration
EdbPatCouple Class Reference

#include <EdbPVRec.h>

Inheritance diagram for EdbPatCouple:
Collaboration diagram for EdbPatCouple:

Public Member Functions

EdbSegCoupleAddSegCouple (int id1, int id2)
 
int Align (int alignFlag)
 
void CalculateAffXY (int alignFlag)
 
void CalculateAffXYZ (float z, int alignFlag)
 
int CheckSegmentsDuplication (EdbPattern *pat)
 
float Chi2A (EdbSegCouple *scp, int iprob=1)
 
float Chi2A (EdbSegP *s1, EdbSegP *s2, int iprob=1)
 
float Chi2KF (EdbSegCouple *scp)
 
int CHI2mode () const
 
float Chi2Pz0 (EdbSegCouple *scp)
 
void ClearSegCouples ()
 
EdbScanCondCond ()
 
int CutCHI2P (float chimax)
 
int DiffPat (EdbPattern *pat1, EdbPattern *pat2, Long_t vdiff[4])
 
int DiffPatCell (TIndexCell *cel1, TIndexCell *cel2, Long_t vdiff[4])
 
 EdbPatCouple ()
 
void FillCell_XYaXaY (EdbPattern *pat, EdbScanCond *cond, float dz, float stepx, float stepy)
 
void FillCell_XYaXaY (EdbScanCond *cond, float zlink, int id=0)
 
int FillCHI2 ()
 
int FillCHI2P ()
 
int FindOffset (EdbPattern *pat1, EdbPattern *pat2, Long_t vdiff[4])
 
int FindOffset0 (float xmax, float ymax)
 
int FindOffset01 (float xmax, float ymax)
 
int FindOffset1 (float xmax, float ymax)
 
EdbAffine2DGetAff ()
 
EdbSegCoupleGetSegCouple (int i) const
 
int ID1 () const
 
int ID2 () const
 
int LinkFast ()
 
int LinkSlow (float chi2max)
 
int Ncouples () const
 
float OffsetTX () const
 
float OffsetTY () const
 
float OffsetX () const
 
float OffsetY () const
 
EdbPatternPat1 ()
 
EdbPatternPat2 ()
 
void PrintCouples ()
 
void RemoveSegCouple (EdbSegCouple *sc)
 
int SelectIsolated ()
 
void SetCHI2mode (int m)
 
void SetCond (EdbScanCond *cond)
 
void SetID (int id1, int id2)
 
void SetOffset (float o1, float o2, float o3, float o4)
 
void SetOffsetsMax (float ox, float oy)
 
void SetPat1 (EdbPattern *pat1)
 
void SetPat2 (EdbPattern *pat2)
 
void SetSigma (float s1, float s2, float s3, float s4)
 
void SetZlink (float z)
 
float SigmaTX () const
 
float SigmaTY () const
 
float SigmaX () const
 
float SigmaY () const
 
int SortByCHI2P ()
 
float Zlink () const
 
 ~EdbPatCouple ()
 

Private Attributes

EdbAffine2DeAff
 
float eChi2Max
 
int eCHI2mode
 
EdbScanCondeCond
 
int eCoupleType
 
Int_t eID [2]
 
Float_t eOffset [4]
 
EdbPatternePat1
 
EdbPatternePat2
 
TObjArray * eSegCouples
 
Float_t eSigma [4]
 
float eXoffsetMax
 
float eYoffsetMax
 
float eZlink
 

Constructor & Destructor Documentation

◆ EdbPatCouple()

EdbPatCouple::EdbPatCouple ( )

◆ ~EdbPatCouple()

EdbPatCouple::~EdbPatCouple ( )

110 {
111  if(eSegCouples) {
112  eSegCouples->Delete();
113  SafeDelete(eSegCouples);
114  }
115 }
TObjArray * eSegCouples
Definition: EdbPVRec.h:44

Member Function Documentation

◆ AddSegCouple()

EdbSegCouple * EdbPatCouple::AddSegCouple ( int  id1,
int  id2 
)

119 {
120  if(!eSegCouples) eSegCouples = new TObjArray(1000);
121  EdbSegCouple *sc = new EdbSegCouple(id1,id2);
122  eSegCouples->Add(sc);
123  return sc;
124 }
Definition: EdbSegCouple.h:14

◆ Align()

int EdbPatCouple::Align ( int  alignFlag)

535 {
536  int npat =0;
537 
538  SetZlink( (Pat1()->Z()+Pat2()->Z())/2. ); // link at central z
539 
540  Log(2,"/nEdbPatCouple::Align","patterns: %d (%d) and %d (%d) at Zlink = %f",
541  Pat1()->ID(), Pat1()->N(), Pat2()->ID(),Pat2()->N(), Zlink() );
542 
544 
545  Long_t vdiff[4]={0,0,0,0};
546  int nitr=5;
547 
548  FillCell_XYaXaY(Cond(), Zlink(), 2 ); Pat2()->Cell()->DropCouples(4);
549 
550  for(int i=0; i<nitr; i++) {
551  FillCell_XYaXaY(Cond(), Zlink(), 1 ); Pat1()->Cell()->DropCouples(4);
552  npat = DiffPat(Pat1(),Pat2(),vdiff);
553 
554  CalculateAffXYZ(Zlink(), alignFlag);
555 
556  Pat1()->Transform(GetAff());
557  if( Pat1()->DiffAff(GetAff()) < Cond()->SigmaX(0)/20. ) break; // stop iterations
558  }
559 
560  vdiff[0]=vdiff[1]=vdiff[2]=vdiff[3]=1;
561 
562  npat = DiffPat( Pat1(), Pat2(), vdiff );
563  FillCHI2P();
564  SortByCHI2P();
565  CutCHI2P(1.5);
566  SelectIsolated();
567  npat = Ncouples(); // the selected couples for the final transformation
568  CalculateAffXYZ(Zlink(),alignFlag);
569  Pat1()->Transform(GetAff());
570  Pat1()->SetNAff(npat);
571  EdbAffine2D affA;
572  affA.Set( GetAff()->A11(), GetAff()->A12(), GetAff()->A21(), GetAff()->A22(),0,0 );
573 
574  //psel1->CalculateAXAY(psel2,affA);
575  Pat1()->TransformA(&affA);
576  GetAff()->Reset();
577 
578 
579  //psel2->CalculateAXAY(psel1,affA);
580  //pat2->TransformA(affA);
581 
582  return npat;
583 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Int_t npat
Definition: Xi2HatStartScript.C:33
Definition: EdbAffine.h:17
void Reset()
Definition: EdbAffine.cxx:72
void Set(EdbAffine2D &a)
Definition: EdbAffine.h:36
float eXoffsetMax
Definition: EdbPVRec.h:51
EdbPattern * Pat2()
Definition: EdbPVRec.h:90
EdbPattern * Pat1()
Definition: EdbPVRec.h:89
int FillCHI2P()
Definition: EdbPVRec.cxx:265
int SelectIsolated()
Definition: EdbPVRec.cxx:471
int FindOffset01(float xmax, float ymax)
Definition: EdbPVRec.cxx:190
int DiffPat(EdbPattern *pat1, EdbPattern *pat2, Long_t vdiff[4])
Definition: EdbPVRec.cxx:697
void SetZlink(float z)
Definition: EdbPVRec.h:69
float Zlink() const
Definition: EdbPVRec.h:79
float SigmaX() const
Definition: EdbPVRec.h:139
void FillCell_XYaXaY(EdbScanCond *cond, float zlink, int id=0)
Definition: EdbPVRec.cxx:806
int SortByCHI2P()
Definition: EdbPVRec.cxx:490
EdbAffine2D * GetAff()
Definition: EdbPVRec.h:76
int CutCHI2P(float chimax)
Definition: EdbPVRec.cxx:451
void CalculateAffXYZ(float z, int alignFlag)
Definition: EdbPVRec.cxx:138
float eYoffsetMax
Definition: EdbPVRec.h:52
EdbScanCond * Cond()
Definition: EdbPVRec.h:77
int Ncouples() const
Definition: EdbPVRec.h:80
TIndexCell * Cell() const
Definition: EdbPattern.h:330
void SetNAff(int n)
Definition: EdbPattern.h:320
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154
void TransformA(const EdbAffine2D *affA)
Definition: EdbPattern.cxx:367
int DropCouples(int level)
Definition: TIndexCell.cpp:206
struct @8 Z

◆ CalculateAffXY()

void EdbPatCouple::CalculateAffXY ( int  alignFlag)
173 {
174  // calculate affine transformation for SELECTED couples at Z in the center
175  float z = (Pat2()->Z()-Pat1()->Z())/2.;
176  CalculateAffXYZ(z,flag);
177  Pat1()->Transform(GetAff());
178  GetAff()->Reset();
179 }
Float_t Z() const
Definition: EdbPattern.h:87

◆ CalculateAffXYZ()

void EdbPatCouple::CalculateAffXYZ ( float  z,
int  alignFlag 
)
139 {
140  // calculate affine transformation for SELECTED couples at given z
141  // if flag==0 (default) - permit patterns deformation
142 
143  if(!eAff) eAff = new EdbAffine2D();
144  else eAff->Reset();
145 
146  EdbSegCouple *scp=0;
147  EdbSegP *s1, *s2;
148  int ncp=Ncouples();
149 
150  TArrayF x1(ncp);
151  TArrayF y1(ncp);
152  TArrayF x2(ncp);
153  TArrayF y2(ncp);
154 
155  Float_t dz1,dz2;
156 
157  for( int i=0; i<ncp; i++ ) {
158  scp=GetSegCouple(i);
159  s1 = Pat1()->GetSegment(scp->ID1());
160  s2 = Pat2()->GetSegment(scp->ID2());
161  dz1 = z - s1->Z();
162  dz2 = z - s2->Z();
163  x1[i] = s1->X() + dz1*s1->TX();
164  y1[i] = s1->Y() + dz1*s1->TY();
165  x2[i] = s2->X() + dz2*s2->TX();
166  y2[i] = s2->Y() + dz2*s2->TY();
167  }
168  eAff->Calculate( ncp,x1.fArray,y1.fArray,x2.fArray,y2.fArray, flag);
169 }
Int_t Calculate(EdbPointsBox2D *b1, EdbPointsBox2D *b2)
Definition: EdbAffine.cxx:260
EdbAffine2D * eAff
Definition: EdbPVRec.h:42
EdbSegCouple * GetSegCouple(int i) const
Definition: EdbPVRec.h:85
int ID2() const
Definition: EdbSegCouple.h:53
int ID1() const
Definition: EdbSegCouple.h:52
Definition: EdbSegP.h:18
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
Float_t Y() const
Definition: EdbSegP.h:171
Float_t TY() const
Definition: EdbSegP.h:173
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ CheckSegmentsDuplication()

int EdbPatCouple::CheckSegmentsDuplication ( EdbPattern pat)

620 {
621  TIndexCell *cell=pat->Cell();
622  int n1 = cell->GetEntriesFast();
623  TIndexCell *c1,*c2,*c3,*c4;
624  EdbSegP *s1=0,*s2=0;
625  for( int i1=0; i1<n1; i1++) {
626  c1 = cell->At(i1);
627  int n2 = c1->GetEntriesFast();
628  for( int i2=0; i2<n2; i2++) {
629  c2 = c1->At(i2);
630  int n3 = c2->GetEntriesFast();
631  for( int i3=0; i3<n3; i3++) {
632  c3 = c2->At(i3);
633  int n4 = c3->GetEntriesFast();
634  for( int i4=0; i4<n4; i4++) {
635  c4 = c3->At(i4);
636  int N=c4->N();
637  if(N>1) {
638  for(int j1=0; j1<N-1; j1++) {
639  s1=pat->GetSegment(c4->At(j1)->Value());
640  for(int j2=j1+1; j2<N; j2++) {
641  s2=pat->GetSegment(c4->At(j2)->Value());
642 
643  if(gDIFF) gDIFF->Fill( s1->X(),s1->Y(),s1->TX(),s1->TY(),s1->W(),
644  s2->X(),s2->Y(),s2->TX(),s2->TY(),s2->W(),
645  s1->Z(),
646  s1->Aid(0), s1->Aid(1), s2->Aid(0), s2->Aid(1)
647  );
648  if( s1->Flag()<0 ) continue;
649  if( s2->Flag()<0 ) continue;
650  if( s1->Aid(0) == s2->Aid(0)&& s1->Aid(1) == s2->Aid(1) && s1->Side()==s2->Side() ) continue;
651  if( TMath::Abs(s2->X()-s1->X()) > 3.) continue;
652  if( TMath::Abs(s2->Y()-s1->Y()) > 3.) continue;
653  s2->W()>s1->W() ? s1->SetFlag(-1):s2->SetFlag(-1);
654  }
655  }
656  }
657  }
658  }
659  }
660  }
661  return 0;
662 }
TNtuple * gDIFF
Definition: EdbLog.cxx:26
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
Int_t Flag() const
Definition: EdbSegP.h:146
Definition: TIndexCell.h:19
Long_t Value() const
Definition: TIndexCell.h:79
Int_t GetEntriesFast() const
Definition: TIndexCell.h:82
TIndexCell const * At(Int_t narg, Int_t vind[]) const
Definition: TIndexCell.cpp:519
Int_t N() const
Definition: TIndexCell.cpp:344
TCanvas * c1
Definition: energy.C:13
TCanvas * c2
Definition: energy.C:26

◆ Chi2A() [1/2]

float EdbPatCouple::Chi2A ( EdbSegCouple scp,
int  iprob = 1 
)

331 {
332  EdbSegP *s1 = Pat1()->GetSegment(scp->ID1());
333  EdbSegP *s2 = Pat2()->GetSegment(scp->ID2());
334  float chi2 = Chi2A(s1,s2, iprob);
335 
336  SafeDelete(scp->eS);
337  EdbSegP *s = scp->eS=new EdbSegP();
338  s->Set( 0, // id will be assigned on writing into the tree
339  (s1->X()+s2->X())/2.,
340  (s1->Y()+s2->Y())/2.,
341  (s1->X()-s2->X())/(s1->Z()-s2->Z()),
342  (s1->Y()-s2->Y())/(s1->Z()-s2->Z()),
343  s1->W()+s2->W(),0
344  );
345  s->SetZ( (s2->Z()+s1->Z())/2 );
346  s->SetChi2( chi2 );
347  s->SetDZ( s2->Z()-s1->Z() );
348  s->SetVolume( s1->Volume()+s2->Volume() );
349  s->SetMC(s1->MCEvt(),s1->MCTrack());
350 
351  if(s1->EMULDigitArray())
352  for(int i=0; i<s1->EMULDigitArray()->GetEntriesFast(); i++) s->addEMULDigit(s1->EMULDigitArray()->At(i));
353  if(s2->EMULDigitArray())
354  for(int i=0; i<s2->EMULDigitArray()->GetEntriesFast(); i++) s->addEMULDigit(s2->EMULDigitArray()->At(i));
355 
356  return chi2;
357 }
float Chi2A(EdbSegCouple *scp, int iprob=1)
Definition: EdbPVRec.cxx:330
EdbSegP * eS
Definition: EdbSegCouple.h:24
void SetVolume(float w)
Definition: EdbSegP.h:133
void addEMULDigit(TObject *a)
Definition: EdbSegP.h:76
Float_t Volume() const
Definition: EdbSegP.h:155
void SetZ(float z)
Definition: EdbSegP.h:122
void SetChi2(float chi2)
Definition: EdbSegP.h:132
TRefArray * EMULDigitArray() const
Definition: EdbSegP.h:81
void SetMC(int mEvt, int mTrack)
Definition: EdbSegP.h:138
void SetDZ(float dz)
Definition: EdbSegP.h:123
Int_t MCTrack() const
Definition: EdbSegP.h:143
Int_t MCEvt() const
Definition: EdbSegP.h:142
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:86
Float_t chi2
Definition: testBGReduction_By_ANN.C:14
EdbSegP * s
Definition: tlg2pattern.C:32

◆ Chi2A() [2/2]

float EdbPatCouple::Chi2A ( EdbSegP s1,
EdbSegP s2,
int  iprob = 1 
)

361 {
362  // fast estimation of chi2 in the special case when the position
363  // errors of segments are negligible in respect to angular errors:
364  // sigmaXY/dz << sigmaTXY
365  // application: up/down linking, alignment (offset search)
366  //
367  // All calculation are done in the track plane which remove the
368  // dependency of the polar angle (phi)
369 
370  TVector3 v1,v2,v;
371  v1.SetXYZ( s1->TX(), s1->TY() , -1. );
372  v2.SetXYZ( s2->TX(), s2->TY() , -1. );
373  v.SetXYZ( -( s2->X() - s1->X() ),
374  -( s2->Y() - s1->Y() ),
375  -( s2->Z() - s1->Z() ) );
376 
377  float phi = v.Phi();
378  v.RotateZ( -phi );
379  v1.RotateZ( -phi );
380  v2.RotateZ( -phi );
381 
382  float dz = v.Z();
383  float tx = v.X()/dz;
384  float ty = v.Y()/dz;
385  float stx = eCond->SigmaTX(tx);
386  float sty = eCond->SigmaTY(ty);
387 
388  float prob1=1., prob2=1.;
389  if(iprob) {
390  prob1 = eCond->ProbSeg(tx,ty,s1->W());
391  prob2 = eCond->ProbSeg(tx,ty,s2->W());
392  }
393  float dtx1 = (v1.X()-tx)*(v1.X()-tx)/stx/stx/prob1;
394  float dty1 = (v1.Y()-ty)*(v1.Y()-ty)/sty/sty/prob1;
395  float dtx2 = (v2.X()-tx)*(v2.X()-tx)/stx/stx/prob2;
396  float dty2 = (v2.Y()-ty)*(v2.Y()-ty)/sty/sty/prob2;
397 
398  float chi2a=TMath::Sqrt(dtx1+dty1+dtx2+dty2)/2.;
399  return chi2a;
400 }
brick dz
Definition: RecDispMC.C:107
EdbScanCond * eCond
Definition: EdbPVRec.h:47
float SigmaTX(float ax) const
Definition: EdbScanCond.h:106
float SigmaTY(float ay) const
Definition: EdbScanCond.h:107
float ProbSeg(float tx, float ty, float puls) const
Definition: EdbScanCond.cxx:119

◆ Chi2KF()

float EdbPatCouple::Chi2KF ( EdbSegCouple scp)

304 {
305  // exact estimation of chi2 with full fitting procedure
306  // Applications: up/down linking, alignment (offset search)
307  //
308  // All calculation are done with full corellation matrix for both segments
309  // (dependency on the polar angle (phi) is taken into account)
310 
311  EdbSegP *s1 = Pat1()->GetSegment(scp->ID1());
312  EdbSegP *s2 = Pat2()->GetSegment(scp->ID2());
313  s1->SetErrors();
314  s2->SetErrors();
315  eCond->FillErrorsCov( s1->TX(), s1->TY(), s1->COV() );
316  eCond->FillErrorsCov( s2->TX(), s2->TY(), s2->COV() );
317 
318  SafeDelete(scp->eS);
319  scp->eS=new EdbSegP(*s2);
320  float chi2 = EdbTrackFitter::Chi2Seg(scp->eS, s1);
321  scp->eS->PropagateToCOV( 0.5*(s1->Z()+s2->Z()) );
322 
323  if(s1->EMULDigitArray())
324  for(int i=0; i<s1->EMULDigitArray()->GetEntriesFast(); i++) scp->eS->addEMULDigit(s1->EMULDigitArray()->At(i));
325 
326  return chi2;
327 }
void FillErrorsCov(float tx, float ty, TMatrixD &cov)
Definition: EdbScanCond.cxx:161
void SetErrors()
Definition: EdbSegP.h:89
TMatrixD & COV() const
Definition: EdbSegP.h:120
void PropagateToCOV(float z)
Definition: EdbSegP.cxx:252
static float Chi2Seg(EdbSegP *s1, EdbSegP *s2)
Definition: EdbTrackFitter.cxx:62

◆ CHI2mode()

int EdbPatCouple::CHI2mode ( ) const
inline
104 { return eCHI2mode; }
int eCHI2mode
Definition: EdbPVRec.h:56

◆ Chi2Pz0()

float EdbPatCouple::Chi2Pz0 ( EdbSegCouple scp)

404 {
405  float sx=.5, sy=.5, sz=3., dz=44.;
406  float sa;
407  float a1,a2;
408  float tx,ty;
409 
410  TVector3 v1,v2,v;
411 
412  EdbSegP *s1 = Pat1()->GetSegment(scp->ID1());
413  EdbSegP *s2 = Pat2()->GetSegment(scp->ID2());
414 
415  tx = (s1->TX()+s2->TX())/2.;
416  ty = (s1->TY()+s2->TY())/2.;
417 
418  v1.SetXYZ( s1->TX()/sx, s1->TY()/sy , 1./sz );
419  v2.SetXYZ( s2->TX()/sx, s2->TY()/sy , 1./sz );
420 
421  v = v1+v2;
422  v *= .5;
423 
424  a1 = v.Angle(v1);
425  a2 = v.Angle(v2);
426 
427  sa = sz/dz*TMath::Cos(v.Theta());
428 
429  float chi2 = TMath::Sqrt( (a1*a1 + a2*a2)/2. ) /
430  eCond->ProbSeg( tx, ty, (s1->W()+s2->W())/2. ) / sa;
431 
432  SafeDelete(scp->eS);
433  EdbSegP *s = scp->eS=new EdbSegP();
434  s->Set( 0, // id will be assigned on writing into the tree
435  (s1->X()+s2->X())/2.,
436  (s1->Y()+s2->Y())/2.,
437  tx,
438  ty,
439  s1->W()+s2->W(),0
440  );
441  s->SetZ( (s2->Z()+s1->Z())/2 );
442  s->SetDZ( (s2->DZ()+s1->DZ())/2. );
443  s->SetChi2( chi2 );
444  s->SetVolume( s1->Volume()+s2->Volume() );
445  s->SetMC(s1->MCEvt(),s1->MCTrack());
446 
447  return chi2;
448 }
Float_t DZ() const
Definition: EdbSegP.h:151
static Float_t Angle(const EdbSegP &s1, const EdbSegP &s2)
Definition: EdbSegP.cxx:470

◆ ClearSegCouples()

void EdbPatCouple::ClearSegCouples ( )
inline
82 { if(eSegCouples) eSegCouples->Clear(); }

◆ Cond()

EdbScanCond* EdbPatCouple::Cond ( )
inline
77 {return eCond;}

◆ CutCHI2P()

int EdbPatCouple::CutCHI2P ( float  chi2max)

452 {
453  TObjArray *sCouples = new TObjArray();
454  EdbSegCouple *sc = 0;
455  int ncp = Ncouples();
456 
457  if(gEDBDEBUGLEVEL>1) printf("CutCHI2P (%4.1f): %d -> ", chi2max,ncp );
458 
459  for( int i=ncp-1; i>=0; i-- ) {
460  sc = GetSegCouple(i);
461  if(sc->CHI2P()<=chi2max) sCouples->Add(sc);
462  else SafeDelete(sc);
463  }
464  SafeDelete(eSegCouples);
465  eSegCouples=sCouples;
466  if(gEDBDEBUGLEVEL>1) printf("%d\n", Ncouples() );
467  return Ncouples();
468 }
float CHI2P() const
Definition: EdbSegCouple.h:59
gEDBDEBUGLEVEL
Definition: energy.C:7

◆ DiffPat()

int EdbPatCouple::DiffPat ( EdbPattern pat1,
EdbPattern pat2,
Long_t  vdiff[4] 
)
699 {
700  if(!pat1) return 0;
701  if(!pat2) return 0;
702  TIndexCell *c1=pat1->Cell();
703  TIndexCell *c2=pat2->Cell();
704  int ncouples = 0;
705 
706  ncouples = DiffPatCell(c1,c2,vdiff);
707 
708  return ncouples;
709 }
int DiffPatCell(TIndexCell *cel1, TIndexCell *cel2, Long_t vdiff[4])
Definition: EdbPVRec.cxx:712

◆ DiffPatCell()

int EdbPatCouple::DiffPatCell ( TIndexCell cel1,
TIndexCell cel2,
Long_t  vdiff[4] 
)
714 {
715  // Input: 2 cells as "x:y:ax:ay:entry" where entry is local id
716  // vdiff - vector of differences
717  //
718  // Output: 1 patterns as: "entry1:entry2"
719  //
720  // Action: all entries from both patterns satisfied to current vdiff for
721  // each cell are selected. Entries could be taken more than once
722 
723  // TODO: move this algorithm to TIndexCell (n-dim)
724 
725  int ncouples = 0;
726  int npat = 0;
727  ClearSegCouples();
728 
729  TIndexCell *c1[4],*c2[4];
730 
731  Long_t v[2]={0,0};
732  Long_t val0[6]={0,0,0,0,0,0};
733  Long_t val[5]={0,0,0,0,0};
734  int vind[5]={-1,-1,-1,-1,-1};
735 
736  //EdbSegP *s1,*s2;
737 
738  int ncel1, nc10, nc11, nc12, nc13, nc23;
739 
740  ncel1 = cel1->GetEntriesFast();
741  for( vind[0]=0; vind[0]<ncel1; vind[0]++) { //x1
742  c1[0] = cel1->At(vind[0]);
743  val0[0] = c1[0]->Value();
744  for( val[0] = val0[0]-vdiff[0]; val[0]<=val0[0]+vdiff[0]; val[0]++ ) { //x2
745  c2[0] = cel2->Find(val[0]);
746  if(!c2[0]) continue;
747 
748  nc10 = c1[0]->GetEntriesFast();
749  for( vind[1]=0; vind[1]<nc10; vind[1]++) { //y1
750  c1[1] = c1[0]->At(vind[1]);
751  val0[1] = c1[1]->Value();
752  for( val[1] = val0[1]-vdiff[1]; val[1]<=val0[1]+vdiff[1]; val[1]++ ) { //y2
753  c2[1] = c2[0]->Find(val[1]);
754  if(!c2[1]) continue;
755 
756  nc11 = c1[1]->GetEntriesFast();
757  for( vind[2]=0; vind[2]<nc11; vind[2]++) { //ax1
758  c1[2] = c1[1]->At(vind[2]);
759  val0[2] = c1[2]->Value();
760  for( val[2] = val0[2]-vdiff[2]; val[2]<=val0[2]+vdiff[2]; val[2]++ ) { //ax2
761  c2[2] = c2[1]->Find(val[2]);
762  if(!c2[2]) continue;
763 
764  nc12 = c1[2]->GetEntriesFast();
765  for( vind[3]=0; vind[3]<nc12; vind[3]++) { //ay1
766  c1[3] = c1[2]->At(vind[3]);
767  val0[3] = c1[3]->Value();
768  for( val[3] = val0[3]-vdiff[3]; val[3]<=val0[3]+vdiff[3]; val[3]++ ) { //ay2
769  c2[3] = c2[2]->Find(val[3]);
770  if(!c2[3]) continue;
771 
772  npat++;
773 
774  nc13 = c1[3]->GetEntriesFast();
775  for(int ie1=0; ie1<nc13; ie1++) {
776  nc23 = c2[3]->GetEntriesFast();
777  for(int ie2=0; ie2<nc23; ie2++) {
778 
779  ncouples++;
780 
781  v[0] = c1[3]->At(ie1)->Value();
782  v[1] = c2[3]->At(ie2)->Value();
783 
784 // s1 = Pat1()->GetSegment(v[0]);
785 // s2 = Pat2()->GetSegment(v[1]);
786 // if(IsCompatible(s1,s2,eCond) //TODO
787 
788  AddSegCouple((int)v[0],(int)v[1]);
789 
790  }
791  }
792 
793  }
794  }
795  }
796  }
797  }
798  }
799  }
800  }
801 
802  return npat;
803 }
EdbSegCouple * AddSegCouple(int id1, int id2)
Definition: EdbPVRec.cxx:118
void ClearSegCouples()
Definition: EdbPVRec.h:82
TIndexCell * Find(Int_t narg, Long_t varg[]) const
Definition: TIndexCell.cpp:613

◆ FillCell_XYaXaY() [1/2]

void EdbPatCouple::FillCell_XYaXaY ( EdbPattern pat,
EdbScanCond cond,
float  dz,
float  stepx,
float  stepy 
)
823 {
824  // fill cells according to Sigma(angle) functions
825  // here cells size do not depends on dz!
826 
827  TIndexCell *cell = pat->Cell();
828  if(cell) cell->Drop();
829  pat->SetStep(stepx,stepy,0,0);
830 
831  float x,y,tx,ty;
832  Long_t val[5]; // x,y,ax,ay,i
833  EdbSegP *p;
834  int npat = pat->N();
835  Log(3,"EdbPatCouple::FillCell_XYaXaY","npat = %d",npat);
836  for(int i=0; i<npat; i++ ) {
837  p = pat->GetSegment(i);
838  if( p->Track() >-1 ) continue; //to check side effects!!!
839  tx = p->TX();
840  ty = p->TY();
841  x = p->X() + tx*dz;
842  y = p->Y() + ty*dz;
843  val[0]= (Long_t)(x / stepx );
844  val[1]= (Long_t)(y / stepy );
845  val[2]= (Long_t)(tx/ cond->StepTX(tx) );
846  val[3]= (Long_t)(ty/ cond->StepTY(ty) );
847  val[4]= (Long_t)(i);
848  cell->Add(5,val);
849  }
850  cell->Sort();
851  //cell->PrintStat();
852  //cell->SetName("x:y:tx:ty:entry");
853 }
void SetStep(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPattern.h:306
float StepTX(float tx) const
Definition: EdbScanCond.h:93
float StepTY(float ty) const
Definition: EdbScanCond.h:94
Int_t N() const
Definition: EdbPattern.h:89
void Drop()
Definition: TIndexCell.cpp:237
void Sort(Int_t upto=kMaxInt)
Definition: TIndexCell.cpp:539
Int_t Add(Int_t narg, Long_t varg[])
Definition: TIndexCell.cpp:602
p
Definition: testBGReduction_AllMethods.C:8

◆ FillCell_XYaXaY() [2/2]

void EdbPatCouple::FillCell_XYaXaY ( EdbScanCond cond,
float  zlink,
int  id = 0 
)
807 {
808  // fill cells according to Sigma(angle) functions at z=zlink
809 
810  float dz1 = zlink - Pat1()->Z();
811  float dz2 = zlink - Pat2()->Z();
812  float dz = TMath::Max( TMath::Abs(dz1), TMath::Abs(dz2) );
813  float stepx = cond->StepX(dz);
814  float stepy = cond->StepY(dz);
815 
816  if(id==0||id==1) FillCell_XYaXaY( Pat1(), cond, dz1, stepx, stepy );
817  if(id==0||id==2) FillCell_XYaXaY( Pat2(), cond, dz2, stepx, stepy );
818 }
float StepY(float dz) const
Definition: EdbScanCond.cxx:97
float StepX(float dz) const
Definition: EdbScanCond.cxx:90

◆ FillCHI2()

int EdbPatCouple::FillCHI2 ( )

288 {
289  // final chi2 calculation based on the linked track
290 
291  EdbSegCouple *scp=0;
292  float chi2;
293  int ncp = Ncouples();
294  for( int i=0; i<ncp; i++ ) {
295  scp=GetSegCouple(i);
296  chi2 = Chi2A(scp,0);
297  scp->SetCHI2(chi2);
298  }
299  return Ncouples();
300 }
void SetCHI2(float chi2)
Definition: EdbSegCouple.h:44

◆ FillCHI2P()

int EdbPatCouple::FillCHI2P ( )

266 {
267  // fast chi2 calculation used for couples selection
268 
269  EdbSegCouple *scp=0;
270  float chi2;
271  int ncp = Ncouples();
272 
273  Log(3,"EdbPatCouple::FillCHI2P","eCHI2mode = %d\n",eCHI2mode);
274  for( int i=0; i<ncp; i++ ) {
275  scp=GetSegCouple(i);
276 
277  if(eCHI2mode==2) chi2 = Chi2Pz0(scp);
278  else if(eCHI2mode==3) chi2 = Chi2KF(scp);
279  else chi2 = Chi2A(scp);
280 
281  scp->SetCHI2P(chi2);
282  }
283  return Ncouples();
284 }
float Chi2Pz0(EdbSegCouple *scp)
Definition: EdbPVRec.cxx:403
float Chi2KF(EdbSegCouple *scp)
Definition: EdbPVRec.cxx:303
void SetCHI2P(float chi2)
Definition: EdbSegCouple.h:45

◆ FindOffset()

int EdbPatCouple::FindOffset ( EdbPattern pat1,
EdbPattern pat2,
Long_t  vdiff[4] 
)
207 {
208  float dz=pat2->Z()-pat1->Z();
209 
210  float voff[2]={0,0};
211  float stepx = Cond()->StepX(dz/2);
212  float stepy = Cond()->StepY(dz/2);
213  int nx = (int)( eXoffsetMax/stepx );
214  int ny = (int)( eYoffsetMax/stepy );
215 
216  if(nx==0&&ny==0) return 2;
217  Log(2,"EdbPatCouple::FindOffset","( %d x %d ) with steps %8.3f %8.3f \t%f %f",
218  2*nx+1,2*ny+1,stepx,stepy,Cond()->StepTX(0),Cond()->StepTY(0) );
219 
220  FillCell_XYaXaY(pat1,Cond(),dz/2.,stepx,stepy);
221  Log(3,"EdbPatCouple::FindOffset"," drop couples: %d",pat1->Cell()->DropCouples(4) );
222  FillCell_XYaXaY(pat2,Cond(),-dz/2.,stepx,stepy);
223  Log(3,"EdbPatCouple::FindOffset"," drop couples: %d",pat2->Cell()->DropCouples(4) );
224 
225  Long_t vshift[4] = {0,0,0,0};
226  TIndexCell *c1=pat1->Cell();
227  TIndexCell *c2=pat2->Cell();
228 
229  int npat0 = 0;
230  int npat = 0;
231 
232  for(int iy=-ny; iy<=ny; iy++ ) {
233  for(int ix=-nx; ix<=nx; ix++ ) {
234  vshift[0] = ix;
235  vshift[1] = iy;
236  c1->Shift(2,vshift);
237 
238  npat = c1->ComparePatterns(4,vdiff,c2);
239  if(gEDBDEBUGLEVEL>1) printf("%5d",npat);
240 
241  if(npat>npat0) {
242  npat0 = npat;
243  voff[0] = ix*stepx;
244  voff[1] = iy*stepy;
245  }
246 
247  vshift[0] = -ix;
248  vshift[1] = -iy;
249  c1->Shift(2,vshift);
250  }
251  if(gEDBDEBUGLEVEL>1) printf("\n");
252  }
253 
254  Log(2,"EdbPatCouple::FindOffset","Offset: %f %f npat = %d", voff[0], voff[1], npat0 );
255 
256  EdbAffine2D aff;
257  aff.ShiftX(voff[0]);
258  aff.ShiftY(voff[1]);
259  pat1->Transform(&aff);
260 
261  return npat0;
262 }
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
int nx
Definition: emthickness.cpp:60
int ny
Definition: emthickness.cpp:62

◆ FindOffset0()

int EdbPatCouple::FindOffset0 ( float  xmax,
float  ymax 
)
183 {
184  Long_t vdiff[4]={0,0,0,0};
186  return FindOffset( Pat1(),Pat2(),vdiff);
187 }
void SetOffsetsMax(float ox, float oy)
Definition: EdbPVRec.h:63
int FindOffset(EdbPattern *pat1, EdbPattern *pat2, Long_t vdiff[4])
Definition: EdbPVRec.cxx:206
float xmax
Definition: emthickness.cpp:61
float ymax
Definition: emthickness.cpp:63

◆ FindOffset01()

int EdbPatCouple::FindOffset01 ( float  xmax,
float  ymax 
)
191 {
192  Long_t vdiff[4]={0,0,1,1};
194  return FindOffset( Pat1(),Pat2(),vdiff);
195 }

◆ FindOffset1()

int EdbPatCouple::FindOffset1 ( float  xmax,
float  ymax 
)
199 {
200  Long_t vdiff[4]={1,1,1,1};
202  return FindOffset( Pat1(),Pat2(),vdiff);
203 }

◆ GetAff()

EdbAffine2D* EdbPatCouple::GetAff ( )
inline
76 {return eAff;}

◆ GetSegCouple()

EdbSegCouple* EdbPatCouple::GetSegCouple ( int  i) const
inline
86  { return (EdbSegCouple *)(eSegCouples->At(i)); }

◆ ID1()

int EdbPatCouple::ID1 ( ) const
inline
131 { return eID[0]; }
Int_t eID[2]
Definition: EdbPVRec.h:31

◆ ID2()

int EdbPatCouple::ID2 ( ) const
inline
132 { return eID[1]; }

◆ LinkFast()

int EdbPatCouple::LinkFast ( )

666 {
667  // to link segments of already aligned patterns
668  // fast - because check couples by cells
669 
670  if(Pat1()->N()<1) return 0;
671  if(Pat2()->N()<1) return 0;
672  int npat =0;
673  SetZlink( (Pat2()->Z()+Pat1()->Z())/2. );
674 
675  Log(2,"EdbPatCouple::LinkFast"," %3d (%7d) and %3d (%7d) at Z = %13.3f",
676  Pat1()->ID(), Pat1()->N(), Pat2()->ID(),Pat2()->N(), Zlink() );
677 
678  FillCell_XYaXaY(Cond(), Zlink() );
679  Log(3,"EdbPatCouple::LinkFast","1");
680 
681  //CheckSegmentsDuplication(Pat1());
682  //CheckSegmentsDuplication(Pat2());
683 
684  Long_t vdiff[4]={1,1,1,1};
685 
686  npat = DiffPat( Pat1(), Pat2(), vdiff );
687  Log(3,"EdbPatCouple::LinkFast","2");
688 
689  FillCHI2P();
690  Log(3,"EdbPatCouple::LinkFast","End of linking: %3d (%7d) and %3d (%7d) at Z = %13.3f npat= %d",
691  Pat1()->ID(), Pat1()->N(), Pat2()->ID(),Pat2()->N(), Zlink(),npat );
692 
693  return npat;
694 }

◆ LinkSlow()

int EdbPatCouple::LinkSlow ( float  chi2max)

587 {
588  // to link segments of already aligned patterns
589  // slow - because check all couples
590 
591  int npat =0;
592  EdbPattern const *pat1=Pat1(); if(!pat1) return npat;
593  EdbPattern const *pat2=Pat2(); if(!pat2) return npat;
594 
595  ClearSegCouples();
596 
597  Log(2,"EdbPatCouple::LinkSlow","patterns: %d (%d) and %d (%d) \n",
598  pat1->ID(), pat1->N(), pat2->ID(),pat2->N());
599 
600  EdbSegCouple *c;
601  float chi2;
602 
603  int n1,n2;
604  n1 = pat1->N();
605  for( int i1=0; i1<n1; i1++ ) {
606  n2 = pat2->N();
607  for( int i2=0; i2<n2; i2++ ) {
608  chi2 = Chi2A( pat1->GetSegment(i1), pat2->GetSegment(i2) );
609  if( chi2 > chi2max ) continue;
610  c=AddSegCouple(i1,i2);
611  c->SetCHI2P(chi2);
612  npat++;
613  }
614  }
615  return npat;
616 }
Definition: EdbPattern.h:280
int ID() const
Definition: EdbPattern.h:328

◆ Ncouples()

int EdbPatCouple::Ncouples ( ) const
inline
80  { if(eSegCouples) return eSegCouples->GetEntriesFast();
81  else return 0; }

◆ OffsetTX()

float EdbPatCouple::OffsetTX ( ) const
inline
136 { return eOffset[2]; }
Float_t eOffset[4]
Definition: EdbPVRec.h:38

◆ OffsetTY()

float EdbPatCouple::OffsetTY ( ) const
inline
137 { return eOffset[3]; }

◆ OffsetX()

float EdbPatCouple::OffsetX ( ) const
inline
134 { return eOffset[0]; }

◆ OffsetY()

float EdbPatCouple::OffsetY ( ) const
inline
135 { return eOffset[1]; }

◆ Pat1()

EdbPattern* EdbPatCouple::Pat1 ( )
inline
89 { return ePat1; }
EdbPattern * ePat1
Definition: EdbPVRec.h:35

◆ Pat2()

EdbPattern* EdbPatCouple::Pat2 ( )
inline
90 { return ePat2; }
EdbPattern * ePat2
Definition: EdbPVRec.h:36

◆ PrintCouples()

void EdbPatCouple::PrintCouples ( )

128 {
129  EdbSegCouple *sc=0;
130  int ncp = Ncouples();
131  for(int i=0; i<ncp; i++) {
132  sc = GetSegCouple(i);
133  sc->Print();
134  }
135 }
void Print()
Definition: EdbSegCouple.cxx:67

◆ RemoveSegCouple()

void EdbPatCouple::RemoveSegCouple ( EdbSegCouple sc)
inline
87 { SafeDelete(sc); }

◆ SelectIsolated()

int EdbPatCouple::SelectIsolated ( )

472 {
473  TObjArray *sCouples = new TObjArray();
474  EdbSegCouple *sc = 0;
475  int ncp = Ncouples();
476  if(gEDBDEBUGLEVEL>1) printf("SelectIsolated: %d -> ", ncp );
477 
478  for( int i=ncp-1; i>=0; i-- ) {
479  sc = GetSegCouple(i);
480  if( sc->N1tot()>1 || sc->N2tot()>1 ) {SafeDelete(sc);}
481  else sCouples->Add(sc);
482  }
483  SafeDelete(eSegCouples);
484  eSegCouples=sCouples;
485  if(gEDBDEBUGLEVEL>1) printf(" %d \n", Ncouples() );
486  return Ncouples();
487 }
int N2tot() const
Definition: EdbSegCouple.h:57
int N1tot() const
Definition: EdbSegCouple.h:56

◆ SetCHI2mode()

void EdbPatCouple::SetCHI2mode ( int  m)
inline
103 { eCHI2mode=m; }

◆ SetCond()

void EdbPatCouple::SetCond ( EdbScanCond cond)
inline
74 { eCond=cond; }

◆ SetID()

void EdbPatCouple::SetID ( int  id1,
int  id2 
)
inline
62 { eID[0]=id1; eID[1]=id2; }

◆ SetOffset()

void EdbPatCouple::SetOffset ( float  o1,
float  o2,
float  o3,
float  o4 
)
inline
66  { eOffset[0]=o1; eOffset[1]=o2; eOffset[2]=o3; eOffset[3]=o4; }

◆ SetOffsetsMax()

void EdbPatCouple::SetOffsetsMax ( float  ox,
float  oy 
)
inline
64  { eXoffsetMax=ox; eYoffsetMax=oy; }

◆ SetPat1()

void EdbPatCouple::SetPat1 ( EdbPattern pat1)
inline
71 { ePat1=pat1; }

◆ SetPat2()

void EdbPatCouple::SetPat2 ( EdbPattern pat2)
inline
72 { ePat2=pat2; }

◆ SetSigma()

void EdbPatCouple::SetSigma ( float  s1,
float  s2,
float  s3,
float  s4 
)
inline
68  { eSigma[0]=s1; eSigma[1]=s2; eSigma[2]=s3; eSigma[3]=s4; }
Float_t eSigma[4]
Definition: EdbPVRec.h:40

◆ SetZlink()

void EdbPatCouple::SetZlink ( float  z)
inline
69 {eZlink=z;}
float eZlink
Definition: EdbPVRec.h:49

◆ SigmaTX()

float EdbPatCouple::SigmaTX ( ) const
inline
141 { return eSigma[2]; }

◆ SigmaTY()

float EdbPatCouple::SigmaTY ( ) const
inline
142 { return eSigma[3]; }

◆ SigmaX()

float EdbPatCouple::SigmaX ( ) const
inline
139 { return eSigma[0]; }

◆ SigmaY()

float EdbPatCouple::SigmaY ( ) const
inline
140 { return eSigma[1]; }

◆ SortByCHI2P()

int EdbPatCouple::SortByCHI2P ( )

491 {
492  int npat=0;
493 
494  EdbSegCouple::SetSortFlag(0); // sort by CHI2P
495  eSegCouples->UnSort();
496  eSegCouples->Sort();
497 
498  int np1 = ePat1->N();
499  int np2 = ePat2->N();
500  TArrayI found1(np1);
501  TArrayI found2(np2);
502  int i;
503  for(i=0; i<np1; i++) found1[i]=0;
504  for(i=0; i<np2; i++) found2[i]=0;
505 
506  EdbSegCouple *sc = 0;
507 
508  int ncp = Ncouples();
509  for( i=0; i<ncp; i++ ) {
510  sc = GetSegCouple(i);
511  found1[sc->ID1()]++;
512  found2[sc->ID2()]++;
513  sc->SetN1( found1[sc->ID1()] );
514  sc->SetN2( found2[sc->ID2()] );
515  npat++;
516  }
517 
518  ncp = Ncouples();
519  for( i=0; i<ncp; i++ ) {
520  sc = GetSegCouple(i);
521  sc->SetN1tot( found1[sc->ID1()] );
522  sc->SetN2tot( found2[sc->ID2()] );
523  }
524 
525  EdbSegCouple::SetSortFlag(1); // sort by (numbers + CHI2P)
526  eSegCouples->UnSort();
527  eSegCouples->Sort();
528 
529  return npat;
530 }
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
static void SetSortFlag(int s=0)
Definition: EdbSegCouple.cxx:61

◆ Zlink()

float EdbPatCouple::Zlink ( ) const
inline
79 {return eZlink;}

Member Data Documentation

◆ eAff

EdbAffine2D* EdbPatCouple::eAff
private

◆ eChi2Max

float EdbPatCouple::eChi2Max
private

◆ eCHI2mode

int EdbPatCouple::eCHI2mode
private

◆ eCond

EdbScanCond* EdbPatCouple::eCond
private

◆ eCoupleType

int EdbPatCouple::eCoupleType
private

◆ eID

Int_t EdbPatCouple::eID[2]
private

◆ eOffset

Float_t EdbPatCouple::eOffset[4]
private

◆ ePat1

EdbPattern* EdbPatCouple::ePat1
private

◆ ePat2

EdbPattern* EdbPatCouple::ePat2
private

◆ eSegCouples

TObjArray* EdbPatCouple::eSegCouples
private

◆ eSigma

Float_t EdbPatCouple::eSigma[4]
private

◆ eXoffsetMax

float EdbPatCouple::eXoffsetMax
private

◆ eYoffsetMax

float EdbPatCouple::eYoffsetMax
private

◆ eZlink

float EdbPatCouple::eZlink
private

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