FEDRA emulsion software from the OPERA Collaboration
EdbDistortionCorr Class Reference

#include <EdbDistortion.h>

Inheritance diagram for EdbDistortionCorr:
Collaboration diagram for EdbDistortionCorr:

Public Member Functions

void AddCluster (EdbClDist *c)
 
void CalculateCorr ()
 
void CalculateGrRef ()
 
void CalculateGrRefMean ()
 
void CutGrRef ()
 
TNtuple * DumpGr (const char *name)
 
 EdbDistortionCorr ()
 
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 ReadClusters (const char *fname, TClonesArray &arr)
 
void SaveCorrMap ()
 
void SetPar (TEnv &env)
 
void SetPixelSize (float xpix, float ypix)
 
virtual ~EdbDistortionCorr ()
 

Public Attributes

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

Private Attributes

TClonesArray eCl
 
float eCorrectionMatrixStepX
 
float eCorrectionMatrixStepY
 
EdbDistortionMap eCorrMap
 
EdbDistortionMap eCorrMap0
 
EdbDistortionMap eCorrMapTot
 
int eDirX
 
int eDirY
 
EdbCell2 eGMap
 
TClonesArray eGr
 
int eNCenterMin
 
int eNClMin
 
int eNXpix
 
int eNYpix
 
float eR2CenterMax
 
float eRmax
 
float eXpix
 
float eYpix
 

Constructor & Destructor Documentation

◆ EdbDistortionCorr()

EdbDistortionCorr::EdbDistortionCorr ( )

◆ ~EdbDistortionCorr()

virtual EdbDistortionCorr::~EdbDistortionCorr ( )
inlinevirtual
108 {}

Member Function Documentation

◆ AddCluster()

void EdbDistortionCorr::AddCluster ( EdbClDist c)
107 {
108  float v[2]={ c->eX+c->eXv, c->eY+c->eYv };
109  int ir[2]={1,1};
110  TObjArray arr;
111  EdbSegment *s0 = 0;
112  int n = eGMap.SelectObjectsC( v, ir, arr);
113  if(n>100) printf("n=%d\n",n);
114  if(n) {
115  float r, rmin=2.*eRmax;
116  for(int i=0; i<n; i++) {
117  EdbSegment *s = (EdbSegment *)arr.At(i);
118  r = Sqrt( (s->GetX0()-v[0])*(s->GetX0()-v[0]) + (s->GetY0()-v[1])*(s->GetY0()-v[1]) );
119  if(r<eRmax) if(r<rmin) { rmin=r; s0 = s; }
120  }
121  }
122  if(s0) { s0->AddElement(c); s0->SetX0(v[0]); s0->SetY0(v[1]); s0->SetZ0(c->eZ); }
123  else {
124  int inds = eGr.GetEntriesFast();
125  EdbSegment *s = new(eGr[inds]) EdbSegment(v[0],v[1],c->eZ,0,0);
126  s->AddElement(c);
127  eGMap.AddObject(v, s);
128  }
129 
130 }
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 eXv
Definition: EdbDistortion.h:19
Float_t eZ
Definition: EdbDistortion.h:18
Float_t eYv
Definition: EdbDistortion.h:19
Float_t eY
Definition: EdbDistortion.h:18
Float_t eX
Definition: EdbDistortion.h:18
TClonesArray eGr
Definition: EdbDistortion.h:87
float eRmax
Definition: EdbDistortion.h:84
EdbCell2 eGMap
Definition: EdbDistortion.h:88
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
void r(int rid=2)
Definition: test.C:201
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CalculateCorr()

void EdbDistortionCorr::CalculateCorr ( )
199 {
200  int ngr = eGr.GetEntries();
201  Log(2,"EdbDistortionCorr::CalculateCorr","%d grains used",ngr);
202  for(int i=0; i<ngr; i++) {
203  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
204  int nc = s->GetNelements(); if(!nc) continue;
205  float x0 = s->GetX0(), y0= s->GetY0();
206  for( int ic=0; ic<nc; ic++ ) {
207  EdbClDist *c = (EdbClDist *)(s->GetElements()->UncheckedAt(ic));
208  float dx = c->eX+c->eXv - x0;
209  float dy = c->eY+c->eYv - y0;
210  eCorrMap.Fill(c->eX, c->eY, dx,dy);
211  }
212  }
213  eCorrMap.Norm();
214 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Definition: EdbDistortion.h:16
EdbDistortionMap eCorrMap
Definition: EdbDistortion.h:89
void Fill(float x, float y, float dx, float dy)
Definition: EdbDistortion.cxx:489
void Norm()
Definition: EdbDistortion.cxx:499

◆ CalculateGrRef()

void EdbDistortionCorr::CalculateGrRef ( )

◆ CalculateGrRefMean()

void EdbDistortionCorr::CalculateGrRefMean ( )
134 {
135  // take as grain reference position the mean of grains closer then eR2CenterMax to the view center
136 
137  int ngr = eGr.GetEntries();
138  for(int i=0; i<ngr; i++) {
139  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
140  s->SetSide(0);
141  int nc = s->GetNelements();
142  double x0=0, y0=0, r0=0;
143  int n0=0;
144  for( int ic=0; ic<nc; ic++ ) {
145  EdbClDist *c = (EdbClDist *)(s->GetElements()->UncheckedAt(ic));
146  float r = Sqrt( c->eX*c->eX + c->eY*c->eY ); // distance to the view center
147  if(r<=eR2CenterMax) { x0 += (c->eXv+c->eX); y0+=(c->eYv+c->eY); r0+=r; n0++; }
148  }
149  if( n0 >= eNCenterMin) // select as a reference
150  {
151  x0 /= n0;
152  y0 /= n0;
153  r0 /= n0;
154  s->SetX0( x0 ); s->SetY0( y0 ); s->SetDz(r0);
155  s->SetSide( n0 ); // use as a counter
156  }
157  }
158 }
float eR2CenterMax
Definition: EdbDistortion.h:82
int eNCenterMin
Definition: EdbDistortion.h:83
void SetSide(int side=0)
Definition: EdbSegP.h:136

◆ CutGrRef()

void EdbDistortionCorr::CutGrRef ( )
162 {
163  // remove marginal grains from calculation
164  int ngr = eGr.GetEntries();
165  for(int i=0; i<ngr; i++) {
166  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(i));
167  int nc = s->GetNelements();
168  if(nc<eNClMin) s->GetElements()->Clear();
169  if(s->GetSide()<1) s->GetElements()->Clear();
170  }
171 }
int eNClMin
Definition: EdbDistortion.h:81
void Clear()
Definition: EdbSegP.h:85

◆ DumpGr()

TNtuple * EdbDistortionCorr::DumpGr ( const char *  name)
175 {
176  TNtuple *nt = new TNtuple( name,"grains dump","ig:n:xg:yg:nc:ic:xc:yc:xcv:ycv:dx:dy:w:ncenter:iscenter");
177  int ngr = eGr.GetEntries();
178  for(int ig=0; ig<ngr; ig++) {
179  EdbSegment *s = ((EdbSegment*)eGr.UncheckedAt(ig));
180  int nc = s->GetNelements(); if(!nc) continue;
181  float dx=0, dy=0;
182  for( int ic=0; ic<nc; ic++ ) {
183  EdbClDist *c = (EdbClDist *)(s->GetElements()->UncheckedAt(ic));
184  int j = eCorrMap.Jcell(c->eX,c->eY);
185  int w = eCorrMap.Bin(j);
186  if(w) {
187  dx = eCorrMap.DX(j);
188  dy = eCorrMap.DY(j);
189  } else {dx=dy=0;}
190  nt->Fill( ig, s->GetNelements(), s->GetX0(), s->GetY0(), //s->GetDz(),
191  nc, ic, c->eX, c->eY, c->eXv, c->eYv, dx,dy,w, s->GetSide(), c->eIsCenter);
192  }
193  }
194  return nt;
195 }
Short_t eIsCenter
Definition: EdbDistortion.h:22
int Jcell(float x, float y) const
Definition: EdbDistortion.h:54
int Bin(int j) const
Definition: EdbDistortion.h:53
double DY(int j) const
Definition: EdbDistortion.cxx:540
double DX(int j) const
Definition: EdbDistortion.cxx:534
const char * name
Definition: merge_Energy_SytematicSources_Electron.C:24
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ GenerateCorrectionMatrix()

void EdbDistortionCorr::GenerateCorrectionMatrix ( bool  do_add)

◆ InitCorrMap()

void EdbDistortionCorr::InitCorrMap ( )
89 {
93 }
float eYpix
Definition: EdbDistortion.h:93
int eNYpix
Definition: EdbDistortion.h:94
float eCorrectionMatrixStepX
Definition: EdbDistortion.h:97
float eCorrectionMatrixStepY
Definition: EdbDistortion.h:98
int eNXpix
Definition: EdbDistortion.h:94
EdbDistortionMap eCorrMapTot
Definition: EdbDistortion.h:91
EdbDistortionMap eCorrMap0
Definition: EdbDistortion.h:90
float eXpix
Definition: EdbDistortion.h:93
void InitMap(int nxpix, int nypix, float xpix, float ypix, float stepX, float stepY)
Definition: EdbDistortion.cxx:636

◆ InitGMap()

void EdbDistortionCorr::InitGMap ( )
97 {
98  float bin=5;
99  float mi[2] = { -eNXpix*Abs(eXpix)/2-bin, -eNYpix*Abs(eYpix)/2-bin };
100  float ma[2] = { 1.5*eNXpix*Abs(eXpix)+bin, 1.5*eNYpix*Abs(eYpix)+bin };
101  int n[2] = { int((ma[0]-mi[0])/bin), int((ma[1]-mi[1])/bin) };
102  eGMap.InitCell(250, n, mi, ma);
103 }
int InitCell(EdbCell2 &c)
Definition: EdbCell2.h:170
float bin
Definition: emthickness.cpp:98

◆ MakeDistortionMap()

void EdbDistortionCorr::MakeDistortionMap ( const char *  fname,
TEnv &  env,
const char *  usefile = 0,
const char *  addfile = 0 
)
324 {
325  SetPar(cenv);
326 
327  InitGMap();
328  InitCorrMap();
329 
330  ReadClusters( fname, eCl );
331 
332  if(usefile) {
333  eCorrMap0.ReadMatrix2Map(usefile);
335  int ncl = eCl.GetEntries();
336  for(int i=0; i<ncl; i++) {
337  eCorrMap0.ApplyCorr( *((EdbClDist*)(eCl[i])) );
338  }
339  }
340 
342  CutGrRef();
343  CalculateCorr(); // calculate the differential map eCorrMap
345 
346  eOutputFile = new TFile("map.root","RECREATE");
347  SaveCorrMap();
348  if(eDumpGr) { TNtuple *ntgr = DumpGr("grcut"); ntgr->Write(); }
349  eOutputFile->Close();
350 
351  //Print();
352 }
bool eDumpGr
Definition: EdbDistortion.h:102
void CalculateCorr()
Definition: EdbDistortion.cxx:198
void CalculateGrRefMean()
Definition: EdbDistortion.cxx:133
void CutGrRef()
Definition: EdbDistortion.cxx:161
void SaveCorrMap()
Definition: EdbDistortion.cxx:217
TNtuple * DumpGr(const char *name)
Definition: EdbDistortion.cxx:174
void ReadClusters(const char *fname, TClonesArray &arr)
Definition: EdbDistortion.cxx:290
void InitGMap()
Definition: EdbDistortion.cxx:96
TClonesArray eCl
Definition: EdbDistortion.h:86
TFile * eOutputFile
Definition: EdbDistortion.h:101
void InitCorrMap()
Definition: EdbDistortion.cxx:88
void SetPar(TEnv &env)
Definition: EdbDistortion.cxx:54
void ReadMatrix2Map(const char *file)
Definition: EdbDistortion.cxx:447
void Add(const EdbDistortionMap &map, float k=1.)
Definition: EdbDistortion.cxx:614
void ApplyCorr(EdbClDist &c)
Definition: EdbDistortion.cxx:355
TEnv cenv("emrec")
const char * fname
Definition: mc2raw.cxx:41

◆ MakeViewDirectionList()

int EdbDistortionCorr::MakeViewDirectionList ( EdbRun run,
int  dirx,
int  diry,
TArrayI &  entries 
)
252 {
253  // Select views in desired direction dirx, diry {-1,0,1}
254  // -1 negative, +1 positive, 0 any direction
255 
256  struct {int id; float x; float y; } sv1,sv2;
257 
258  float tolerance = 2; // tolerance in microns
259  EdbView *v=run.GetView();
260  int nentr = run.GetEntries();
261  entries.Set(nentr);
262  int count=0;
263  for(int ie=0; ie<nentr-1; ie++ ) {
264  run.GetEntry(ie , 1,0,0,0,0);
265  sv1.id = v->GetViewID();
266  sv1.x = v->GetXview();
267  sv1.y = v->GetYview();
268  run.GetEntry(ie+1 , 1,0,0,0,0);
269  sv2.id = v->GetViewID();
270  sv2.x = v->GetXview();
271  sv2.y = v->GetYview();
272 
273  float dx = sv2.x-sv1.x;
274  float dy = sv2.y-sv1.y;
275  if(dirx) {
276  if( abs(dx)<tolerance) continue;
277  else if( dirx*dx < 0 ) continue;
278  }
279  if(diry) {
280  if( abs(dy)<tolerance) continue;
281  else if( diry*dy < 0 ) continue;
282  }
283  //printf("%d %d %f %f\n", sv1.id, sv2.id, sv2.x-sv1.x, sv2.y-sv1.y);
284  entries[count++]=ie+1;
285  }
286  return count;
287 }
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
Definition: EdbView.h:134
Float_t GetXview() const
Definition: EdbView.h:193
Int_t GetViewID() const
Definition: EdbView.h:190
Float_t GetYview() const
Definition: EdbView.h:194
EdbRun * run
Definition: check_raw.C:38
UInt_t id
Definition: tlg2pattern.C:118

◆ Print()

void EdbDistortionCorr::Print ( )
231 {
232  printf("\n-----------------------------------------------------------------------------------------------------\n");
233  int ncl = eCl.GetEntries();
234  int ngr = eGr.GetEntries();
235  int icgr=0, iccl=0;
236  for(int i=0; i<ngr; i++) {
237  int nc = ((EdbSegment*)eGr.At(i))->GetNelements();
238  if(nc>=eNClMin) { icgr++; iccl+=nc; }
239  }
240  printf("\n%d grains found\n",ngr);
241  printf("\n%d grains selected with ncl > %d and closer then %.2f to view center \n",icgr, eNClMin, eR2CenterMax );
242  printf("\n%d clusters used in selected grains, mean: %d clusters/grain \n",iccl, (int)(iccl/icgr) );
243  printf("Matrix definition: %d %d %f %f view size: %.2f %.2f\n", eNXpix, eNYpix, eXpix, eYpix, eNXpix*eXpix, eNYpix*eYpix );
244 
245  eGMap.PrintStat();
246  //eCorrMap.PrintStat();
247  printf("-----------------------------------------------------------------------------------------------------\n");
248 }
void PrintStat()
Definition: EdbCell2.cpp:711

◆ ReadClusters()

void EdbDistortionCorr::ReadClusters ( const char *  fname,
TClonesArray &  arr 
)
291 {
292  EdbRun run(fname);
293  TArrayI entries;
294  int nsel = MakeViewDirectionList( run, eDirX, eDirY, entries );
295  printf("nsel = %d\n", nsel);
296 
297  int n = run.GetEntries();
298  EdbView *v = run.GetView();
299  run.GetEntry(0,1);
300  int count=0;
301  for(int i=0; i<nsel; i++) {
302  run.GetEntry( entries[i] , 1,1);
303  int ncl = v->Nclusters();
304  float xv = v->GetXview();
305  float yv = v->GetYview();
306  int view = v->GetViewID();
307  printf("%6d ", ncl);
308  for(int ic=0; ic<ncl; ic++) {
309  EdbCluster *c = v->GetCluster(ic);
310  if(c->GetArea()>eAreaMin&&c->GetArea()<eAreaMax) {
311  EdbClDist *cm = (EdbClDist*)(arr[count++]);
312  cm->eX=c->eX; cm->eY=c->eY; cm->eZ=c->eZ;
313  cm->eXv=xv; cm->eYv=yv;
314  cm->eView=view; cm->eFrame=c->GetFrame();
315  AddCluster(cm);
316  }
317  }
318  }
319  printf("\nread %d clusters from %s\n",count,fname);
320 }
Int_t eFrame
Definition: EdbDistortion.h:21
Int_t eView
Definition: EdbDistortion.h:20
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
int eDirX
Definition: EdbDistortion.h:95
float eAreaMax
Definition: EdbDistortion.h:103
int MakeViewDirectionList(EdbRun &run, int dirx, int diry, TArrayI &entries)
Definition: EdbDistortion.cxx:251
int eDirY
Definition: EdbDistortion.h:95
void AddCluster(EdbClDist *c)
Definition: EdbDistortion.cxx:106
float eAreaMin
Definition: EdbDistortion.h:103
Definition: EdbRun.h:74
EdbCluster * GetCluster(int i) const
Definition: EdbView.h:218
Int_t Nclusters() const
Definition: EdbView.h:215

◆ SaveCorrMap()

void EdbDistortionCorr::SaveCorrMap ( )
218 {
219  eCorrMap.Save(eOutputFile, "diff");
220  eCorrMapTot.Save(eOutputFile, "tot");
221 
222  bool batch = gROOT->IsBatch();
223  gROOT->SetBatch();
224  eGMap.DrawH2("eGMap","entries/bin")->Write();
225  gROOT->SetBatch(batch);
226 
227  eCorrMapTot.GenerateCorrectionMatrix("correction_matrix.txt");
228 }
void Save(TFile *f, const char *suffix="")
Definition: EdbDistortion.cxx:367
void GenerateCorrectionMatrix(const char *file)
Definition: EdbDistortion.cxx:665
TH2F * DrawH2(const char *name="plot2d", const char *title="EdbH2plot2D")
Definition: EdbCell2.cpp:197

◆ SetPar()

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

◆ SetPixelSize()

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

Member Data Documentation

◆ eAreaMax

float EdbDistortionCorr::eAreaMax

◆ eAreaMin

float EdbDistortionCorr::eAreaMin

◆ eCl

TClonesArray EdbDistortionCorr::eCl
private

◆ eCorrectionMatrixStepX

float EdbDistortionCorr::eCorrectionMatrixStepX
private

◆ eCorrectionMatrixStepY

float EdbDistortionCorr::eCorrectionMatrixStepY
private

◆ eCorrMap

EdbDistortionMap EdbDistortionCorr::eCorrMap
private

◆ eCorrMap0

EdbDistortionMap EdbDistortionCorr::eCorrMap0
private

◆ eCorrMapTot

EdbDistortionMap EdbDistortionCorr::eCorrMapTot
private

◆ eDirX

int EdbDistortionCorr::eDirX
private

◆ eDirY

int EdbDistortionCorr::eDirY
private

◆ eDumpGr

bool EdbDistortionCorr::eDumpGr

◆ eGMap

EdbCell2 EdbDistortionCorr::eGMap
private

◆ eGr

TClonesArray EdbDistortionCorr::eGr
private

◆ eNCenterMin

int EdbDistortionCorr::eNCenterMin
private

◆ eNClMin

int EdbDistortionCorr::eNClMin
private

◆ eNXpix

int EdbDistortionCorr::eNXpix
private

◆ eNYpix

int EdbDistortionCorr::eNYpix
private

◆ eOutputFile

TFile* EdbDistortionCorr::eOutputFile

◆ eR2CenterMax

float EdbDistortionCorr::eR2CenterMax
private

◆ eRmax

float EdbDistortionCorr::eRmax
private

◆ eVolumeMax

float EdbDistortionCorr::eVolumeMax

◆ eVolumeMin

float EdbDistortionCorr::eVolumeMin

◆ eXpix

float EdbDistortionCorr::eXpix
private

◆ eYpix

float EdbDistortionCorr::eYpix
private

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