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

Classes

struct  BRICK
 

Functions

void BookHistsV (int nve)
 
void clear_all ()
 
void ClearHistsV ()
 
void d ()
 
void DrawHistsV ()
 
void DrawHlist (TCanvas *c, TObjArray h)
 
void dsall ()
 
void dsst (int numt=-1)
 
void dst (int numt=-1)
 
void dsv (int numv=-1, int ntrMin=0)
 
void dsvg (int numv=-1)
 
void dsvg2 (int numv=-1)
 
void dsvga (int numv=-1)
 
void dsvgar (int numv=-1)
 
void FillHistsGen ()
 
void FillHistsV (EdbVertex &edbv, Vertex &v)
 
int g1 (int ne=1, float b1=0., float b2=0.)
 
void gv (int n=1, int nve=100, float back1=0., float back2=0.)
 
TGenPhaseSpace * K3Pi (float p=3.)
 
void makeVolumeOPERAn (BRICK &b, EdbPatternsVolume *v)
 
void print_conditions (int n, int nve, float back1, float back2)
 
void print_results ()
 
int read_events_from_file (int ne, float *fractbkg, float vlim[4], float vzlim[2])
 
void rec_all ()
 
void Set_Prototype_OPERA_basetrack (EdbScanCond *cond)
 

Variables

EdbPVRecali =0
 
TObjArray * arrs = new TObjArray()
 
TObjArray * arrs2 = new TObjArray()
 
TObjArray * arrtr = new TObjArray()
 
TObjArray * arrtr2 = new TObjArray()
 
TObjArray * arrv = new TObjArray()
 
TObjArray * arrv2 = new TObjArray()
 
float back1_tetamax = 0.35
 
float back2_plim [2] = {0.5, 5.}
 
float back2_tetamax = 0.25
 
BRICK brick
 
int charges [101]
 
double DE_FIT
 
double DE_MC
 
int design = +0
 
float dpp = 0.20
 
EdbDisplayds =0
 
EdbDisplayds2 =0
 
brick dz = 1290.
 
int eloss_flag = 1
 
int evcount = 0
 
FILE * f =0
 
float fiducial_border = 50000.
 
float fiducial_border_z = 17000.
 
bool fmc1steof = true
 
FILE * fmcdata =0
 
EdbPVGengener =0
 
EdbVertexRecgEVR =0
 
TObjArray hld1
 
TObjArray hld2
 
TObjArray hld3
 
TObjArray hld4
 
TObjArray hlist
 
TH1F * hp [24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
 
brick lim [0] = -60000.
 
bool mc_make_tracks = false
 
double mK =5.6
 
float momentumK =15.
 
double mP =0.938
 
double mPi =.139
 
int n2gv = 0
 
int neg_tot = 0
 
int negood_tot = 0
 
int neutral_primary = 1
 
int npi = 5
 
int nprongmax = 0
 
int nprongmaxg = 0
 
int nsegMin = 2
 
int ntall = 0
 
int ntr_tot = 0
 
int ntrg_tot = 0
 
int ntrgb = 0
 
int ntrgood_r_tot = 0
 
int ntrgood_tot = 0
 
int ntrgoodb_r_tot = 0
 
int ntrgoodb_tot = 0
 
int ntrgv_tot = 0
 
int numbricks = 0
 
int nuse = 5
 
int nvg_tot = 0
 
int nvgm_tot [100]
 
int nvgood_tot [100]
 
int nvgoodm_tot [100]
 
int nvgoodmg_tot [100]
 
int nvgoodmt_tot = 0
 
TGenPhaseSpace * pDecay = 0
 
brick plates = 58
 
int primary_vertex_ntracks_min = 2
 
const unsigned long int PrintN = 100
 
float ProbGap = 0.10
 
float ProbMinP = 0.01
 
float ProbMinT = 0.01
 
float ProbMinV = 0.01
 
float ProbMinVN = 0.01
 
bool read_from_file = false
 
int rec_primary_vertex_ntracks_min = 2
 
bool regenerate_vertex_xyz = true
 
TFile * rf =0
 
float RightRatioMin = 0.5
 
EdbScanCondscanCond =0
 
float seg_s [4] ={1.2, 1.2, 0.0015, 0.0015}
 
float seg_zero [4] ={.0,.0,.0,.0}
 
bool select_neighborhood = false
 
bool use_mc_mass = false
 
bool use_mc_momentum = false
 
EdbVertexvedb
 
float vxg = 0.
 
float vxo = 0.
 
float vxyz [3] = {0., 0., 0.}
 
float vyg = 0.
 
float vyo = 0.
 
float vzg = 0.
 
float vzo = 0.
 
brick X0 = 5810.
 
brick z0 = 0.
 

Function Documentation

◆ BookHistsV()

void BookHistsV ( int  nve)

1156{
1157 if (!hp[0]) hp[0] = new TH1F("Hist_Vt_Dx","Vertex X error",100,-50.,50.);
1158 if (!hp[1]) hp[1] = new TH1F("Hist_Vt_Dy","Vertex Y error",100,-50.,50.);
1159 if (!hp[2]) hp[2] = new TH1F("Hist_Vt_Dz","Vertex Z error",100,-100.,100.);
1160 if (!hp[3]) hp[3] = new TH1F("Hist_Vt_Sx","Vertex X sigma",100,0.,10.);
1161 if (!hp[4]) hp[4] = new TH1F("Hist_Vt_Sy","Vertex Y sigma",100,0.,10.);
1162 if (!hp[5]) hp[5] = new TH1F("Hist_Vt_Sz","Vertex Z sigma",100,0.,500.);
1163 if (!hp[6]) hp[6] = new TH1F("Hist_Vt_Chi2","Vertex Chi-square/D.F.",25,0.,5.);
1164 if (!hp[7]) hp[7] = new TH1F("Hist_Vt_Prob","Vertex Chi-square Probability",26,0.,1.04);
1165 if (!hp[8]) hp[8] = new TH1F("Hist_Vt_Mass","Vertex Mass error",50,-1.000,+1.000);
1166 char title[128];
1167 sprintf(title,"Number of reconstructed vertexs (%d generated)",nve);
1168 if (!hp[9]) hp[9] = new TH1F("Hist_Vt_Nvert",title,nve*2,0.,(float)(nve*2));
1169 sprintf(title,"Number of reconstructed tracks (%d generated)",ntall);
1170 if (!hp[10]) hp[10] = new TH1F("Hist_Vt_Ntrack",title,ntall*2,0.,(float)(ntall*2));
1171 if (!hp[11]) hp[11] = new TH1F("Hist_Vt_Nsegs","Number of track segments",brick.plates+1,0.,(float)(brick.plates+1));
1172 if (!hp[12]) hp[12] = new TH1F("Hist_Vt_Dtrack","Track DeltaX, microns",100,-5.,+5.);
1173 if (!hp[13]) hp[13] = new TH1F("Hist_Vt_NsegsG","Number of generated track segments",brick.plates+1,0.,(float)(brick.plates+1));
1174 if (!hp[19]) hp[19] = new TH1F("Hist_Vt_DE","DE(MC)-DE",100,-0.25,+0.25);
1175// if (!hp[19]) hp[19] = new TH1F("Hist_Vt_DE","Momentum for low prob tracks",100,0.,2000.);
1176 if (!hp[14]) hp[14] = new TH1F("Hist_Vt_Dist","RMS track-vertex distance",100, 0.,50.);
1177 if (!hp[15]) hp[15] = new TH1F("Hist_Vt_Match","Right segments fraction (tracks at vertexes)",110, 0.,1.1);
1178 if (!hp[16]) hp[16] = new TH1F("Hist_Vt_Matchb","Right segments fraction (backgound tracks) ",110, 0.,1.1);
1179 if (!hp[17]) hp[17] = new TH1F("Hist_Vt_Trprob","Track probability",110, 0.,1.1);
1180 if (!hp[18]) hp[18] = new TH1F("Hist_Vt_AngleV","RMS track-track angle, mrad", 100, 0.,1000.);
1181 if (!hp[20]) hp[20] = new TH1F("Hist_Vt_Angle","Track angle, mrad", 100, 0.,2000.);
1182 if (!hp[21]) hp[21] = new TH1F("Hist_Vt_Momen","Track momentum, GeV/c", 50, 0.,5.);
1183 if (!hp[22]) hp[22] = new TH1F("Hist_Vt_Ntracks","Number of tracks at vertex", 20, 0.,20.);
1184 if (!hp[23]) hp[23] = new TH1F("Hist_Vt_Pmulsca","Relative Momentum error", 50, -100.,100.);
1185
1186 hld1.Add(hp[0]);
1187 hld1.Add(hp[1]);
1188 hld1.Add(hp[2]);
1189 hld1.Add(hp[3]);
1190 hld1.Add(hp[4]);
1191 hld1.Add(hp[5]);
1192 hld1.Add(hp[6]);
1193 hld1.Add(hp[7]);
1194 hld1.Add(hp[8]);
1195
1196 hld2.Add(hp[11]);
1197 hld2.Add(hp[15]);
1198 hld2.Add(hp[12]);
1199 hld2.Add(hp[13]);
1200 hld2.Add(hp[16]);
1201 hld2.Add(hp[19]);
1202 hld2.Add(hp[17]);
1203 hld2.Add(hp[20]);
1204 hld2.Add(hp[21]);
1205
1206 hld3.Add(hp[9]);
1207 hld3.Add(hp[10]);
1208 hld3.Add(hp[14]);
1209 hld3.Add(hp[18]);
1210
1211 hld4.Add(hp[22]);
1212 hld4.Add(hp[23]);
1213
1214 for (int i=0; i<24; i++)
1215 if (hp[i]) hlist.Add(hp[i]);
1216}
TObjArray hld1
Definition: RecDispMC_new.C:133
TObjArray hld2
Definition: RecDispMC_new.C:133
TObjArray hlist
Definition: RecDispMC_new.C:133
TObjArray hld4
Definition: RecDispMC_new.C:133
BRICK brick
Definition: RecDispMC_new.C:81
int ntall
Definition: RecDispMC_new.C:120
TObjArray hld3
Definition: RecDispMC_new.C:133
TH1F * hp[24]
Definition: RecDispMC_new.C:116
int plates
Definition: RecDispMC.C:96

◆ clear_all()

void clear_all ( )

497{
498 nvg_tot = 0;
499 ntrg_tot = 0;
500 ntrgb = 0;
501 ntr_tot = 0;
502 ntrgood_tot = 0;
503 ntrgoodb_tot = 0;
504 ntrgood_r_tot = 0;
505 ntrgoodb_r_tot = 0;
506 nvgoodmt_tot = 0;
507 numbricks = 0;
508 ntrgv_tot = 0;
509 nprongmax = 0;
510 nprongmaxg = 0;
511 evcount = 0;
512 for (int i=0; i<100; i++)
513 {
514 nvgm_tot[i] = 0;
515 nvgood_tot[i] = 0;
516 nvgoodm_tot[i] = 0;
517 nvgoodmg_tot[i] = 0;
518 }
519
520 hlist.Clear();
521 hld1.Clear();
522 hld2.Clear();
523 hld3.Clear();
524 hld4.Clear();
525
526 if (ali)
527 {
528 delete ali;
529 ali = 0;
530 }
531 if (gener)
532 {
533 delete gener;
534 gener = 0;
535 }
536 if (pDecay)
537 {
538 delete pDecay;
539 pDecay = 0;
540 }
541 return;
542}
int ntrgood_tot
Definition: RecDispMC_new.C:145
int ntrgoodb_r_tot
Definition: RecDispMC_new.C:151
int ntr_tot
Definition: RecDispMC_new.C:144
int nvgoodmt_tot
Definition: RecDispMC_new.C:159
int ntrgb
Definition: RecDispMC_new.C:141
int nvg_tot
Definition: RecDispMC_new.C:136
EdbPVRec * ali
Definition: RecDispMC_new.C:100
int ntrg_tot
Definition: RecDispMC_new.C:139
int numbricks
Definition: RecDispMC_new.C:121
int nvgood_tot[100]
Definition: RecDispMC_new.C:153
TGenPhaseSpace * pDecay
Definition: RecDispMC_new.C:166
int ntrgoodb_tot
Definition: RecDispMC_new.C:147
EdbPVGen * gener
Definition: RecDispMC_new.C:101
int nprongmaxg
Definition: RecDispMC_new.C:162
int nvgm_tot[100]
Definition: RecDispMC_new.C:137
int nprongmax
Definition: RecDispMC_new.C:161
int ntrgood_r_tot
Definition: RecDispMC_new.C:149
int ntrgv_tot
Definition: RecDispMC_new.C:140
int nvgoodm_tot[100]
Definition: RecDispMC_new.C:155
int nvgoodmg_tot[100]
Definition: RecDispMC_new.C:157
int evcount
Definition: RecDispMC_new.C:163

◆ ClearHistsV()

void ClearHistsV ( )

1377{
1378 for(int i=0; hp[i]; i++) {
1379 hp[i]->Clear();
1380 }
1381}

◆ d()

void d ( )

1383{ DrawHistsV();}
void DrawHistsV()
Definition: RecDispMC_new.C:1302

◆ DrawHistsV()

void DrawHistsV ( )

1303{
1304 char title[128];
1305
1306 sprintf(title,"Number of reconstructed vertexs (%d generated)",nvg_tot);
1307 if (hp[9]) hp[9]->SetTitle(title);
1308 sprintf(title,"Number of reconstructed tracks (%d generated)",ntrg_tot);
1309 if (hp[10]) hp[10]->SetTitle(title);
1310
1311 TCanvas *cv1 = new TCanvas("Vertex_reconstruction_1","MC Vertex reconstruction", 760, 760);
1312 DrawHlist(cv1, hld1);
1313
1314 TCanvas *cv2 = new TCanvas("Vertex_reconstruction_2","Vertex reconstruction (tracks hists)", 600, 760);
1315 DrawHlist(cv2, hld2);
1316
1317 TCanvas *cv3 = new TCanvas("Vertex_reconstruction_3","Vertex reconstruction (eff hists)", 600, 760);
1318 DrawHlist(cv3, hld3);
1319
1320 TCanvas *cv4 = new TCanvas("Vertex_reconstruction_4","Vertex reconstruction (ntracks)", 600, 760);
1321 DrawHlist(cv4, hld4);
1322}
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
void DrawHlist(TCanvas *c, TObjArray h)
Definition: RecDispMC_new.C:1324
new TCanvas()

◆ DrawHlist()

void DrawHlist ( TCanvas c,
TObjArray  h 
)

1325{
1326 int n = h.GetEntries();
1327 if (n < 2)
1328 {
1329 }
1330 else if (n < 3)
1331 {
1332 c->Divide(1,2);
1333 }
1334 else if (n < 4)
1335 {
1336 c->Divide(1,3);
1337 }
1338 else if (n < 5)
1339 {
1340 c->Divide(2,2);
1341 }
1342 else if (n < 6)
1343 {
1344 c->Divide(2,3);
1345 }
1346 else if (n < 7)
1347 {
1348 c->Divide(2,3);
1349 }
1350 else if (n < 8)
1351 {
1352 c->Divide(2,4);
1353 }
1354 else if (n < 9)
1355 {
1356 c->Divide(2,4);
1357 }
1358 else if (n < 10)
1359 {
1360 c->Divide(3,3);
1361 }
1362 else if (n < 11)
1363 {
1364 c->Divide(2,5);
1365 }
1366 else
1367 {
1368 c->Divide(3,5);
1369 }
1370 for(int i=0; i<n; i++) {
1371 c->cd(i+1);
1372 if (h.At(i)) h.At(i)->Draw();
1373 }
1374}

◆ dsall()

void dsall ( )

1390{
1391
1392 arrs->Clear();
1393
1395
1396 gStyle->SetPalette(1);
1397
1398 const char *title = "display-segments";
1399 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1400 ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1401
1402 ds->SetArrSegP( arrs );
1403 if (ali->eTracks) ds->SetArrTr( ali->eTracks );
1404 if (ali->eVTX) ds->SetArrV( ali->eVTX );
1405 ds->SetDrawTracks(3);
1406 ds->Draw();
1407
1408}
TObjArray * arrs
Definition: RecDispMC_new.C:107
EdbDisplay * ds
Definition: RecDispMC_new.C:1386
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
void SetArrV(TObjArray *arrv)
Definition: EdbDisplay.cxx:501
void SetDrawTracks(int opt)
Definition: EdbDisplay.h:98
static EdbDisplay * EdbDisplayExist(const char *title)
Definition: EdbDisplay.cxx:233
int ExtractDataVolumeSegAll(TObjArray &arr)
Definition: EdbPVRec.cxx:2881
TObjArray * eVTX
array of vertex
Definition: EdbPVRec.h:162
TObjArray * eTracks
Definition: EdbPVRec.h:161

◆ dsst()

void dsst ( int  numt = -1)
1457{
1458 arrs->Clear();
1459 arrtr->Clear();
1460
1461 gStyle->SetPalette(1);
1462
1463 const char *title = "display-stopped-tracks";
1464 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1465 ds=new EdbDisplay(title,-30000.,2000.,-2000., 42000., -80000.,80000.);
1466
1467 ds->SetDrawTracks(4);
1468
1469 int ntr = ali->eTracks->GetEntries();
1470 int nn = 0;
1471 int it0,it1;
1472 if (numt == -1)
1473 {
1474 it0 = 0;
1475 it1 = ntr;
1476 }
1477 else
1478 {
1479 it0 = numt;
1480 it1 = numt+1;
1481 }
1482 for(int i=it0; i<it1; i++)
1483 {
1484 tra = (EdbTrackP*)(ali->eTracks->At(i));
1485 if (!tra) continue;
1486 if (tra->Flag() != -10 && tra->N() >= 20 && tra->N() <= 50) // skip "broken" tracks
1487 {
1488 if (tra->TrackZmin()->PID() > 10) continue;
1489 arrtr->Add(tra);
1490 nn = gEVR->SegmentNeighbor(tra->TrackZmax(), 8000., 5, arrs, 0);
1491 printf("Track ID %d, neighborhood: %d segments and tracks\n", tra->ID(), nn);
1492 }
1493 }
1494 ds->SetArrSegP( arrs );
1495 ds->SetArrTr( arrtr );
1496 ds->Draw();
1497}
TObjArray * arrtr
Definition: RecDispMC_new.C:108
EdbVertexRec * gEVR
Definition: RecDispMC_new.C:103
Definition: EdbPattern.h:113
Int_t SegmentNeighbor(EdbSegP *s, float RadMax=1000., int Dpat=1, float ImpMax=1000000., float SegWmin=9, TObjArray *aseg=0, TObjArray *atr=0, TObjArray *arv=0)
Definition: EdbVertex.cxx:3005

◆ dst()

void dst ( int  numt = -1)

1411{
1412
1413 arrs->Clear();
1414 arrtr->Clear();
1415
1416 if (ali->eTracks)
1417 {
1418 int ntr = ali->eTracks->GetEntries();
1419 if (!ntr) return;
1420 }
1421 else return;
1422
1423 int it0,it1;
1424 if (numt == -1)
1425 {
1426 it0 = 0;
1427 it1 = ntr;
1428 }
1429 else
1430 {
1431 it0 = numt;
1432 it1 = numt+1;
1433 }
1434
1435 //if (numt < 0) ali->ExtractDataVolumeSegAll( *arrs );
1436
1437 gStyle->SetPalette(1);
1438 const char *title = "display-tracks";
1439 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1440 ds=new EdbDisplay(title,-60000.,60000.,-60000., 60000., 0.,80000.);
1441
1442 EdbTrackP *track = 0;
1443 for(int i=it0; i<it1; i++) {
1444 track = (EdbTrackP *)(ali->eTracks->At(i));
1445 if(track->Flag()<0) continue;
1446 if (track->Prob() < ProbMinT) continue;
1447 arrtr->Add(track);
1448 }
1449 ds->SetArrSegP( arrs );
1450 ds->SetArrTr(arrtr);
1451 ds->SetDrawTracks(4);
1452 ds->Draw();
1453
1454}
float ProbMinT
Definition: RecDispMC_new.C:65
Definition: bitview.h:14

◆ dsv()

void dsv ( int  numv = -1,
int  ntrMin = 0 
)
1502{
1503 if(!ali->eVTX) return;
1504 if(!ali->eTracks) return;
1505
1506 arrs->Clear();
1507 arrtr->Clear();
1508 arrv->Clear();
1509 //if(ds) delete ds;
1510
1511 int nvtx = ali->eVTX->GetEntries();
1512 EdbVertex *v = 0;
1513 int iv0,iv1;
1514 if (numv <0 )
1515 {
1516 iv0 = 0;
1517 iv1 = nvtx;
1518 }
1519 else
1520 {
1521 iv0 = numv;
1522 iv1 = numv+1;
1523 }
1524
1525 if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs );
1526
1527 for(int iv=iv0; iv<iv1; iv++) {
1528 v = (EdbVertex *)(ali->eVTX->At(iv));
1529 if(!v) continue;
1530 if(v->N()<ntrMin) continue;
1531 if(v->Flag() == -10) continue;
1532 arrv->Add(v);
1533
1534 int ntr = v->N();
1535 printf("Vertex %d, number of tracks %d\n", iv, ntr);
1536 for(int i=0; i<ntr; i++) {
1537 EdbTrackP *track = v->GetTrack(i);
1538 printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1539 track->ID(), track->Z(), track->N(), v->Zpos(i));
1540 arrtr->Add(track);
1541 }
1542
1543 if (numv == -1) continue;
1544
1545 int nntr = v->Nn();
1546 for(int i=0; i<nntr; i++) {
1547 if (v->GetVTn(i)->Flag() == 1)
1548 {
1549 EdbSegP *seg = (EdbSegP *)(v->GetVTn(i)->GetTrack());
1550 if (!seg) continue;
1551 arrs->Add(seg);
1552 printf(" Neighbor Segment ID %d, Z = %f\n",
1553 seg->ID(), seg->Z());
1554 }
1555 else if (v->GetVTn(i)->Flag() == 0)
1556 {
1557 EdbTrackP *track = (EdbTrackP *)v->GetVTn(i)->GetTrack();
1558 if (!track) continue;
1559 arrtr->Add(track);
1560 printf(" Neighbor Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1561 track->ID(), track->Z(), track->N(), v->GetVTn(i)->Zpos());
1562 }
1563 }
1564 }
1565
1566 gStyle->SetPalette(1);
1567
1568 const char *title = "display-vertexes";
1569 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1570 {
1571 ds=new EdbDisplay(title,-60000.,60000.,-60000., 60000., 0.,80000.);
1572 }
1573 ds->SetArrSegP( arrs );
1574 ds->SetArrTr( arrtr );
1575 ds->SetArrV( arrv );
1576 if (numv == -10)
1577 ds->SetDrawTracks(3);
1578 else
1579 ds->SetDrawTracks(4);
1580 ds->SetDrawVertex(1);
1581 ds->Draw();
1582
1583}
TObjArray * arrv
Definition: RecDispMC_new.C:109
void SetDrawVertex(int opt)
Definition: EdbDisplay.h:109
Definition: EdbSegP.h:21
Int_t ID() const
Definition: EdbSegP.h:147
Float_t Z() const
Definition: EdbSegP.h:153
EdbTrackP * GetTrack() const
Definition: EdbVertex.h:51
Int_t Flag() const
Definition: EdbVertex.h:48
Int_t Zpos() const
Definition: EdbVertex.h:47
Definition: EdbVertex.h:69
Int_t N() const
Definition: EdbVertex.h:121
EdbVTA * GetVTn(int i)
Definition: EdbVertex.h:140
Int_t Nn() const
Definition: EdbVertex.h:122
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
Int_t Flag() const
Definition: EdbVertex.h:124
Int_t Zpos(int i)
Definition: EdbVertex.h:127

◆ dsvg()

void dsvg ( int  numv = -1)
1586{
1587 if(!gener->eVTX) return;
1588
1589 arrs->Clear();
1590 arrtr->Clear();
1591 arrv->Clear();
1592
1593 EdbSegP *seg=0; // direction
1594
1595 int ntrMin=2;
1596 int nvtx = gener->eVTX->GetEntries();
1597 EdbVertex *v = 0;
1598 int iv0,iv1;
1599 if (numv < 0)
1600 {
1601 iv0 = 0;
1602 iv1 = nvtx;
1603 }
1604 else
1605 {
1606 iv0 = numv;
1607 iv1 = numv+1;
1608 }
1609
1610 if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs );
1611
1612 for(int iv=iv0; iv<iv1; iv++) {
1613 v = (EdbVertex *)(gener->eVTX->At(iv));
1614 if(!v) continue;
1615 if(v->N()<ntrMin) continue;
1616
1617 arrv->Add(v);
1618
1619 int ntr = v->N();
1620 printf("Vertex %d, number of tracks %d\n", iv, ntr);
1621 for(int i=0; i<ntr; i++) {
1622 EdbTrackP *track = v->GetTrack(i);
1623 printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1624 track->ID(), track->Z(), track->N(), v->Zpos(i));
1625 arrtr->Add(track);
1626 }
1627
1628 }
1629
1630 gStyle->SetPalette(1);
1631
1632 const char *title = "display-generated-vertexes";
1633 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1634 ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1635
1636 ds->SetArrSegP( arrs );
1637 ds->SetArrTr( arrtr );
1638 ds->SetArrV( arrv );
1639 if (numv == -10)
1640 ds->SetDrawTracks(3);
1641 else
1642 ds->SetDrawTracks(4);
1643 ds->SetDrawVertex(1);
1644 ds->Draw();
1645}
TObjArray * eVTX
Definition: EdbPVGen.h:28

◆ dsvg2()

void dsvg2 ( int  numv = -1)
1753{
1754 if(!gener->eVTX) return;
1755
1756 if(ds2) delete ds2;
1757 arrs2->Clear();
1758 arrtr2->Clear();
1759 arrv2->Clear();
1760
1761 EdbSegP *seg=0; // direction
1762
1763 int ntrMin=2;
1764 int nvtx = gener->eVTX->GetEntries();
1765 EdbVertex *v = 0;
1766 int iv0,iv1;
1767 if (numv < 0)
1768 {
1769 iv0 = 0;
1770 iv1 = nvtx;
1771 }
1772 else
1773 {
1774 iv0 = numv;
1775 iv1 = numv+1;
1776 }
1777 if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs2 );
1778 for(int iv=iv0; iv<iv1; iv++) {
1779 v = (EdbVertex *)(gener->eVTX->At(iv));
1780 if(!v) continue;
1781 if(v->N()<ntrMin) continue;
1782
1783 arrv2->Add(v);
1784
1785 int ntr = v->N();
1786 printf("Vertex %d, number of tracks %d\n", iv, ntr);
1787 for(int i=0; i<ntr; i++) {
1788 EdbTrackP *track = v->GetTrack(i);
1789 printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1790 track->ID(), track->Z(), track->N(), v->Zpos(i));
1791 arrtr2->Add(track);
1792 }
1793 }
1794
1795 gStyle->SetPalette(1);
1796
1797 const char *title = "display-generated-vertexes-2";
1798 if(!(ds2 = EdbDisplay::EdbDisplayExist(title)))
1799 ds2=new EdbDisplay(title,-60000.,60000.,-60000., 60000., 0.,80000.);
1800
1801 ds2->SetArrSegP( arrs2 );
1802 ds2->SetArrTr( arrtr2 );
1803 ds2->SetArrV( arrv2 );
1804 if (numv == -10)
1805 ds->SetDrawTracks(3);
1806 else
1807 ds->SetDrawTracks(4);
1808 ds2->SetDrawVertex(1);
1809 ds2->Draw();
1810}
TObjArray * arrs2
Definition: RecDispMC_new.C:110
EdbDisplay * ds2
Definition: RecDispMC_new.C:1387
TObjArray * arrv2
Definition: RecDispMC_new.C:112
TObjArray * arrtr2
Definition: RecDispMC_new.C:111

◆ dsvga()

void dsvga ( int  numv = -1)
1648{
1649 if(!gener->eVTX) return;
1650
1651 EdbSegP *seg=0; // direction
1652
1653 int ntrMin=2;
1654 int nvtx = gener->eVTX->GetEntries();
1655 EdbVertex *v = 0;
1656 int iv0,iv1;
1657 if (numv < 0)
1658 {
1659 return;
1660 }
1661 else
1662 {
1663 iv0 = numv;
1664 iv1 = numv+1;
1665 }
1666
1667 for(int iv=iv0; iv<iv1; iv++) {
1668 v = (EdbVertex *)(gener->eVTX->At(iv));
1669 if(!v) continue;
1670 if(v->N()<ntrMin) continue;
1671
1672 arrv->Add(v);
1673
1674 int ntr = v->N();
1675 printf("Vertex %d, number of tracks %d\n", iv, ntr);
1676 for(int i=0; i<ntr; i++) {
1677 EdbTrackP *track = v->GetTrack(i);
1678 printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1679 track->ID(), track->Z(), track->N(), v->Zpos(i));
1680 arrtr->Add(track);
1681 }
1682
1683 }
1684
1685 gStyle->SetPalette(1);
1686
1687 const char *title = "display-generated-vertexes";
1688 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1689 {
1690 ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1691 }
1692 ds->SetArrSegP( arrs );
1693 ds->SetArrTr( arrtr );
1694 ds->SetArrV( arrv );
1695 ds->SetDrawTracks(4);
1696 ds->SetDrawVertex(1);
1697 ds->Draw();
1698}

◆ dsvgar()

void dsvgar ( int  numv = -1)
1701{
1702 if(!gener->eVTX) return;
1703
1704 EdbSegP *seg=0; // direction
1705
1706 int ntrMin=2;
1707 int nvtx = gener->eVTX->GetEntries();
1708 EdbVertex *v = 0;
1709 int iv0,iv1;
1710 if (numv < 0)
1711 {
1712 return;
1713 }
1714 else
1715 {
1716 iv0 = numv;
1717 iv1 = numv+1;
1718 }
1719
1720 for(int iv=iv0; iv<iv1; iv++) {
1721 v = (EdbVertex *)(gener->eVTX->At(iv));
1722 if(!v) continue;
1723 if(v->N()<ntrMin) continue;
1724
1725 arrv->Add(v);
1726
1727 int ntr = v->N();
1728 printf("Vertex %d, number of tracks %d\n", iv, ntr);
1729 for(int i=0; i<ntr; i++) {
1730 EdbTrackP *track = v->GetTrack(i);
1731 printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1732 track->ID(), track->Z(), track->N(), v->Zpos(i));
1733 arrtr->Add(track);
1734 }
1735
1736 }
1737
1738 gStyle->SetPalette(1);
1739
1740 const char *title = "display-vertexes";
1741 if(!(ds = EdbDisplay::EdbDisplayExist(title)))
1742 ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1743
1744 ds->SetArrSegP( arrs );
1745 ds->SetArrTr( arrtr );
1746 ds->SetArrV( arrv );
1747 ds->SetDrawTracks(4);
1748 ds->SetDrawVertex(1);
1749 ds->Draw();
1750}

◆ FillHistsGen()

void FillHistsGen ( )

1252{
1253 // tracks and vertex reconstruction (KF fitting only without track finding)
1254
1255 double xg, yg, zg, txg, tyg, pg, ang;
1256 EdbTrackP *tr;
1257 EdbVertex *vedbg = 0;
1258
1259 int nv = 0;
1260 if (!gener) return;
1261 if(gener->eVTX) nv = gener->eVTX->GetEntries();
1262 // loop on generated vertexes
1263 for(int i=0; i<nv; i++) {
1264 vedbg = (EdbVertex *)(gener->eVTX->At(i));
1265 if (!vedbg) continue;
1266 int nt = vedbg->N();
1267 // loop on vertex tracks
1268 for(int ip=0; ip<nt; ip++) {
1269 tr = vedbg->GetTrack(ip);
1270 if (!tr) continue;
1271 xg = tr->X();
1272 yg = tr->Y();
1273 zg = tr->Z();
1274 txg = tr->TX();
1275 tyg = tr->TY();
1276 pg = tr->P();
1277 // calculate teta angle (mrad)
1278 ang = TMath::ACos(1./(1.+txg*txg+tyg*tyg))*1000.;
1279 if (hp[20]) hp[20]->Fill(ang);
1280 if (hp[21]) hp[21]->Fill(pg);
1281 }
1282 }
1283 int nt = 0;
1284 if (gener->eTracks) nt = gener->eTracks->GetEntries();
1285 // loop on all generated tracks
1286 for(int i=0; i<nt; i++) {
1287 tr = (EdbTrackP *)(gener->eTracks->At(i));
1288 if (!tr) continue;
1289 xg = tr->X();
1290 yg = tr->Y();
1291 zg = tr->Z();
1292 txg = tr->TX();
1293 tyg = tr->TY();
1294 pg = tr->P();
1295 ang = TMath::ACos(1./(1.+txg*txg+tyg*tyg))*180./TMath::Pi();
1296 // fill hist with number of generated segments
1297 if (hp[13]) hp[13]->Fill(tr->N());
1298 }
1299}
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
TObjArray * eTracks
Definition: EdbPVGen.h:27

◆ FillHistsV()

void FillHistsV ( EdbVertex edbv,
Vertex v 
)

1219{
1220 double smass = 0.13957;
1221 // fill hists with differences between reconstructed and generated position
1222 hp[0]->Fill((double)vxo - (double)vxg);
1223 hp[1]->Fill((double)vyo - (double)vyg);
1224 hp[2]->Fill((double)vzo - (double)vzg);
1225 // fill hists with vertex coordinate errors
1226 hp[3]->Fill(v.vxerr());
1227 hp[4]->Fill(v.vyerr());
1228 hp[5]->Fill(v.vzerr());
1229 // fill hist with chi2/ndf
1230 hp[6]->Fill(v.ndf() > 0 ? v.chi2()/v.ndf() : 0);
1231 // fill hist with vertex chi2 probability
1232 hp[7]->Fill(v.prob());
1233 if ( (nuse == npi) && neutral_primary && !read_from_file)
1234 {
1235 double rmass = v.mass(smass);
1236 hp[8]->Fill(rmass-mK);
1237 }
1238 // calculate average track-vertex distance
1239 double rmsdist = v.rmsDistAngle();
1240// hp[14]->Fill(rmsdist);
1241 // fill hist with average track-track angle
1242 hp[18]->Fill(v.angle()*1000.);
1243 // fill histy with vertex multiplicity
1244 hp[22]->Fill(v.ntracks());
1245 // fill hist with impact parameters
1246 int n = edbv.N();
1247 for (int j=0; j<n; j++)
1248 if (hp[14]) hp[14]->Fill(edbv.Impact(j));
1249}
int neutral_primary
Definition: RecDispMC_new.C:44
float vxg
Definition: RecDispMC_new.C:125
int npi
Definition: RecDispMC_new.C:45
float vyg
Definition: RecDispMC_new.C:125
float vyo
Definition: RecDispMC_new.C:124
float vxo
Definition: RecDispMC_new.C:124
bool read_from_file
Definition: RecDispMC_new.C:26
double mK
Definition: RecDispMC_new.C:49
int nuse
Definition: RecDispMC_new.C:46
float vzg
Definition: RecDispMC_new.C:125
float vzo
Definition: RecDispMC_new.C:124
double smass
Definition: RecDispNU.C:1099
Float_t Impact(int i)
Definition: EdbVertex.h:149
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
double mass(const bool use=false) const
rest-mass 0 or track rest mass
Definition: VtVertex.C:929
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

◆ g1()

int g1 ( int  ne = 1,
float  b1 = 0.,
float  b2 = 0. 
)

691{
692 // generation of 1 pattern volume
693 float vlim[4], vzlim[2];
694 // delete previous generated tracks and vertexes
695 if (gener)
696 {
697 if (gener->eVTX) gener->eVTX->Delete();
698 if (gener->eTracks) gener->eTracks->Delete();
699 gener->eVTX = new TObjArray(1000);
700 }
701 // delete previous reconstructed tracks and vertexes, generated segments
702 if (ali)
703 {
704 if (ali->eVTX) ali->eVTX->Delete();
705 if (ali->eTracks) ali->eTracks->Delete();
706 ali->ResetCouples();
707 int npat=ali->Npatterns();
708 TClonesArray *segs = 0;
709 for(int i=0; i<npat; i++ )
710 if ( segs = (ali->GetPattern(i))->GetSegments()) segs->Delete();
711 ali->eVTX = new TObjArray(1000);
712 }
713 if (gEVR)
714 {
715 gEVR->eVTA.Clear();
716 gEVR->ePVR = ali;
717 }
718 vlim[0] = brick.lim[0] + fiducial_border;
719 vlim[1] = brick.lim[1] + fiducial_border;
720 vlim[2] = brick.lim[2] - fiducial_border;
721 vlim[3] = brick.lim[3] - fiducial_border;
722 // working area
723 float area = (vlim[2]-vlim[0])*(vlim[3]-vlim[1])/1000000.;
724 // number of background segments and tracks
725 int nb1 = b1*area;
726 int nb2 = b2*area;
727 vzlim[0] = fiducial_border_z;
729
730 float fractbkg = 1.;
731 int retval = 0;
732// generate events (vertexes)
733 if (read_from_file && ne)
734 {
735 retval = read_events_from_file(ne, &fractbkg, vlim, vzlim);
736 }
737 else if (ne)
738 {
739 gener->GeneratePhaseSpaceEvents( ne, pDecay, vzlim, vlim,
741 charges);
742 neg_tot+=ne;
743 nvgm_tot[nuse + 1 - neutral_primary] += ne;
744 }
745 int nb1f, nb2f;
746// generate uncorrelated segments
747 if ((nb1f = (int)(nb1*fractbkg)))
749 back1_tetamax, 0 );
750// generate cosmictracks
751 if ((nb2f = (int)(nb2*fractbkg)))
755 ntrgb += nb2f;
756// fill hists with generated track parameters
757 FillHistsGen();
758// reconstruction procedure
759 rec_all();
760
761 return retval;
762}
int read_events_from_file(int ne, float *fractbkg, float vlim[4], float vzlim[2])
Definition: RecDispMC_new.C:544
float back2_tetamax
Definition: RecDispMC_new.C:31
void rec_all()
Definition: RecDispMC_new.C:765
int neg_tot
Definition: RecDispMC_new.C:135
float fiducial_border_z
Definition: RecDispMC_new.C:35
float fiducial_border
Definition: RecDispMC_new.C:34
int eloss_flag
Definition: RecDispMC_new.C:67
float back1_tetamax
Definition: RecDispMC_new.C:30
float ProbGap
Definition: RecDispMC_new.C:56
int charges[101]
Definition: RecDispMC_new.C:127
float back2_plim[2]
Definition: RecDispMC_new.C:32
void FillHistsGen()
Definition: RecDispMC_new.C:1251
Int_t npat
Definition: Xi2HatStartScript.C:33
void GeneratePhaseSpaceEvents(int nv, TGenPhaseSpace *pDecay, float vzlim[2], float vlim[4], float lim[4], float ProbGap, int eloss_flag, int *charges)
Definition: EdbPVGen.cxx:699
void GenerateUncorrelatedSegments(int nb, float lim[4], float TetaMax, int flag)
Definition: EdbPVGen.cxx:587
void GenerateBackgroundTracks(int nb, float vlim[4], float lim[4], float plim[2], float TetaMax, float ProbGap, int eloss_flag)
Definition: EdbPVGen.cxx:640
void ResetCouples()
Definition: EdbPVRec.cxx:950
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
EdbPVRec * ePVR
patterns volume (optional)
Definition: EdbVertex.h:206
TList eVTA
vertex-track associations
Definition: EdbVertex.h:203
float lim[4]
Definition: RecDispMC.C:99
float dz
Definition: RecDispMC.C:98

◆ gv()

void gv ( int  n = 1,
int  nve = 100,
float  back1 = 0.,
float  back2 = 0. 
)

196{
197 // main steering routine for vertex generation & reconstruction test
198 char outfile[128];
199
200 if ( !read_from_file && (npi < 2 || npi > 100 || nuse > npi) )
201 {
202 printf("Wrong combination of kinematic conditions:\n");
203 printf(" %d secondary pions, tracking for %d pions \n", npi, nuse);
204 return;
205 }
206
207 timespec_t t0, t;
208 double dt;
209
210 if (read_from_file)
211 {
212 fmcdata = fopen("vertexes_and_tracks.data","r");
213 rewind(fmcdata);
214 ntall = 10*nve;
215 }
216 else
217 {
218 float area = (brick.lim[2]-brick.lim[0]-2.*fiducial_border)*
219 (brick.lim[3]-brick.lim[1]-2.*fiducial_border)/1000000.;
220 ntall = nve*(nuse+1-neutral_primary)+back2*area;
221 }
222
223 // log MC conditions on stdout and logfile
224 print_conditions(n, nve, back1, back2);
225
226 // clear variables and objects
227 clear_all();
228
229 // histogram booking
230 BookHistsV(nve);
231
232 // Phase Space Generator initialization
234 // Create PVRec object
235 ali = new EdbPVRec();
236 // Get Patterns Volume pointer
238 // Make patterns
240 // Create Vertexes TObjArray in PVRec
241 ali->eVTX = new TObjArray(1000);
242 // Create Scan Conditions object
243 scanCond = new EdbScanCond();
244 // Set Scan conditions variables
246 // Assign Scan Conditions to PVRec
248
252
253 // Create PVGen object
254 gener = new EdbPVGen();
255 // Use the same volume as PVRec
257 // Create Vertexes TObjArray in PVGen
258 gener->eVTX = new TObjArray(1000);
259 // Assign Scan Conditions to PVGen (the same as for PVRec)
261
262 gEVR = new EdbVertexRec();
263 if (!(ali->eTracks)) ali->eTracks = new TObjArray(100);
265 if (!(ali->eVTX)) ali->eVTX = new TObjArray(100);
266 gEVR->eVTX = ali->eVTX;
267 gEVR->ePVR = ali;
268
269 gEVR->eZbin = 100.; // default is 100. microns
270 gEVR->eAbin = 0.01; // default is 0.01 rad
271 gEVR->eDZmax = 4500.; // default is 3000. microns
272 gEVR->eProbMin = ProbMinV; // default 0.01, i.e 1%
273 gEVR->eImpMax = 35.; // default is 25. microns
274 gEVR->eUseSegPar = false; // default is FALSE - use fitted track parameters
275
276
277 TTimeStamp ts; // Time Stamp for printing
278 t0=ts.GetTimeSpec();
279
280 int breakflag = 0;
281 int print_at_end = 0;
282 int nprong = nuse + 1 - neutral_primary;
283
284 for(int i=1; i<=n; i++) {
285 numbricks++;
286 // generate one brick with:
287 // nve events,
288 // back1 uncorrelated segments per mm^2 per plate,
289 // back2 cosmic tracks per mm^2,
290 // return true if EOF conditions (when readevents from file)
291 if (g1(nve,back1,back2)) breakflag = 1;
292 // print time and statistic
293 if ((!(nvg_tot%PrintN)) || breakflag || (i == n))
294 {
295 TTimeStamp ts;
296 t=ts.GetTimeSpec();
297 dt=(t.tv_sec-t0.tv_sec)*1000000000.+(t.tv_nsec-t0.tv_nsec);
298 if ( !breakflag && (i != n) )
299 {
300 if (nve>0&&back2<=0.)
301 printf("%d events generated in %.4f sec (%.1f msec per event)\n",
302 neg_tot,dt/1000000000.,dt/(double)(neg_tot)/1000000.);
303 else if (nve>0&&back2>0.)
304 printf("%d events and %d cosmic tracks generated in %.4f sec (%.1f msec per event)\n",
305 neg_tot,ntrgb, dt/1000000000.,dt/(double)(neg_tot)/1000000.);
306 else if (nve<=0&&back2>0.)
307 printf("%d cosmic tracks generated in %.4f sec (%.1f msec per track)\n",
308 ntrgb, dt/1000000000.,dt/(double)(ntrgb)/1000000.);
309 }
310 else
311 {
312 print_at_end = 1;
313 }
314 }
315 if (breakflag) break;
316 }
317 if (read_from_file)
318 {
320 }
321 else
322 {
323 ntrgv_tot = nprong*nvg_tot;
324 nprongmaxg = nprong;
325 }
326
327 // log MC results on stdout and logfile
329 // Store histogramms on ROOT file
330 sprintf(outfile,"%db_%dK%dpi_%dub_%3.1ftb", n, nve, nuse, (int)back1, back2);
331 rf = new TFile(strcat(outfile,".root"),"RECREATE","MC Vertex reconstruction");
332 hlist.Write();
333 rf->Close();
334 delete rf;
335 rf = 0;
336 // print time and statistic
337 if ( print_at_end )
338 {
339 if (nve>0&&back2<=0.)
340 printf("%d events generated in %.4f sec (%.1f msec per event)\n",
341 neg_tot,dt/1000000000.,dt/(double)(neg_tot)/1000000.);
342 else if (nve>0&&back2>0.)
343 printf("%d events and %d cosmic tracks generated in %.4f sec (%.1f msec per event)\n",
344 neg_tot,ntrgb, dt/1000000000.,dt/(double)(neg_tot)/1000000.);
345 else if (nve<=0&&back2>0.)
346 printf("%d cosmic tracks generated in %.4f sec (%.1f msec per track)\n",
347 ntrgb, dt/1000000000.,dt/(double)(ntrgb)/1000000.);
348 }
349}
const unsigned long int PrintN
Definition: RecDispMC_new.C:98
TGenPhaseSpace * K3Pi(float p=3.)
Definition: RecDispMC_new.C:1812
TFile * rf
Definition: RecDispMC_new.C:131
float momentumK
Definition: RecDispMC_new.C:47
void print_conditions(int n, int nve, float back1, float back2)
Definition: RecDispMC_new.C:351
float ProbMinV
Definition: RecDispMC_new.C:62
void Set_Prototype_OPERA_basetrack(EdbScanCond *cond)
Definition: RecDispMC_new.C:169
int g1(int ne=1, float b1=0., float b2=0.)
Definition: RecDispMC_new.C:690
void makeVolumeOPERAn(BRICK &b, EdbPatternsVolume *v)
Definition: RecDispMC_new.C:184
EdbScanCond * scanCond
Definition: RecDispMC_new.C:102
void print_results()
Definition: RecDispMC_new.C:406
void BookHistsV(int nve)
Definition: RecDispMC_new.C:1155
FILE * fmcdata
Definition: RecDispMC_new.C:130
void clear_all()
Definition: RecDispMC_new.C:496
EdbPatternsVolume * vol
Definition: RecDispNU.C:116
Definition: EdbPVGen.h:18
void SetVolume(EdbPatternsVolume *pv)
Definition: EdbPVGen.h:34
void SetScanCond(EdbScanCond *scan)
Definition: EdbPVGen.h:35
Definition: EdbPVRec.h:148
void SetChi2Max(float chi)
Definition: EdbPVRec.h:186
void SetCouplesAll()
Definition: EdbPVRec.cxx:975
void SetScanCond(EdbScanCond *scan)
Definition: EdbPVRec.h:171
Definition: EdbPattern.h:334
void SetPatternsID()
Definition: EdbPattern.cxx:1603
Definition: EdbScanCond.h:10
float Chi2PMax() const
Definition: EdbScanCond.h:86
Float_t eAbin
safety margin for angular aperture of vertex products
Definition: EdbVertex.h:176
Bool_t eUseSegPar
use only the nearest measured segments for vertex fit (as Neuchatel)
Definition: EdbVertex.h:182
Float_t eImpMax
maximal acceptable impact parameter (preliminary check)
Definition: EdbVertex.h:179
Float_t eZbin
z- granularity (default is 100 microns)
Definition: EdbVertex.h:175
Float_t eDZmax
maximum z-gap in the track-vertex group
Definition: EdbVertex.h:177
Float_t eProbMin
minimum acceptable probability for chi2-distance between tracks
Definition: EdbVertex.h:178
Definition: EdbVertex.h:194
TObjArray * eVTX
array of vertex
Definition: EdbVertex.h:205
TObjArray * eEdbTracks
Definition: EdbVertex.h:204
TTree * t
Definition: check_shower.C:4
fclose(pFile)

◆ K3Pi()

TGenPhaseSpace * K3Pi ( float  p = 3.)
1813{
1814 // K->3Pi decay phase space
1815
1816 double e=TMath::Sqrt(p*p+mK*mK);
1817 TLorentzVector K(0,0,p,e);
1818 Double_t masses[100];
1819 for (int i=0; i<100; i++)
1820 {
1821 masses[i] = 0;
1822 if (i < npi) masses[i] = mPi;
1823 if (i == 0) masses[i] = mP;
1824 charges[i] = 0;
1825 if (i < nuse) charges[i] = 1;
1826 }
1827 charges[npi] = 1;
1828 if (neutral_primary) charges[npi] = 0;
1829 TGenPhaseSpace *psp = new TGenPhaseSpace();
1830 psp->SetDecay(K, npi, masses);
1831 return psp;
1832}
double mP
Definition: RecDispMC_new.C:51
double mPi
Definition: RecDispMC_new.C:50
p
Definition: testBGReduction_AllMethods.C:8

◆ makeVolumeOPERAn()

void makeVolumeOPERAn ( BRICK b,
EdbPatternsVolume v 
)

185{
186 // Volume geometry setting
187
188 EdbPattern *pat =0;
189 for(int i=0; i<b.plates; i++) {
190 pat = new EdbPattern(0,0,b.z0+b.dz*i);
191 v->AddPattern(pat);
192 }
193}
Definition: EdbPattern.h:273
void AddPattern(EdbPattern *pat)
Definition: EdbPattern.cxx:1707
float z0
Definition: RecDispMC.C:97

◆ print_conditions()

void print_conditions ( int  n,
int  nve,
float  back1,
float  back2 
)

352{
353 char outfile[128];
354
355 sprintf(outfile,"%db_%dK%dpi_%dub_%3.1ftb", n, nve, nuse, (int)back1, back2);
356
357 f = fopen(strcat(outfile,".out"),"w");
358
359 if (read_from_file)
360 fprintf(f,"Monte-Carlo for %d brick(s) with %d events from file vertexes_and_tracks.data\n", n, nve);
361 else
362 fprintf(f,"Monte-Carlo for %d brick(s) with %d K-%dpi decays, kaon momentum %.1f GeV/c\n",
363 n, nve, nuse, momentumK);
364 if (back1)
365 fprintf(f,"%d uncorrelated segments per mm^2 per pattern, acceptance %.2f rad\n",
366 (int)back1, back1_tetamax);
367 else
368 fprintf(f,"No uncorrelated segments background\n");
369 if (back2)
370 fprintf(f,"%3.1f cosmic tracks per volume, acceptance %.2f rad, momentum %.2f-%.2f GeV/c\n",
371 back2, back2_tetamax, back2_plim[0], back2_plim[1]);
372 else
373 fprintf(f,"No cosmic tracks background\n");
374 fprintf(f,"%3d plates (thickness %5.2f mm) per brick, total area %.1fx%.1f mm2\n",
375 brick.plates, brick.dz/1000., (brick.lim[2]-brick.lim[0])/1000.,
376 (brick.lim[3]-brick.lim[1])/1000.);
377 fprintf(f," work area %.1fx%.1f mm2\n",
378 (brick.lim[2]-brick.lim[0]-2.*fiducial_border)/1000.,
379 (brick.lim[3]-brick.lim[1]-2.*fiducial_border)/1000.);
380 fprintf(f,"Basetrack measurement errors:\n %6.1f microns (X) , %6.1f microns (Y)\n",
381 seg_s[0], seg_s[1]);
382 fprintf(f," %6.4f mrad (TX), %6.4f mrad (TY)\n",
383 seg_s[2], seg_s[3]);
384 fprintf(f,"Track momentum relative error %d%%\n",
385 (int)(dpp*100.));
386 if (eloss_flag == 0)
387 fprintf(f,"No energy losses simulation during particle tracking.\n");
388 else if (eloss_flag == 1)
389 fprintf(f,"Take into account average energy losses.\n");
390 else if (eloss_flag == 2)
391 fprintf(f,"Simulate energy losses according Landau distribution.\n");
392 fprintf(f,"Track segment registration un-efficiency %d%%\n",
393 (int)(ProbGap*100.));
394 fprintf(f,"Minimal Chi2 probability for segment attachment %6.4f\n",
395 ProbMinP);
396 fprintf(f,"Minimal number of track segments for vertexing %d\n",
397 nsegMin);
398 fprintf(f,"Minimal Chi2 track probability for vertexing %6.4f\n",
399 ProbMinT);
400 fprintf(f,"Minimal Chi2 vertex probability for vertex registration %6.4f\n",
401 ProbMinV);
402 fprintf(f,"-----------------------------------------------------------\n");
403 return;
404}
FILE * f
Definition: RecDispMC_new.C:129
float seg_s[4]
Definition: RecDispMC_new.C:54
int nsegMin
Definition: RecDispMC_new.C:60
float dpp
Definition: RecDispMC_new.C:53
float ProbMinP
Definition: RecDispMC_new.C:64

◆ print_results()

void print_results ( )

407{
408 float tr_eff = (float)ntr_tot/(ntrgv_tot+ntrgb);
409 printf("-----------------------------------------------------------\n");
410 fprintf(f,"-----------------------------------------------------------\n");
411 printf("Total tracks finding efficiency %6.1f%%\n",
412 tr_eff*100.);
413 fprintf(f,"Toatal tracks finding efficiency %6.1f%%\n",
414 tr_eff*100.);
415 if (ntrgv_tot)
416 {
417 float trgood_eff = (float)ntrgood_tot/ntrgv_tot;
418 float trgood_r_eff = (float)ntrgood_r_tot/ntrgv_tot;
419 printf("Event tracks finding efficiency %6.1f%% ( %6.1f%% with right segs >= %.1f%%)\n",
420 trgood_eff*100., trgood_r_eff*100., RightRatioMin*100.);
421 fprintf(f, "Event tracks finding efficiency %6.1f%% ( %6.1f%% with right segs >= %.1f%%)\n",
422 trgood_eff*100., trgood_r_eff*100., RightRatioMin*100.);
423 }
424 if (ntrgb)
425 {
426 float trgoodb_eff = (float)ntrgoodb_tot/ntrgb;
427 float trgoodb_r_eff = (float)ntrgoodb_r_tot/ntrgb;
428 printf("Cosmic tracks finding efficiency %6.1f%% ( %6.1f%% with right segs >= %.1f%%)\n",
429 trgoodb_eff*100., trgoodb_r_eff*100., RightRatioMin*100.);
430 fprintf(f, "Cosmic tracks finding efficiency %6.1f%% ( %6.1f%% with right segs >= %.1f%%)\n",
431 trgoodb_eff*100., trgoodb_r_eff*100., RightRatioMin*100.);
432 }
433 printf("------------------------------------------------------------\n");
434 fprintf(f, "------------------------------------------------------------\n");
435 if (!read_from_file)
436 {
437 int nprong = nuse + 1 - neutral_primary;
438 n2gv = (nprong*(nprong-1)/2)*nvg_tot;
439 }
440 printf("Maximal generated vertex multiplicity %d tracks\n", nprongmaxg);
441 fprintf(f, "Maximal generated vertex multiplicity %d tracks\n", nprongmaxg);
442 printf("Maximal reconstructed vertex multiplicity %d tracks\n", nprongmax);
443 fprintf(f, "Maximal reconstructed vertex multiplicity %d tracks\n", nprongmax);
444 int nvgmsum = 0;
445 int nvgoodmsum = 0;
446 int nvgoodmgsum = 0;
447 printf("------------------------------------------------------------\n");
448 fprintf(f, "------------------------------------------------------------\n");
449 for (int i=2; (i<=nprongmaxg) && nvg_tot; i++)
450 {
451 nvgmsum += nvgm_tot[i];
452 nvgoodmsum += nvgoodm_tot[i];
453 nvgoodmgsum += nvgoodmg_tot[i];
454 if (nvgood_tot[i] <= 0) continue;
455 float vgood_eff = (float)nvgood_tot[i]/nvg_tot;
456 float vgooda_eff = 0.;
457 if (nvgm_tot[i]) vgooda_eff = (float)nvgood_tot[i]/nvgm_tot[i];
458 if (i>2) printf("-----\n");
459 printf("Total %d-track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
460 i, vgood_eff*100., vgooda_eff*100.);
461 fprintf(f,"Total %d-Track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
462 i, vgood_eff*100., vgooda_eff*100.);
463 float vgoodm_eff = (float)nvgoodm_tot[i]/nvg_tot;
464 vgooda_eff = 0.;
465 if (nvgm_tot[i]) vgooda_eff = (float)nvgoodm_tot[i]/nvgm_tot[i];
466 printf("Match %d-Track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
467 i, vgoodm_eff*100., vgooda_eff*100.);
468 fprintf(f,"Match %d-Track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
469 i, vgoodm_eff*100., vgooda_eff*100.);
470 float vgoodmg_eff = (float)nvgoodmg_tot[i]/nvg_tot;
471 vgooda_eff = 0.;
472 if (nvgm_tot[i]) vgooda_eff = (float)nvgoodmg_tot[i]/nvgm_tot[i];
473 printf("Right %d-Track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
474 i, vgoodmg_eff*100., vgooda_eff*100.);
475 fprintf(f,"Right %d-Track vertexes finding efficiency %6.1f%% (%6.1f%%)\n",
476 i, vgoodmg_eff*100., vgooda_eff*100.);
477 }
478 printf("------------------------------------------------------------\n");
479 fprintf(f, "------------------------------------------------------------\n");
480// printf("nvg_tot = %d, nvgmsum = %d, nvgoodmsum = %d, nvgoodmt_tot = %d, nvgoodmgsum = %d\n",
481// nvg_tot, nvgmsum, nvgoodmsum, nvgoodmt_tot, nvgoodmgsum);
482 if (neg_tot)
483 {
484 printf("Primary vertex finding efficiency %6.1f%% (%6.1f%%)\n",
485 (float)negood_tot/neg_tot*100., (float)nvgoodmgsum/neg_tot*100.);
486 fprintf(f, "Primary vertex finding efficiency %6.1f%% (%6.1f%%)\n",
487 (float)negood_tot/neg_tot*100., (float)nvgoodmgsum/neg_tot*100.);
488 }
489 printf("------------------------------------------------------------\n");
490 fprintf(f, "------------------------------------------------------------\n");
491 fclose(f);
492 f = 0;
493 return;
494}
int n2gv
Definition: RecDispMC_new.C:160
int negood_tot
Definition: RecDispMC_new.C:143
float RightRatioMin
Definition: RecDispMC_new.C:58

◆ read_events_from_file()

int read_events_from_file ( int  ne,
float *  fractbkg,
float  vlim[4],
float  vzlim[2] 
)

545{
546 int retval = 0;
547 float VTx;
548 float VTy;
549 float VTz;
550 float zlimt[2];
551 EdbVertex *vedb = 0;
552 EdbTrackP *tr = 0;
553 int numt = 0, ntrv = 0, indv, gcode, nitem;
554 float TMass, Pt, TXt, TYt;
555 int iiv = 0;
556 while (iiv == 0)
557 {
558 for (int iv = 0; iv < ne; iv++)
559 {
560 // read vertex line: vert number, multiplicity, coordinates
561 nitem = fscanf(fmcdata, "%d %d %f %f %f\n", &indv, &ntrv, &VTx, &VTy, &VTz);
562 if (nitem <= 0 && fmc1steof && evcount == 0)
563 {
564 fmc1steof = false;
565 rewind(fmcdata);
566 // re-read vertex line: vert number, multiplicity, coordinates
567 nitem = fscanf(fmcdata, "%d %d %f %f %f\n", &indv, &ntrv, &VTx, &VTy, &VTz);
568 if (nitem <= 0)
569 {
570 retval = 1;
571 *fractbkg = (float)evcount/ne;
572 iiv = -1;
573 break;
574 }
575 }
576 else if ( nitem <= 0 )
577 {
578 retval = 1;
579 *fractbkg = (float)evcount/ne;
580 iiv = -1;
581 break;
582 }
584 {
585 // skip event with low multiplicity
586 for (int it = 0; it < ntrv; it++)
587 {
588 fscanf(fmcdata, "%d %f %f %f %f\n", &gcode, &TMass, &Pt, &TXt, &TYt);
589 }
590 continue;
591 }
593 {
594 // generate vertex position into fiducial volume
595 VTx = vlim[0] + (vlim[2] - vlim[0])*gRandom->Rndm();
596 VTy = vlim[1] + (vlim[3] - vlim[1])*gRandom->Rndm();
597 VTz = vzlim[0] + (vzlim[1] - vzlim[0])*gRandom->Rndm();
598 }
599 evcount++;
600 vedb = new EdbVertex();
601 vedb->SetXYZ(VTx, VTy, VTz);
602 int ntrvreal = 0;
603 for (int it = 0; it < ntrv; it++)
604 {
605 // read track parameters: Geant_code, mass, momentum, slopes
606 fscanf(fmcdata, "%d %f %f %f %f\n", &gcode, &TMass, &Pt, &TXt, &TYt);
607 tr = new EdbTrackP();
608 tr->Set(numt++, VTx, VTy, TXt, TYt, 1, iiv+1);
609 tr->SetZ(VTz);
610 tr->SetP(Pt);
611 tr->SetM(TMath::Abs(TMass));
612 if (TMass >= 0.)
613 {
614 zlimt[0] = VTz;
615 zlimt[1] = 100000.;
616 }
617 else
618 {
619 zlimt[0] = VTz;
620 zlimt[1] = -1000.;
621 }
622 // generate segments
623 gener->TrackMC( zlimt, brick.lim, *tr, eloss_flag, ProbGap);
624 // reject tracks with one segment only
625 if (tr->N() >= 2)
626 {
627 gener->AddTrack(tr);
628 if (TMass < 0.)
629 vedb->AddTrack(tr, 0);
630 else
631 vedb->AddTrack(tr, 1);
632 ntrvreal++;
633 ntrgv_tot++;
634 }
635 else
636 {
637 if (tr->N())
638 {
639 tr->GetSegment(0)->SetFlag(-1);
640 }
641 delete tr;
642 tr = 0;
643 }
644 }
645 if (ntrvreal == 0)
646 {
647 // reject vertex with no "good" tracks
648 delete vedb;
649 vedb = 0;
650 }
651 else if (ntrvreal == 1)
652 {
653 // reject vertex with no one track only
654 delete vedb;
655 vedb = 0;
656 if (indv == 1)
657 {
658 // primary vertex
659 if (tr)
660 {
661 ntrgv_tot--;
662 gener->eTracks->Remove(tr);
663 delete tr;
664 tr = 0;
665 }
666 }
667 if (tr)
668 {
669 tr->SetFlag(0);
670 ntrgv_tot--;
671 }
672 }
673 else
674 {
675 // accept vertex
676 vedb->SetFlag(indv);
678 iiv++;
679 if (indv == 1) neg_tot++;
680 n2gv += (ntrvreal*(ntrvreal-1)/2);
681 nvgm_tot[ntrvreal]++;
682 if (ntrvreal > nprongmaxg) nprongmaxg = ntrvreal;
683 }
684 }
685 if (iiv < 0) break;
686 }
687 return retval;
688}
int primary_vertex_ntracks_min
Definition: RecDispMC_new.C:24
EdbVertex * vedb
Definition: RecDispMC_new.C:118
bool regenerate_vertex_xyz
Definition: RecDispMC_new.C:27
bool fmc1steof
Definition: RecDispMC_new.C:164
float TMass[500]
Definition: RecDispNU.C:109
float VTz[500]
Definition: RecDispNU.C:104
float VTy[500]
Definition: RecDispNU.C:104
float Pt[500]
Definition: RecDispNU.C:99
float TXt[500]
Definition: RecDispNU.C:100
float TYt[500]
Definition: RecDispNU.C:101
float VTx[500]
Definition: RecDispNU.C:104
void TrackMC(float zlim[2], float lim[4], EdbTrackP &tr, int eloss_flag=0, float PGap=0.)
Definition: EdbPVGen.cxx:389
void AddVertex(EdbVertex *vtx)
Definition: EdbPVGen.h:54
void AddTrack(EdbTrackP *track)
Definition: EdbPVGen.h:49
void SetFlag(int flag=0)
Definition: EdbVertex.h:158
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157

◆ rec_all()

void rec_all ( )

766{
767 // tracks and vertex reconstruction (track finding and fitting, vertex finding and fitting)
768
769 int numrect[10000];
770 float xg, yg, zg, txg, tyg, pg;
771 int zpos;
772 Vertex *v;
773 EdbVertex *edbv, *edbv1, *edbv2, *edbvg
774 EdbTrackP *tr = 0;
775 EdbTrackP *trg = 0;
776 EdbSegP *s = 0;
777 float p;
778
779
780 int nvg = 0;
781 if (gener->eVTX) nvg = gener->eVTX->GetEntries();
782 int ntrg = 0;
783 if (gener->eTracks) ntrg = gener->eTracks->GetEntries();
784
785 nvg_tot += nvg;
786 ntrg_tot += ntrg;
787
788 // link microtracks
789 ali->Link();
791
792 printf("------------------------------------------------------------\n");
793 printf("%d generated vertexes\n", nvg);
794 printf("%d generated tracks\n", ntrg);
795 fprintf(f," %6d generated vertexes\n", nvg);
796 fprintf(f," %6d generated tracks\n", ntrg);
797
798 // make track candidates
799
800 if (mc_make_tracks)
801 {
802 ali->eTracks = new TObjArray();
804 }
805 else
806 ali->MakeTracks(2, 0);
807
808 int itrg = 0;
809 int nsegmatch = 0;
810 int ntr = 0;
811 if (ali->eTracks) ntr = ali->eTracks->GetEntries();
812 // loop for tracks momentum and momentum error setting
813 for (int itr=0; itr<ntr; itr++) {
814 tr = (EdbTrackP*)(ali->eTracks->At(itr));
815 trg = 0;
816 if (ntrg)
817 {
818 itrg = tr->GetSegmentsMCTrack(nsegmatch);
819 if (itrg >= 0 && itrg < ntrg)
820 {
821 trg = (EdbTrackP*)(gener->eTracks->At(itrg));
822 p = trg->P();
823 if (dpp != 0.) tr->SetErrorP(p*p*dpp*dpp);
824 else tr->SetErrorP(p*p*0.2*0.2);
825 tr->GetSegmentFirst()->SetErrorP(p*p*0.2*0.2);
826 tr->GetSegmentLast()->SetErrorP(p*p*0.2*0.2);
827 if (use_mc_momentum)
828 {
829 p = p*(1.+dpp*gRandom->Gaus());
830 if (p < 0.050) p = 0.050;
831 }
832 else
833 {
834 p = 0.;
835 }
836 tr->SetP(p);
837 }
838 }
839 }
840
841 fprintf(f," %6d tracks found after track making\n", ntr);
842
843 float mpar = -1.;
844 if (use_mc_mass)
845 mpar = -1.;
846 else
847 mpar = 0.;
848 // fit tracks
849 ali->FitTracks(0., mpar, gener->eTracks, design);
850 ali->FillCell(50,50,0.015,0.015);
851
852 // merge tracks
853 for (int i=0; i<10; i++)
854 if (ali->PropagateTracks(brick.plates-1,2,ProbMinP, 3) < 1) break;
855
856 ntr = 0;
857 if (ali->eTracks) ntr = ali->eTracks->GetEntries();
858
859 // clear some counters
860 int ntrgood = 0;
861 int ntrgood_r = 0;
862 int negflag = 0;
863 int notmatched = 0;
864 int nreject_prob = 0;
865 int nreject_nseg = 0;
866 int ntrgoodb = 0;
867 int ntrgoodb_r = 0;
868 double right_ratio = 0.;
869 float pro = 0.;
870
871 // loop on tracks for count statistic and hists filling
872
873 for(int itr=0; itr<ntr; itr++) {
874 tr = (EdbTrackP*)(ali->eTracks->At(itr));
875 if (tr->Flag()<0)
876 {
877 // count "broken" tracks (at track merging procedure)
878 negflag++;
879 continue;
880 }
881 if (hp[11]) hp[11]->Fill(tr->N());
882 if (tr->N()<nsegMin)
883 {
884 // count too short tracks
885 nreject_nseg++;
886 continue;
887 }
888 trg = 0;
889 if (ntrg)
890 {
891 // find corresponding generated track
892 itrg = tr->GetSegmentsMCTrack(nsegmatch);
893 if (itrg >= 0 && itrg < ntrg)
894 {
895 trg = (EdbTrackP*)(gener->eTracks->At(itrg));
896 }
897 }
898 if (trg && ((pro = tr->Prob()) < 0.9999))
899 {
900 // fill probability hist (reject "one-segment" tracks (too high MS)
901 hp[17]->Fill(pro);
902 }
903 if (tr->Prob()<ProbMinT)
904 {
905// ang = TMath::ACos(1./(1.+tr->TX()*tr->TX()+tr->TY()*tr->TY()))*1000.;
906// printf("Track ID = %d, N = %d Prob = %f X = %f Y = %f Z = %f\n TX = %f TY = %f P = %f M = %f\n",
907// tr->ID(), tr->N(), tr->Prob(), tr->X(), tr->Y(), tr->Z(),
908// tr->TX(), tr->TY(), tr->P(), tr->M());
909// hp[19]->Fill(ang);
910 // count low probability tracks
911 nreject_prob++;
912 continue;
913 }
914 if (ntrg)
915 {
916 if (trg)
917 {
918 if (trg->Flag() == 0) // background track
919 {
920 // count tracks matched to MC (cosmic)
921 ntrgoodb++;
922 right_ratio = (double)nsegmatch/tr->N();
923 if (right_ratio >= RightRatioMin)
924 {
925 // count tracks matched to MC with high "right" segments
926 // contamination (cosmic tracks)
927 ntrgoodb_r++;
928 }
929 hp[16]->Fill(right_ratio);
930
931 }
932 else if (trg->Flag() <= nvg) // track at vertex
933 {
934 // count tracks matched to MC (tracks at vertexes)
935 ntrgood++;
936 right_ratio = (double)nsegmatch/tr->N();
937 if (right_ratio >= RightRatioMin)
938 {
939 // count tracks matched to MC with high "right" segments
940 // contamination (tracks at vertexes)
941 ntrgood_r++;
942 }
943 hp[15]->Fill(right_ratio);
944 }
945 }
946 else
947 {
948 // count tracks not matched to MC
949 notmatched++;
950 }
951 }
952 else
953 {
954 // count tracks not matched to MC
955 notmatched++;
956 }
957
958// printf(" tr # %d, N = %d P = %f\n", itr, tr->N(), tr->P());
959// if (tr->N() < nsegMin) continue;
960// if (tr->P() < 0.1) continue;
961
962
963 // fill hist with difference between measured and fitted track coordinate
964 if (hp[12]) hp[12]->Fill(tr->GetSegmentFirst()->X()-tr->GetSegmentFFirst()->X());
965
966 if (trg != 0)
967 {
968 DE_MC = trg->DE();
969 DE_FIT = tr->DE();
970 // fill hist with difference between estimated and
971 // generated track energy losses
972 hp[19]->Fill(DE_FIT-DE_MC);
973 // fill hist with relative difference between MS-estimated and
974 // generated track momentum
975// float pms = tr->P_MS(brick.X0, trg->M(), true);
976 float pms = tr->P_MS(brick.X0, trg->M(), false);
977 if (pms > 0.)
978 {
979 hp[23]->Fill((1./pms - 1./trg->P())*trg->P()*100.);
980 }
981 }
982 }
983
984 printf(" %6d tracks found after propagation\n", ntr-negflag);
985 printf(" %6d matched tracks found (at vertexes), %6d with right segs >= %.0f%%\n", ntrgood, ntrgood_r, RightRatioMin*100.);
986 printf(" %6d matched tracks found (cosmic ), %6d with right segs >= %.0f%%\n", ntrgoodb, ntrgoodb_r, RightRatioMin*100.);
987 printf(" ( %4d tracks not matched with generated ones)\n", notmatched);
988 printf(" ( %4d tracks with nseg < %d )\n", nreject_nseg, nsegMin);
989 printf(" ( %4d tracks with prob < %6.3f )\n", nreject_prob, ProbMinT);
990 fprintf(f," %6d tracks found after propagation\n", ntr-negflag);
991 fprintf(f," %6d matched tracks found (at vertexes), %6d with right segs >= %.0f%%\n", ntrgood, ntrgood_r, RightRatioMin*100.);
992 fprintf(f," %6d matched tracks found (cosmic ), %6d with right segs >= %.0f%%\n", ntrgoodb, ntrgoodb_r, RightRatioMin*100.);
993 fprintf(f," ( %4d tracks not matched with generated ones)\n", notmatched);
994 fprintf(f," ( %4d tracks with nseg < %d )\n", nreject_nseg, nsegMin);
995 fprintf(f," ( %4d tracks with prob < %6.3f )\n", nreject_prob, ProbMinT);
996
997 ntr_tot += ntr-negflag;
998 ntrgood_tot += ntrgood;
999 ntrgoodb_tot += ntrgoodb;
1000 ntrgood_r_tot += ntrgood_r;
1001 ntrgoodb_r_tot += ntrgoodb_r;
1002
1003
1004
1005 if (hp[10]) hp[10]->Fill(ntr-negflag);
1006
1007 bool usemom = false;
1008 if ( neutral_primary && (nuse == npi) && !read_from_file ) usemom = true;
1009
1011 gEVR->eVTX = ali->eVTX;
1012
1013 // build 2-tracks vertexes
1014 int nvtx = gEVR->FindVertex();
1015
1016 // clearsome counters
1017 int nvgood[100];
1018 int nvgoodm[100];
1019 for (int i=0; i<100; i++) nvgood[i] = 0;
1020 for (int i=0; i<100; i++) nvgoodm[i] = 0;
1021 for (int i=0; i<10000; i++) numrect[i] = 0;
1022
1023 int nadd = 0, npg = 0;
1024 int nprong = nuse + 1 - neutral_primary;
1025
1026 // build N-tracks vertexes
1027 if (nprong > 2 || read_from_file) nadd = gEVR->ProbVertexN();
1028
1029 // loop on found vertexes, search of corresponding generated vertex,
1030 // count some statistics, fill hists
1031 int ivg = 0, nvgoodt = 0, nvgoodmt = 0, np = 0, ntold = 0;
1032 for (int i=0; i<nvtx; i++)
1033 {
1034 edbv = (EdbVertex *)((ali->eVTX)->At(i));
1035 if (edbv)
1036 {
1037 if (edbv->Flag() == -10) continue;
1038 v = edbv->V();
1039 if (v)
1040 {
1041 if (v->valid())
1042 {
1043 if ((np = v->ntracks()) >= 2)
1044 {
1045 // reconstructed vertex with "np" tracks
1046 nvgood[np]++;
1047 nvgoodt++;
1048 if (np == 5) printf("Found 5-prongs rec vert (id = %d)!\n",i);
1049 if (np > nprongmax) nprongmax = np;
1050 tr = edbv->GetTrack(0);
1051 // search corresponding generated vertex for 1st track
1052 int ivg0 = -1000000;
1053 if(tr) ivg0 = tr->GetSegmentsMCTrack(nsegmatch);
1054 if (ivg0 >= 0 && ivg0 < ntrg)
1055 ivg0 = ((EdbTrackP*)(gener->eTracks->At(ivg0)))->Flag();
1056 else
1057 ivg0 = -1000000;
1058 ivg = -2000000;
1059 if (np == 5 && ivg0 > 0) printf("Found 5-prongs vert 1 tr (%d) ivg %d\n", tr->ID(), ivg0);
1060 // check that all track has the same generated vertex
1061 for (int j=1; j<edbv->N() && ivg0>0; j++)
1062 {
1063 tr = edbv->GetTrack(j);
1064 int ivg = -2000000;
1065 if(tr) ivg = tr->GetSegmentsMCTrack(nsegmatch);
1066 if (ivg >= 0 && ivg < ntrg)
1067 ivg = ((EdbTrackP*)(gener->eTracks->At(ivg)))->Flag();
1068 else
1069 {
1070 ivg = -2000000;
1071 break;
1072 }
1073 if (np == 5 ) printf("Found 5-prongs vert %d tr (%d) ivg %d\n", j+1, tr->ID(), ivg);
1074 if (ivg != ivg0) break;
1075// if (np == 5 && ivg > 0) printf("Found 5-prongs vert %d tr good!\n", j+1);
1076 }
1077 if (ivg != ivg0) continue;
1078 if (ivg <= 0) continue;
1079 if (ivg > nvg) continue;
1080 // corresponding generated vertex found!
1081 if (np < rec_primary_vertex_ntracks_min) continue;
1082 if (np == 5) printf("Found 5-prongs gen vert!\n");
1083 edbvg = (EdbVertex *)((gener->eVTX)->At(ivg-1));
1084 npg = edbvg->N();
1085 ntold = numrect[ivg];
1086 // count reconstructed vertex only one time for
1087 // the same generated vertex
1088 if (ntold == 0)
1089 {
1090 nvgoodmg_tot[npg]++;
1091 numrect[ivg] = npg;
1092 }
1093 nvgoodmt++;
1094 nvgoodmt_tot++;
1095 nvgoodm[np]++;
1096 // count primary vertexes (i.e. events)
1097 if (!read_from_file && ntold == 0) negood_tot++;
1098 else if (edbvg->Flag() == 1 && ntold == 0) negood_tot++;
1099 vxo = edbv->VX();
1100 vyo = edbv->VY();
1101 vzo = edbv->VZ();
1102 vxg = edbvg->X();
1103 vyg = edbvg->Y();
1104 vzg = edbvg->Z();
1105 FillHistsV(*edbv, *v);
1106 }
1107 }
1108 }
1109 }
1110 }
1111 if (hp[9]) hp[9]->Fill(nvgoodmt);
1112 for (int i=2; i<=nprongmax; i++)
1113 {
1114 if (nvgood[i] <= 0) continue;
1115 printf("%6d %d-tracks vertexes found (%d matched to MC)\n", nvgood[i], i, nvgoodm[i]);
1116 fprintf(f,"%6d %d-tracks vertexes found (%d matched to MC)\n", nvgood[i], i, nvgoodm[i]);
1117 nvgood_tot[i] += nvgood[i];
1118 nvgoodm_tot[i] += nvgoodm[i];
1119 }
1120 if (nvtx)
1121 {
1122 int nlv = gEVR->LinkedVertexes();
1123 printf("------------------------------------------------------------\n");
1124 printf("%d linked vertexes found\n", nlv);
1125 if (nlv)
1126 {
1127 EdbVertex *vl = 0;
1128 EdbVertex *vc = 0;
1129 for(int i=0; i<nvtx; i++)
1130 {
1131 vl = (EdbVertex*)(ali->eVTX->At(i));
1132 if (!vl) continue;
1133 if (vl->Flag()) > 2)
1134 {
1135 vc = vl->GetConnectedVertex(0);
1136 if (!vc) continue;
1137 if (vc->ID() > vl->ID())
1138 {
1139// vl->Print();
1140// vc->Print();
1141 }
1142 }
1143 }
1144 }
1146 {
1147 int nn = gEVR->VertexNeighbor(1000., 2, 10000.);
1148 printf("------------------------------------------------------------\n");
1149 printf("%d neighboring tracks and segments found\n", nn);
1150 }
1151 }
1152}
bool usemom
Definition: RecDispEX.C:20
bool use_mc_mass
Definition: RecDispMC_new.C:23
bool mc_make_tracks
Definition: RecDispMC_new.C:21
bool use_mc_momentum
Definition: RecDispMC_new.C:22
int rec_primary_vertex_ntracks_min
Definition: RecDispMC_new.C:25
double DE_FIT
Definition: RecDispMC_new.C:126
double DE_MC
Definition: RecDispMC_new.C:126
void FillHistsV(EdbVertex &edbv, Vertex &v)
Definition: RecDispMC_new.C:1218
int design
Definition: RecDispMC_new.C:68
bool select_neighborhood
Definition: RecDispMC_new.C:29
int MakeTracksMC(int nsegmin, TObjArray *tracks)
Definition: EdbPVGen.cxx:1046
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
Float_t P() const
Definition: EdbSegP.h:152
Int_t Flag() const
Definition: EdbSegP.h:149
Float_t M() const
Definition: EdbPattern.h:155
Float_t DE() const
Definition: EdbPattern.h:166
Int_t ProbVertexN()
Definition: EdbVertex.cxx:1426
Int_t LinkedVertexes()
Definition: EdbVertex.cxx:1809
Int_t VertexNeighbor(float RadMax=1000., int Dpat=1, float ImpMax=1000000.)
Definition: EdbVertex.cxx:2732
Int_t FindVertex()
Definition: EdbVertex.cxx:1065
Int_t ID() const
Definition: EdbVertex.h:126
Float_t VX() const
Definition: EdbVertex.h:133
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Float_t VY() const
Definition: EdbVertex.h:134
EdbVertex * GetConnectedVertex(int nv)
Definition: EdbVertex.cxx:405
Float_t VZ() const
Definition: EdbVertex.h:135
Definition: VtVertex.hh:88
bool valid() const
is vertex valid?
s
Definition: check_shower.C:55
float X0
Definition: RecDispMC.C:100

◆ Set_Prototype_OPERA_basetrack()

void Set_Prototype_OPERA_basetrack ( EdbScanCond cond)

170{
171 // sigma0 "x, y, tx, ty" at zero angle
172 cond->SetSigma0( seg_s[0], seg_s[1], seg_s[2], seg_s[3] );
173 cond->SetDegrad( 0.2 ); // sigma(tx) = sigma0*(1+degrad*tx)
174 cond->SetBins(20, 20, 10, 10); // bins in [sigma] for checks
175 cond->SetPulsRamp0( 15., 15. ); // in range (Pmin:Pmax) Signal/All is nearly linear
176 cond->SetPulsRamp04( 15., 15. );
177 cond->SetChi2Max( 3.5 );
178 cond->SetChi2PMax( 3.5 );
179 cond->SetRadX0( brick.X0 );
180
181 cond->SetName("Prototype_OPERA_basetrack");
182}
void SetPulsRamp0(float p1, float p2)
Definition: EdbScanCond.h:74
void SetChi2Max(float chi2)
Definition: EdbScanCond.h:83
void SetDegrad(float d)
Definition: EdbScanCond.h:71
void SetSigma0(float x, float y, float tx, float ty)
Definition: EdbScanCond.h:62
void SetBins(float bx, float by, float btx, float bty)
Definition: EdbScanCond.h:65
void SetPulsRamp04(float p1, float p2)
Definition: EdbScanCond.h:75
void SetRadX0(float x0)
Definition: EdbScanCond.h:57
void SetChi2PMax(float chi2)
Definition: EdbScanCond.h:84

Variable Documentation

◆ ali

EdbPVRec* ali =0

◆ arrs

TObjArray* arrs = new TObjArray()

◆ arrs2

TObjArray* arrs2 = new TObjArray()

◆ arrtr

TObjArray* arrtr = new TObjArray()

◆ arrtr2

TObjArray* arrtr2 = new TObjArray()

◆ arrv

TObjArray* arrv = new TObjArray()

◆ arrv2

TObjArray* arrv2 = new TObjArray()

◆ back1_tetamax

float back1_tetamax = 0.35

◆ back2_plim

float back2_plim[2] = {0.5, 5.}

◆ back2_tetamax

float back2_tetamax = 0.25

◆ brick

BRICK brick

◆ charges

int charges[101]

◆ DE_FIT

double DE_FIT

◆ DE_MC

double DE_MC

◆ design

int design = +0

◆ dpp

float dpp = 0.20

◆ ds

EdbDisplay* ds =0

◆ ds2

EdbDisplay* ds2 =0

◆ dz

brick dz = 1290.

◆ eloss_flag

int eloss_flag = 1

◆ evcount

int evcount = 0

◆ f

FILE* f =0

◆ fiducial_border

float fiducial_border = 50000.

◆ fiducial_border_z

float fiducial_border_z = 17000.

◆ fmc1steof

bool fmc1steof = true

◆ fmcdata

FILE* fmcdata =0

◆ gener

EdbPVGen* gener =0

◆ gEVR

EdbVertexRec* gEVR =0

◆ hld1

TObjArray hld1

◆ hld2

TObjArray hld2

◆ hld3

TObjArray hld3

◆ hld4

TObjArray hld4

◆ hlist

TObjArray hlist

◆ hp

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

◆ lim

brick lim[3] = -60000.

◆ mc_make_tracks

bool mc_make_tracks = false

◆ mK

double mK =5.6

◆ momentumK

float momentumK =15.

◆ mP

double mP =0.938

◆ mPi

double mPi =.139

◆ n2gv

int n2gv = 0

◆ neg_tot

int neg_tot = 0

◆ negood_tot

int negood_tot = 0

◆ neutral_primary

int neutral_primary = 1

◆ npi

int npi = 5

◆ nprongmax

int nprongmax = 0

◆ nprongmaxg

int nprongmaxg = 0

◆ nsegMin

int nsegMin = 2

◆ ntall

int ntall = 0

◆ ntr_tot

int ntr_tot = 0

◆ ntrg_tot

int ntrg_tot = 0

◆ ntrgb

int ntrgb = 0

◆ ntrgood_r_tot

int ntrgood_r_tot = 0

◆ ntrgood_tot

int ntrgood_tot = 0

◆ ntrgoodb_r_tot

int ntrgoodb_r_tot = 0

◆ ntrgoodb_tot

int ntrgoodb_tot = 0

◆ ntrgv_tot

int ntrgv_tot = 0

◆ numbricks

int numbricks = 0

◆ nuse

int nuse = 5

◆ nvg_tot

int nvg_tot = 0

◆ nvgm_tot

int nvgm_tot[100]

◆ nvgood_tot

int nvgood_tot[100]

◆ nvgoodm_tot

int nvgoodm_tot[100]

◆ nvgoodmg_tot

int nvgoodmg_tot[100]

◆ nvgoodmt_tot

int nvgoodmt_tot = 0

◆ pDecay

TGenPhaseSpace* pDecay = 0

◆ plates

brick plates = 58

◆ primary_vertex_ntracks_min

int primary_vertex_ntracks_min = 2

◆ PrintN

const unsigned long int PrintN = 100

◆ ProbGap

float ProbGap = 0.10

◆ ProbMinP

float ProbMinP = 0.01

◆ ProbMinT

float ProbMinT = 0.01

◆ ProbMinV

float ProbMinV = 0.01

◆ ProbMinVN

float ProbMinVN = 0.01

◆ read_from_file

bool read_from_file = false

◆ rec_primary_vertex_ntracks_min

int rec_primary_vertex_ntracks_min = 2

◆ regenerate_vertex_xyz

bool regenerate_vertex_xyz = true

◆ rf

TFile* rf =0

◆ RightRatioMin

float RightRatioMin = 0.5

◆ scanCond

EdbScanCond* scanCond =0

◆ seg_s

float seg_s[4] ={1.2, 1.2, 0.0015, 0.0015}

◆ seg_zero

float seg_zero[4] ={.0,.0,.0,.0}

◆ select_neighborhood

bool select_neighborhood = false

◆ use_mc_mass

bool use_mc_mass = false

◆ use_mc_momentum

bool use_mc_momentum = false

◆ vedb

EdbVertex* vedb

◆ vxg

float vxg = 0.

◆ vxo

float vxo = 0.

◆ vxyz

float vxyz[3] = {0., 0., 0.}

◆ vyg

float vyg = 0.

◆ vyo

float vyo = 0.

◆ vzg

float vzg = 0.

◆ vzo

float vzo = 0.

◆ X0

brick X0 = 5810.

◆ z0

brick z0 = 0.