FEDRA emulsion software from the OPERA Collaboration
RecDispMC.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 dst (int numt=-1)
 
void dsv (int numv=-1, int ntrMin=0, float binx=6, float bint=10)
 
void dsvg (int numv=-1, float binx=6, float bint=10)
 
void dsvg2 (int numv=-1, float binx=6, float bint=10)
 
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
 
float AngleAcceptance = 2.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] = {1., 1.}
 
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 = 0
 
int evcount = 0
 
FILE * f =0
 
float fiducial_border = 50000.
 
float fiducial_border_z = 12000.
 
bool fmc1steof = true
 
FILE * fmcdata =0
 
EdbPVGengener = 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.
 
int maxgaps [6] = {0,3,3,6,3,6}
 
bool mc_make_tracks = true
 
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 = true
 
bool use_mc_mass = false
 
bool use_mc_momentum = true
 
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)

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

◆ clear_all()

void clear_all ( )

514 {
515  nvg_tot = 0;
516  ntrg_tot = 0;
517  ntrgb = 0;
518  ntr_tot = 0;
519  ntrgood_tot = 0;
520  ntrgoodb_tot = 0;
521  ntrgood_r_tot = 0;
522  ntrgoodb_r_tot = 0;
523  nvgoodmt_tot = 0;
524  numbricks = 0;
525  ntrgv_tot = 0;
526  nprongmax = 0;
527  nprongmaxg = 0;
528  evcount = 0;
529  for (int i=0; i<100; i++)
530  {
531  nvgm_tot[i] = 0;
532  nvgood_tot[i] = 0;
533  nvgoodm_tot[i] = 0;
534  nvgoodmg_tot[i] = 0;
535  }
536 
537  hlist.Clear();
538  hld1.Clear();
539  hld2.Clear();
540  hld3.Clear();
541  hld4.Clear();
542 
543  if (ali)
544  {
545  delete ali;
546  ali = 0;
547  }
548  if (gener)
549  {
550  delete gener;
551  gener = 0;
552  }
553  if (pDecay)
554  {
555  delete pDecay;
556  pDecay = 0;
557  }
558  return;
559 }
int ntrgood_tot
Definition: RecDispMC.C:166
int ntrgoodb_r_tot
Definition: RecDispMC.C:172
int ntr_tot
Definition: RecDispMC.C:165
int nvgoodmt_tot
Definition: RecDispMC.C:180
int ntrgb
Definition: RecDispMC.C:162
int nvg_tot
Definition: RecDispMC.C:157
EdbPVRec * ali
Definition: RecDispMC.C:122
int ntrg_tot
Definition: RecDispMC.C:160
int numbricks
Definition: RecDispMC.C:142
int nvgood_tot[100]
Definition: RecDispMC.C:174
TGenPhaseSpace * pDecay
Definition: RecDispMC.C:187
int ntrgoodb_tot
Definition: RecDispMC.C:168
EdbPVGen * gener
Definition: RecDispMC.C:123
int nprongmaxg
Definition: RecDispMC.C:183
int nvgm_tot[100]
Definition: RecDispMC.C:158
int nprongmax
Definition: RecDispMC.C:182
int ntrgood_r_tot
Definition: RecDispMC.C:170
int ntrgv_tot
Definition: RecDispMC.C:161
int nvgoodm_tot[100]
Definition: RecDispMC.C:176
int nvgoodmg_tot[100]
Definition: RecDispMC.C:178
int evcount
Definition: RecDispMC.C:184

◆ ClearHistsV()

void ClearHistsV ( )

1389 {
1390  for(int i=0; hp[i]; i++) {
1391  hp[i]->Clear();
1392  }
1393 }

◆ d()

void d ( )

1395 { DrawHistsV();}
void DrawHistsV()
Definition: RecDispMC.C:1314

◆ DrawHistsV()

void DrawHistsV ( )

1315 {
1316  char title[128];
1317 
1318  sprintf(title,"Number of reconstructed vertexs (%d generated)",nvg_tot);
1319  if (hp[9]) hp[9]->SetTitle(title);
1320  sprintf(title,"Number of reconstructed tracks (%d generated)",ntrg_tot);
1321  if (hp[10]) hp[10]->SetTitle(title);
1322 
1323  TCanvas *cv1 = new TCanvas("Vertex_reconstruction_1","MC Vertex reconstruction", 760, 760);
1324  DrawHlist(cv1, hld1);
1325 
1326  TCanvas *cv2 = new TCanvas("Vertex_reconstruction_2","Vertex reconstruction (tracks hists)", 600, 760);
1327  DrawHlist(cv2, hld2);
1328 
1329  TCanvas *cv3 = new TCanvas("Vertex_reconstruction_3","Vertex reconstruction (eff hists)", 600, 760);
1330  DrawHlist(cv3, hld3);
1331 
1332  TCanvas *cv4 = new TCanvas("Vertex_reconstruction_4","Vertex reconstruction (ntracks)", 600, 760);
1333  DrawHlist(cv4, hld4);
1334 }
void DrawHlist(TCanvas *c, TObjArray h)
Definition: RecDispMC.C:1336
TCanvas * cv4
Definition: RecDispMC_Profiles.C:63
TCanvas * cv1
Definition: RecDispMC_Profiles.C:63
TCanvas * cv2
Definition: RecDispMC_Profiles.C:63
TCanvas * cv3
Definition: RecDispMC_Profiles_new.C:70
new TCanvas()

◆ DrawHlist()

void DrawHlist ( TCanvas c,
TObjArray  h 
)

1337 {
1338  int n = h.GetEntries();
1339  if (n < 2)
1340  {
1341  }
1342  else if (n < 3)
1343  {
1344  c->Divide(1,2);
1345  }
1346  else if (n < 4)
1347  {
1348  c->Divide(1,3);
1349  }
1350  else if (n < 5)
1351  {
1352  c->Divide(2,2);
1353  }
1354  else if (n < 6)
1355  {
1356  c->Divide(2,3);
1357  }
1358  else if (n < 7)
1359  {
1360  c->Divide(2,3);
1361  }
1362  else if (n < 8)
1363  {
1364  c->Divide(2,4);
1365  }
1366  else if (n < 9)
1367  {
1368  c->Divide(2,4);
1369  }
1370  else if (n < 10)
1371  {
1372  c->Divide(3,3);
1373  }
1374  else if (n < 11)
1375  {
1376  c->Divide(2,5);
1377  }
1378  else
1379  {
1380  c->Divide(3,5);
1381  }
1382  for(int i=0; i<n; i++) {
1383  c->cd(i+1);
1384  if (h.At(i)) h.At(i)->Draw();
1385  }
1386 }

◆ dsall()

void dsall ( )

1402 {
1403 
1404  arrs->Clear();
1405 
1407 
1408  gStyle->SetPalette(1);
1409 
1410  const char *title = "display-segments";
1411  if(!EdbDisplay::EdbDisplayExist(title))
1412  ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1413 
1414  ds->SetArrSegP( arrs );
1415  if (ali->eTracks) ds->SetArrTr( ali->eTracks );
1416  if (ali->eVTX) ds->SetArrV( ali->eVTX );
1417  ds->SetDrawTracks(3);
1418  ds->Draw();
1419 
1420 }
TObjArray * arrs
Definition: RecDispMC.C:128
EdbDisplay * ds
Definition: RecDispMC.C:1398
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

◆ dst()

void dst ( int  numt = -1)

1423 {
1424 
1425  arrs->Clear();
1426  arrtr->Clear();
1427 
1428  if (ali->eTracks)
1429  {
1430  int ntr = ali->eTracks->GetEntries();
1431  if (!ntr) return;
1432  }
1433  else return;
1434 
1435  int it0,it1;
1436  if (numt == -1)
1437  {
1438  it0 = 0;
1439  it1 = ntr;
1440  }
1441  else
1442  {
1443  it0 = numt;
1444  it1 = numt+1;
1445  }
1446 
1447  //if (numt < 0) ali->ExtractDataVolumeSegAll( *arrs );
1448 
1449  gStyle->SetPalette(1);
1450  const char *title = "display-tracks";
1451  if(!EdbDisplay::EdbDisplayExist(title))
1452  ds=new EdbDisplay(title,-60000.,60000.,-60000., 60000., 0.,80000.);
1453 
1454  EdbTrackP *track = 0;
1455  for(int i=it0; i<it1; i++) {
1456  track = (EdbTrackP *)(ali->eTracks->At(i));
1457  if(track->Flag()<0) continue;
1458  if (track->Prob() < ProbMinT) continue;
1459  arrtr->Add(track);
1460  }
1461  ds->SetArrSegP( arrs );
1462  ds->SetArrTr(arrtr);
1463  ds->SetDrawTracks(4);
1464  ds->Draw();
1465 
1466 }
TObjArray * arrtr
Definition: RecDispMC.C:129
float ProbMinT
Definition: RecDispMC.C:87
Definition: EdbPattern.h:118
Definition: bitview.h:14

◆ dsv()

void dsv ( int  numv = -1,
int  ntrMin = 0,
float  binx = 6,
float  bint = 10 
)
1470 {
1471  if(!ali->eVTX) return;
1472  if(!ali->eTracks) return;
1473 
1474  arrs->Clear();
1475  arrtr->Clear();
1476  arrv->Clear();
1477  //if(ds) delete ds;
1478 
1479  int nvtx = ali->eVTX->GetEntries();
1480  EdbVertex *v = 0;
1481  int iv0,iv1;
1482  if (numv <0 )
1483  {
1484  iv0 = 0;
1485  iv1 = nvtx;
1486  }
1487  else
1488  {
1489  iv0 = numv;
1490  iv1 = numv+1;
1491  }
1492 
1493  if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs );
1494 
1495  for(int iv=iv0; iv<iv1; iv++) {
1496  v = (EdbVertex *)(ali->eVTX->At(iv));
1497  if(!v) continue;
1498  if(v->N()<ntrMin) continue;
1499  if(v->Flag() == -10) continue;
1500  arrv->Add(v);
1501 
1502  int ntr = v->N();
1503  printf("Vertex %d, number of tracks %d\n", iv, ntr);
1504  for(int i=0; i<ntr; i++) {
1505  EdbTrackP *track = v->GetTrack(i);
1506  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1507  track->ID(), track->Z(), track->N(), v->Zpos(i));
1508  arrtr->Add(track);
1509  }
1510 
1511  if (numv == -1) continue;
1512 
1513  int nntr = v->Nn();
1514  for(int i=0; i<nntr; i++) {
1515  if (v->GetVTn(i)->Flag() == 1)
1516  {
1517  EdbSegP *seg = (EdbSegP *)(v->GetVTn(i)->GetTrack());
1518  if (!seg) continue;
1519  arrs->Add(seg);
1520  printf(" Neighboor Segment ID %d, Z = %f\n",
1521  seg->ID(), seg->Z());
1522  }
1523  else if (v->GetVTn(i)->Flag() == 0)
1524  {
1525  EdbTrackP *track = (EdbTrackP *)v->GetVTn(i)->GetTrack();
1526  if (!track) continue;
1527  arrtr->Add(track);
1528  printf(" Neighboor Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1529  track->ID(), track->Z(), track->N(), v->GetVTn(i)->Zpos());
1530  }
1531  }
1532  }
1533 
1534  gStyle->SetPalette(1);
1535 
1536  const char *title = "display-vertexes";
1537  if(!(EdbDisplay::EdbDisplayExist(title)))
1538  ds=new EdbDisplay(title,-60000.,60000.,-60000., 60000., 0.,80000.);
1539 
1540 // ds->SetPVR( ali );
1541  ds->SetArrSegP( arrs );
1542  ds->SetArrTr( arrtr );
1543  ds->SetArrV( arrv );
1544  if (numv == -10)
1545  ds->SetDrawTracks(3);
1546  else
1547  ds->SetDrawTracks(4);
1548  ds->SetDrawVertex(1);
1549  ds->Draw();
1550 
1551 }
TObjArray * arrv
Definition: RecDispMC.C:130
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,
float  binx = 6,
float  bint = 10 
)
1554 {
1555  if(!gener->eVTX) return;
1556 
1557  arrs->Clear();
1558  arrtr->Clear();
1559  arrv->Clear();
1560 
1561  EdbSegP *seg=0; // direction
1562 
1563  int ntrMin=2;
1564  int nvtx = gener->eVTX->GetEntries();
1565  EdbVertex *v = 0;
1566  int iv0,iv1;
1567  if (numv < 0)
1568  {
1569  iv0 = 0;
1570  iv1 = nvtx;
1571  }
1572  else
1573  {
1574  iv0 = numv;
1575  iv1 = numv+1;
1576  }
1577 
1578  if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs );
1579 
1580  for(int iv=iv0; iv<iv1; iv++) {
1581  v = (EdbVertex *)(gener->eVTX->At(iv));
1582  if(!v) continue;
1583  if(v->N()<ntrMin) continue;
1584 
1585  arrv->Add(v);
1586 
1587  int ntr = v->N();
1588  printf("Vertex %d, number of tracks %d\n", iv, ntr);
1589  for(int i=0; i<ntr; i++) {
1590  EdbTrackP *track = v->GetTrack(i);
1591  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1592  track->ID(), track->Z(), track->N(), v->Zpos(i));
1593  arrtr->Add(track);
1594  }
1595 
1596  }
1597 
1598  gStyle->SetPalette(1);
1599 
1600  const char *title = "display-generated-vertexes";
1601  if(!EdbDisplay::EdbDisplayExist(title))
1602  ds=new EdbDisplay(title, -60000.,60000.,-60000., 60000., 0.,80000.);
1603 
1604  ds->SetArrSegP( arrs );
1605  ds->SetArrTr( arrtr );
1606  ds->SetArrV( arrv );
1607  if (numv == -10)
1608  ds->SetDrawTracks(3);
1609  else
1610  ds->SetDrawTracks(4);
1611  ds->SetDrawVertex(1);
1612  ds->Draw();
1613 }
TObjArray * eVTX
Definition: EdbPVGen.h:28

◆ dsvg2()

void dsvg2 ( int  numv = -1,
float  binx = 6,
float  bint = 10 
)
1616 {
1617  if(!gener->eVTX) return;
1618 
1619  if(ds2) delete ds2;
1620  arrs2->Clear();
1621  arrtr2->Clear();
1622  arrv2->Clear();
1623 
1624  EdbSegP *seg=0; // direction
1625 
1626  int ntrMin=2;
1627  int nvtx = gener->eVTX->GetEntries();
1628  EdbVertex *v = 0;
1629  int iv0,iv1;
1630  if (numv < 0)
1631  {
1632  iv0 = 0;
1633  iv1 = nvtx;
1634  }
1635  else
1636  {
1637  iv0 = numv;
1638  iv1 = numv+1;
1639  }
1640  if (numv == -10) ali->ExtractDataVolumeSegAll( *arrs2 );
1641  for(int iv=iv0; iv<iv1; iv++) {
1642  v = (EdbVertex *)(gener->eVTX->At(iv));
1643  if(!v) continue;
1644  if(v->N()<ntrMin) continue;
1645 
1646  arrv2->Add(v);
1647 
1648  int ntr = v->N();
1649  printf("Vertex %d, number of tracks %d\n", iv, ntr);
1650  for(int i=0; i<ntr; i++) {
1651  EdbTrackP *track = v->GetTrack(i);
1652  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
1653  track->ID(), track->Z(), track->N(), v->Zpos(i));
1654  arrtr2->Add(track);
1655  }
1656  }
1657 
1658  gStyle->SetPalette(1);
1659 
1660  ds2=new EdbDisplay("display-generated-vertexes-2",-60000.,60000.,-60000., 60000., 0.,80000.);
1661 
1662  ds2->SetArrSegP( arrs2 );
1663  ds2->SetArrTr( arrtr2 );
1664  ds2->SetArrV( arrv2 );
1665  if (numv == -10)
1666  ds->SetDrawTracks(3);
1667  else
1668  ds->SetDrawTracks(4);
1669  ds2->SetDrawVertex(1);
1670  ds2->Draw();
1671 }
TObjArray * arrs2
Definition: RecDispMC.C:131
EdbDisplay * ds2
Definition: RecDispMC.C:1399
TObjArray * arrv2
Definition: RecDispMC.C:133
TObjArray * arrtr2
Definition: RecDispMC.C:132

◆ FillHistsGen()

void FillHistsGen ( )

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

◆ FillHistsV()

void FillHistsV ( EdbVertex edbv,
Vertex v 
)

1231 {
1232  double smass = 0.13957;
1233  // fill hists with differences between reconstructed and generated position
1234  hp[0]->Fill((double)vxo - (double)vxg);
1235  hp[1]->Fill((double)vyo - (double)vyg);
1236  hp[2]->Fill((double)vzo - (double)vzg);
1237  // fill hists with vertex coordinate errors
1238  hp[3]->Fill(v.vxerr());
1239  hp[4]->Fill(v.vyerr());
1240  hp[5]->Fill(v.vzerr());
1241  // fill hist with chi2/ndf
1242  hp[6]->Fill(v.ndf() > 0 ? v.chi2()/v.ndf() : 0);
1243  // fill hist with vertex chi2 probability
1244  hp[7]->Fill(v.prob());
1245  if ( (nuse == npi) && neutral_primary && !read_from_file)
1246  {
1247  double rmass = v.mass(smass);
1248  hp[8]->Fill(rmass-mK);
1249  }
1250  // calculate average track-vertex distance
1251  double rmsdist = v.rmsDistAngle();
1252 // hp[14]->Fill(rmsdist);
1253  // fill hist with average track-track angle
1254  hp[18]->Fill(v.angle()*1000.);
1255  // fill histy with vertex multiplicity
1256  hp[22]->Fill(v.ntracks());
1257  // fill hist with impact parameters
1258  int n = edbv.N();
1259  for (int j=0; j<n; j++)
1260  if (hp[14]) hp[14]->Fill(edbv.Impact(j));
1261 }
int neutral_primary
Definition: RecDispMC.C:44
float vxg
Definition: RecDispMC.C:146
int npi
Definition: RecDispMC.C:45
float vyg
Definition: RecDispMC.C:146
float vyo
Definition: RecDispMC.C:145
float vxo
Definition: RecDispMC.C:145
bool read_from_file
Definition: RecDispMC.C:26
double mK
Definition: RecDispMC.C:49
int nuse
Definition: RecDispMC.C:46
float vzg
Definition: RecDispMC.C:146
float vzo
Definition: RecDispMC.C:145
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. 
)

708 {
709  // generation of 1 pattern volume
710  float vlim[4], vzlim[2];
711  // delete previous generated tracks and vertexes
712  if (gener)
713  {
714  if (gener->eVTX) gener->eVTX->Delete();
715  if (gener->eTracks) gener->eTracks->Delete();
716  gener->eVTX = new TObjArray(1000);
717  }
718  // delete previous reconstructed tracks and vertexes, generated segments
719  if (ali)
720  {
721  ali->eVTA.Clear();
722  if (ali->eVTX) ali->eVTX->Delete();
723  if (ali->eTracks) ali->eTracks->Delete();
724  ali->ResetCouples();
725  int npat=ali->Npatterns();
726  TClonesArray *segs = 0;
727  for(int i=0; i<npat; i++ )
728  if ( segs = (ali->GetPattern(i))->GetSegments()) segs->Delete();
729  ali->eVTX = new TObjArray(1000);
730  }
731 
732  vlim[0] = brick.lim[0] + fiducial_border;
733  vlim[1] = brick.lim[1] + fiducial_border;
734  vlim[2] = brick.lim[2] - fiducial_border;
735  vlim[3] = brick.lim[3] - fiducial_border;
736  // working area
737  float area = (vlim[2]-vlim[0])*(vlim[3]-vlim[1])/1000000.;
738  // number of background segments and tracks
739  int nb1 = b1*area;
740  int nb2 = b2*area;
741  vzlim[0] = fiducial_border_z;
742  vzlim[1] = brick.plates*brick.dz - fiducial_border_z;
743 
744  float fractbkg = 1.;
745  int retval = 0;
746 // generate events (vertexes)
747  if (read_from_file && ne)
748  {
749  retval = read_events_from_file(ne, &fractbkg, vlim, vzlim);
750  }
751  else if (ne)
752  {
753  gener->GeneratePhaseSpaceEvents( ne, pDecay, vzlim, vlim,
755  charges);
756  neg_tot+=ne;
757  nvgm_tot[nuse + 1 - neutral_primary] += ne;
758  }
759  int nb1f, nb2f;
760 // generate uncorrelated segments
761  if ((nb1f = (int)(nb1*fractbkg)))
763  back1_tetamax, 0 );
764 // generate cosmictracks
765  if ((nb2f = (int)(nb2*fractbkg)))
768  ProbGap, eloss_flag );
769  ntrgb += nb2f;
770 // fill hists with generated track parameters
771  FillHistsGen();
772 // reconstruction procedure
773  rec_all();
774 
775  return retval;
776 }
int read_events_from_file(int ne, float *fractbkg, float vlim[4], float vzlim[2])
Definition: RecDispMC.C:561
float back2_tetamax
Definition: RecDispMC.C:31
void rec_all()
Definition: RecDispMC.C:790
int neg_tot
Definition: RecDispMC.C:156
float fiducial_border_z
Definition: RecDispMC.C:35
float fiducial_border
Definition: RecDispMC.C:34
int eloss_flag
Definition: RecDispMC.C:89
float back1_tetamax
Definition: RecDispMC.C:30
float ProbGap
Definition: RecDispMC.C:56
int charges[101]
Definition: RecDispMC.C:148
float back2_plim[2]
Definition: RecDispMC.C:32
void FillHistsGen()
Definition: RecDispMC.C:1263
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
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. 
)

228 {
229  // main steering routine for vertex generation & reconstruction test
230  char outfile[128];
231 
232  if ( !read_from_file && (npi < 2 || npi > 100 || nuse > npi) )
233  {
234  printf("Wrong combination of kinematic conditions:\n");
235  printf(" %d secondary pions, tracking for %d pions \n", npi, nuse);
236  return;
237  }
238 
239  timespec_t t0, t;
240  double dt;
241 
242  if (read_from_file)
243  {
244  fmcdata = fopen("vertexes_and_tracks.data","r");
245  rewind(fmcdata);
246  ntall = 10*nve;
247  }
248  else
249  {
250  float area = (brick.lim[2]-brick.lim[0]-2.*fiducial_border)*
251  (brick.lim[3]-brick.lim[1]-2.*fiducial_border)/1000000.;
252  ntall = nve*(nuse+1-neutral_primary)+back2*area;
253  }
254 
255  // log MC conditions on stdout and logfile
256  print_conditions(n, nve, back1, back2);
257 
258  // clear variables and objects
259  clear_all();
260 
261  // histogram booking
262  BookHistsV(nve);
263 
264  // Phase Space Generator initialization
265  pDecay = K3Pi(momentumK);
266  // Create PVRec object
267  ali = new EdbPVRec();
268  // Get Patterns Volume pointer
270  // Make patterns
272  // Create Vertexes TObjArray in PVRec
273  ali->eVTX = new TObjArray(1000);
274  // Create Scan Conditions object
275  scanCond = new EdbScanCond();
276  // Set Scan conditions variables
278  // Assign Scan Conditions to PVRec
280 
281  ali->SetPatternsID();
282  ali->SetCouplesAll();
284 
285  // Create PVGen object
286  gener = new EdbPVGen();
287  // Use the same volume as PVRec
288  gener->SetVolume(vol);
289  // Create Vertexes TObjArray in PVGen
290  gener->eVTX = new TObjArray(1000);
291  // Assign Scan Conditions to PVGen (the same as for PVRec)
293 
294  TTimeStamp ts; // Time Stamp for printing
295  t0=ts.GetTimeSpec();
296 
297  int breakflag = 0;
298  int print_at_end = 0;
299  int nprong = nuse + 1 - neutral_primary;
300 
301  for(int i=1; i<=n; i++) {
302  numbricks++;
303  // generate one brick with:
304  // nve events,
305  // back1 uncorrelated segments per mm^2 per plate,
306  // back2 cosmic tracks per mm^2,
307  // return true if EOF conditions (when readevents from file)
308  if (g1(nve,back1,back2)) breakflag = 1;
309  // print time and statistic
310  if ((!(nvg_tot%PrintN)) || breakflag || (i == n))
311  {
312  TTimeStamp ts;
313  t=ts.GetTimeSpec();
314  dt=(t.tv_sec-t0.tv_sec)*1000000000.+(t.tv_nsec-t0.tv_nsec);
315  if ( !breakflag && (i != n) )
316  {
317  if (nve>0&&back2<=0.)
318  printf("%d events generated in %.4f sec (%.1f msec per event)\n",
319  neg_tot,dt/1000000000.,dt/(double)(neg_tot)/1000000.);
320  else if (nve>0&&back2>0.)
321  printf("%d events and %d cosmic tracks generated in %.4f sec (%.1f msec per event)\n",
322  neg_tot,ntrgb, dt/1000000000.,dt/(double)(neg_tot)/1000000.);
323  else if (nve<=0&&back2>0.)
324  printf("%d cosmic tracks generated in %.4f sec (%.1f msec per track)\n",
325  ntrgb, dt/1000000000.,dt/(double)(ntrgb)/1000000.);
326  }
327  else
328  {
329  print_at_end = 1;
330  }
331  }
332  if (breakflag) break;
333  }
334  if (read_from_file)
335  {
336  fclose(fmcdata);
337  }
338  else
339  {
340  ntrgv_tot = nprong*nvg_tot;
341  nprongmaxg = nprong;
342  }
343 
344  // log MC results on stdout and logfile
345  print_results();
346  // Store histogramms on ROOT file
347  sprintf(outfile,"%db_%dK%dpi_%dub_%3.1ftb", n, nve, nuse, (int)back1, back2);
348  rf = new TFile(strcat(outfile,".root"),"RECREATE","MC Vertex reconstruction");
349  hlist.Write();
350  rf->Close();
351  delete rf;
352  rf = 0;
353  // print time and statistic
354  if ( print_at_end )
355  {
356  if (nve>0&&back2<=0.)
357  printf("%d events generated in %.4f sec (%.1f msec per event)\n",
358  neg_tot,dt/1000000000.,dt/(double)(neg_tot)/1000000.);
359  else if (nve>0&&back2>0.)
360  printf("%d events and %d cosmic tracks generated in %.4f sec (%.1f msec per event)\n",
361  neg_tot,ntrgb, dt/1000000000.,dt/(double)(neg_tot)/1000000.);
362  else if (nve<=0&&back2>0.)
363  printf("%d cosmic tracks generated in %.4f sec (%.1f msec per track)\n",
364  ntrgb, dt/1000000000.,dt/(double)(ntrgb)/1000000.);
365  }
366 }
const unsigned long int PrintN
Definition: RecDispMC.C:120
TFile * rf
Definition: RecDispMC.C:152
float momentumK
Definition: RecDispMC.C:47
void print_conditions(int n, int nve, float back1, float back2)
Definition: RecDispMC.C:368
void Set_Prototype_OPERA_basetrack(EdbScanCond *cond)
Definition: RecDispMC.C:212
TGenPhaseSpace * K3Pi(float p=3.)
Definition: RecDispMC.C:190
int g1(int ne=1, float b1=0., float b2=0.)
Definition: RecDispMC.C:707
void makeVolumeOPERAn(BRICK &b, EdbPatternsVolume *v)
Definition: RecDispMC.C:779
EdbScanCond * scanCond
Definition: RecDispMC.C:124
void print_results()
Definition: RecDispMC.C:423
void BookHistsV(int nve)
Definition: RecDispMC.C:1167
FILE * fmcdata
Definition: RecDispMC.C:151
void clear_all()
Definition: RecDispMC.C:513
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
fclose(pFile)

◆ K3Pi()

TGenPhaseSpace* K3Pi ( float  p = 3.)
191 {
192  // K->3Pi decay phase space
193 
194  double e=TMath::Sqrt(p*p+mK*mK);
195  TLorentzVector K(0,0,p,e);
196  Double_t masses[100];
197  for (int i=0; i<100; i++)
198  {
199  masses[i] = 0;
200  if (i < npi) masses[i] = mPi;
201  if (i == 0) masses[i] = mP;
202  charges[i] = 0;
203  if (i < nuse) charges[i] = 1;
204  }
205  charges[npi] = 1;
206  if (neutral_primary) charges[npi] = 0;
207  TGenPhaseSpace *psp = new TGenPhaseSpace();
208  psp->SetDecay(K, npi, masses);
209  return psp;
210 }
double mP
Definition: RecDispMC.C:51
double mPi
Definition: RecDispMC.C:50
p
Definition: testBGReduction_AllMethods.C:8

◆ makeVolumeOPERAn()

void makeVolumeOPERAn ( BRICK b,
EdbPatternsVolume v 
)

780 {
781  // Volume geometry setting
782 
783  EdbPattern *pat =0;
784  for(int i=0; i<b.plates; i++) {
785  pat = new EdbPattern(0,0,b.z0+b.dz*i);
786  v->AddPattern(pat);
787  }
788 }
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 
)

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

◆ print_results()

void print_results ( )

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

◆ read_events_from_file()

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

562 {
563  int retval = 0;
564  float VTx;
565  float VTy;
566  float VTz;
567  float zlimt[2];
568  EdbVertex *vedb = 0;
569  EdbTrackP *tr = 0;
570  int numt = 0, ntrv = 0, indv, gcode, nitem;
571  float TMass, Pt, TXt, TYt;
572  int iiv = 0;
573  while (iiv == 0)
574  {
575  for (int iv = 0; iv < ne; iv++)
576  {
577  // read vertex line: vert number, multiplicity, coordinates
578  nitem = fscanf(fmcdata, "%d %d %f %f %f\n", &indv, &ntrv, &VTx, &VTy, &VTz);
579  if (nitem <= 0 && fmc1steof && evcount == 0)
580  {
581  fmc1steof = false;
582  rewind(fmcdata);
583  // re-read vertex line: vert number, multiplicity, coordinates
584  nitem = fscanf(fmcdata, "%d %d %f %f %f\n", &indv, &ntrv, &VTx, &VTy, &VTz);
585  if (nitem <= 0)
586  {
587  retval = 1;
588  *fractbkg = (float)evcount/ne;
589  iiv = -1;
590  break;
591  }
592  }
593  else if ( nitem <= 0 )
594  {
595  retval = 1;
596  *fractbkg = (float)evcount/ne;
597  iiv = -1;
598  break;
599  }
600  if (ntrv < primary_vertex_ntracks_min)
601  {
602  // skip event with low multiplicity
603  for (int it = 0; it < ntrv; it++)
604  {
605  fscanf(fmcdata, "%d %f %f %f %f\n", &gcode, &TMass, &Pt, &TXt, &TYt);
606  }
607  continue;
608  }
610  {
611  // generate vertex position into fiducial volume
612  VTx = vlim[0] + (vlim[2] - vlim[0])*gRandom->Rndm();
613  VTy = vlim[1] + (vlim[3] - vlim[1])*gRandom->Rndm();
614  VTz = vzlim[0] + (vzlim[1] - vzlim[0])*gRandom->Rndm();
615  }
616  evcount++;
617  vedb = new EdbVertex();
618  vedb->SetXYZ(VTx, VTy, VTz);
619  int ntrvreal = 0;
620  for (int it = 0; it < ntrv; it++)
621  {
622  // read track parameters: Geant_code, mass, momentum, slopes
623  fscanf(fmcdata, "%d %f %f %f %f\n", &gcode, &TMass, &Pt, &TXt, &TYt);
624  tr = new EdbTrackP();
625  tr->Set(numt++, VTx, VTy, TXt, TYt, 1, iiv+1);
626  tr->SetZ(VTz);
627  tr->SetP(Pt);
628  tr->SetM(TMath::Abs(TMass));
629  if (TMass >= 0.)
630  {
631  zlimt[0] = VTz;
632  zlimt[1] = 100000.;
633  }
634  else
635  {
636  zlimt[0] = VTz;
637  zlimt[1] = -1000.;
638  }
639  // generate segments
640  gener->TrackMC( zlimt, brick.lim, *tr, eloss_flag, ProbGap);
641  // reject tracks with one segment only
642  if (tr->N() >= 2)
643  {
644  gener->AddTrack(tr);
645  if (TMass < 0.)
646  vedb->AddTrack(tr, 0);
647  else
648  vedb->AddTrack(tr, 1);
649  ntrvreal++;
650  ntrgv_tot++;
651  }
652  else
653  {
654  if (tr->N())
655  {
656  tr->GetSegment(0)->SetFlag(-1);
657  }
658  delete tr;
659  tr = 0;
660  }
661  }
662  if (ntrvreal == 0)
663  {
664  // reject vertex with no "good" tracks
665  delete vedb;
666  vedb = 0;
667  }
668  else if (ntrvreal == 1)
669  {
670  // reject vertex with no one track only
671  delete vedb;
672  vedb = 0;
673  if (indv == 1)
674  {
675  // primary vertex
676  if (tr)
677  {
678  ntrgv_tot--;
679  gener->eTracks->Remove(tr);
680  delete tr;
681  tr = 0;
682  }
683  }
684  if (tr)
685  {
686  tr->SetFlag(0);
687  ntrgv_tot--;
688  }
689  }
690  else
691  {
692  // accept vertex
693  vedb->SetFlag(indv);
694  gener->AddVertex(vedb);
695  iiv++;
696  if (indv == 1) neg_tot++;
697  n2gv += (ntrvreal*(ntrvreal-1)/2);
698  nvgm_tot[ntrvreal]++;
699  if (ntrvreal > nprongmaxg) nprongmaxg = ntrvreal;
700  }
701  }
702  if (iiv < 0) break;
703  }
704  return retval;
705 }
int primary_vertex_ntracks_min
Definition: RecDispMC.C:24
EdbVertex * vedb
Definition: RecDispMC.C:139
bool regenerate_vertex_xyz
Definition: RecDispMC.C:27
bool fmc1steof
Definition: RecDispMC.C:185
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 ( )

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

213 {
214  // sigma0 "x, y, tx, ty" at zero angle
215  cond->SetSigma0( seg_s[0], seg_s[1], seg_s[2], seg_s[3] );
216  cond->SetDegrad( 0.2 ); // sigma(tx) = sigma0*(1+degrad*tx)
217  cond->SetBins(20, 20, 10, 10); // bins in [sigma] for checks
218  cond->SetPulsRamp0( 15., 15. ); // in range (Pmin:Pmax) Signal/All is nearly linear
219  cond->SetPulsRamp04( 15., 15. );
220  cond->SetChi2Max( 3.5 );
221  cond->SetChi2PMax( 3.5 );
222  cond->SetRadX0( brick.X0 );
223 
224  cond->SetName("Prototype_OPERA_basetrack");
225 }
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

◆ AngleAcceptance

float AngleAcceptance = 2.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] = {1., 1.}

◆ 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 = 0

◆ evcount

int evcount = 0

◆ f

FILE* f =0

◆ fiducial_border

float fiducial_border = 50000.

◆ fiducial_border_z

float fiducial_border_z = 12000.

◆ fmc1steof

bool fmc1steof = true

◆ fmcdata

FILE* fmcdata =0

◆ gener

EdbPVGen* gener = 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 = -60000.

◆ maxgaps

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

◆ mc_make_tracks

bool mc_make_tracks = true

◆ 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 = true

◆ use_mc_mass

bool use_mc_mass = false

◆ use_mc_momentum

bool use_mc_momentum = true

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