FEDRA emulsion software from the OPERA Collaboration
EdbUnbender Class Reference

#include <EdbUnbender.h>

Inheritance diagram for EdbUnbender:
Collaboration diagram for EdbUnbender:

Public Member Functions

void CalcMeanPath (int cycle)
 
void CalculateCorrections (const TObjArray &acorr, int length, EdbPattern &p, EdbPlateP &plate, int flag)
 
void CheckResolutions (TObjArray &a1, TObjArray &a2, int plate, int flag)
 
 EdbUnbender ()
 
void GlobalCorr3 (int offset, int step, int cycle)
 
void GlobalCorrN (int length, int position, int offset, int step, int flag)
 
void Set0 ()
 
void Unbend3a (EdbPVRec &pvr, EdbScanSet &ss, TEnv &env)
 
void Unbend3g (EdbPVRec &pvr, EdbScanSet &ss, TEnv &env)
 
void Unbend5g (EdbPVRec &pvr, EdbScanSet &ss, TEnv &env)
 
virtual ~EdbUnbender ()
 

Public Attributes

bool do_save_hist
 
bool do_save_tree
 

Private Attributes

EdbCouplesTree eCPT
 
TEnv * eEnv
 
EdbScanSeteSS
 
EdbPVReceV
 

Constructor & Destructor Documentation

◆ EdbUnbender()

EdbUnbender::EdbUnbender ( )
inline
27 { Set0(); }
void Set0()
Definition: EdbUnbender.cxx:23

◆ ~EdbUnbender()

virtual EdbUnbender::~EdbUnbender ( )
inlinevirtual
28 {}

Member Function Documentation

◆ CalcMeanPath()

void EdbUnbender::CalcMeanPath ( int  cycle)
83 {
84  EdbPVRec &ali = *eV;
85  EdbScanSet &ss = *eSS;
86 
87  int npat = ali.Npatterns();
88 
89  double x0[npat],y0[npat], z0[npat], tx0[npat], ty0[npat], w0[npat];
90  for( int ipat=0; ipat<npat; ipat++ )
91  {
92  EdbPattern *p = ali.GetPattern(ipat);
93  if(p)
94  {
95  z0[ipat] = p->Z();
96  x0[ipat]=y0[ipat]=tx0[ipat]=ty0[ipat]=w0[ipat]=0;
97  }
98  }
99 
100  EdbSegP s0;
101  int ntr = ali.Ntracks();
102  for( int i=0; i<ntr; i++ )
103  {
104  EdbTrackP *t = ali.GetTrack(i);
105  for( int ipat=0; ipat<npat; ipat++ )
106  {
107  EdbPattern *p = ali.GetPattern(ipat);
108  if(p)
109  {
110  t->EstimatePositionAt( z0[ipat], s0 );
111  x0[ipat] += s0.X();
112  y0[ipat] += s0.Y();
113  tx0[ipat] += s0.TX();
114  ty0[ipat] += s0.TY();
115  w0[ipat] += 1;
116  }
117  }
118  }
119 
120  TH3F hmp("hmp","mean path", 100, -50, 50, 100, -50,50, npat, 0, z0[npat-1] );
121  TPolyMarker3D mp(npat);
122  EdbAffine2D aff;
123  for( int ipat=0; ipat<npat; ipat++ )
124  {
125  EdbPattern *p = ali.GetPattern(ipat);
126  if(p)
127  {
128  aff.Reset();
129  x0[ipat] /= w0[ipat];
130  y0[ipat] /= w0[ipat];
131  tx0[ipat] /= w0[ipat];
132  ty0[ipat] /= w0[ipat];
133  mp.SetPoint(ipat, x0[ipat] - x0[0],y0[ipat]-y0[0],z0[ipat]-z0[0] );
134  hmp.Fill(x0[ipat] - x0[0],y0[ipat]-y0[0],z0[ipat]-z0[0]);
135  aff.ShiftX( -(x0[ipat]-x0[0]) );
136  aff.ShiftY( -(y0[ipat]-y0[0]) );
137  p->Transform(&aff);
138  EdbPlateP *plate = ss.GetPlate( p->ScanID().ePlate );
139  plate->GetAffineXY()->Transform(&aff);
140  }
141  }
142  if(do_save_hist)
143  {
144  TFile f(Form("pm_%d.root",cycle),"RECREATE");
145  mp.Write("pm");
146  hmp.Write("hmp");
147  f.Close();
148  }
149 }
brick z0
Definition: RecDispMC.C:106
FILE * f
Definition: RecDispMC.C:150
Int_t npat
Definition: Xi2HatStartScript.C:33
EdbPVRec * ali
Definition: align.C:1
TTree * t
Definition: check_shower.C:4
Definition: EdbAffine.h:17
void ShiftX(float d)
Definition: EdbAffine.h:64
void ShiftY(float d)
Definition: EdbAffine.h:65
void Reset()
Definition: EdbAffine.cxx:72
Definition: EdbPVRec.h:148
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Int_t Ntracks() const
Definition: EdbPVRec.h:203
Definition: EdbPattern.h:280
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Definition: EdbBrick.h:13
Definition: EdbScanSet.h:11
Definition: EdbSegP.h:18
Float_t TX() const
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
Float_t TY() const
Definition: EdbSegP.h:173
Definition: EdbPattern.h:118
bool do_save_hist
Definition: EdbUnbender.h:23
EdbPVRec * eV
Definition: EdbUnbender.h:17
EdbScanSet * eSS
Definition: EdbUnbender.h:18
ss
Definition: energy.C:62
Int_t plate
Definition: merge_Energy_SytematicSources_Electron.C:1
p
Definition: testBGReduction_AllMethods.C:8

◆ CalculateCorrections()

void EdbUnbender::CalculateCorrections ( const TObjArray &  acorr,
int  length,
EdbPattern p,
EdbPlateP plate,
int  flag 
)
218 {
219  EdbAlignmentV al; al.eS[1].SetOwner();
220  EdbTrackFitter ft;
221  int ntr = acorr.GetEntries();
222  Log(2,"EdbUnbender::CalculateCorrections","ntr length: %d %d pid: %d plate: %d/%d",
223  ntr, length, p.PID(), p.ScanID().ePlate, plate.ID() );
224  for(int i=0; i<ntr; i++)
225  {
226  EdbTrackP *t = (EdbTrackP*)(acorr.At(i));
227  if(t->N()!=length) continue;
228 
229  EdbSegP *s1=0;
230  EdbTrackP *trest = new EdbTrackP();
231  for(int j=0; j<length; j++)
232  {
233  EdbSegP *s=t->GetSegment(j);
234  if(s->ScanID().ePlate==p.ScanID().ePlate) s1=s;
235  else trest->AddSegment(s);
236  }
237  if(s1)
238  {
239  ft.Fit3Pos(*trest);
240  trest->PropagateTo(s1->Z());
241  al.eS[0].Add(s1);
242  al.eS[1].Add( new EdbSegP(*trest) );
243  }
244  }
245 
246  CheckResolutions(al.eS[0], al.eS[1], p.ScanID().ePlate, flag);
247 
248  EdbAffine2D affXYcum;
249  EdbAffine2D affTXTYcum;
250 
251  for(int iter=0; iter<3; iter++)
252  {
253  EdbAffine2D affXY;
254  al.CalculateAffXY( al.eS[0], al.eS[1], affXY);
255  p.Transform(&affXY);
256  affXYcum.Transform(&affXY);
257 
258  EdbAffine2D affTXTY;
259  al.CalculateAffTXTYTurn( al.eS[0], al.eS[1], affTXTY);
260  p.TransformA(&affTXTY);
261  affTXTYcum.Transform(&affTXTY);
262  Log(2,"EdbUnbender::CalculateCorrections","%d \n coord: %s\n angle: %s",iter,affXY.AsString(),affTXTY.AsString());
263  }
264 
265  plate.GetAffineTXTY()->Transform(&affTXTYcum);
266  plate.GetAffineXY()->Transform(&affXYcum);
267 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
const char * AsString() const
Definition: EdbAffine.cxx:57
void Transform(const EdbAffine2D *a)
Definition: EdbAffine.cxx:93
Definition: EdbAlignmentV.h:13
Int_t CalculateAffXY(EdbAffine2D &aff)
Definition: EdbAlignmentV.h:97
Int_t CalculateAffTXTYTurn(TObjArray &arr1, TObjArray &arr2, EdbAffine2D &aff)
Definition: EdbAlignmentV.cxx:1074
TObjArray eS[2]
Definition: EdbAlignmentV.h:21
Int_t ePlate
Definition: EdbID.h:11
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
Float_t Z() const
Definition: EdbSegP.h:150
EdbID ScanID() const
Definition: EdbSegP.h:157
Definition: EdbTrackFitter.h:16
int Fit3Pos(EdbTrackP &tr)
Definition: EdbTrackFitter.cxx:588
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:219
void CheckResolutions(TObjArray &a1, TObjArray &a2, int plate, int flag)
Definition: EdbUnbender.cxx:270
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CheckResolutions()

void EdbUnbender::CheckResolutions ( TObjArray &  a1,
TObjArray &  a2,
int  plate,
int  flag 
)
271 {
272  //TH2F hxy( Form("hxy_%d",plate), "hxy", 100, -2.5,2.5, 100, -2.5,2.5 );
273  //TH2F htxty( Form("htxty_%d",plate), "htxty", 200, -.01,0.01, 200, -0.01,0.01 );
274  int n=a1.GetEntries();
275  for(int i=0; i<n; i++)
276  {
277  EdbSegP *s1 = (EdbSegP*)(a1.At(i));
278  EdbSegP *s2 = (EdbSegP*)(a2.At(i));
279  //hxy.Fill(s2->X()-s1->X(),s2->Y()-s1->Y());
280  //htxty.Fill(s2->TX()-s1->TX(),s2->TY()-s1->TY());
281  if(do_save_tree) eCPT.Fill( s1, s2, 0,0, 0,0, 0, flag );
282 
283  }
284  //hxy.Write();
285  //htxty.Write();
286  if(do_save_tree) eCPT.SaveTree();
287 }
void SaveTree()
Definition: EdbCouplesTree.cxx:60
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
EdbCouplesTree eCPT
Definition: EdbUnbender.h:21
bool do_save_tree
Definition: EdbUnbender.h:24
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ GlobalCorr3()

void EdbUnbender::GlobalCorr3 ( int  offset,
int  step,
int  cycle 
)
291 {
292  EdbPVRec &ali = *eV;
293  EdbScanSet &ss = *eSS;
294 
295  bool doAng = true;
296 
297  int ntr = ali.Ntracks();
298  int npat = ali.Npatterns();
299  Log(2,"EdbUnbender::GlobalCorr3","%d_%d_%d with %d tracks and %d patterns",offset,step,cycle, ntr, npat);
300  if(npat<3) return;
301 
302  TH3F hdxyp("hdxyp","triplet position residuals", 150,-15,15, 150,-15,15, 57,0.5,57.5 );
303  TH3F hdtxtyp("hdtxtyp","triplet angular residuals", 150,-0.015,0.015, 150,-0.015,0.015, 57,0.5,57.5 );
304  TH2F h2theta13("h2theta13","theta plates 1 3", 57,0.5,57.5, 100, 0., 1.);
305  TH2F h2theta2("h2theta2","theta plate 2", 57,0.5,57.5, 100, 0., 1.);
306 
307  for( int ipat=offset; ipat<npat; ipat+=step )
308  {
309  int id1=ipat;
310  int id2=ipat+1;
311  int id3=ipat+2;
312  if(id3>=npat-1) break;
313 
314  EdbPattern *p1 = ali.GetPattern(id1); p1->SetPID(id1);
315  EdbPattern *p2 = ali.GetPattern(id2); p2->SetPID(id2);
316  EdbPattern *p3 = ali.GetPattern(id3); p3->SetPID(id3);
317 
318  float lm[4] = {
319  Max(Max( p1->Xmin(), p2->Xmin()), p3->Xmin()),
320  Min(Min( p1->Xmax(), p2->Xmax()), p3->Xmax() ),
321  Max(Max( p1->Ymin(), p2->Ymin()), p3->Ymin() ),
322  Min(Min( p1->Ymax(), p2->Ymax()), p3->Ymax() )
323  };
324 
325  TObjArray p1corr;
326  TObjArray p2corr;
327  TObjArray p3corr;
328  int ncp=0;
329  for(int itr=0; itr<ntr; itr++) {
330  EdbTrackP *t = ali.GetTrack(itr);
331  EdbSegP *s1=0, *s2=0, *s3=0;
332  for(int j=0; j<t->N(); j++) {
333  EdbSegP *s = t->GetSegment(j);
334  if(s->PID()==p1->PID()) s1=s;
335  if(s->PID()==p2->PID()) s2=s;
336  if(s->PID()==p3->PID()) s3=s;
337  }
338  if(s1&&s2&&s3) { p1corr.Add(s1); p2corr.Add(s2); p3corr.Add(s3); ncp++; }
339  //FillEfficiency( p2->ScanID().ePlate, s1,s2,s3, lm, h2theta13, h2theta2 );
340  }
341 
342  TObjArray p13corr;
343  p13corr.SetOwner();
344  for(int i=0; i<ncp; i++)
345  {
346  EdbSegP *s1 = ((EdbSegP *)(p1corr.At(i)));
347  EdbSegP *s2 = ((EdbSegP *)(p2corr.At(i)));
348  EdbSegP *s3 = ((EdbSegP *)(p3corr.At(i)));
349  EdbSegP *s = new EdbSegP( *s2 );
350  float r = (s2->Z()-s1->Z())/(s3->Z()-s1->Z());
351  s->SetX( s1->X() + (s3->X()-s1->X())*r );
352  s->SetY( s1->Y() + (s3->Y()-s1->Y())*r );
353  s->SetTX( (s3->X()-s1->X())/(s3->Z()-s1->Z()) );
354  s->SetTY( (s3->Y()-s1->Y())/(s3->Z()-s1->Z()) );
355  p13corr.Add(s);
356  }
357 
358  printf("ipat: %d plate: %d pid: %d z: %.1f N3 = %d\n", ipat, p2->ScanID().ePlate, p2->PID(), p2->Z(), ncp );
359  for(int i=0; i<ncp; i++)
360  {
361  EdbSegP *s2 = ((EdbSegP*)(p2corr.At(i)));
362  EdbSegP *s13 = ((EdbSegP*)(p13corr.At(i)));
363  hdxyp.Fill( s13->X()-s2->X(), s13->Y()-s2->Y(), (float)(s2->ScanID().ePlate) );
364  hdtxtyp.Fill( s13->TX()-s2->TX(), s13->TY()-s2->TY(), (float)(s2->ScanID().ePlate) );
365  }
366 
367  EdbAlignmentV al;
368  for(int i=0; i<ncp; i++)
369  {
370  al.eS[0].Add(p2corr.At(i));
371  al.eS[1].Add(p13corr.At(i));
372  }
373 
374  EdbAffine2D aff2XYcum;
375  EdbAffine2D aff2TXTYcum;
376  float dz02corr=0;
377  float z02set=(p3->Z()+p1->Z())/2.;
378 
379  for(int iter=0; iter<3; iter++) {
380  printf("***** iter %d\n",iter);
381 
382  EdbAffine2D aff1to2XY;
383  al.CalculateAffXY( al.eS[0], al.eS[1], aff1to2XY);
384  aff1to2XY.Print();
385  p2->Transform(&aff1to2XY);
386  aff2XYcum.Transform(&aff1to2XY);
387 
388  if(doAng) {
389  EdbAffine2D aff1to2TXTY;
390  al.CalculateAffTXTYTurn( al.eS[0], al.eS[1], aff1to2TXTY);
391  aff1to2TXTY.Print();
392  p2->TransformA(&aff1to2TXTY);
393  aff2TXTYcum.Transform(&aff1to2TXTY);
394  }
395  }
396 
397  EdbPlateP *plate2 = ss.GetPlate( p2->ScanID().ePlate );
398  if(doAng) plate2->GetAffineTXTY()->Transform(&aff2TXTYcum);
399  plate2->GetAffineXY()->Transform(&aff2XYcum);
400  }
401 
402  if(do_save_hist)
403  {
404  TFile fout(Form("glob3_%d_%d_%d.root",offset,step,cycle),"RECREATE");
405  hdxyp.Write();
406  hdtxtyp.Write();
407  h2theta13.Write();
408  h2theta2.Write();
409  fout.Close();
410  }
411 }
void Print(Option_t *opt="") const
Definition: EdbAffine.cxx:52
EdbAffine2D * GetAffineXY()
Definition: EdbLayer.h:120
EdbAffine2D * GetAffineTXTY()
Definition: EdbLayer.h:121
void SetPID(int pid)
Definition: EdbPattern.h:319
int PID() const
Definition: EdbPattern.h:329
EdbID ScanID() const
Definition: EdbPattern.h:339
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 void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154
virtual Float_t Ymax() const
Definition: EdbVirtual.cxx:215
void SetY(Float_t y)
Definition: EdbSegP.h:175
void SetTX(Float_t tx)
Definition: EdbSegP.h:176
void SetX(Float_t x)
Definition: EdbSegP.h:174
void SetTY(Float_t ty)
Definition: EdbSegP.h:177
Int_t PID() const
Definition: EdbSegP.h:145
Float_t Z() const
Definition: EdbPattern.h:87
void TransformA(const EdbAffine2D *affA)
Definition: EdbPattern.cxx:367
void r(int rid=2)
Definition: test.C:201

◆ GlobalCorrN()

void EdbUnbender::GlobalCorrN ( int  length,
int  position,
int  offset,
int  step,
int  flag 
)
153 {
154  EdbPVRec &ali = *eV;
155  EdbScanSet &ss = *eSS;
156  int ntr = ali.Ntracks();
157  int npat = ali.Npatterns();
158  Log(2,"EdbUnbender::GlobalCorrN","l_p_o_s_f: %d_%d_%d_%d_%d with %d tracks and %d patterns",length,position,offset,step,flag, ntr, npat);
159  if(npat<length) return;
160  if(ntr<3) return;
161 
162  int start,end,incr;
163  if(step>0) {
164  start=0;
165  end=npat-1;
166  incr=1;
167  }
168  else if(step<0) {
169  start=npat-1;
170  end=0;
171  incr=-1;
172  } else return;
173 
174  int cntg=start + incr*offset;
175  printf("start end incr: %d %d %d\n",start,end,incr);
176 
177  do {
178  EdbPattern *p[length];
179  int nfill=0;
180  int cnt=cntg;
181  for(int i=0; i<length; i++)
182  {
183  printf("i cnt nfill: %d %d %d\n", i,cnt,nfill );
184  p[i] = ali.GetPattern(cnt);
185  if(p[i]) {
186  p[i]->SetPID(cnt);
187  nfill++;
188  }
189  if(cnt==end) break;
190  cnt+=incr;
191  }
192  if(nfill<(length)) break;
193 
194  TObjArray acorr; acorr.SetOwner();
195  for(int itr=0; itr<ntr; itr++) {
196  EdbTrackP *t = ali.GetTrack(itr);
197  EdbTrackP *tcorr = new EdbTrackP();
198  for(int j=0; j<t->N(); j++) {
199  EdbSegP *s = t->GetSegment(j);
200  for(int i=0; i<length; i++)
201  {
202  if(p[i]) if(s->PID()==p[i]->PID()) tcorr->AddSegment(s);
203  }
204  }
205  acorr.Add(tcorr);
206  }
207 
208  EdbPlateP *plate = ss.GetPlate( p[position]->ScanID().ePlate );
209  CalculateCorrections(acorr, length, *(p[position]), *plate, flag );
210  if(cnt==end+incr) break;
211  else cntg+=step;
212  }
213  while(cntg!=end);
214 }
MFTYPE32 long position
Definition: Milproto.h:644
void CalculateCorrections(const TObjArray &acorr, int length, EdbPattern &p, EdbPlateP &plate, int flag)
Definition: EdbUnbender.cxx:217

◆ Set0()

void EdbUnbender::Set0 ( )
24 {
25  eV=0;
26  eSS=0;
27  eEnv=0;
28  do_save_hist=0;
29  do_save_tree=0;
30 }
TEnv * eEnv
Definition: EdbUnbender.h:19

◆ Unbend3a()

void EdbUnbender::Unbend3a ( EdbPVRec pvr,
EdbScanSet ss,
TEnv &  env 
)
34 {
35  eV=&pvr; eSS=&ss; eEnv=&env;
36 
37  for( int iter=0; iter<5; iter++ )
38  {
39  CalcMeanPath(iter);
40  for(int i=0; i<3; i++)
41  {
42  GlobalCorr3(0,2, 100*iter+i);
43  GlobalCorr3(1,2, 100*iter+i);
44  }
45  }
46 }
void GlobalCorr3(int offset, int step, int cycle)
Definition: EdbUnbender.cxx:290
void CalcMeanPath(int cycle)
Definition: EdbUnbender.cxx:82

◆ Unbend3g()

void EdbUnbender::Unbend3g ( EdbPVRec pvr,
EdbScanSet ss,
TEnv &  env 
)
50 {
51  eV=&pvr; eSS=&ss; eEnv=&env;
52  for( int iter=0; iter<1; iter++ )
53  {
54  CalcMeanPath(iter);
55  for(int i=0; i<1; i++)
56  {
57  GlobalCorrN( 3,1,0,2, 100*iter+i); // length, position, offset, step, iteration
58  GlobalCorrN( 3,1,1,2, 200*iter+i); // length, position, offset, step, iteration
59  }
60  }
61 }
void GlobalCorrN(int length, int position, int offset, int step, int flag)
Definition: EdbUnbender.cxx:152

◆ Unbend5g()

void EdbUnbender::Unbend5g ( EdbPVRec pvr,
EdbScanSet ss,
TEnv &  env 
)
65 {
66  eV=&pvr; eSS=&ss; eEnv=&env;
67  if(do_save_tree) eCPT.InitCouplesTree( "couples","unbend.root","RECREATE");
68 
69  int niter=1;
70  for( int iter=0; iter<1; iter++ )
71  {
72  //CalcMeanPath(iter);
73  for(int i=0; i<niter; i++) GlobalCorrN( 5,2,0, 1, 520100+i); // length, position, offset, step, iteration
74  //for(int i=0; i<niter; i++) GlobalCorrN( 5,1,0, 1, 510100+i); // length, position, offset, step, iteration
75  //for(int i=0; i<niter; i++) GlobalCorrN( 5,3,0, 1, 530100+i); // length, position, offset, step, iteration
76  //for(int i=0; i<niter; i++) GlobalCorrN( 5,0,0, 5, 500500+i); // length, position, offset, step, iteration
77  //for(int i=0; i<niter; i++) GlobalCorrN( 5,4,0,-5, -540500+i); // length, position, offset, step, iteration
78  //for(int i=0; i<2; i++) GlobalCorrN( 5,2,0, 1, 520110+i); // length, position, offset, step, iteration
79  }
80 }
bool InitCouplesTree(const char *name="couples", const char *fname=0, Option_t *mode="READ")
Definition: EdbCouplesTree.cxx:87

Member Data Documentation

◆ do_save_hist

bool EdbUnbender::do_save_hist

◆ do_save_tree

bool EdbUnbender::do_save_tree

◆ eCPT

EdbCouplesTree EdbUnbender::eCPT
private

◆ eEnv

TEnv* EdbUnbender::eEnv
private

◆ eSS

EdbScanSet* EdbUnbender::eSS
private

◆ eV

EdbPVRec* EdbUnbender::eV
private

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