FEDRA emulsion software from the OPERA Collaboration
EdbFragmentAlignment Class Reference

#include <EdbFragmentAlignment.h>

Inheritance diagram for EdbFragmentAlignment:
Collaboration diagram for EdbFragmentAlignment:

Public Member Functions

void AddPatternAt (EdbPattern *p, int i)
 
void AlignAndShift (EdbMosaicPath &mp)
 
void AlignFragment (EdbPattern &pf)
 
void AlignFragment_dummy (EdbPattern &pf)
 
void ApplyAff ()
 
void CheckScale (EdbMosaicPath &mp, EdbAffine2D &aff)
 
float CheckScaleX (float y0)
 
float CheckScaleY (float x0)
 
 EdbFragmentAlignment ()
 
void FillVC ()
 
void FillVDT (EdbCouplesTree &vdt)
 
EdbViewHeaderGetHeader (int i) const
 
TObjArray & GetParr ()
 
EdbPatternGetPattern (int i) const
 
int N () const
 
void RealignAndShift (EdbMosaicPath &mp)
 
void SetAlPar (const AlPar &ap, EdbPlateAlignment &al)
 
void SetHarr (TObjArray &ha)
 
void SetID (int id)
 
void SetMinPeak (int mp)
 
void SetPatternsOwner ()
 
void SetSide (int s)
 
int Side () const
 
int ViewSideAl (EdbPattern &p1, EdbPattern &p2, EdbAffine2D &aff, bool do_shift)
 
virtual ~EdbFragmentAlignment ()
 

Public Attributes

AlPar eAP
 
bool eDoSaveAlignments
 
float eR0
 

Private Attributes

EdbAffine2D eAff
 
TObjArray eHarr
 
int eID
 centers after alignment More...
 
int eMinPeak
 
int eN
 
TObjArray eParr
 
int eSide
 
EdbPatterneVC
 original centers More...
 
EdbPatterneVC0
 

Constructor & Destructor Documentation

◆ EdbFragmentAlignment()

EdbFragmentAlignment::EdbFragmentAlignment ( )
inline
56 { eN=0; eVC0=0; eVC=0; }
int eN
Definition: EdbFragmentAlignment.h:38
EdbPattern * eVC
original centers
Definition: EdbFragmentAlignment.h:42
EdbPattern * eVC0
Definition: EdbFragmentAlignment.h:41

◆ ~EdbFragmentAlignment()

virtual EdbFragmentAlignment::~EdbFragmentAlignment ( )
inlinevirtual
57 { eParr.Delete(); SafeDelete(eVC); SafeDelete(eVC0); }
TObjArray eParr
Definition: EdbFragmentAlignment.h:40

Member Function Documentation

◆ AddPatternAt()

void EdbFragmentAlignment::AddPatternAt ( EdbPattern p,
int  i 
)
279 {
280  if(i>=0&&i<eParr.GetSize()) eParr.AddAt( p, i );
281  else Log(1,"EdbFragmentAlignment::AddPatternAt","Error! i = %d is out of bounds(0:%d)",i,eParr.GetSize());
282 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
p
Definition: testBGReduction_AllMethods.C:8

◆ AlignAndShift()

void EdbFragmentAlignment::AlignAndShift ( EdbMosaicPath mp)
185 {
186  Log(1,"EdbFragmentAlignment::AlignAndShift","");
187  mp.SetOK( mp.I(0) );
188  for(int i=1; i<eN; i++)
189  {
190  EdbPattern *p = GetPattern(mp.I(i));
191  if(p->N()<eMinPeak)
192  {
193  Log(1,"EdbFragmentAlignment::AlignAndShift","Skip view with %d segments",p->N());
194  continue;
195  }
196  TArrayI narr(20);
197  int nb = mp.GetAlignedNeighbours( mp.I(i), narr );
198  if(nb>20)
199  {
200  Log(1,"EdbFragmentAlignment::AlignAndShift","Warning! too many neigbours: %d in dr = %f reset to 20",nb, mp.eR0);
201  nb=20;
202  }
203  EdbPattern alp;
204  for(int ii=0; ii<nb; ii++) {
205  alp.AddPattern( *GetPattern(narr[ii]) );
206  }
207  printf("align %d -> %d at dist %.1f \n",p->N(), alp.N(), mp.Dist(mp.I(i)) );
208  EdbAffine2D aff;
209  int peak = ViewSideAl(*p, alp, aff, 1);
210  EdbSegP *s = eVC->GetSegment( mp.I(i) );
211  s->SetW(peak);
212  if( peak > eMinPeak )
213  {
214  mp.SetOK( mp.I(i) );
215  s->Transform(&aff);
216  }
217  }
218 }
Definition: EdbAffine.h:17
int ViewSideAl(EdbPattern &p1, EdbPattern &p2, EdbAffine2D &aff, bool do_shift)
Definition: EdbFragmentAlignment.cxx:259
int eMinPeak
Definition: EdbFragmentAlignment.h:46
EdbPattern * GetPattern(int i) const
Definition: EdbFragmentAlignment.h:69
int I(const int i) const
Definition: EdbMosaicPath.h:43
void SetOK(const int i)
Definition: EdbMosaicPath.h:41
int GetAlignedNeighbours(const int i0, TArrayI &list) const
Definition: EdbMosaicPath.cxx:21
Float_t Dist(const int i) const
Definition: EdbMosaicPath.h:47
Float_t eR0
Definition: EdbMosaicPath.h:30
Definition: EdbPattern.h:280
Int_t AddPattern(EdbPattern &p)
Definition: EdbPattern.cxx:1563
Definition: EdbSegP.h:18
void SetW(float w)
Definition: EdbSegP.h:129
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
virtual void Transform(const EdbAffine2D *a)
EdbSegP * s
Definition: tlg2pattern.C:32

◆ AlignFragment()

void EdbFragmentAlignment::AlignFragment ( EdbPattern pf)
53 {
54  EdbMosaicPath mp(eN);
55  mp.eR0=eR0;
56  EdbViewHeader *h = mp.FindNearest( eHarr, pf.X(), pf.Y() );
57  if(h) {
58  Log(1,"EdbFragmentAlignment::AlignFragment","with %d views at x0,y0 was %f %f: %f %f",
59  eN,h->GetXview(), h->GetYview(), pf.X(), pf.Y() );
60  mp.InitArea( eHarr, h->GetXview(), h->GetYview(), eMinPeak );
61  }
62  else {
63  Log(1,"EdbFragmentAlignment::AlignFragment","Warning! central view close to (%f %f) was not found! abandon this fragment",pf.X(), pf.Y());
64  //mp.InitArea( eHarr, pf.X(), pf.Y(), eMinPeak );
65  return;
66  }
67 
68  AlignAndShift( mp );
69  RealignAndShift( mp );
70  AlignAndShift( mp );
71  RealignAndShift( mp );
72 
73  for(int i=0; i<eN; i++)
74  {
75  if( mp.OK(i) ) pf.AddPattern( *GetPattern(i) );
76  }
77 
78  eAff.Reset();
79  eAff.Calculate(eVC,eVC0); // from found to original
80  Log(1,"EdbFragmentAlignment::AlignFragment","apply %s",eAff.AsString());
81  eVC->Transform(&eAff);
82  pf.Transform(&eAff);
83 }
Int_t Calculate(EdbPointsBox2D *b1, EdbPointsBox2D *b2)
Definition: EdbAffine.cxx:260
const char * AsString() const
Definition: EdbAffine.cxx:57
void Reset()
Definition: EdbAffine.cxx:72
EdbAffine2D eAff
Definition: EdbFragmentAlignment.h:48
void AlignAndShift(EdbMosaicPath &mp)
Definition: EdbFragmentAlignment.cxx:184
float eR0
Definition: EdbFragmentAlignment.h:52
TObjArray eHarr
Definition: EdbFragmentAlignment.h:39
void RealignAndShift(EdbMosaicPath &mp)
Definition: EdbFragmentAlignment.cxx:221
Definition: EdbMosaicPath.h:20
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154
Float_t Y() const
Definition: EdbPattern.h:86
Float_t X() const
Definition: EdbPattern.h:85
Definition: EdbView.h:26
Float_t GetXview() const
Definition: EdbView.h:93
Float_t GetYview() const
Definition: EdbView.h:94

◆ AlignFragment_dummy()

void EdbFragmentAlignment::AlignFragment_dummy ( EdbPattern pf)
87 {
88  EdbMosaicPath mp(eN);
89  mp.eR0=eR0;
90  EdbViewHeader *h = mp.FindNearest( eHarr, pf.X(), pf.Y() );
91  if(h) {
92  Log(1,"EdbFragmentAlignment::AlignFragment","with %d views at x0,y0 was %f %f: %f %f",
93  eN,h->GetXview(), h->GetYview(), pf.X(), pf.Y() );
94  mp.InitArea( eHarr, h->GetXview(), h->GetYview(), eMinPeak );
95  }
96  else {
97  Log(1,"EdbFragmentAlignment::AlignFragment","Warning! central view close to (%f %f) was not found! abandon this fragment",pf.X(), pf.Y());
98  //mp.InitArea( eHarr, pf.X(), pf.Y(), eMinPeak );
99  return;
100  }
101 
102  //AlignAndShift( mp );
103  //RealignAndShift( mp );
104  //AlignAndShift( mp );
105  //RealignAndShift( mp );
106 
107  for(int i=0; i<eN; i++)
108  {
109  pf.AddPattern( *GetPattern(i) );
110  }
111 
112  //eAff.Reset();
113  //eAff.Calculate(eVC,eVC0); // from found to original
114  Log(1,"EdbFragmentAlignment::AlignFragment_dummy","apply %s",eAff.AsString());
115  //eVC->Transform(&eAff);
116  //pf.Transform(&eAff);
117 }

◆ ApplyAff()

void EdbFragmentAlignment::ApplyAff ( )
178 {
179  Log(1,"EdbFragmentAlignment::ApplyAff","%s",eAff.AsString());
180  for( int i=0; i<eN; i++ ) GetPattern(i)->Transform(&eAff);
181 }

◆ CheckScale()

void EdbFragmentAlignment::CheckScale ( EdbMosaicPath mp,
EdbAffine2D aff 
)
153 {
154  int n = mp.N();
155  mp.SetOK( (mp.I(0)) );
156 
157  for(int i=1; i<n; i++)
158  {
159  EdbPattern *p = (EdbPattern *)(eParr.At(mp.I(i)));
160  TArrayI narr(10);
161  int nb = mp.GetAlignedNeighbours( mp.I(i), narr );
162  if(nb>10)
163  {
164  Log(1,"EdbFragmentAlignment::CheckScale","Warning! too many neigbours: %d in dr = %f reset to 10",nb, mp.eR0);
165  nb=10;
166  }
167  EdbPattern alp;
168  for(int ii=0; ii<nb; ii++) {
169  alp.AddPattern( *(EdbPattern *)(eParr.At(narr[ii])) );
170  }
171  printf("align %d -> %d at dist %.1f \n",p->N(), alp.N(), mp.Dist(mp.I(i)) );
172  if( ViewSideAl(*p, alp, aff, 0) > eMinPeak ) mp.SetOK( mp.I(i) );
173  }
174 }
int N() const
Definition: EdbMosaicPath.h:45

◆ CheckScaleX()

float EdbFragmentAlignment::CheckScaleX ( float  y0)
131 {
132  EdbMosaicPath mp(eN);
133  float length = mp.InitLineX(eHarr, y0, 100. );
134  mp.eR0 = eR0;
135  EdbAffine2D aff;
136  CheckScale(mp,aff);
137  return (length-aff.B1())/length;
138 }
Float_t B1() const
Definition: EdbAffine.h:47
void CheckScale(EdbMosaicPath &mp, EdbAffine2D &aff)
Definition: EdbFragmentAlignment.cxx:152

◆ CheckScaleY()

float EdbFragmentAlignment::CheckScaleY ( float  x0)
142 {
143  EdbMosaicPath mp(eN);
144  float length = mp.InitLineY(eHarr, x0, 100. );
145  mp.eR0 = eR0;
146  EdbAffine2D aff;
147  CheckScale(mp,aff);
148  return (length-aff.B2())/length;
149 }
Float_t B2() const
Definition: EdbAffine.h:48

◆ FillVC()

void EdbFragmentAlignment::FillVC ( )
34 {
35  eVC0 = new EdbPattern(0,0,0,eN);
36  eVC = new EdbPattern(0,0,0,eN);
37  for( int i=0; i<eN; i++ ) {
38  EdbViewHeader *h = GetHeader(i);
39  EdbSegP *s0 = eVC0->AddSegment(i, h->GetXview(), h->GetYview(), 0, 0, 0,0 );
40  EdbSegP *s = eVC->AddSegment( i, h->GetXview(), h->GetYview(), 0, 0, 0,0 );
41 // int side=0;
42 // if( h->GetNframesTop()==0) side=2; // 2- bottom
43 // else if(h->GetNframesBot()==0) side=1; // 1- top
44 // s0->SetAid( h->GetAreaID(),h->GetViewID(), side);
45 // s->SetAid( h->GetAreaID(),h->GetViewID(), side);
46  s0->SetAid( h->GetAreaID(),h->GetViewID(), eSide);
47  s->SetAid( h->GetAreaID(),h->GetViewID(), eSide);
48  }
49 }
EdbViewHeader * GetHeader(int i) const
Definition: EdbFragmentAlignment.h:68
int eSide
Definition: EdbFragmentAlignment.h:45
void SetAid(int a, int v, int side=0)
Definition: EdbSegP.h:135
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71
Int_t GetAreaID() const
Definition: EdbView.h:91
Int_t GetViewID() const
Definition: EdbView.h:90

◆ FillVDT()

void EdbFragmentAlignment::FillVDT ( EdbCouplesTree vdt)
121 {
122  int n = eVC0->N();
123  for(int i=0; i<n; i++)
124  {
125  vdt.Fill( eVC0->GetSegment(i), eVC->GetSegment(i), 0,0, 0,0, eID, eSide );
126  }
127 }
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
int eID
centers after alignment
Definition: EdbFragmentAlignment.h:44

◆ GetHeader()

EdbViewHeader* EdbFragmentAlignment::GetHeader ( int  i) const
inline
68 { return (EdbViewHeader *)(eHarr.At(i)); }

◆ GetParr()

TObjArray& EdbFragmentAlignment::GetParr ( )
inline
67 { return eParr; }

◆ GetPattern()

EdbPattern* EdbFragmentAlignment::GetPattern ( int  i) const
inline
69 { return (EdbPattern *)(eParr.At(i)); }

◆ N()

int EdbFragmentAlignment::N ( ) const
inline
65 {return eN;}

◆ RealignAndShift()

void EdbFragmentAlignment::RealignAndShift ( EdbMosaicPath mp)
222 {
223  //assume that most of views were already aligned
224  Log(1,"EdbFragmentAlignment::RealignAndShift","");
225  for(int i=0; i<eN; i++)
226  {
227  if(mp.OK(i)) continue;
228  EdbPattern *p = GetPattern(i);
229  if(p->N()<eMinPeak)
230  {
231  Log(1,"EdbFragmentAlignment::RealignAndShift","Skip view with %d segments",p->N());
232  continue;
233  }
234  TArrayI narr(20);
235  int nb = mp.GetAlignedNeighbours( i, narr );
236  if(nb>20)
237  {
238  Log(1,"EdbFragmentAlignment::AlignAndShift","Warning! too many neigbours: %d in dr = %f reset to 20",nb, mp.eR0);
239  nb=20;
240  }
241  EdbPattern alp;
242  for(int ii=0; ii<nb; ii++) {
243  alp.AddPattern( *GetPattern(narr[ii]) );
244  }
245  printf("align %d -> %d at dist %.1f \n",p->N(), alp.N(), mp.Dist(i) );
246  EdbAffine2D aff;
247  int peak = ViewSideAl(*p, alp, aff, 1);
248  EdbSegP *s = eVC->GetSegment( i );
249  s->SetW(peak);
250  if( peak > eMinPeak )
251  {
252  mp.SetOK( i );
253  s->Transform(&aff);
254  }
255  }
256 }
int OK(const int i) const
Definition: EdbMosaicPath.h:46

◆ SetAlPar()

void EdbFragmentAlignment::SetAlPar ( const AlPar ap,
EdbPlateAlignment al 
)
9 {
10  av.eNoScaleRot = ap.NoScaleRot; // calculate shift only
11  av.eOffsetMax = ap.OffsetMax;
12  av.eDZ = ap.DZ;
13  av.eDPHI = ap.DPHI;
14  av.eDoFine = ap.DoFine;
15  av.eSaveCouples = ap.DoSaveCouples;
16  av.SetSigma( ap.SigmaR, ap.SigmaT );
17  for(int i=0; i<4; i++) av.eDoublets[i] = ap.Doublets[i];
18 }
float Doublets[4]
Definition: EdbFragmentAlignment.h:29
float DZ
Definition: EdbFragmentAlignment.h:27
float OffsetMax
Definition: EdbFragmentAlignment.h:26
float DPHI
Definition: EdbFragmentAlignment.h:28
int NoScaleRot
Definition: EdbFragmentAlignment.h:23
int DoSaveCouples
Definition: EdbFragmentAlignment.h:31
float SigmaR
Definition: EdbFragmentAlignment.h:24
int DoFine
Definition: EdbFragmentAlignment.h:30
float SigmaT
Definition: EdbFragmentAlignment.h:25

◆ SetHarr()

void EdbFragmentAlignment::SetHarr ( TObjArray &  ha)
22 {
23  eN = ha.GetEntries();
24  eHarr.Expand(eN);
25  for( int i=0; i<eN; i++ ) eHarr.AddAt( ha.At(i),i );
26  eParr.Expand(eN);
27  printf("*** eN=%d\n",eN);
28  FillVC();
29  printf("*** eN=%d\n",eN);
30 }
void FillVC()
Definition: EdbFragmentAlignment.cxx:33

◆ SetID()

void EdbFragmentAlignment::SetID ( int  id)
inline
59 {eID=id;}
UInt_t id
Definition: tlg2pattern.C:118

◆ SetMinPeak()

void EdbFragmentAlignment::SetMinPeak ( int  mp)
inline
62 {eMinPeak=mp;}

◆ SetPatternsOwner()

void EdbFragmentAlignment::SetPatternsOwner ( )
inline
74 { eParr.SetOwner(); }

◆ SetSide()

void EdbFragmentAlignment::SetSide ( int  s)
inline
60 {eSide=s;}

◆ Side()

int EdbFragmentAlignment::Side ( ) const
inline
66 {return eSide;}

◆ ViewSideAl()

int EdbFragmentAlignment::ViewSideAl ( EdbPattern p1,
EdbPattern p2,
EdbAffine2D aff,
bool  do_shift 
)
260 {
261  // transform aff instead of pattern
263  SetAlPar( eAP, av );
264  av.eSaveCouples=0;
265  if(eDoSaveAlignments) av.InitOutputFile( Form( "p%.3d/%d_%d.al.vsa.root", p1.ScanID().ePlate, p1.ID(), p2.ID() ) );
266  av.Align( p1, p2, 0);
267  EdbAffine2D *affXY = av.eCorrL[0].GetAffineXY();
268  EdbAffine2D *affTXTY = av.eCorrL[0].GetAffineTXTY();
269  if(av.eNcoins > eMinPeak )
270  {
271  if(do_shift) p1.Transform( affXY );
272  aff.Transform( affXY );
273  }
275  return av.eNcoins;
276 }
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
EdbLayer eCorrL[2]
Definition: EdbAlignmentV.h:25
void InitOutputFile(const char *file="report_al.root", const char *option="RECREATE")
Definition: EdbAlignmentV.cxx:55
void CloseOutputFile()
Definition: EdbAlignmentV.cxx:64
bool eDoSaveAlignments
Definition: EdbFragmentAlignment.h:53
void SetAlPar(const AlPar &ap, EdbPlateAlignment &al)
Definition: EdbFragmentAlignment.cxx:8
AlPar eAP
Definition: EdbFragmentAlignment.h:51
Int_t ePlate
Definition: EdbID.h:11
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
EdbID ScanID() const
Definition: EdbPattern.h:339
int ID() const
Definition: EdbPattern.h:328
Definition: EdbPlateAlignment.h:8
Bool_t eSaveCouples
Definition: EdbPlateAlignment.h:24
Int_t eNcoins
Definition: EdbPlateAlignment.h:26
void Align(EdbPattern &p1, EdbPattern &p2, float dz, int flag=0)
Definition: EdbPlateAlignment.cxx:62

Member Data Documentation

◆ eAff

EdbAffine2D EdbFragmentAlignment::eAff
private

◆ eAP

AlPar EdbFragmentAlignment::eAP

◆ eDoSaveAlignments

bool EdbFragmentAlignment::eDoSaveAlignments

◆ eHarr

TObjArray EdbFragmentAlignment::eHarr
private

◆ eID

int EdbFragmentAlignment::eID
private

centers after alignment

◆ eMinPeak

int EdbFragmentAlignment::eMinPeak
private

◆ eN

int EdbFragmentAlignment::eN
private

◆ eParr

TObjArray EdbFragmentAlignment::eParr
private

◆ eR0

float EdbFragmentAlignment::eR0

◆ eSide

int EdbFragmentAlignment::eSide
private

◆ eVC

EdbPattern* EdbFragmentAlignment::eVC
private

original centers

◆ eVC0

EdbPattern* EdbFragmentAlignment::eVC0
private

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