FEDRA emulsion software from the OPERA Collaboration
EdbViewMatch Class Reference

#include <EdbViewMatch.h>

Inheritance diagram for EdbViewMatch:
Collaboration diagram for EdbViewMatch:

Public Member Functions

void AddCluster (EdbClMatch *c)
 
void CalculateCorr ()
 
void CalculateGrRef ()
 
void CalculateGrRefMean ()
 
void CutGrRef ()
 
void DrawCorrMap ()
 
TNtuple * DumpGr (const char *name)
 
 EdbViewMatch ()
 
void GenerateCorrectionMatrix (bool do_add)
 
void InitCorrMap ()
 
void InitGMap ()
 
void MakeDistortionMap (const char *fname, TEnv &env, const char *usefile=0, const char *addfile=0)
 
int MakeViewDirectionList (EdbRun &run, int dirx, int diry, TArrayI &entries)
 
void Print ()
 
void ReadMatrix2Map (const char *file, EdbCell2 &map)
 
void SetPar (TEnv &env)
 
void SetPixelSize (float xpix, float ypix)
 
virtual ~EdbViewMatch ()
 

Public Attributes

float eAreaMax
 
float eAreaMin
 
bool eDumpGr
 
TFile * eOutputFile
 
float eVolumeMax
 
float eVolumeMin
 

Private Attributes

TClonesArray eCl
 
float eCorrectionMatrixStepX
 
float eCorrectionMatrixStepY
 
EdbCell2 eCorrMap
 
EdbCell2 eCorrMap0
 
int eDirX
 
int eDirY
 
EdbCell2 eGMap
 
TClonesArray eGr
 
int eIC [2]
 
int eNCenterMin
 
int eNClMin
 
int eNXpix
 
int eNYpix
 
float eR2CenterMax
 
float eRmax
 
float eXpix
 
float eYpix
 

Constructor & Destructor Documentation

◆ EdbViewMatch()

EdbViewMatch::EdbViewMatch ( )

◆ ~EdbViewMatch()

virtual EdbViewMatch::~EdbViewMatch ( )
inlinevirtual
64 {}

Member Function Documentation

◆ AddCluster()

void EdbViewMatch::AddCluster ( EdbClMatch c)
134 {
135  float v[2]={ c->eX+c->eXv, c->eY+c->eYv };
136  int ir[2]={1,1};
137  TObjArray arr;
138  EdbSegment *s0 = 0;
139  int n = eGMap.SelectObjectsC( v, ir, arr);
140  if(n>100) printf("n=%d\n",n);
141  if(n) {
142  float r, rmin=2.*eRmax;
143  for(int i=0; i<n; i++) {
144  EdbSegment *s = (EdbSegment *)arr.At(i);
145  r = Sqrt( (s->GetX0()-v[0])*(s->GetX0()-v[0]) + (s->GetY0()-v[1])*(s->GetY0()-v[1]) );
146  if(r<eRmax) if(r<rmin) { rmin=r; s0 = s; }
147  }
148  }
149  if(s0) { s0->AddElement(c); s0->SetX0(v[0]); s0->SetY0(v[1]); s0->SetZ0(c->eZ); }
150  else {
151  int inds = eGr.GetEntriesFast();
152  EdbSegment *s = new(eGr[inds]) EdbSegment(v[0],v[1],c->eZ,0,0);
153  s->AddElement(c);
154  eGMap.AddObject(v, s);
155  }
156 
157 }
int SelectObjectsC(int iv[2], int ir[2], TObjArray &arr)
Definition: EdbCell2.cpp:766
bool AddObject(float v[2], TObject *obj)
Definition: EdbCell2.h:176
Float_t eX
Definition: EdbViewMatch.h:20
Float_t eXv
Definition: EdbViewMatch.h:21
Float_t eYv
Definition: EdbViewMatch.h:21
Float_t eZ
Definition: EdbViewMatch.h:20
Float_t eY
Definition: EdbViewMatch.h:20
virtual void SetX0(float x)
Definition: EdbSegment.h:44
virtual void SetZ0(float z)
Definition: EdbSegment.h:46
virtual void SetY0(float y)
Definition: EdbSegment.h:45
Definition: EdbSegment.h:61
void AddElement(TObject *element)
Definition: EdbSegment.cxx:149
TClonesArray eGr
Definition: EdbViewMatch.h:43
float eRmax
Definition: EdbViewMatch.h:40
EdbCell2 eGMap
Definition: EdbViewMatch.h:44
void r(int rid=2)
Definition: test.C:201
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CalculateCorr()

void EdbViewMatch::CalculateCorr ( )
268 {
269  int ngr = eGr.GetEntries();
270  Log(2,"EdbViewMatch::CalculateCorr","%d grains used",ngr);
271  for(int i=0; i<ngr; i++) {
272  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
273  int nc = s->GetNelements(); if(!nc) continue;
274  float x0 = s->GetX0(), y0= s->GetY0();
275  for( int ic=0; ic<nc; ic++ ) {
276  EdbClMatch *c = (EdbClMatch *)(s->GetElements()->UncheckedAt(ic));
277  float dx = c->eX+c->eXv - x0;
278  float dy = c->eY+c->eYv - y0;
279  TArrayD *dxy = (TArrayD*)(eCorrMap.GetObject(c->eX, c->eY, 0));
280  if(!dxy) { Log(1,"EdbViewMatch::CalculateCorr","WARNING: null dxy: ic=%d i=%d cx,cy: %f %f",ic,i, c->eX, c->eY); continue; }
281  (*dxy)[0] += dx;
282  (*dxy)[1] += dy;
283  eCorrMap.Fill(c->eX, c->eY);
284  }
285  }
286 
287  int nc=eCorrMap.Ncell();
288  Log(2,"EdbViewMatch::CalculateCorr","%d cells in the map",nc);
289  for( int i=0; i<nc; i++ ) {
290  TArrayD *dxy = (TArrayD*)( eCorrMap.GetObject(i, 0 ) ); if(!dxy) continue;
291  int w = eCorrMap.Bin(i); if(!w) continue;
292  (*dxy)[0] /= w;
293  (*dxy)[1] /= w;
294  }
295 
296 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
TObject * GetObject(float x, float y, int ientr) const
Definition: EdbCell2.h:199
Definition: EdbViewMatch.h:18
int Ncell() const
Definition: EdbCell2.h:49
int Fill(float x, float y)
Definition: EdbCell2.h:88
int Bin(float x, float y) const
Definition: EdbCell2.h:80
EdbCell2 eCorrMap
Definition: EdbViewMatch.h:45
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ CalculateGrRef()

void EdbViewMatch::CalculateGrRef ( )
161 {
162  // take as grain reference position of the most central cluster
163 
164  int ngr = eGr.GetEntries();
165  for(int i=0; i<ngr; i++) {
166  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
167  s->SetSide(0);
168  int nc = s->GetNelements();
169 // float rmin=10000., r;
170  for( int ic=0; ic<nc; ic++ ) {
171  EdbClMatch *c = (EdbClMatch *)(s->GetElements()->UncheckedAt(ic));
172  //r = Sqrt( c->eX*c->eX + c->eY*c->eY ); // distance to view center
173  //if(r<rmin) { rmin=r; s->SetX0(c->eXv+c->eX); s->SetY0(c->eYv+c->eY); s->SetDz(r); }
174  int ix = eCorrMap.IX(c->eX);
175  int iy = eCorrMap.IY(c->eY);
176  if(ix==eIC[0] && iy==eIC[1]) // select central bin as a reference
177  {
178  s->SetX0(c->eXv+c->eX); s->SetY0(c->eYv+c->eY); //s->SetDz(r);
179  s->SetSide( s->GetSide()+1 ); // use as a counter
180  c->eIsCenter=1;
181  } else c->eIsCenter=0;
182  }
183  }
184 }
Short_t eIsCenter
Definition: EdbViewMatch.h:24
int IX(float x) const
Definition: EdbCell2.h:52
int IY(float y) const
Definition: EdbCell2.h:53
void SetSide(int side=0)
Definition: EdbSegP.h:136
int eIC[2]
Definition: EdbViewMatch.h:47

◆ CalculateGrRefMean()

void EdbViewMatch::CalculateGrRefMean ( )
188 {
189  // take as grain reference position the mean of grains closer then eR2CenterMax to the view center
190 
191  int ngr = eGr.GetEntries();
192  for(int i=0; i<ngr; i++) {
193  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
194  s->SetSide(0);
195  int nc = s->GetNelements();
196  double x0=0, y0=0, r0=0;
197  int n0=0;
198  for( int ic=0; ic<nc; ic++ ) {
199  EdbClMatch *c = (EdbClMatch *)(s->GetElements()->UncheckedAt(ic));
200  float r = Sqrt( c->eX*c->eX + c->eY*c->eY ); // distance to the view center
201  if(r<=eR2CenterMax) { x0 += (c->eXv+c->eX); y0+=(c->eYv+c->eY); r0+=r; n0++; }
202  }
203  if( n0 >= eNCenterMin) // select as a reference
204  {
205  x0 /= n0;
206  y0 /= n0;
207  r0 /= n0;
208  s->SetX0( x0 ); s->SetY0( y0 ); s->SetDz(r0);
209  s->SetSide( n0 ); // use as a counter
210  }
211  }
212 }
int eNCenterMin
Definition: EdbViewMatch.h:39
float eR2CenterMax
Definition: EdbViewMatch.h:38

◆ CutGrRef()

void EdbViewMatch::CutGrRef ( )
216 {
217  // remove marginal grains from calculation
218  int ngr = eGr.GetEntries();
219  for(int i=0; i<ngr; i++) {
220  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
221  int nc = s->GetNelements();
222  if(nc<eNClMin) s->GetElements()->Clear();
223  if(s->GetSide()<1) s->GetElements()->Clear();
224  }
225 }
void Clear()
Definition: EdbSegP.h:85
int eNClMin
Definition: EdbViewMatch.h:37

◆ DrawCorrMap()

void EdbViewMatch::DrawCorrMap ( )
300 {
301  bool batch = gROOT->IsBatch();
302  if(eOutputFile) {
303  Log(2,"DrawCorrMap","Save to file %s", eOutputFile->GetName());
304  gROOT->SetBatch();
305  }
306 
307  TCanvas *cc = new TCanvas("cc","Corrections map",1200,900);
308 
309  gStyle->SetPalette(1);
310  gStyle->SetOptStat(0);
311  gPad->SetGridx(1);
312  gPad->SetGridy(1);
313 
314  float margin=10;
315  double minXborder = eCorrMap.Xmin() - margin;
316  double maxXborder = eCorrMap.Xmax() + margin;
317  double minYborder = eCorrMap.Ymin() - margin;
318  double maxYborder = eCorrMap.Ymax() + margin;
319 
320  TH2F *hh = new TH2F("hh","Corrections map",100,minXborder,maxXborder,100,minYborder,maxYborder);
321  hh->GetXaxis()->SetTitle("X (#mum)");
322  hh->GetYaxis()->SetTitle("Y (#mum)");
323  hh->Draw();
324 
325  TBox *plate = new TBox(eCorrMap.Xmin(),eCorrMap.Ymin(),eCorrMap.Xmax(),eCorrMap.Ymax());
326  plate->SetFillColor(16);
327  plate->SetFillStyle(3001);
328  plate->Draw();
329 
330  Double_t meanx=0, meany=0, meanr=0, wtot=0;
331  float scale = 15.;
332  int nc=eCorrMap.Ncell();
333  for( int i=0; i<nc; i++ ) {
334  int w = eCorrMap.Bin(i); if(!w) continue;
335  TArrayD *dxy = (TArrayD*)( eCorrMap.GetObject(i, 0 ) );
336  float x = eCorrMap.Xj(i);
337  float y = eCorrMap.Yj(i);
338  float dx = (*dxy)[0];
339  float dy = (*dxy)[1];
340 
341  TArrow *arrow = new TArrow(x,y,x+scale*dx,y+scale*dy,0.01);
342  arrow->SetLineWidth(1);
343  arrow->Draw();
344 
345  meanx += dx;
346  meany += dy;
347  meanr += sqrt(dx*dx+dy*dy);
348  wtot += w;
349  }
350 
351  meanx /= wtot;
352  meany /= wtot;
353  meanr /= wtot;
354  printf("\nmeanR = %g meanx = %g meany = %g wtot = %f\n", meanr, meanx, meany, wtot);
355 
356  eGMap.DrawH2("eGMap","entries/bin")->Write();
357  eCorrMap.DrawH2("eCorrMap","entries/bin")->Write();
358  cc->Write("corr_map");
359  gROOT->SetBatch(batch);
360 }
float Xmax() const
Definition: EdbCell2.h:65
float Xj(int j) const
Definition: EdbCell2.h:62
float Ymin() const
Definition: EdbCell2.h:66
float Yj(int j) const
Definition: EdbCell2.h:63
TH2F * DrawH2(const char *name="plot2d", const char *title="EdbH2plot2D")
Definition: EdbCell2.cpp:197
float Xmin() const
Definition: EdbCell2.h:64
float Ymax() const
Definition: EdbCell2.h:67
TFile * eOutputFile
Definition: EdbViewMatch.h:57
Int_t plate
Definition: merge_Energy_SytematicSources_Electron.C:1
new TCanvas()

◆ DumpGr()

TNtuple * EdbViewMatch::DumpGr ( const char *  name)
243 {
244  TNtuple *nt = new TNtuple( name,"grains dump","ig:n:xg:yg:nc:ic:xc:yc:xcv:ycv:dx:dy:w:ncenter:iscenter");
245  int ngr = eGr.GetEntries();
246  for(int ig=0; ig<ngr; ig++) {
247  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(ig));
248  int nc = s->GetNelements(); if(!nc) continue;
249  float dx=0, dy=0;
250  for( int ic=0; ic<nc; ic++ ) {
251  EdbClMatch *c = (EdbClMatch *)(s->GetElements()->UncheckedAt(ic));
252  int j = eCorrMap.Jcell(c->eX,c->eY);
253  int w = eCorrMap.Bin(j);
254  if(w) {
255  TArrayD *dxy = (TArrayD*)( eCorrMap.GetObject(j, 0 ) );
256  dx = (*dxy)[0];
257  dy = (*dxy)[1];
258  } else {dx=dy=0;}
259  nt->Fill( ig, s->GetNelements(), s->GetX0(), s->GetY0(), //s->GetDz(),
260  nc, ic, c->eX, c->eY, c->eXv, c->eYv, dx,dy,w, s->GetSide(), c->eIsCenter);
261  }
262  }
263  return nt;
264 }
int Jcell(int ix, int iy) const
Definition: EdbCell2.h:57
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24

◆ GenerateCorrectionMatrix()

void EdbViewMatch::GenerateCorrectionMatrix ( bool  do_add)
364 {
365  int nentries = eCorrMap.Ncell();
366  Double_t *vx = new Double_t[nentries];
367  Double_t *vy = new Double_t[nentries];
368  Double_t *vdx = new Double_t[nentries];
369  Double_t *vdy = new Double_t[nentries];
370 
371  for(int i=0; i<nentries; i++) {
372  int w = eCorrMap.Bin(i); if(!w) continue;
373  TArrayD *arr = (TArrayD*)eCorrMap.GetObject(i,0);
374  if(!arr) { Log(1,"EdbViewMatch::GenerateCorrectionMatrix","ERROR: missed bin"); break; }
375  vx[i] = eCorrMap.Xj(i);
376  vy[i] = eCorrMap.Yj(i);
377  vdx[i] = arr->At(0);
378  vdy[i] = arr->At(1);
379  }
380 
381  TGraph2D *gdx = new TGraph2D("graphDX","graphDX",nentries,vx,vy,vdx);
382  TGraph2D *gdy = new TGraph2D("graphDY","graphDY",nentries,vx,vy,vdy);
383 
384  TH2F hdx("hdx","CorrectionMatrix dX",eNXpix, -eXpix*eNXpix/2., eXpix*eNXpix/2., eNYpix, -eYpix*eNYpix/2., eYpix*eNYpix/2. );
385  TH2F hdy("hdy","CorrectionMatrix dY",eNXpix, -eXpix*eNXpix/2., eXpix*eNXpix/2., eNYpix, -eYpix*eNYpix/2., eYpix*eNYpix/2. );
386 
387  FILE *fmatr = fopen("correction_matrix.txt","w");
388  fprintf(fmatr,"%d %d %f %f\n", eNXpix, eNYpix, eXpix, eYpix);
389 
390  for(int i=0; i<eNXpix; i++) {
391  for(int j=0; j<eNYpix; j++) {
392  float x = (i - 0.5*(eNXpix-1))*eXpix;
393  float y = (j - 0.5*(eNYpix-1))*eYpix;
394  //float dx = gdx->Interpolate(x,y);
395  //float dy = gdy->Interpolate(x,y);
396  float dx = ((TArrayD *)eCorrMap.GetObject(x,y,0))->At(0);
397  float dy = ((TArrayD *)eCorrMap.GetObject(x,y,0))->At(1);
398 
399  if(addmap) {
400  TArrayD *dxy0 = (TArrayD *)eCorrMap0.GetObject(x,y,0);
401  dx += (*dxy0)[0];
402  dy += (*dxy0)[1];
403  }
404  fprintf(fmatr,"%5d %5d %12.6f %12.6f %11.6f %11.6f\n", i, j, x,y,dx,dy);
405 
406  hdx.Fill(x,y,dx);
407  hdy.Fill(x,y,dy);
408  }
409  }
410  fclose(fmatr);
411 
412  bool batch = gROOT->IsBatch();
413  if(eOutputFile) {
414  Log(2,"GenerateCorrectionMatrix","Save to file %s", eOutputFile->GetName());
415  gROOT->SetBatch();
416  }
417 
418  //TCanvas c("c","CorrectionMatrix", 700, 1200 );
419  //c.Divide(1,2);
420  //c.cd(1); hdx.Draw("colz");
421  //c.cd(2); hdy.Draw("colz");
422  //c.Write();
423  hdx.Write("hdx");
424  hdy.Write("hdy");
425  gdx->Write("gdx");
426  gdy->Write("gdy");
427  gROOT->SetBatch(batch);
428 
429 }
int nentries
Definition: check_shower.C:40
float eYpix
Definition: EdbViewMatch.h:49
float eXpix
Definition: EdbViewMatch.h:49
int eNXpix
Definition: EdbViewMatch.h:50
EdbCell2 eCorrMap0
Definition: EdbViewMatch.h:46
int eNYpix
Definition: EdbViewMatch.h:50
fclose(pFile)

◆ InitCorrMap()

void EdbViewMatch::InitCorrMap ( )
88 {
89  // matrix of the corrections in each entry is TArrayD with 2 entries:(dx,dy)
90  float mi[2] = { -eNXpix*Abs(eXpix)/2., -eNYpix*Abs(eYpix)/2. };
91  float ma[2] = { eNXpix*Abs(eXpix)/2., eNYpix*Abs(eYpix)/2. };
92  int n[2] = { int((ma[0]-mi[0])/eCorrectionMatrixStepX), int((ma[1]-mi[1])/eCorrectionMatrixStepY) };
93 
94  eCorrectionMatrixStepX = (ma[0]-mi[0])/n[0];
95  eCorrectionMatrixStepY = (ma[1]-mi[1])/n[1];
96  n[0] = int((ma[0]-mi[0]+1.)/eCorrectionMatrixStepX);
97  n[1] = int((ma[1]-mi[1]+1.)/eCorrectionMatrixStepY);
98 
99  eCorrMap.InitCell(20, n, mi, ma);
100  eIC[0] = n[0]/2;
101  eIC[1] = n[1]/2;
102  printf("The central bin is: %d %d\n",eIC[0],eIC[1]);
104 
105  int nc=eCorrMap.Ncell();
106  for( int i=0; i<nc; i++ ) {
107  TArrayD *a = new TArrayD(2);
108  eCorrMap.AddObject(i, (TObject*)a );
109  eCorrMap.SetBin(i,0);
110  }
111 
112  eCorrMap0.InitCell(20, n, mi, ma);
113  nc=eCorrMap0.Ncell();
114  for( int i=0; i<nc; i++ ) {
115  TArrayD *a = new TArrayD(2);
116  eCorrMap0.AddObject(i, (TObject*)a );
117  eCorrMap0.SetBin(i,0);
118  }
119 
120 }
void a()
Definition: check_aligned.C:59
int InitCell(EdbCell2 &c)
Definition: EdbCell2.h:170
void PrintStat()
Definition: EdbCell2.cpp:711
void SetBin(int ix, int iy, int n)
Definition: EdbCell2.h:91
float eCorrectionMatrixStepX
Definition: EdbViewMatch.h:53
float eCorrectionMatrixStepY
Definition: EdbViewMatch.h:54

◆ InitGMap()

void EdbViewMatch::InitGMap ( )
124 {
125  float bin=5;
126  float mi[2] = { -eNXpix*Abs(eXpix)/2-bin, -eNYpix*Abs(eYpix)/2-bin };
127  float ma[2] = { 1.5*eNXpix*Abs(eXpix)+bin, 1.5*eNYpix*Abs(eYpix)+bin };
128  int n[2] = { int((ma[0]-mi[0])/bin), int((ma[1]-mi[1])/bin) };
129  eGMap.InitCell(250, n, mi, ma);
130 }
float bin
Definition: emthickness.cpp:98

◆ MakeDistortionMap()

void EdbViewMatch::MakeDistortionMap ( const char *  fname,
TEnv &  env,
const char *  usefile = 0,
const char *  addfile = 0 
)
493 {
494  SetPar(cenv);
495  EdbRun run(fname);
496  TArrayI entries;
497  int nsel = MakeViewDirectionList( run, eDirX, eDirY, entries );
498  printf("nsel = %d\n", nsel);
499 
500  InitGMap();
501  InitCorrMap();
502  bool do_add=0;
503  if(usefile) {
504  ReadMatrix2Map(usefile, eCorrMap0);
505  do_add=1;
506  }
507 
508  int n = run.GetEntries();
509  EdbView *v = run.GetView();
510  run.GetEntry(0,1);
511  float dx0=0;
512  float dy0=0;
513  int count=0;
514  for(int i=0; i<nsel; i++) {
515  run.GetEntry( entries[i] , 1,1);
516  int ncl = v->Nclusters();
517  float xv = v->GetXview();
518  float yv = v->GetYview();
519  int view = v->GetViewID();
520  printf("%6d ", ncl);
521  for(int ic=0; ic<ncl; ic++) {
522  EdbCluster *c = v->GetCluster(ic);
523  if(c->GetArea()>eAreaMin&&c->GetArea()<eAreaMax) {
524  if(usefile)
525  {
526  TArrayD *dxy0 = (TArrayD *)eCorrMap0.GetObject(c->eX,c->eY,0);
527  if(dxy0){ dx0 = (*dxy0)[0]; dy0 = (*dxy0)[1]; }
528  else dx0=dy0=0;
529  }
530  EdbClMatch *cm = (EdbClMatch*)(eCl[count++]);
531  cm->eX=c->eX-dx0; cm->eY=c->eY-dy0; cm->eZ=c->eZ;
532  cm->eXv=xv; cm->eYv=yv;
533  cm->eView=view; cm->eFrame=c->GetFrame();
534  AddCluster(cm);
535  }
536  }
537  }
538  printf("\nread %d clusters from %s\n",count,fname);
539 
540 // CalculateGrRef();
542 
543  eOutputFile = new TFile("map.root","RECREATE");
544  //if(eDumpGr) { TNtuple *ntgr = DumpGr("gr"); ntgr->Write(); }
545  CutGrRef();
546  CalculateCorr();
547  DrawCorrMap();
548  GenerateCorrectionMatrix(do_add);
549  if(eDumpGr) { TNtuple *ntgr = DumpGr("grcut"); ntgr->Write(); }
550  eOutputFile->Close();
551  Print();
552 }
Int_t eFrame
Definition: EdbViewMatch.h:23
Int_t eView
Definition: EdbViewMatch.h:22
Definition: EdbCluster.h:19
Float_t eZ
Definition: EdbCluster.h:25
Int_t GetFrame() const
Definition: EdbCluster.h:56
Float_t eY
Definition: EdbCluster.h:24
Float_t eX
Definition: EdbCluster.h:23
Float_t GetArea() const
Definition: EdbCluster.h:54
Definition: EdbRun.h:74
int GetEntries() const
Definition: EdbRun.h:135
EdbView * GetEntry(int entry, int ih=1, int icl=0, int iseg=1, int itr=0, int ifr=0)
Definition: EdbRun.cxx:489
EdbView * GetView() const
Definition: EdbRun.h:109
void CalculateCorr()
Definition: EdbViewMatch.cxx:267
float eAreaMin
Definition: EdbViewMatch.h:59
void Print()
Definition: EdbViewMatch.cxx:432
void GenerateCorrectionMatrix(bool do_add)
Definition: EdbViewMatch.cxx:363
bool eDumpGr
Definition: EdbViewMatch.h:58
TClonesArray eCl
Definition: EdbViewMatch.h:42
float eAreaMax
Definition: EdbViewMatch.h:59
void CalculateGrRefMean()
Definition: EdbViewMatch.cxx:187
void ReadMatrix2Map(const char *file, EdbCell2 &map)
Definition: EdbViewMatch.cxx:555
TNtuple * DumpGr(const char *name)
Definition: EdbViewMatch.cxx:242
void SetPar(TEnv &env)
Definition: EdbViewMatch.cxx:53
void AddCluster(EdbClMatch *c)
Definition: EdbViewMatch.cxx:133
void DrawCorrMap()
Definition: EdbViewMatch.cxx:299
int MakeViewDirectionList(EdbRun &run, int dirx, int diry, TArrayI &entries)
Definition: EdbViewMatch.cxx:453
int eDirY
Definition: EdbViewMatch.h:51
void InitCorrMap()
Definition: EdbViewMatch.cxx:87
int eDirX
Definition: EdbViewMatch.h:51
void InitGMap()
Definition: EdbViewMatch.cxx:123
void CutGrRef()
Definition: EdbViewMatch.cxx:215
Definition: EdbView.h:134
Float_t GetXview() const
Definition: EdbView.h:193
Int_t GetViewID() const
Definition: EdbView.h:190
EdbCluster * GetCluster(int i) const
Definition: EdbView.h:218
Int_t Nclusters() const
Definition: EdbView.h:215
Float_t GetYview() const
Definition: EdbView.h:194
TEnv cenv("emrec")
EdbRun * run
Definition: check_raw.C:38
const char * fname
Definition: mc2raw.cxx:41

◆ MakeViewDirectionList()

int EdbViewMatch::MakeViewDirectionList ( EdbRun run,
int  dirx,
int  diry,
TArrayI &  entries 
)
454 {
455  // Select views in desired direction dirx, diry {-1,0,1}
456  // -1 negative, +1 positive, 0 any direction
457 
458  struct {int id; float x; float y; } sv1,sv2;
459 
460  float tolerance = 2; // tolerance in microns
461  EdbView *v=run.GetView();
462  int nentr = run.GetEntries();
463  entries.Set(nentr);
464  int count=0;
465  for(int ie=0; ie<nentr-1; ie++ ) {
466  run.GetEntry(ie , 1,0,0,0,0);
467  sv1.id = v->GetViewID();
468  sv1.x = v->GetXview();
469  sv1.y = v->GetYview();
470  run.GetEntry(ie+1 , 1,0,0,0,0);
471  sv2.id = v->GetViewID();
472  sv2.x = v->GetXview();
473  sv2.y = v->GetYview();
474 
475  float dx = sv2.x-sv1.x;
476  float dy = sv2.y-sv1.y;
477  if(dirx) {
478  if( abs(dx)<tolerance) continue;
479  else if( dirx*dx < 0 ) continue;
480  }
481  if(diry) {
482  if( abs(dy)<tolerance) continue;
483  else if( diry*dy < 0 ) continue;
484  }
485  //printf("%d %d %f %f\n", sv1.id, sv2.id, sv2.x-sv1.x, sv2.y-sv1.y);
486  entries[count++]=ie+1;
487  }
488  return count;
489 }
UInt_t id
Definition: tlg2pattern.C:118

◆ Print()

void EdbViewMatch::Print ( )
433 {
434  printf("\n-----------------------------------------------------------------------------------------------------\n");
435  int ncl = eCl.GetEntries();
436  int ngr = eGr.GetEntries();
437  int icgr=0, iccl=0;
438  for(int i=0; i<ngr; i++) {
439  int nc = ((EdbSegment*)eGr.At(i))->GetNelements();
440  if(nc>=eNClMin) { icgr++; iccl+=nc; }
441  }
442  printf("\n%d grains found\n",ngr);
443  printf("\n%d grains selected with ncl > %d and closer then %.2f to view center \n",icgr, eNClMin, eR2CenterMax );
444  printf("\n%d clusters used in selected grains, mean: %d clusters/grain \n",iccl, (int)(iccl/icgr) );
445  printf("Matrix definition: %d %d %f %f view size: %.2f %.2f\n", eNXpix, eNYpix, eXpix, eYpix, eNXpix*eXpix, eNYpix*eYpix );
446 
447  eGMap.PrintStat();
449  printf("-----------------------------------------------------------------------------------------------------\n");
450 }

◆ ReadMatrix2Map()

void EdbViewMatch::ReadMatrix2Map ( const char *  file,
EdbCell2 map 
)
556 {
557  Log(1,"ReadMatrix2Map","%s ",file);
558  FILE *f = fopen(file,"r");
559  if(!f) { Log(1,"ReadMatrix2Map","file %s not found!",file); return; }
560  char str[256];
561  fgets(str, 256, f);
562  int nxpix, nypix;
563  float xpix, ypix;
564  sscanf(str,"%d %d %f %f", &nxpix, &nypix, &xpix, &ypix);
565  if( nxpix!=eNXpix||nypix!=eNYpix||abs(xpix-eXpix)>0.000001||abs(ypix-eYpix)>0.000001 )
566  { Log(1,"ReadMatrix2Map","ERROR: matrix definition is different!",file);
567  printf("%d %d %f %f\n", nxpix, nypix, xpix, ypix);
568  return;
569  }
570 
571  int i0,j0;
572  float x0,y0,dx0,dy0;
573  for(int i=0; i<eNXpix; i++) {
574  for(int j=0; j<eNYpix; j++) {
575  if(fgets(str, 256, f)==NULL) Log(1,"GenerateCorrectionMatrix","ERROR: input file is not correct");
576  if( sscanf(str, "%d %d %f %f %f %f", &i0, &j0, &x0, &y0, &dx0, &dy0) == 6 )
577  {
578  TArrayD *dxy = (TArrayD *)eCorrMap0.GetObject(x0,y0,0);
579  (*dxy)[0]+=dx0;
580  (*dxy)[1]+=dy0;
581  eCorrMap0.Fill(x0, y0);
582  }
583  }
584  }
585  fclose(f);
586 
587  //eCorrMap0.PrintStat();
588 
589  int nc=eCorrMap0.Ncell();
590  for( int i=0; i<nc; i++ ) {
591  TArrayD *dxy = (TArrayD*)( eCorrMap0.GetObject(i, 0 ) ); if(!dxy) continue;
592  int w = eCorrMap0.Bin(i); if(!w) continue;
593  (*dxy)[0] /= w;
594  (*dxy)[1] /= w;
595  }
596 }
FILE * f
Definition: RecDispMC.C:150
#define NULL
Definition: nidaqmx.h:84
TFile * file
Definition: write_pvr.C:3

◆ SetPar()

void EdbViewMatch::SetPar ( TEnv &  env)
54 {
55  eNClMin = env.GetValue("viewdist.NClMin" , 20);
56  eR2CenterMax = env.GetValue("viewdist.R2CenterMax" , 15.);
57  eRmax = env.GetValue("viewdist.Rmax" , 1.);
58 
59  eXpix = env.GetValue("viewdist.Xpix" , 0.); // 0.30625);
60  eYpix = env.GetValue("viewdist.Ypix" , 0.); //0.30714);
61  eNXpix = env.GetValue("viewdist.NXpix", 0); //1280);
62  eNYpix = env.GetValue("viewdist.NYpix", 0); //1024);
63  eDirX = env.GetValue("viewdist.DirX", 0); // -1,0,1
64  eDirY = env.GetValue("viewdist.DirY", 0); // -1,0,1
65 
66  eCorrectionMatrixStepX = env.GetValue("viewdist.MatrixStepX", 10);
67  eCorrectionMatrixStepY = env.GetValue("viewdist.MatrixStepY", 10);
68 
69  eDumpGr = env.GetValue("viewdist.DumpGr", 0);
70 
71  sscanf( env.GetValue("viewdist.ClusterAreaLimits", "0 90000000"), "%f %f", &eAreaMin, &eAreaMax);
72  sscanf( env.GetValue("viewdist.ClusterVolumeLimits", "0 90000000"), "%f %f", &eVolumeMin, &eVolumeMax);
73 
74  printf("\n----------------------- Processing Parameters ---------------------------\n");
75  printf("eNClMin\t %d\n",eNClMin);
76  printf("eR2CenterMax\t %6.2f\n",eR2CenterMax);
77  printf("eRmax\t %f6.2\n",eRmax);
78  printf("Pixel: %9.7f x %9.7f \n", eXpix, eYpix );
79  printf("Matrix: %d x %d pixels, \t %15.7f x %15.7f microns", eNXpix, eNYpix, eXpix*eNXpix, eYpix*eNYpix);
80  printf("Clusters Area limits: %7.0f %7.0f \n", eAreaMin, eAreaMax );
81  printf("Clusters Volume limits: %7.0f %7.0f \n", eVolumeMin, eVolumeMax );
82  printf("-------------------------------------------------------------------------\n\n");
83 
84 }
float eVolumeMax
Definition: EdbViewMatch.h:60
float eVolumeMin
Definition: EdbViewMatch.h:60

◆ SetPixelSize()

void EdbViewMatch::SetPixelSize ( float  xpix,
float  ypix 
)
inline
77 { eXpix=xpix; eYpix=ypix; }

Member Data Documentation

◆ eAreaMax

float EdbViewMatch::eAreaMax

◆ eAreaMin

float EdbViewMatch::eAreaMin

◆ eCl

TClonesArray EdbViewMatch::eCl
private

◆ eCorrectionMatrixStepX

float EdbViewMatch::eCorrectionMatrixStepX
private

◆ eCorrectionMatrixStepY

float EdbViewMatch::eCorrectionMatrixStepY
private

◆ eCorrMap

EdbCell2 EdbViewMatch::eCorrMap
private

◆ eCorrMap0

EdbCell2 EdbViewMatch::eCorrMap0
private

◆ eDirX

int EdbViewMatch::eDirX
private

◆ eDirY

int EdbViewMatch::eDirY
private

◆ eDumpGr

bool EdbViewMatch::eDumpGr

◆ eGMap

EdbCell2 EdbViewMatch::eGMap
private

◆ eGr

TClonesArray EdbViewMatch::eGr
private

◆ eIC

int EdbViewMatch::eIC[2]
private

◆ eNCenterMin

int EdbViewMatch::eNCenterMin
private

◆ eNClMin

int EdbViewMatch::eNClMin
private

◆ eNXpix

int EdbViewMatch::eNXpix
private

◆ eNYpix

int EdbViewMatch::eNYpix
private

◆ eOutputFile

TFile* EdbViewMatch::eOutputFile

◆ eR2CenterMax

float EdbViewMatch::eR2CenterMax
private

◆ eRmax

float EdbViewMatch::eRmax
private

◆ eVolumeMax

float EdbViewMatch::eVolumeMax

◆ eVolumeMin

float EdbViewMatch::eVolumeMin

◆ eXpix

float EdbViewMatch::eXpix
private

◆ eYpix

float EdbViewMatch::eYpix
private

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