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:786
Definition: EdbDisplay.h:21
void SetArrSegP(TObjArray *arr)
Definition: EdbDisplay.cxx:389
void SetArrTr(TObjArray *arr)
Definition: EdbDisplay.cxx:430
void SetArrV(TObjArray *arrv)
Definition: EdbDisplay.cxx:500
void SetDrawTracks(int opt)
Definition: EdbDisplay.h:97
static EdbDisplay * EdbDisplayExist(const char *title)
Definition: EdbDisplay.cxx:232
int ExtractDataVolumeSegAll(TObjArray &arr)
Definition: EdbPVRec.cxx:2877
TObjArray * eVTX
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:118
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:3027

◆ 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:108
Definition: EdbSegP.h:18
Int_t ID() const
Definition: EdbSegP.h:144
Float_t Z() const
Definition: EdbSegP.h:150
Int_t Flag() const
Definition: EdbVertex.h:47
Int_t Zpos() const
Definition: EdbVertex.h:46
EdbTrackP * GetTrack() const
Definition: EdbVertex.h:50
Definition: EdbVertex.h:68
EdbVTA * GetVTn(int i)
Definition: EdbVertex.h:140
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
Int_t N() const
Definition: EdbVertex.h:121
Int_t Nn() const
Definition: EdbVertex.h:122
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;
728  vzlim[1] = brick.plates*brick.dz - 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)))
754  ProbGap, eloss_flag );
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:949
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
EdbPVRec * ePVR
Definition: EdbVertex.h:206
TList eVTA
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
233  pDecay = K3Pi(momentumK);
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 
249  ali->SetPatternsID();
250  ali->SetCouplesAll();
252 
253  // Create PVGen object
254  gener = new EdbPVGen();
255  // Use the same volume as PVRec
256  gener->SetVolume(vol);
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  {
319  fclose(fmcdata);
320  }
321  else
322  {
323  ntrgv_tot = nprong*nvg_tot;
324  nprongmaxg = nprong;
325  }
326 
327  // log MC results on stdout and logfile
328  print_results();
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
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
TGenPhaseSpace * K3Pi(float p=3.)
Definition: RecDispMC_new.C:1812
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
TTree * t
Definition: check_shower.C:4
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:974
void SetScanCond(EdbScanCond *scan)
Definition: EdbPVRec.h:171
Definition: EdbPattern.h:348
void SetPatternsID()
Definition: EdbPattern.cxx:1763
Definition: EdbScanCond.h:10
float Chi2PMax() const
Definition: EdbScanCond.h:86
Float_t eAbin
Definition: EdbVertex.h:176
Bool_t eUseSegPar
Definition: EdbVertex.h:182
Float_t eImpMax
Definition: EdbVertex.h:179
Float_t eZbin
Definition: EdbVertex.h:175
Float_t eDZmax
Definition: EdbVertex.h:177
Float_t eProbMin
Definition: EdbVertex.h:178
Definition: EdbVertex.h:194
TObjArray * eVTX
Definition: EdbVertex.h:205
TObjArray * eEdbTracks
Definition: EdbVertex.h:204
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:280
void AddPattern(EdbPattern *pat)
Definition: EdbPattern.cxx:1867
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  }
583  if (ntrv < primary_vertex_ntracks_min)
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);
677  gener->AddVertex(vedb);
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();
790  ali->FillTracksCell();
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 
1010  gEVR->eEdbTracks = ali->eTracks;
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  }
1145  if (select_neighborhood)
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: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
Float_t P() const
Definition: EdbSegP.h:149
Int_t Flag() const
Definition: EdbSegP.h:146
Float_t M() const
Definition: EdbPattern.h:160
Float_t DE() const
Definition: EdbPattern.h:171
Int_t ProbVertexN()
Definition: EdbVertex.cxx:1448
Int_t LinkedVertexes()
Definition: EdbVertex.cxx:1831
Int_t VertexNeighbor(float RadMax=1000., int Dpat=1, float ImpMax=1000000.)
Definition: EdbVertex.cxx:2754
Int_t FindVertex()
Definition: EdbVertex.cxx:1087
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:427
Float_t VZ() const
Definition: EdbVertex.h:135
Definition: VtVertex.hh:88
bool valid() const
is vertex valid?
float X0
Definition: RecDispMC.C:100
EdbSegP * s
Definition: tlg2pattern.C:32

◆ 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.