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
array of vertex
Definition: EdbPVRec.h:162
TObjArray * eTracks
Definition: EdbPVRec.h:161
Definition: EdbPattern.h:113
Definition: EdbVertex.h:69
void Print()
Definition: EdbVertex.cxx:328
Int_t ID() const
Definition: EdbVertex.h:126
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Int_t N() const
Definition: EdbVertex.h:121
Int_t Nn() const
Definition: EdbVertex.h:122
EdbVertex * GetConnectedVertex(int nv)
Definition: EdbVertex.cxx:405
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);
305 }
306
307 n = hld2.GetEntries();
308 if (n)
309 {
310 TCanvas *cv2 = new TCanvas("Vertex_reconstruction_2","Vertex reconstruction (tracks hists)", 600, 760);
312 }
313
314 n = hld3.GetEntries();
315 if (n)
316 {
317 TCanvas *cv3 = new TCanvas("Vertex_reconstruction_3","Vertex reconstruction (eff hists)", 600, 760);
319 }
320
321 n = hld4.GetEntries();
322 if (n)
323 {
324 TCanvas *cv4 = new TCanvas("Vertex_reconstruction_4","Vertex reconstruction (ntracks)", 600, 760);
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:787
FEDRA Event Display.
Definition: EdbDisplay.h:22
void SetArrSegP(TObjArray *arr)
Definition: EdbDisplay.cxx:390
void SetArrTr(TObjArray *arr)
Definition: EdbDisplay.cxx:431
static EdbDisplay * EdbDisplayExist(const char *title)
Definition: EdbDisplay.cxx:233
int ExtractDataVolumeSeg(EdbTrackP &tr, TObjArray &arr, float binx, float bint)
Definition: EdbPVRec.cxx:2856
Definition: EdbSegP.h:21
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:109
void SetArrV(TObjArray *arrv)
Definition: EdbDisplay.cxx:501
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
41 // make track candidates
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:1989
void FillTracksCell()
Definition: EdbPVRec.cxx:1319
void FillCell(float stepx, float stepy, float steptx, float stepty)
Definition: EdbPVRec.cxx:1092
int Link()
Definition: EdbPVRec.cxx:1187
int PropagateTracks(int nplmax, int nplmin, float probMin=0.05, int ngapMax=3, int design=0)
Definition: EdbPVRec.cxx:2487
void FitTracks(float p=10., float mass=0.139, TObjArray *gener=0, int design=0)
Definition: EdbPVRec.cxx:1893

◆ 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
emulsion data processing
Definition: EdbDataSet.h:181
int InitVolume(int datatype=0, const char *rcut="1")
Definition: EdbDataSet.cxx:2066
EdbPVRec * PVR() const
Definition: EdbDataSet.h:198

◆ 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