FEDRA emulsion software from the OPERA Collaboration
RecDispEX.C File Reference

Functions

void analyze (char *file="alirec.root")
 
void BookHistsV ()
 
void ClearHistsV ()
 
void d ()
 
void DrawHistsV ()
 
void DrawHlist (TCanvas *c, TObjArray h)
 
void ds (int iseg=0, float binx=20, float bint=10, int ntr=1)
 
void dsv (int numv=-1, int ntrMin=2, float binx=6, float bint=10)
 
void FillHistsV (Vertex &v)
 
void init (char *file="ali.root")
 
void init_set (char *data_set)
 
void RecDispEX ()
 

Variables

EdbPVRecali =0
 
float AngleAcceptance = 1.0
 
EdbDisplayds =0
 
EdbDataProcdset =0
 
EdbPVRecgAli =0
 
TObjArray hld1
 
TObjArray hld2
 
TObjArray hld3
 
TObjArray hld4
 
TObjArray hlist
 
TH1F * hp [23] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
 
int maxgaps [6] = {0,3,3,6,3,6}
 
int nsegMin = 3
 
float ProbMinP = 0.01
 
float ProbMinT = 0.01
 
float ProbMinV = 0.01
 
bool usemom = false
 

Function Documentation

◆ analyze()

void analyze ( char *  file = "alirec.root")

391 {
392  TFile *f = new TFile(file);
393  gAli = (EdbPVRec*)(f->FindKey("alirec")->ReadObj());
394 
395  BookHistsV();
396 
397  if (!gAli->eTracks) return;
398 
399  printf("\n%d tracks are in the list\n",gAli->eTracks->GetEntriesFast());
400 
401  ntr = gAli->eTracks->GetEntries();
402  if (hp[10]) hp[10]->Fill(ntr);
403  EdbTrackP *tr = 0;
404  float ang = 0.;
405  float tx = 0.;
406  float ty = 0.;
407  for(int i=0; i<ntr; i++)
408  {
409  tr = (EdbTrackP*)(gAli->eTracks->At(i));
410  if (tr->Flag() != -10)
411  {
412  if (hp[11]) hp[11]->Fill(tr->N());
413  if (hp[12]) hp[12]->Fill(tr->GetSegment(0)->X()-tr->GetSegmentF(0)->X());
414  if (hp[17]) hp[17]->Fill(tr->Prob());
415  tx = tr->TX();
416  ty = tr->TY();
417  ang = TMath::ACos(1./(1.+tx*tx+ty*ty))*1000.;
418  if (hp[20]) hp[20]->Fill(ang);
419  if (hp[21]) hp[21]->Fill(tr->P());
420  }
421  }
422 
423  if (!(gAli->eVTX)) return;
424  EdbVertex *v = 0;
425  EdbVertex *vc = 0;
426  Vertex *vt = 0;
427  int nv = gAli->eVTX->GetEntries();
428  int nvg = 0;
429  for(int i=0; i<nv; i++)
430  {
431  v = (EdbVertex*)(gAli->eVTX->At(i));
432  if (v->Flag() != -10)
433  {
434  nvg++;
435  vt = v->V();
436  if (vt) FillHistsV(*vt);
437  if (v->N() > 2) v->Print();
438  }
439  }
440 
441  printf("%d vertexes found\n", nvg);
442 
443  if (hp[9]) hp[9]->Fill(nvg);
444 
445  int nlv = 0;
446  int nn = 0;
447  if (nv)
448  {
449 
450  for(int i=0; i<nv; i++)
451  {
452  v = (EdbVertex*)(gAli->eVTX->At(i));
453  if (v->Flag() > 2)
454  {
455  vc = v->GetConnectedVertex(0);
456  if (vc->ID() > v->ID())
457  {
458 // v->Print();
459 // vc->Print();
460  nlv++;
461  }
462  }
463  nn += v->Nn();
464  }
465  }
466 
467  printf("%d linked vertexes found\n", nlv);
468 
469  printf("%d neighbooring tracks and segments found\n", nn);
470 
471 }
TH1F * hp[23]
Definition: RecDispEX.C:22
void FillHistsV(Vertex &v)
Definition: RecDispEX.C:285
void BookHistsV()
Definition: RecDispEX.C:244
EdbPVRec * gAli
Definition: RecDispEX.C:11
FILE * f
Definition: RecDispMC.C:150
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
Definition: EdbPVRec.h:148
TObjArray * eVTX
Definition: EdbPVRec.h:162
TObjArray * eTracks
Definition: EdbPVRec.h:161
Definition: EdbPattern.h:118
Definition: EdbVertex.h:68
void Print()
Definition: EdbVertex.cxx:328
Int_t ID() const
Definition: EdbVertex.h:126
Int_t N() const
Definition: EdbVertex.h:121
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Int_t Nn() const
Definition: EdbVertex.h:122
EdbVertex * GetConnectedVertex(int nv)
Definition: EdbVertex.cxx:427
Int_t Flag() const
Definition: EdbVertex.h:124
Definition: VtVertex.hh:88
TFile * file
Definition: write_pvr.C:3

◆ BookHistsV()

void BookHistsV ( )

245 {
246  if (!hp[3]) hp[3] = new TH1F("Hist_Vt_Sx","Vertex X sigma",100,0.,10.);
247  if (!hp[4]) hp[4] = new TH1F("Hist_Vt_Sy","Vertex Y sigma",100,0.,10.);
248  if (!hp[5]) hp[5] = new TH1F("Hist_Vt_Sz","Vertex Z sigma",100,0.,500.);
249  if (!hp[6]) hp[6] = new TH1F("Hist_Vt_Chi2","Vertex Chi-square/D.F.",25,0.,5.);
250  if (!hp[7]) hp[7] = new TH1F("Hist_Vt_Prob","Vertex Chi-square Probability",26,0.,1.04);
251  if (!hp[9]) hp[9] = new TH1F("Hist_Vt_Nvert","Number of reconstructed vertexs",100,0.,100.);
252  if (!hp[22]) hp[22] = new TH1F("Hist_Vt_Ntracks","Number of tracks at vertex", 20, 0.,20.);
253  if (!hp[14]) hp[14] = new TH1F("Hist_Vt_Dist","RMS track-vertex distance",100, 0.,50.);
254  if (!hp[18]) hp[18] = new TH1F("Hist_Vt_AngleV","RMS track-track angle, mrad", 100, 0.,1000.);
255 
256  if (!hp[10]) hp[10] = new TH1F("Hist_Vt_Ntrack","Number of reconstructed tracks",100,0.,10000.);
257  if (!hp[11]) hp[11] = new TH1F("Hist_Vt_Nsegs","Number of track segments",60,0.,60.);
258  if (!hp[12]) hp[12] = new TH1F("Hist_Vt_Dtrack","Track DeltaX, microns",100,-5.,+5.);
259  if (!hp[17]) hp[17] = new TH1F("Hist_Vt_Trprob","Track probability",110, 0.,1.1);
260  if (!hp[20]) hp[20] = new TH1F("Hist_Vt_Angle","Track angle, mrad", 100, 0.,1000.);
261  if (!hp[21]) hp[21] = new TH1F("Hist_Vt_Momen","Track momentum, GeV/c", 100, 0.,20.);
262 
263  hld1.Add(hp[3]);
264  hld1.Add(hp[4]);
265  hld1.Add(hp[5]);
266  hld1.Add(hp[6]);
267  hld1.Add(hp[7]);
268  hld1.Add(hp[9]);
269  hld1.Add(hp[22]);
270  hld1.Add(hp[14]);
271  hld1.Add(hp[18]);
272 
273  hld2.Add(hp[10]);
274  hld2.Add(hp[11]);
275  hld2.Add(hp[12]);
276  hld2.Add(hp[17]);
277  hld2.Add(hp[20]);
278  hld2.Add(hp[21]);
279 
280  for (int i=0; i<22; i++)
281  if (hp[i]) hlist.Add(hp[i]);
282 }
TObjArray hld1
Definition: RecDispEX.C:23
TObjArray hld2
Definition: RecDispEX.C:23
TObjArray hlist
Definition: RecDispEX.C:23

◆ ClearHistsV()

void ClearHistsV ( )

384 {
385  for(int i=0; i<22; i++) {
386  if (hp[i]) hp[i]->Clear();
387  }
388 }

◆ d()

void d ( )

381 { DrawHistsV();}
void DrawHistsV()
Definition: RecDispEX.C:297

◆ DrawHistsV()

void DrawHistsV ( )

298 {
299 
300  int n = hld1.GetEntries();
301  if (n)
302  {
303  TCanvas *cv1 = new TCanvas("Vertex_reconstruction_1","MC Vertex reconstruction", 760, 760);
304  DrawHlist(cv1, hld1);
305  }
306 
307  n = hld2.GetEntries();
308  if (n)
309  {
310  TCanvas *cv2 = new TCanvas("Vertex_reconstruction_2","Vertex reconstruction (tracks hists)", 600, 760);
311  DrawHlist(cv2, hld2);
312  }
313 
314  n = hld3.GetEntries();
315  if (n)
316  {
317  TCanvas *cv3 = new TCanvas("Vertex_reconstruction_3","Vertex reconstruction (eff hists)", 600, 760);
318  DrawHlist(cv3, hld3);
319  }
320 
321  n = hld4.GetEntries();
322  if (n)
323  {
324  TCanvas *cv4 = new TCanvas("Vertex_reconstruction_4","Vertex reconstruction (ntracks)", 600, 760);
325  DrawHlist(cv4, hld4);
326  }
327 }
void DrawHlist(TCanvas *c, TObjArray h)
Definition: RecDispEX.C:329
TObjArray hld4
Definition: RecDispEX.C:23
TObjArray hld3
Definition: RecDispEX.C:23
TCanvas * cv4
Definition: RecDispMC_Profiles.C:63
TCanvas * cv1
Definition: RecDispMC_Profiles.C:63
TCanvas * cv2
Definition: RecDispMC_Profiles.C:63
TCanvas * cv3
Definition: RecDispMC_Profiles_new.C:70
new TCanvas()

◆ DrawHlist()

void DrawHlist ( TCanvas c,
TObjArray  h 
)

330 {
331  int n = h.GetEntries();
332  if (n < 2)
333  {
334  }
335  else if (n < 3)
336  {
337  c->Divide(1,2);
338  }
339  else if (n < 4)
340  {
341  c->Divide(1,3);
342  }
343  else if (n < 5)
344  {
345  c->Divide(2,2);
346  }
347  else if (n < 6)
348  {
349  c->Divide(2,3);
350  }
351  else if (n < 7)
352  {
353  c->Divide(2,3);
354  }
355  else if (n < 8)
356  {
357  c->Divide(2,4);
358  }
359  else if (n < 9)
360  {
361  c->Divide(2,4);
362  }
363  else if (n < 10)
364  {
365  c->Divide(3,3);
366  }
367  else if (n < 11)
368  {
369  c->Divide(2,5);
370  }
371  else
372  {
373  c->Divide(3,5);
374  }
375  for(int i=0; i<n; i++) {
376  c->cd(i+1);
377  if (h.At(i)) h.At(i)->Draw();
378  }
379 }

◆ ds()

void ds ( int  iseg = 0,
float  binx = 20,
float  bint = 10,
int  ntr = 1 
)
161 {
162  if(!gAli) init();
163  if(ali) delete ali;
164 
165  EdbSegP *seg=0; // direction
166 
167  TObjArray *arr = new TObjArray();
168  TObjArray *arrtr = new TObjArray();
169 
170  for(int i=0; i<ntr; i++) {
171  EdbTrackP *track = (EdbTrackP*)(gAli->eTracks->At(iseg+i));
172  track->SetSegmentsTrack();
173 
174  arrtr->Add(track);
175  gAli->ExtractDataVolumeSeg( *track,*arr,binx,bint );
176  }
177 
178  gStyle->SetPalette(1);
179  const char *title = "display-segments";
180  if(!EdbDisplay::EdbDisplayExist(title))
181  ds=new EdbDisplay(title,-15000.,15000.,-15000.,15000.,-4000.,40000.);
182 
183  ds->SetArrSegP( arr );
184  ds->SetArrTr( arrtr );
185  ds->Draw();
186 }
void init(char *file="ali.root")
Definition: RecDispEX.C:31
EdbPVRec * ali
Definition: RecDispEX.C:12
EdbDisplay * ds
Definition: RecDispEX.C:10
TObjArray * arrtr
Definition: RecDispMC.C:129
virtual void Draw(Option_t *option="")
Definition: EdbDisplayBase.cxx:786
Definition: EdbDisplay.h:21
void SetArrSegP(TObjArray *arr)
Definition: EdbDisplay.cxx:389
void SetArrTr(TObjArray *arr)
Definition: EdbDisplay.cxx:430
static EdbDisplay * EdbDisplayExist(const char *title)
Definition: EdbDisplay.cxx:232
int ExtractDataVolumeSeg(EdbTrackP &tr, TObjArray &arr, float binx, float bint)
Definition: EdbPVRec.cxx:2852
Definition: EdbSegP.h:18
Definition: bitview.h:14

◆ dsv()

void dsv ( int  numv = -1,
int  ntrMin = 2,
float  binx = 6,
float  bint = 10 
)
189 {
190  if(!gAli->eVTX) return;
191  if(!gAli) init();
192 
193  EdbSegP *seg=0; // direction
194 
195  TObjArray *arrV = new TObjArray(); // vertexes
196  TObjArray *arr = new TObjArray(); // segments
197  TObjArray *arrtr = new TObjArray(); // tracks
198 
199  int nvtx = gAli->eVTX->GetEntries();
200  EdbVertex *v = 0;
201  int iv0,iv1;
202  if (numv == -1)
203  {
204  iv0 = 0;
205  iv1 = nvtx;
206  }
207  else
208  {
209  iv0 = numv;
210  iv1 = numv+1;
211  }
212  for(int iv=iv0; iv<iv1; iv++) {
213  v = (EdbVertex *)(gAli->eVTX->At(iv));
214  if(!v) continue;
215  if(v->N()<ntrMin) continue;
216 
217  arrV->Add(v);
218 
219  int ntr = v->N();
220  printf("Vertex %d, multiplicity %d\n", iv, ntr);
221  for(int i=0; i<ntr; i++) {
222  EdbTrackP *track = v->GetTrack(i);
223  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
224  track->ID(), track->Z(), track->N(), v->Zpos(i));
225  arrtr->Add(track);
226  gAli->ExtractDataVolumeSeg( *track,*arr,binx,bint );
227  }
228 
229  }
230 
231  gStyle->SetPalette(1);
232  const char *title = "display-vertexes";
233  if(!EdbDisplay::EdbDisplayExist(title))
234  ds=new EdbDisplay(title,-15000.,15000.,-15000.,15000.,-4000.,40000.);
235 
236  ds->SetArrSegP( arr );
237  ds->SetArrTr( arrtr );
238  ds->SetArrV( arrV );
239  ds->SetDrawVertex(1);
240  ds->SetDrawTrack(4);
241  ds->Draw();
242 }
void SetDrawVertex(int opt)
Definition: EdbDisplay.h:108
void SetArrV(TObjArray *arrv)
Definition: EdbDisplay.cxx:500
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
Int_t Zpos(int i)
Definition: EdbVertex.h:127

◆ FillHistsV()

void FillHistsV ( Vertex v)

286 {
287  hp[3]->Fill(v.vxerr());
288  hp[4]->Fill(v.vyerr());
289  hp[5]->Fill(v.vzerr());
290  hp[6]->Fill(v.ndf() > 0 ? v.chi2()/v.ndf() : 0);
291  hp[7]->Fill(v.prob());
292  hp[14]->Fill(v.rmsDistAngle());
293  hp[18]->Fill(v.angle()*1000.);
294  hp[22]->Fill(v.ntracks());
295 }
double vyerr() const
$\sqrt{\sigma_{vy}^2}$ vertex $y$-error
unsigned short int ndf() const
degrees of freedom of vertex fit
Definition: VtVertex.C:238
float chi2() const
$\chi^2$ of vertex fit
Definition: VtVertex.C:236
double vzerr() const
$\sqrt{\sigma_{vz}^2}$ vertex $z$-error
double angle() const
unsigned short int ntracks() const
no of tracks in vertex $n$
Definition: VtVertex.C:240
double rmsDistAngle() const
calc rms dist and rms angle
Definition: VtVertex.C:1073
float prob() const
upper tail $\chi^2$ probability
Definition: VtVertex.C:237
double vxerr() const
$\sqrt{\sigma_{vx}^2}$ vertex $x$-error

◆ init()

void init ( char *  file = "ali.root")
32 {
33  TFile *f = new TFile(file);
34  gAli = (EdbPVRec*)(f->FindKey("ali")->ReadObj());
35  // hists booking
36  BookHistsV();
37  // link microtracks
38  gAli->Link();
39 
40  gAli->FillTracksCell();
41  // make track candidates
42  gAli->MakeTracks();
43  if (!gAli->eTracks) return;
44 
45  int ntr = gAli->eTracks->GetEntries();
46  // set track momentum error - 20% for 4 GeV/c
47  for(int i=0; i<ntr; i++)
48  ((EdbTrackP*)(gAli->eTracks->At(i)))->SetErrorP(0.2*0.2*4.*4.);
49  // tracks fit assuming momentum 4 GeV/c and pion mass
50  gAli->FitTracks(4.);
51 
52  gAli->FillCell(50,50,0.015,0.015);
53 
54  // merge consistient tracks
56 
57  if (!(gAli->eTracks)) return;
58  ntr = gAli->eTracks->GetEntries();
59  // fill hist with number of tracks
60  if (hp[10]) hp[10]->Fill(ntr);
61  EdbTrackP *tr = 0;
62  float ang = 0.;
63  float tx = 0.;
64  float ty = 0.;
65  // tracks loop
66  for(int i=0; i<ntr; i++)
67  {
68  tr = (EdbTrackP*)(gAli->eTracks->At(i));
69  if (tr->Flag() != -10) // skip "broken" tracks
70  {
71  // fill hist with number of segments
72  if (hp[11]) hp[11]->Fill(tr->N());
73  // fill hist with difference between measured and reconstructed coordinate
74  if (hp[12]) hp[12]->Fill(tr->GetSegment(0)->X()-tr->GetSegmentF(0)->X());
75  // fill hist with track probability
76  if (hp[17]) hp[17]->Fill(tr->Prob());
77  tx = tr->TX();
78  ty = tr->TY();
79  ang = TMath::ACos(1./(1.+tx*tx+ty*ty))*1000.;
80  // fill hist with track Teta angle
81  if (hp[20]) hp[20]->Fill(ang);
82  // fill hist with track momentum
83  if (hp[21]) hp[21]->Fill(tr->P());
84  }
85  }
86  // find 2-track vertexes
87  int nvtx = gAli->ProbVertex(maxgaps, AngleAcceptance, ProbMinV, ProbMinT, nsegMin, usemom);
88  printf("%d 2-track vertexes was found\n",nvtx);
89 
90  if(nvtx != 0) {
91  // merge 2-tracks vertexes into N-tracks
92  int nadd = gAli->ProbVertexN(ProbMinV);
93  printf("%d vertexes with number of tracks >2 was found\n",nadd);
94  }
95 
96  if (!(gAli->eVTX)) return;
97  EdbVertex *v = 0;
98  EdbVertex *vc = 0;
99  Vertex *vt = 0;
100  int nv = gAli->eVTX->GetEntries();
101  int nvg = 0;
102  for(int i=0; i<nv; i++)
103  {
104  v = (EdbVertex*)(gAli->eVTX->At(i));
105  if (v->Flag() != -10) // skip "used" vertexes
106  {
107  nvg++;
108  vt = v->V();
109  if (vt) FillHistsV(*vt);
110  if (v->N() > 2) v->Print();
111  }
112  }
113  // fill hist with number of vertexes (exclude "used" ones)
114  if (hp[9]) hp[9]->Fill(nvg);
115 
116  if (nv)
117  {
118  // set corresponding flag value for "linked" vertexes
119  int nlv = gAli->LinkedVertexes();
120  printf("%d linked vertexes found\n", nlv);
121  if (nlv)
122  {
123  for(int i=0; i<nv; i++)
124  {
125  v = (EdbVertex*)(gAli->eVTX->At(i));
126  if (v->Flag() > 2) // select "linked" vertexes only
127  {
128  vc = v->GetConnectedVertex(0);
129  if (vc->ID() > v->ID())
130  {
131 // v->Print();
132 // vc->Print();
133  }
134  }
135  }
136  }
137  }
138  // fill vertexes neighborhood lists with tracks and segments
139  int nn = gAli->VertexNeighboor(1000., 2);
140  printf("%d neighbooring tracks found\n", nn);
141  // store results
142  //TFile fo("alirec.root","RECREATE");
143  //gAli->Write("alirec");
144  //fo.Close();
145 }
int maxgaps[6]
Definition: RecDispEX.C:14
bool usemom
Definition: RecDispEX.C:20
float ProbMinV
Definition: RecDispEX.C:16
float AngleAcceptance
Definition: RecDispEX.C:15
float ProbMinT
Definition: RecDispEX.C:18
int nsegMin
Definition: RecDispEX.C:19
float ProbMinP
Definition: RecDispEX.C:17
int MakeTracks(int nsegments=2, int flag=0)
Definition: EdbPVRec.cxx:1985
void FillTracksCell()
Definition: EdbPVRec.cxx:1315
void FillCell(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPVRec.cxx:1088
int Link()
Definition: EdbPVRec.cxx:1183
int PropagateTracks(int nplmax, int nplmin, float probMin=0.05, int ngapMax=3, int design=0)
Definition: EdbPVRec.cxx:2483
void FitTracks(float p=10., float mass=0.139, TObjArray *gener=0, int design=0)
Definition: EdbPVRec.cxx:1889

◆ init_set()

void init_set ( char *  data_set)
149 {
150  dset=new EdbDataProc(data_set);
151  dset->InitVolume(0);
152  gAli = dset->PVR();
153 
154  TFile f("ali.root","RECREATE");
155  gAli->Write("ali");
156  f.Close();
157 }
EdbDataProc * dset
Definition: RecDispEX.C:9
Definition: EdbDataSet.h:180
EdbPVRec * PVR() const
Definition: EdbDataSet.h:197
int InitVolume(int datatype=0, const char *rcut="1")
Definition: EdbDataSet.cxx:2071

◆ RecDispEX()

void RecDispEX ( )
26 {
27  init();
28 }

Variable Documentation

◆ ali

EdbPVRec* ali =0

◆ AngleAcceptance

float AngleAcceptance = 1.0

◆ ds

EdbDisplay* ds =0

◆ dset

EdbDataProc* dset =0

◆ gAli

EdbPVRec* gAli =0

◆ hld1

TObjArray hld1

◆ hld2

TObjArray hld2

◆ hld3

TObjArray hld3

◆ hld4

TObjArray hld4

◆ hlist

TObjArray hlist

◆ hp

TH1F* hp[23] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

◆ maxgaps

int maxgaps[6] = {0,3,3,6,3,6}

◆ nsegMin

int nsegMin = 3

◆ ProbMinP

float ProbMinP = 0.01

◆ ProbMinT

float ProbMinT = 0.01

◆ ProbMinV

float ProbMinV = 0.01

◆ usemom

bool usemom = false