FEDRA emulsion software from the OPERA Collaboration
RecDispNU.C File Reference
#include "My_Track.h"
#include "My_Header.h"
Include dependency graph for RecDispNU.C:

Macros

#define MAXCODES   10000
 

Functions

void BookHistsV ()
 
void ClearHistsV ()
 
void d ()
 
void DrawHistsV ()
 
void DrawHlist (TCanvas *c, TObjArray h)
 
void dsall ()
 
void dsv (int numv=-1, int numt=-1, 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 (Vertex &v)
 
void FillPVGen ()
 
void GCodesInit ()
 
void init (char *data_set="data_set.def")
 
void init_rec (char *data_set="data_set.def")
 
double MassGeant (int val)
 
int Pdg2Geant (int val)
 
void RecDispNU ()
 
void run (int ib=1, int ie=100, int nutype=2)
 
void scan1 ()
 
void scanend ()
 
void SmearSegments ()
 

Variables

float AngleAcceptance = 1.5
 
float back1_tetamax = 0.35
 
float back2_plim [2] = {0.5, 5.5}
 
float back2_tetamax = 0.25
 
float DIRt [500]
 
float dpp = 0.20
 
EdbDisplayds =0
 
EdbDisplayds2 =0
 
EdbDataProcdset =0
 
int evnum = 0
 
float fiducial_border = 20000.
 
float fiducial_border_z = 20000.
 
const char filename [256]
 
FILE * fmcdata = 0
 
TFile * fmicro
 
EdbPVRecgAli =0
 
int Geant [2 *MAXCODES]
 
EdbPVGengener =0
 
TObjArray hld1
 
TObjArray hld2
 
TObjArray hld3
 
TObjArray hld4
 
TObjArray hld5
 
TObjArray hld6
 
TObjArray hld7
 
TObjArray hld8
 
TObjArray hlist
 
TH1F * hp [32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
 
TProfile * hpp [10] = {0,0,0,0,0,0,0,0,0,0}
 
const char * INfile = &filename[0]
 
FILE * log
 
int maxgaps [6] = {0,3,3,6,3,6}
 
int MaxTrack = 0
 
int MaxVertex = 0
 
My_Track * micro = 0
 
int nsegMin = 2
 
int Nst [500]
 
int ntgood = 0
 
int Ntr = 0
 
int ntrgood_gen1 = 0
 
int Numgent [500]
 
int Numgenv [500]
 
float Numvtr [500][500]
 
int nutypes = 0
 
int nvggood = 0
 
int Nvt = 0
 
int NVt [500]
 
float Nvtr [500]
 
bool only_primary_vertex = true
 
int PdgId [500]
 
int primary_vertex_ntracks_min = 2
 
float ProbGap = 0.10
 
float ProbMinP = 0.01
 
float ProbMinT = 0.01
 
float ProbMinV = 0.01
 
float ProbMinVN = 0.01
 
float Pt [500]
 
int rec_primary_vertex_ntracks_min = 2
 
TFile * rf =0
 
float RightRatioMin = 0.5
 
EdbScanCondscan =0
 
bool scanning = false
 
float seg_s [4] ={1.2, 1.2, 0.0015, 0.0015}
 
bool setz = true
 
double smass = 0.1395700
 
bool smear = true
 
FILE * stderr
 
FILE * stdout
 
float TMass [500]
 
TTree * TreeMS = 0
 
float TXt [500]
 
float TYt [500]
 
bool use_mc_mass = false
 
bool use_mc_momentum = false
 
bool usemom =false
 
EdbPatternsVolumevol =0
 
float VTx [500]
 
float VTy [500]
 
float VTz [500]
 
float vxg = 0.
 
float vxo = 0.
 
float vyg = 0.
 
float vyo = 0.
 
float vzg = 0.
 
float vzo = 0.
 
bool write_mc_data = false
 
float z0shift = 295.
 

Macro Definition Documentation

◆ MAXCODES

#define MAXCODES   10000

Function Documentation

◆ BookHistsV()

void BookHistsV ( )

1015 {
1016  if (!hp[0]) hp[0] = new TH1F("Hist_Vt_Dx","Vertex X error",100,-50.,50.);
1017  if (!hp[1]) hp[1] = new TH1F("Hist_Vt_Dy","Vertex Y error",100,-50.,50.);
1018  if (!hp[2]) hp[2] = new TH1F("Hist_Vt_Dz","Vertex Z error",100,-100.,100.);
1019  if (!hp[3]) hp[3] = new TH1F("Hist_Vt_Sx","Vertex X sigma",100,0.,25.);
1020  if (!hp[4]) hp[4] = new TH1F("Hist_Vt_Sy","Vertex Y sigma",100,0.,25.);
1021  if (!hp[5]) hp[5] = new TH1F("Hist_Vt_Sz","Vertex Z sigma",100,0.,50.);
1022  if (!hp[6]) hp[6] = new TH1F("Hist_Vt_Chi2","Vertex Chi-square/D.F.",25,0.,5.);
1023  if (!hp[7]) hp[7] = new TH1F("Hist_Vt_Prob","Vertex Chi-square Probability",26,0.,1.04);
1024 // if (!hp[8]) hp[8] = new TH1F("Hist_Vt_Mass","Vertex Mass error",50,-1.000,+1.000);
1025  if (!hp[8]) hp[8] = new TH1F("Hist_Vt_Vpercg","Ratio reconstructed/generated vertexes",150, 0.,3.0);
1026  char title[128];
1027  sprintf(title,"Number of reconstructed vertexs");
1028  if (!hp[9]) hp[9] = new TH1F("Hist_Vt_Nvert",title,20,0.,20.);
1029  sprintf(title,"Number of reconstructed tracks");
1030  if (!hp[10]) hp[10] = new TH1F("Hist_Vt_Ntrack",title,100,0.,100.);
1031  if (!hp[11]) hp[11] = new TH1F("Hist_Vt_Nsegs","Number of track segments",60,0.,60.);
1032  if (!hp[12]) hp[12] = new TH1F("Hist_Vt_Dtrack","Track DeltaX, microns",100,-1.,+1.);
1033  if (!hp[13]) hp[13] = new TH1F("Hist_Vt_NsegsG","Number of generated track segments",60,0.,60.);
1034 // if (!hp[19]) hp[19] = new TH1F("Hist_Vt_DE","DE(MC)-DE",100,-0.25,+0.25);
1035  if (!hp[19]) hp[19] = new TH1F("Hist_Vt_Tperc","Ratio reconstructed/generated tracks",250, 0.,5.0);
1036  if (!hp[14]) hp[14] = new TH1F("Hist_Vt_Dist","RMS track-vertex distance",100, 0.,50.);
1037  if (!hp[15]) hp[15] = new TH1F("Hist_Vt_Match","Right segments fraction (tracks at vertexes)",110, 0.,1.1);
1038 // if (!hp[16]) hp[16] = new TH1F("Hist_Vt_Matchb","Right segments fraction (backgound tracks)",110, 0.,1.1);
1039  if (!hp[16]) hp[16] = new TH1F("Hist_Vt_Tpercg","Ratio reconstructed(matched)/generated tracks",250, 0.,5.0);
1040  if (!hp[17]) hp[17] = new TH1F("Hist_Vt_Trprob","Track probability",110, 0.,1.1);
1041  if (!hp[18]) hp[18] = new TH1F("Hist_Vt_AngleV","RMS track-track angle, mrad", 100, 0.,1000.);
1042  if (!hp[20]) hp[20] = new TH1F("Hist_Vt_Angle","Track angle, mrad", 100, 0.,2000.);
1043  if (!hp[21]) hp[21] = new TH1F("Hist_Vt_Momen","Track momentum, GeV/c", 50, 0.,5.);
1044  if (!hp[22]) hp[22] = new TH1F("Hist_Vt_Ntracks","Number of tracks at vertex (rec)", 20, 0.,20.);
1045 // if (!hp[23]) hp[23] = new TH1F("Hist_Vt_Pmulsca","Relative Momentum error", 50, -250.,250.);
1046  if (!hp[23]) hp[23] = new TH1F("Hist_Vt_Vpercmg","Ratio reconstructed(matched)/generated vertexes",100, 0.,5.0);
1047  if (!hp[24]) hp[24] = new TH1F("Hist_Vt_NtracksMCTV","Number of tracks at vertex (MC)", 20, 0.,20.);
1048  if (!hp[25]) hp[25] = new TH1F("Hist_Vt_NtracksMCT","Number of generated tracks", 100, 0.,100.);
1049  if (!hp[26]) hp[26] = new TH1F("Hist_Vt_NtracksMCV","Number of generated vertexes", 20, 0.,20.);
1050  if (!hp[27]) hp[27] = new TH1F("Hist_Vt_Nneg","Number of primary vertex tracks (not broken ones)", 20, 0.,20.);
1051  if (!hp[28]) hp[28] = new TH1F("Hist_Vt_Nnsg","Number of primary vertex tracks (not short ones)", 20, 0.,20.);
1052  if (!hp[29]) hp[29] = new TH1F("Hist_Vt_Npro","Number of primary vertex tracks (high probability)", 20, 0.,20.);
1053  if (!hp[30]) hp[30] = new TH1F("Hist_Vt_Noko","Number of rejected primary vertex tracks", 20, 0.,20.);
1054  if (!hp[31]) hp[31] = new TH1F("Hist_Vt_DZpat","DZ for ajunced patterns", 300, 0.,3000.);
1055  if (!hpp[0]) hpp[0] = new TProfile("Hist_Vt_Zpat","Segments Z vs pattern number", 60, -1.,59., -1000000., +1000000, "s");
1056 
1057  hld1.Add(hp[0]);
1058  hld1.Add(hp[1]);
1059  hld1.Add(hp[2]);
1060  hld1.Add(hp[3]);
1061  hld1.Add(hp[4]);
1062  hld1.Add(hp[5]);
1063  hld1.Add(hp[6]);
1064  hld1.Add(hp[7]);
1065  hld1.Add(hp[8]);
1066 
1067  hld2.Add(hp[11]);
1068  hld2.Add(hp[15]);
1069  hld2.Add(hp[12]);
1070  hld2.Add(hp[13]);
1071  hld2.Add(hp[16]);
1072  hld2.Add(hp[19]);
1073  hld2.Add(hp[17]);
1074  hld2.Add(hp[20]);
1075  hld2.Add(hp[21]);
1076 
1077  hld3.Add(hp[9]);
1078  hld3.Add(hp[10]);
1079  hld3.Add(hp[26]);
1080  hld3.Add(hp[25]);
1081 
1082  hld4.Add(hp[22]);
1083  hld4.Add(hp[23]);
1084  hld4.Add(hp[24]);
1085  hld4.Add(hp[14]);
1086 
1087  hld5.Add(hp[27]);
1088  hld5.Add(hp[28]);
1089  hld5.Add(hp[29]);
1090  hld5.Add(hp[30]);
1091 
1092  hld6.Add(hpp[0]);
1093  hld6.Add(hp[31]);
1094 
1095  for (int i=0; i<32; i++)
1096  if (hp[i]) hlist.Add(hp[i]);
1097 }
TProfile * hpp[10]
Definition: RecDispNU.C:78
TObjArray hld1
Definition: RecDispNU.C:79
TObjArray hld2
Definition: RecDispNU.C:79
TObjArray hlist
Definition: RecDispNU.C:79
TObjArray hld4
Definition: RecDispNU.C:79
TObjArray hld6
Definition: RecDispNU.C:79
TObjArray hld3
Definition: RecDispNU.C:79
TObjArray hld5
Definition: RecDispNU.C:79
TH1F * hp[32]
Definition: RecDispNU.C:77

◆ ClearHistsV()

void ClearHistsV ( )

1235 {
1236  for(int i=0; hp[i]; i++) {
1237  hp[i]->Clear();
1238  }
1239 }

◆ d()

void d ( )

1232 { DrawHistsV();}
void DrawHistsV()
Definition: RecDispNU.C:1159

◆ DrawHistsV()

void DrawHistsV ( )

1160 {
1161  TCanvas *cv1 = new TCanvas("Vertex_reconstruction_1","MC Vertex reconstruction", 760, 760);
1162  DrawHlist(cv1, hld1);
1163 
1164  TCanvas *cv2 = new TCanvas("Vertex_reconstruction_2","Vertex reconstruction (tracks hists)", 600, 760);
1165  DrawHlist(cv2, hld2);
1166 
1167  TCanvas *cv3 = new TCanvas("Vertex_reconstruction_3","Vertex reconstruction (eff hists)", 600, 760);
1168  DrawHlist(cv3, hld3);
1169 
1170  TCanvas *cv4 = new TCanvas("Vertex_reconstruction_4","Vertex reconstruction (ntracks)", 600, 760);
1171  DrawHlist(cv4, hld4);
1172 
1173  TCanvas *cv5 = new TCanvas("Vertex_reconstruction_5","Vertex reconstruction (1st vertex tracks)", 600, 760);
1174  DrawHlist(cv5, hld5);
1175 
1176  TCanvas *cv6 = new TCanvas("Vertex_reconstruction_6","Vertex reconstruction (1st pattern Z)", 600, 760);
1177  DrawHlist(cv6, hld6);
1178 }
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
TCanvas * cv6
Definition: RecDispMC_Profiles_new.C:70
TCanvas * cv5
Definition: RecDispMC_Profiles_new.C:70
void DrawHlist(TCanvas *c, TObjArray h)
Definition: RecDispNU.C:1180
new TCanvas()

◆ DrawHlist()

void DrawHlist ( TCanvas c,
TObjArray  h 
)

1181 {
1182  int n = h.GetEntries();
1183  if (n < 2)
1184  {
1185  }
1186  else if (n < 3)
1187  {
1188  c->Divide(1,2);
1189  }
1190  else if (n < 4)
1191  {
1192  c->Divide(1,3);
1193  }
1194  else if (n < 5)
1195  {
1196  c->Divide(2,2);
1197  }
1198  else if (n < 6)
1199  {
1200  c->Divide(2,3);
1201  }
1202  else if (n < 7)
1203  {
1204  c->Divide(2,3);
1205  }
1206  else if (n < 8)
1207  {
1208  c->Divide(2,4);
1209  }
1210  else if (n < 9)
1211  {
1212  c->Divide(2,4);
1213  }
1214  else if (n < 10)
1215  {
1216  c->Divide(3,3);
1217  }
1218  else if (n < 11)
1219  {
1220  c->Divide(2,5);
1221  }
1222  else
1223  {
1224  c->Divide(3,5);
1225  }
1226  for(int i=0; i<n; i++) {
1227  c->cd(i+1);
1228  if (h.At(i)) h.At(i)->Draw();
1229  }
1230 }

◆ dsall()

void dsall ( )
823 {
824 
825  TObjArray *arr = new TObjArray();
826 
827  gAli->ExtractDataVolumeSegAll( *arr );
828 
829  gStyle->SetPalette(1);
830  const char *title = "display-segments";
831  if(!EdbDisplay::EdbDisplayExist(title))
832  ds=new EdbDisplay(title, -60000.,60000.,-60000., 62000., 0.,100000.);
833 
834  ds->SetArrSegP( arr );
835  ds->SetArrTr( gAli->eTracks );
836  ds->SetDrawTracks(3);
837  ds->Draw();
838  delete arr;
839  arr = 0;
840 }
EdbDisplay * ds
Definition: RecDispNU.C:112
EdbPVRec * gAli
Definition: RecDispNU.C:114
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 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 * eTracks
Definition: EdbPVRec.h:161

◆ dsv()

void dsv ( int  numv = -1,
int  numt = -1,
float  binx = 6,
float  bint = 10 
)
844 {
845  if(!gAli->eVTX) return;
846  if(!gAli->eTracks) return;
847 
848  EdbSegP *seg=0; // direction
849 
850  TObjArray *arrV = new TObjArray(); // vertexes
851  TObjArray *arr = new TObjArray(); // segments
852  TObjArray *arrtr = new TObjArray(); // tracks
853 
854  int ntrMin=2;
855  int nvtx = gAli->eVTX->GetEntries();
856  EdbVertex *v = 0;
857  int iv0,iv1;
858  if (numv == -1)
859  {
860  iv0 = 0;
861  iv1 = nvtx;
862  }
863  else
864  {
865  iv0 = numv;
866  iv1 = numv+1;
867  }
868 
869  gAli->ExtractDataVolumeSegAll( *arr );
870 
871  int ntr = gAli->eTracks->GetEntries();
872  for(int i=0; i<ntr; i++) {
873  EdbTrackP *track = (EdbTrackP *)(gAli->eTracks->At(i));
874  if (track->Flag() < 0) continue;
875  printf("Track ID %d, Z = %f, Nseg = %d\n",
876  track->ID(), track->Z(), track->N());
877  if (numt < 0 || numt == i)
878  arrtr->Add(track);
879  }
880 
881  for(int iv=iv0; iv<iv1; iv++) {
882  v = (EdbVertex *)(gAli->eVTX->At(iv));
883  if(!v) continue;
884  if(v->N()<ntrMin) continue;
885 
886  arrV->Add(v);
887  }
888 
889  gStyle->SetPalette(1);
890 
891  if(ds) delete ds;
892  ds=new EdbDisplay("display-vertexes",-60000.,60000.,-60000., 62000., 0.,100000.);
893 
894  ds->SetArrSegP( arr );
895  ds->SetArrTr( arrtr );
896  ds->SetArrV( arrV );
897  ds->SetDrawVertex(1);
898  ds->Draw();
899 }
TObjArray * arrtr
Definition: RecDispMC.C:129
void SetDrawVertex(int opt)
Definition: EdbDisplay.h:108
void SetArrV(TObjArray *arrv)
Definition: EdbDisplay.cxx:500
TObjArray * eVTX
Definition: EdbPVRec.h:162
Definition: EdbSegP.h:18
Definition: EdbPattern.h:118
Definition: EdbVertex.h:68
Int_t N() const
Definition: EdbVertex.h:121
Definition: bitview.h:14

◆ dsvg()

void dsvg ( int  numv = -1,
float  binx = 6,
float  bint = 10 
)
902 {
903  if(!gener->eVTX) return;
904 
905  EdbSegP *seg=0; // direction
906 
907  TObjArray *arrV = new TObjArray(); // vertexes
908  TObjArray *arr = new TObjArray(); // segments
909  TObjArray *arrtr = new TObjArray(); // tracks
910 
911  int ntrMin=2;
912  int nvtx = gener->eVTX->GetEntries();
913  EdbVertex *v = 0;
914  int iv0,iv1;
915  if (numv == -1)
916  {
917  iv0 = 0;
918  iv1 = nvtx;
919  }
920  else
921  {
922  iv0 = numv;
923  iv1 = numv+1;
924  }
925  for(int iv=iv0; iv<iv1; iv++) {
926  v = (EdbVertex *)(gener->eVTX->At(iv));
927  if(!v) continue;
928  if(v->N()<ntrMin) continue;
929 
930  arrV->Add(v);
931 
932  int ntr = v->N();
933  printf("Vertex %d, multiplicity %d\n", iv, ntr);
934  for(int i=0; i<ntr; i++) {
935  EdbTrackP *track = v->GetTrack(i);
936  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
937  track->ID(), track->Z(), track->N(), v->Zpos(i));
938  arrtr->Add(track);
939  }
940 
941  }
942 
943  gStyle->SetPalette(1);
944 
945  const char *title = "display-generated";
946  if(!EdbDisplay::EdbDisplayExist(title))
947  ds=new EdbDisplay(title, -60000.,60000.,-60000., 62000., 0.,100000.);
948 
949  ds->SetArrSegP( arr );
950  ds->SetArrTr( arrtr );
951  ds->SetArrV( arrV );
952  ds->SetDrawVertex(1);
953  ds->SetDrawTrack(4);
954  ds->Draw();
955 }
EdbPVGen * gener
Definition: RecDispNU.C:115
TObjArray * eVTX
Definition: EdbPVGen.h:28
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
Int_t Zpos(int i)
Definition: EdbVertex.h:127

◆ dsvg2()

void dsvg2 ( int  numv = -1,
float  binx = 6,
float  bint = 10 
)
958 {
959  if(!gener->eVTX) return;
960 
961  EdbSegP *seg=0; // direction
962 
963  TObjArray *arrV = new TObjArray(); // vertexes
964  TObjArray *arr = new TObjArray(); // segments
965  TObjArray *arrtr = new TObjArray(); // tracks
966 
967  int ntrMin=2;
968  int nvtx = gener->eVTX->GetEntries();
969  EdbVertex *v = 0;
970  int iv0,iv1;
971  if (numv == -1)
972  {
973  iv0 = 0;
974  iv1 = nvtx;
975  }
976  else
977  {
978  iv0 = numv;
979  iv1 = numv+1;
980  }
981  for(int iv=iv0; iv<iv1; iv++) {
982  v = (EdbVertex *)(gener->eVTX->At(iv));
983  if(!v) continue;
984  if(v->N()<ntrMin) continue;
985 
986  arrV->Add(v);
987 
988  gAli->ExtractDataVolumeSegAll( *arr );
989  int ntr = v->N();
990  printf("Vertex %d, multiplicity %d\n", iv, ntr);
991  for(int i=0; i<ntr; i++) {
992  EdbTrackP *track = v->GetTrack(i);
993  printf(" Track ID %d, Z = %f, Nseg = %d, Zpos = %d\n",
994  track->ID(), track->Z(), track->N(), v->Zpos(i));
995  arrtr->Add(track);
996  }
997 
998  }
999 
1000  gStyle->SetPalette(1);
1001 
1002  const char *title = "display-generated-2";
1003  if(!EdbDisplay::EdbDisplayExist(title))
1004  ds2=new EdbDisplay(title, -60000.,60000.,-60000., 62000., 0.,100000.);
1005 
1006  ds2->SetArrSegP( arr );
1007  ds2->SetArrTr( arrtr );
1008  ds2->SetArrV( arrV );
1009  ds2->SetDrawVertex(1);
1010  ds2->Draw();
1011 }
EdbDisplay * ds2
Definition: RecDispNU.C:113

◆ FillHistsGen()

void FillHistsGen ( )

1118 {
1119  // tracks and vertex reconstruction (KF fitting only without track finding)
1120 
1121  double xg, yg, zg, txg, tyg, pg, ang;
1122  EdbTrackP *tr;
1123  EdbVertex *vedbg = 0;
1124 
1125  int nv = 0;
1126  if(gener->eVTX) nv = gener->eVTX->GetEntries();
1127  for(int i=0; i<nv; i++) {
1128  vedbg = (EdbVertex *)(gener->eVTX->At(i));
1129  int nt = vedbg->N();
1130  for(int ip=0; ip<nt; ip++) {
1131  tr = vedbg->GetTrack(ip);
1132  xg = tr->X();
1133  yg = tr->Y();
1134  zg = tr->Z();
1135  txg = tr->TX();
1136  tyg = tr->TY();
1137  pg = tr->P();
1138  ang = TMath::ACos(1./(1.+txg*txg+tyg*tyg))*1000.;
1139  if (hp[20]) hp[20]->Fill(ang);
1140  if (hp[21]) hp[21]->Fill(pg);
1141  }
1142  }
1143  int nt = 0;
1144  if (gener->eTracks) nt = gener->eTracks->GetEntries();
1145  for(int i=0; i<nt; i++) {
1146  tr = (EdbTrackP *)(gener->eTracks->At(i));
1147  xg = tr->X();
1148  yg = tr->Y();
1149  zg = tr->Z();
1150  txg = tr->TX();
1151  tyg = tr->TY();
1152  pg = tr->P();
1153  ang = TMath::ACos(1./(1.+txg*txg+tyg*tyg))*180./TMath::Pi();
1154  if (hp[13]) hp[13]->Fill(tr->W());
1155  }
1156 }
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
TObjArray * eTracks
Definition: EdbPVGen.h:27

◆ FillHistsV()

void FillHistsV ( Vertex v)

1103 {
1104  hp[0]->Fill((double)vxo - (double)vxg);
1105  hp[1]->Fill((double)vyo - (double)vyg);
1106  hp[2]->Fill((double)vzo - (double)vzg);
1107  hp[3]->Fill(v.vxerr());
1108  hp[4]->Fill(v.vyerr());
1109  hp[5]->Fill(v.vzerr());
1110  hp[6]->Fill(v.ndf() > 0 ? v.chi2()/v.ndf() : 0);
1111  hp[7]->Fill(v.prob());
1112  hp[14]->Fill(v.rmsDistAngle());
1113  hp[18]->Fill(v.angle()*1000.);
1114  hp[22]->Fill(v.ntracks());
1115 }
float vxg
Definition: RecDispNU.C:75
float vyg
Definition: RecDispNU.C:75
float vyo
Definition: RecDispNU.C:74
float vxo
Definition: RecDispNU.C:74
float vzg
Definition: RecDispNU.C:75
float vzo
Definition: RecDispNU.C:74
double vyerr() const
$\sqrt{\sigma_{vy}^2}$ vertex $y$-error
unsigned short int ndf() const
degrees of freedom of vertex fit
Definition: VtVertex.C:238
float chi2() const
$\chi^2$ of vertex fit
Definition: VtVertex.C:236
double vzerr() const
$\sqrt{\sigma_{vz}^2}$ vertex $z$-error
double angle() const
unsigned short int ntracks() const
no of tracks in vertex $n$
Definition: VtVertex.C:240
double rmsDistAngle() const
calc rms dist and rms angle
Definition: VtVertex.C:1073
float prob() const
upper tail $\chi^2$ probability
Definition: VtVertex.C:237
double vxerr() const
$\sqrt{\sigma_{vx}^2}$ vertex $x$-error

◆ FillPVGen()

void FillPVGen ( )
333 {
334  EdbTrackP *trg = 0;
335  EdbVertex *vert = 0;
336  int numt = 0, Track = 0, ntgoodv = 0;
337  nvggood = 0;
338  ntgood = 0;
339 
340  SmearSegments();
341  // loop on event vertexes and fill PVGen with vertexes and tracks
342  for (int iv = 0; iv <= MaxVertex; iv++)
343  {
344  if (VTx[iv] != -1000000.)
345  {
346  vert = new EdbVertex();
347  vert->SetXYZ(VTx[iv], VTy[iv], VTz[iv]-z0shift);
348  ntgoodv = 0;
349  for (int it = 0; it < Nvtr[iv]; it++)
350  {
351  Track = Numvtr[iv][it];
352  if (Pt[Track] != -100.)
353  {
354  // check if less than 2 segment
355  if (Nst[Track] < 2) continue;
356  // count tracks
357  ntgood++;
358  trg = new EdbTrackP();
359  Numgent[Track] = numt;
360  trg->Set(numt++, VTx[iv], VTy[iv], TXt[Track], TYt[Track], Nst[Track], nvggood+1);
361  trg->SetZ(VTz[iv]-z0shift);
362  trg->SetP(Pt[Track]);
363  if (TMass[Track] < 0.)
364  trg->SetM(0.1395700);
365  else
366  trg->SetM(TMass[Track]);
367  gener->AddTrack(trg);
368  // count tracks at current vertex
369  ntgoodv++;
370  // check if vertex with one track only
371  if (Nvtr[iv] < 2) break;
372  if (DIRt[Track] < 0.)
373  vert->AddTrack(trg, 0);
374  else
375  vert->AddTrack(trg, 1);
376  }
377  }
378  if (hp[24]) hp[24]->Fill((float)ntgoodv);
379  if (ntgoodv < 2) // delete vertex with low multiplicity
380  {
381  if(trg) trg->SetFlag(0);
382  delete vert;
383  vert = 0;
384  }
385  else
386  {
387  if (write_mc_data) // if data storing requested
388  {
389  fprintf(fmcdata, "%d %d %f %f %f\n", iv, ntgoodv,
390  VTx[iv], VTy[iv], VTz[iv]);
391  for (int it = 0; it < Nvtr[iv]; it++)
392  {
393  Track = Numvtr[iv][it];
394  if (Pt[Track] != -100.)
395  {
396  if (Nst[Track] < 2) continue;
397  if (TMass[Track] < 0.) TMass[Track] = 0.1395700;
398  fprintf(fmcdata, "%d %f %f %f %f\n",
400  Pt[Track],
401  TXt[Track], TYt[Track]);
402  }
403  }
404  }
405  // check if primary vertex has too low multiplicity
406  if (iv == 1 && (ntgoodv < primary_vertex_ntracks_min)) break;
407  // accept vertex
408  gener->AddVertex(vert);
409  // store MC vertex number
410  Numgenv[nvggood] = iv;
411  nvggood++;
412  if (iv == 1)
413  {
414  // generated primary vertex multiplicity
415  ntrgood_gen1 = ntgoodv;
416  }
417  }
418  }
419  }
420 }
bool write_mc_data
Definition: RecDispNU.C:13
int ntgood
Definition: RecDispNU.C:98
int Numgent[500]
Definition: RecDispNU.C:94
int primary_vertex_ntracks_min
Definition: RecDispNU.C:7
float z0shift
Definition: RecDispNU.C:120
int nvggood
Definition: RecDispNU.C:96
int ntrgood_gen1
Definition: RecDispNU.C:97
float Nvtr[500]
Definition: RecDispNU.C:106
float TMass[500]
Definition: RecDispNU.C:109
int Nst[500]
Definition: RecDispNU.C:92
float Numvtr[500][500]
Definition: RecDispNU.C:107
float VTz[500]
Definition: RecDispNU.C:104
float VTy[500]
Definition: RecDispNU.C:104
int Numgenv[500]
Definition: RecDispNU.C:95
float Pt[500]
Definition: RecDispNU.C:99
float TXt[500]
Definition: RecDispNU.C:100
int MaxVertex
Definition: RecDispNU.C:91
void SmearSegments()
Definition: RecDispNU.C:1375
int Pdg2Geant(int val)
Definition: RecDispNU.C:1302
float DIRt[500]
Definition: RecDispNU.C:103
int PdgId[500]
Definition: RecDispNU.C:93
FILE * fmcdata
Definition: RecDispNU.C:71
float TYt[500]
Definition: RecDispNU.C:101
float VTx[500]
Definition: RecDispNU.C:104
void AddVertex(EdbVertex *vtx)
Definition: EdbPVGen.h:54
void AddTrack(EdbTrackP *track)
Definition: EdbPVGen.h:49
void SetZ(float z)
Definition: EdbSegP.h:122
void SetP(float p)
Definition: EdbSegP.h:130
void SetFlag(int flag)
Definition: EdbSegP.h:127
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:86
void SetM(float m)
Definition: EdbPattern.h:159
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157
Definition: VtTrack.hh:64
@ Track
Definition: tlg2pattern.C:53

◆ GCodesInit()

void GCodesInit ( )
1245  {
1246 
1247  for(int i=0;i<MAXCODES*2;i++) Geant[i]=0;
1248 
1249  Geant[22]=1; // photon
1250  Geant[MAXCODES+11]=2; // e+
1251  Geant[11]=3; // e-
1252  Geant[12]=4; // e-neutrino (NB: flavour undefined by Geant)
1253  Geant[14]=4; // mu-neutrino (NB: flavour undefined by Geant)
1254  Geant[16]=4; // tau-neutrino (NB: flavour undefined by Geant)
1255  Geant[MAXCODES+13]=5; // mu+
1256  Geant[13]=6; // mu-
1257  Geant[111]=7; // pi0
1258  Geant[211]=8; // pi+
1259  Geant[MAXCODES+211]=9; // pi-
1260  Geant[130]=10; // K long
1261  Geant[321]=11; // K+
1262  Geant[MAXCODES+321]=12; // K-
1263  Geant[2112]=13; // n
1264  Geant[2212]=14; // p
1265  Geant[MAXCODES+2212]=15; // anti-proton
1266  Geant[310]=16; // K short
1267  Geant[221]=17; // eta
1268  Geant[3122]=18; // Lambda
1269  Geant[3222]=19; // Sigma+
1270  Geant[3212]=20; // Sigma0
1271  Geant[3112]=21; // Sigma-
1272  Geant[3322]=22; // Xi0
1273  Geant[3212]=23; // Xi-
1274  Geant[3334]=24; // Omega- (PB) ???diff from babar
1275  Geant[MAXCODES+2112]=25; // anti-neutron
1276  Geant[MAXCODES+3122]=26; // anti-Lambda
1277  Geant[MAXCODES+3222]=27; // Sigma-
1278  Geant[MAXCODES+3212]=28; // Sigma0
1279  Geant[MAXCODES+3112]=29; // Sigma+ (PB)*/
1280  Geant[MAXCODES+3322]=30; // Xi0
1281  Geant[MAXCODES+3312]=31; // Xi+
1282  Geant[MAXCODES+3334]=32; // Omega+ (PB) ???diff from babar
1283  Geant[MAXCODES+15]=33; // tau+
1284  Geant[15]=34; // tau-
1285  Geant[411]=35; // D+
1286  Geant[MAXCODES+411]=36; // D-
1287  Geant[421]=37; // D0
1288  Geant[MAXCODES+421]=38; // D0
1289  Geant[431]=39; // Ds+
1290  Geant[MAXCODES+431]=40; // anti Ds-
1291  Geant[4122]=41; // Lamba_c+
1292  Geant[24]=42; // W+
1293  Geant[MAXCODES+24]=43; // W-
1294  Geant[23]=44; // Z
1295  Geant[0]=45; // deuteron
1296  Geant[0]=46; // triton
1297  Geant[0]=47; // alpha
1298  Geant[0]=48; // G nu ? PDG ID 0 is undefined
1299 }
int Geant[2 *MAXCODES]
Definition: RecDispNU.C:1242
#define MAXCODES
Definition: RecDispNU.C:1241

◆ init()

void init ( char *  data_set = "data_set.def")
815 {
816  dset=new EdbDataProc(data_set);
817  dset->InitVolume(100);
818  gAli = dset->PVR();
819 }
EdbDataProc * dset
Definition: RecDispNU.C:111
Definition: EdbDataSet.h:180
EdbPVRec * PVR() const
Definition: EdbDataSet.h:197
int InitVolume(int datatype=0, const char *rcut="1")
Definition: EdbDataSet.cxx:2071

◆ init_rec()

void init_rec ( char *  data_set = "data_set.def")
423 {
424 
425  EdbTrackP *trg = 0;
426  Vertex *v = 0, *vc = 0;
427  int Track = 0;
428 
429  if (Geant[11] != 3) GCodesInit();
430 
431  // delete previous objects
432  if (dset)
433  {
434  if (gAli->eVTX) gAli->eVTX->Delete();
435  if (gAli->eTracks) gAli->eTracks->Delete();
436  gAli->ResetCouples();
437  int npat=gAli->Npatterns();
438  TClonesArray *segs = 0;
439  for(int i=0; i<npat; i++ )
440  if ( segs = (gAli->GetPattern(i))->GetSegments()) segs->Delete();
441  delete dset;
442  dset = 0;
443  gAli = 0;
444  }
445  if (gener)
446  {
447  delete gener;
448  gener = 0;
449  }
450 
451  dset=new EdbDataProc(data_set);
452  dset->InitVolume(0);
453  gAli = dset->PVR();
454 
456  gener = new EdbPVGen();
457  gener->SetVolume(vol);
458  gener->eVTX = new TObjArray(1000);
459  scan = gAli->GetScanCond();
461 
462  // fill PVGen object with generated vertexes and tracks
463  FillPVGen();
464  // if nothing generated
465  if (!(gener->eVTX) || !(gener->eTracks) || (nvggood == 0))
466  {
467  if (hp[25]) hp[25]->Fill(0.);
468  if (hp[26]) hp[26]->Fill(0.);
469  return;
470  }
471 
472  // fill hists with generated tracks parameters
473  FillHistsGen();
474 
475  // link microtracks
476  gAli->Link();
477 
478  if (hp[25]) hp[25]->Fill((float)ntgood);
479  if (hp[26]) hp[26]->Fill((float)nvggood);
480 
481  gAli->FillTracksCell();
482 
483  printf("Monte-Carlo Ntr = %d Nvt = %d MaxTrackIndex = %d MaxVertexIndex = %d\n", ntgood, nvggood, MaxTrack, MaxVertex);
484 
485  // make track candidates
486  gAli->MakeTracks();
487 
488  int nvg = (gener->eVTX)->GetEntries();
489  if (!nvg) return;
490  int ntrg = (gener->eTracks)->GetEntries();
491  if (!ntrg) return;
492 
493  int ntr = 0;
494  if (gAli->eTracks) ntr = gAli->eTracks->GetEntries();
495  if (!ntr)
496  {
497  if (hp[16]) hp[16]->Fill(0.);
498  if (hp[19]) hp[19]->Fill(0.);
499  if (hp[10]) hp[10]->Fill(0.);
500  if (hp[9]) hp[9]->Fill(0.);
501  if (hp[8]) hp[8]->Fill(0.);
502  if (hp[23]) hp[23]->Fill(0.);
503  return;
504  }
505 
506  int nsegmatch = 0, itrg = 0;
507  float p = 0.;
508  EdbTrackP *tr = 0;
509  // loop on tracks for momentum and momentum error setting
510  for (int itr=0; itr<ntr; itr++) {
511  tr = (EdbTrackP*)(gAli->eTracks->At(itr));
512  trg = 0;
513  if (ntrg)
514  {
515  itrg = tr->GetSegmentsAid(nsegmatch);
516  if (itrg >= 0 && itrg < MaxTrack)
517  {
518  itrg = Numgent[itrg];
519  if (itrg < 0 || itrg >= ntrg) continue;
520  trg = (EdbTrackP*)(gener->eTracks->At(itrg));
521  p = trg->P();
522  if (dpp > 0.)
523  tr->SetErrorP(p*p*dpp*dpp);
524  else
525  tr->SetErrorP(p*p*0.2*0.2);
526  if (use_mc_momentum)
527  {
528  p = p*(1.+dpp*gRandom->Gaus());
529  if (p < 0.05) p = 0.05;
530  else if (p > 30.0) p = 30.;
531  tr->SetP(p);
532  }
533  else
534  {
535  p = 0.;
536  }
537  tr->SetP(p);
538  if (use_mc_mass) tr->SetM(trg->M());
539  else tr->SetM(0.);
540  }
541  }
542  }
543  // fit tracks, use predefined track momentum and mass
544  gAli->FitTracks(0., 0.);
545 
546  gAli->FillCell(50,50,0.015,0.015);
547  // merge tracks
549 
550  ntr = gAli->eTracks->GetEntries();
551  printf("%d tracks was found\n",ntr);
552 
553  int ntrgood = 0;
554  int notmatched = 0;
555  int negflag = 0, ntrgood_r = 0, numveg = 0;
556  int negflag1 = 0, ntrgood_r1 = 0;
557  int nreject_nseg = 0, nreject_prob = 0;
558  int nreject_nseg1 = 0, nreject_prob1 = 0;
559  double right_ratio = 0.;
560  float dx = 0.;
561  // loop on tracks for finding corresponding generated track,
562  // count statistic and hists filling
563  for(int itr=0; itr<ntr; itr++) {
564  tr = (EdbTrackP*)(gAli->eTracks->At(itr));
565  trg = 0;
566  numveg = 0;
567  right_ratio = 0.;
568  if (ntrg) // number of generated tracks
569  {
570  itrg = tr->GetSegmentsAid(nsegmatch);
571  if (itrg >= 0 && itrg <= MaxTrack) // valid generated track MC index
572  {
573  itrg = Numgent[itrg];
574  if (itrg >= 0 && itrg < ntrg) // valid generated track PVGen index
575  {
576  trg = (EdbTrackP*)(gener->eTracks->At(itrg));
577  right_ratio = (double)nsegmatch/tr->N(); // "right" segments %%
578  if (right_ratio >= RightRatioMin)
579  {
580  numveg = trg->Flag() - 1;
581  if (numveg >= 0 && numveg < 500)
582  {
583  numveg = Numgenv[numveg]; // number of generated vertex
584  }
585  else
586  {
587  numveg = 0;
588  }
589  }
590  }
591  else
592  {
593  notmatched++;
594  }
595  }
596  else
597  {
598  notmatched++;
599  }
600  }
601  else
602  {
603  notmatched++;
604  }
605 
606  if (tr->Flag()<0)
607  {
608  // count "broken" tracks
609  negflag++;
610  if (numveg == 1) negflag1++;
611  continue;
612  }
613  if (hp[11]) hp[11]->Fill(tr->N());
614  if (tr->N()<nsegMin)
615  {
616  // count short tracks
617  nreject_nseg++;
618  if (numveg == 1) nreject_nseg1++;
619  continue;
620  }
621 
622  dx = (tr->GetSegmentFirst())->X()-(tr->GetSegmentFFirst())->X();
623 
624  if (trg != 0 && dx != 0.) // reject 'one-segment' tracks (due to high MS)
625  {
626  hp[17]->Fill(tr->Prob());
627  }
628  if (tr->Prob()<ProbMinT)
629  {
630  // count low probability tracks
631  nreject_prob++;
632  if (numveg == 1) nreject_prob1++;
633  continue;
634  }
635  if (trg)
636  {
637  if (trg->Flag() == 0) // background track
638  {
639 // ntrgoodb++;
640  if (right_ratio >= RightRatioMin)
641  {
642 // ntrgoodb_r++;
643  }
644 // hp[16]->Fill(right_ratio);
645 
646  }
647  else if (trg->Flag() <= nvg) // track at vertex
648  {
649  // count matched tracks
650  ntrgood++;
651  if (right_ratio >= RightRatioMin)
652  {
653  ntrgood_r++;
654  if (numveg == 1) ntrgood_r1++;
655  }
656  hp[15]->Fill(right_ratio);
657  }
658  }
659 
660  if (hp[12])
661  {
662  if (dx != 0. && tr->N() > 2) hp[12]->Fill(dx);
663  }
664 
665  }
666 
667  printf(" %6d tracks found after propagation\n", ntr-negflag);
668 
669  if (hp[16]) hp[16]->Fill((float)(ntrgood_r)/ntrg);
670  if (hp[19]) hp[19]->Fill((float)(ntr-negflag)/ntrg);
671  if (hp[10]) hp[10]->Fill(ntr-negflag);
672  if (hp[27]) hp[27]->Fill(ntrgood_gen1 - negflag1);
673  if (hp[28]) hp[28]->Fill(ntrgood_gen1 - nreject_nseg1);
674  if (hp[29]) hp[29]->Fill(ntrgood_gen1 - nreject_prob1);
675  if (hp[30]) hp[30]->Fill(ntrgood_gen1 - ntrgood_r1);
676 
677 
678  bool usemom = false;
679  // find 2-track vertexes
680  int nvtx = gAli->ProbVertex(maxgaps, AngleAcceptance, ProbMinV, ProbMinT, nsegMin, usemom);
681  // clear some statistic counters
682  int nvagood[100];
683  int nvagoodm[100];
684  for (int i=0; i<100; i++) nvagood[i] = 0;
685  for (int i=0; i<100; i++) nvagoodm[i] = 0;
686  int nvgoodm = 0, nvgood = 0;
687  int ivg = 0;
688 
689  if (!nvtx)
690  {
691  if (hp[9]) hp[9]->Fill(0.);
692  if (hp[23]) hp[23]->Fill(0.);
693  if (hp[8]) hp[8]->Fill(0.);
694  return;
695  }
696 
697  int nadd = 0;
698  int np = 0;
699  // find N-tracks vertexes
700  nadd = gAli->ProbVertexN(ProbMinVN);
701 
702  nvtx = gAli->eVTX->GetEntries();
703  // loop on found vertexes
704  for (int i=0; i<nvtx; i++)
705  {
706  edbv = (EdbVertex *)((gAli->eVTX)->At(i));
707  if (edbv && (edbv->Flag() != -10)) // reject "used" 2-tracks vertexes
708  {
709  v = edbv->V();
710  if (v)
711  {
712  if (v->valid())
713  {
714  if ((np = v->ntracks()) >= 2) // np is vertex multiplicity
715  {
716  // count valid vertexes
717  nvgood++;
718  nvagood[np]++;
719  tr = edbv->GetTrack(0);
720  // find 'ivg0' - index of corresponding PVGen vertex
721  int ivg0 = -1000000;
722  if(tr) ivg0 = tr->GetSegmentsAid(nsegmatch);
723  if (ivg0 >= 0 && ivg0 <= MaxTrack)
724  {
725  ivg0 = Numgent[ivg0];
726  if (ivg0 >= 0 && ivg0 < ntrg)
727  ivg0 = ((EdbTrackP*)(gener->eTracks->At(ivg0)))->Flag();
728  else
729  ivg0 = -1000000;
730  }
731  else
732  {
733  ivg0 = -1000000;
734  }
735  // check if all vertex tracks belong to the same
736  // generated vertex
737  ivg = -2000000;
738  for (int j=1; j<edbv->N() && ivg0>0; j++)
739  {
740  tr = edbv->GetTrack(j);
741  int ivg = -2000000;
742  if (tr) ivg = tr->GetSegmentsAid(nsegmatch);
743  if (ivg >= 0 && ivg < MaxTrack)
744  {
745  ivg = Numgent[ivg];
746  if (ivg >= 0 && ivg < ntrg)
747  ivg = ((EdbTrackP*)(gener->eTracks->At(ivg)))->Flag();
748  else
749  ivg = -2000000;
750  }
751  else
752  break;
753  if (ivg != ivg0) break;
754  }
755  if (ivg != ivg0) continue;
756  if (ivg <= 0) continue;
757  if (ivg > nvg) continue;
758  // check if vertex has valid multiplicity
759  if (np < rec_primary_vertex_ntracks_min) continue;
760  // count 'right' vertexes
761  nvagoodm[np]++;
762  nvgoodm++;
763  edbvg = (EdbVertex *)((gener->eVTX)->At(ivg-1));
764  vxo = edbv->VX();
765  vyo = edbv->VY();
766  vzo = edbv->VZ();
767  vxg = edbvg->X();
768  vyg = edbvg->Y();
769  vzg = edbvg->Z();
770  FillHistsV(*v);
771  }
772  }
773  }
774  }
775  }
776  if (hp[9]) hp[9]->Fill(nvgood);
777  if (nvggood)
778  {
779  if (hp[23]) hp[23]->Fill((float)nvgoodm/nvggood);
780  if (hp[8]) hp[8]->Fill((float)nvgood/nvggood);
781  }
782 
783  if (1) return;
784  // set special flag values for 'linked' vertexes (i.e. with common track)
785  if (nvtx)
786  {
787  int nlv = gAli->LinkedVertexes();
788  printf("%d linked vertexes found\n", nlv);
789  if (nlv)
790  {
791  for(int i=0; i<nv; i++)
792  {
793  v = (EdbVertex*)(gAli->eVTX->At(i));
794  if (v->Flag() > 2)
795  {
796  vc = v->GetConnectedVertex(0);
797  if (vc->ID() > v->ID())
798  {
799 // v->Print();
800 // vc->Print();
801  }
802  }
803  }
804  }
805  }
806  // fill vertexes neighborhood
807  int nn = gAli->VertexNeighboor(1000.,2);
808  printf("%d neighbooring tracks found\n", nn);
809  delete vol;
810  vol = 0;
811 }
int MaxTrack
Definition: RecDispNU.C:90
int maxgaps[6]
Definition: RecDispNU.C:36
bool use_mc_mass
Definition: RecDispNU.C:5
bool use_mc_momentum
Definition: RecDispNU.C:4
int rec_primary_vertex_ntracks_min
Definition: RecDispNU.C:9
bool usemom
Definition: RecDispNU.C:64
EdbPatternsVolume * vol
Definition: RecDispNU.C:116
float ProbMinV
Definition: RecDispNU.C:59
float AngleAcceptance
Definition: RecDispNU.C:57
void FillHistsV(Vertex &v)
Definition: RecDispNU.C:1102
float ProbMinT
Definition: RecDispNU.C:62
void GCodesInit()
Definition: RecDispNU.C:1245
int nsegMin
Definition: RecDispNU.C:63
float dpp
Definition: RecDispNU.C:30
float ProbMinP
Definition: RecDispNU.C:61
void FillPVGen()
Definition: RecDispNU.C:332
EdbScanCond * scan
Definition: RecDispNU.C:117
float ProbMinVN
Definition: RecDispNU.C:60
float RightRatioMin
Definition: RecDispNU.C:33
void FillHistsGen()
Definition: RecDispNU.C:1117
cout<< tr-> GetEntries()<< endl
Int_t npat
Definition: Xi2HatStartScript.C:33
ParaSet Fill()
Definition: EdbPVGen.h:18
void SetVolume(EdbPatternsVolume *pv)
Definition: EdbPVGen.h:34
void SetScanCond(EdbScanCond *scan)
Definition: EdbPVGen.h:35
int MakeTracks(int nsegments=2, int flag=0)
Definition: EdbPVRec.cxx:1985
EdbScanCond const * GetScanCond()
Definition: EdbPVRec.h:172
void FillTracksCell()
Definition: EdbPVRec.cxx:1315
void ResetCouples()
Definition: EdbPVRec.cxx:949
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
Definition: EdbPattern.h:348
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Float_t P() const
Definition: EdbSegP.h:149
Int_t Flag() const
Definition: EdbSegP.h:146
Float_t M() const
Definition: EdbPattern.h:160
const MATRIX::CMatrix & V() const
covariance matrix
Definition: VtTrack.C:205
Definition: VtVertex.hh:88
bool valid() const
is vertex valid?
Double_t X
Definition: tlg2pattern.C:77
p
Definition: testBGReduction_AllMethods.C:8

◆ MassGeant()

double MassGeant ( int  val)
1312  {
1313 double masses[50] = {
1314  0.,
1315  0.00051099906,
1316  0.00051099906,
1317  0.,
1318  0.105658389,
1319  0.105658389,
1320  0.1349764,
1321  0.1395700,
1322  0.1395700,
1323  0.497672,
1324  0.493677,
1325  0.493677,
1326  0.93956563,
1327  0.93827231,
1328  0.93827231,
1329  0.497672,
1330  0.54745 ,
1331  1.115684,
1332  1.18937 ,
1333  1.19255 ,
1334  1.197436,
1335  1.3149 ,
1336  1.32132 ,
1337  1.67245 ,
1338  0.93956563,
1339  1.115684,
1340  1.18937 ,
1341  1.19255 ,
1342  1.197436,
1343  1.3149 ,
1344  1.32132 ,
1345  1.67245 ,
1346  1.7771 ,
1347  1.7771 ,
1348  1.8694 ,
1349  1.8694 ,
1350  1.8646 ,
1351  1.8646 ,
1352  1.9685 ,
1353  1.9685 ,
1354  2.2851 ,
1355  80.220 ,
1356  80.220 ,
1357  91.187 ,
1358  1.875613,
1359  2.80925 ,
1360  3.727417,
1361  0. ,
1362  2.80923 ,
1363  0.};
1364 
1365  if (abs(val) >= MAXCODES) return(0.13957);
1366  int gc = 0;
1367  if (val>=0) gc = Geant[val];
1368  else gc = Geant[MAXCODES-val];
1369  if(gc > 0)
1370  return masses[gc-1];
1371  else
1372  return(0.13957);
1373 }

◆ Pdg2Geant()

int Pdg2Geant ( int  val)
1302  {
1303 
1304  if (abs(val)>MAXCODES) return(-1);
1305 
1306  if (val>=0 && (val < MAXCODES)) return( Geant[val] );
1307  else if (val < 0 && (-val < MAXCODES)) return( Geant[MAXCODES-val] );
1308  else return 8;
1309 }

◆ RecDispNU()

void RecDispNU ( )
328 {
329  init_rec();
330 }
void init_rec(char *data_set="data_set.def")
Definition: RecDispNU.C:422

◆ run()

void run ( int  ib = 1,
int  ie = 100,
int  nutype = 2 
)
170 {
171  // steering routine for event analysis
172  // take events with numbers from 'ib' to 'ie'
173  // nutype = 0 - NC events, 1 - CC events, 2 - NC & CC events
174 
175  char line[80], nusmtype[7], nutyp[3];
176  FILE *frunlist = 0;
177  int i, j, k, evold;
178  int Event, Track, nV;
179  float Vt, Vx, Vy, Vz, VPx, VPy, VPz, Tx, Ty, P;
180 
181  // initialize Geant Codes arrays
182  if (Geant[11] != 3) GCodesInit();
183  // save old runs.lst file
184  gSystem->Exec("mv -f runs.lst runs.lst.old &> /dev/null");
185  // find last event number for previos script execution
186  for (evold = 1; evold <= 100; evold++)
187  {
188  sprintf(line,"ls par/01_%03d.par &>/dev/null", evold);
189  if (!(gSystem->Exec(line))) break;
190  }
191  // book hists
192  BookHistsV();
193  // open file for write event data
194  if (write_mc_data) fmcdata = fopen("vertexes_and_tracks.data","w");
195  // loop on NC and CC collections
196  for (int nut = 0; nut < 2; nut++)
197  {
198  if (nut == 0 && nutype == 1) continue;
199  if (nut == 1 && nutype == 0) continue;
200  // build dir and file names for corresponding collection
201  if (nut == 0) { strcpy(nusmtype, "NC"); strcpy(nutyp, "nc"); }
202  if (nut == 1) { strcpy(nusmtype, "CC"); strcpy(nutyp, "cc"); }
203  // use data w/o smearing at generation phase
204  if (smear == 1) strcat(nusmtype,"_NOS");
205  // loop on events in selected (NC or CC) collection
206  for (i = ib; i <= ie; i++)
207  {
208  // set symbolic link for requested data directory
209  sprintf(line,"rm -f data &>/dev/null");
210  gSystem->Exec(line);
211  sprintf(line,"ln -s /mnt/nusrv3/opera/NUMU%s/numu%s.%03d data\n", nusmtype, nutyp, i);
212  gSystem->Exec(line);
213  // create runs.lst file
214  frunlist = fopen("runs.lst","w");
215  for (j = 58; j>0; j--)
216  {
217 
218  if (evold != i)
219  {
220  sprintf(line,"mv -f par/%02d_%03d.par par/%02d_%03d.par\n", j, evold, j, i);
221  gSystem->Exec(line);
222  }
223  sprintf(line,"%d %d data/%02d_%03d.cp.root 1\n", j, i, j, i);
224  fprintf(frunlist,"%s",line);
225  }
226  evold = i;
227  fclose(frunlist);
228  // clear some counters ( <=500 tracks, <=500 vertexes)
229  for (j = 0; j<500; j++) Pt[j] = -100.;
230  for (j = 0; j<500; j++) VTx[j] = -1000000.;
231  Ntr = 0;
232  Nvt = 0;
233  for (j = 0; j<500; j++) Nst[j] = 0;
234  for (j = 0; j<500; j++) Nvtr[j] = 0;
235  for (j = 0; j<500; j++) Numgent[j] = -1;
236  for (j = 0; j<500; j++) Numgenv[j] = -1;
237  for (j = 0; j<500; j++) TMass[j] = -1;
238  // open ROOT file with microtrack information
239  sprintf(filename, "/mnt/nusrv3/opera/NUMU%s/numu%s.%03d/numu%s.%03d.root", nusmtype, nutyp, i, nutyp, i);
240  INfile = &filename[0];
241  fmicro = new TFile(INfile);
242  TreeMS = (TTree*)fmicro->Get("TreeMS");
243  micro = new My_Track(TreeMS, INfile);
244 
245 
246  int nentries_micro = Int_t(micro->fChain->GetEntriesFast());
247  MaxTrack = 0;
248  MaxVertex = 0;
249  k = 0;
250  // loop on file entries (microtracks) and fill arrays with
251  // tracks parameters
252  while(k<nentries_micro){
253  micro->GetEntry(k);
254  k++;
255  Event = micro->Event;
256  Track = micro->Track;
257  nV = micro->nV;
258  if (nV != 1 && only_primary_vertex) continue;
259  Vt = micro->Vt;
260  Vx = micro->VTX[0];
261  Vy = micro->VTX[1];
262  Vz = micro->VTX[2];
263  VPx = micro->VPx;
264  VPy = micro->VPy;
265  VPz = micro->VPz;
266  P = TMath::Sqrt(VPx*VPx + VPy*VPy + VPz*VPz);
267  Tx = VPx/VPz;
268  Ty = VPy/VPz;
269  P = micro->P;
270  if (Track >= 500) continue;
271  if (Pt[Track] == -100.) // first occurence for track
272  {
273  Ntr++;
274  Pt[Track] = P;
275  PdgId[Track] = micro->PdgId;
276  TXt[Track] = Tx;
277  TYt[Track] = Ty;
278  NVt[Track] = nV;
280  if (VPz <= 0.) DIRt[Track] = -1.;
281  else DIRt[Track] = +1.;
282  Numvtr[nV][Nvtr[nV]] = Track;
283  Nvtr[nV]++;
284  if (Track > MaxTrack) MaxTrack = Track;
285  }
286  if (nV >= 500) continue;
287  if (VTx[nV] == -1000000.) // first occurence for vertex
288  {
289  Nvt++;
290  VTx[nV] = Vx;
291  VTy[nV] = Vy;
292  VTz[nV] = Vz;
293  if (nV > MaxVertex) MaxVertex = nV;
294  }
295  Nst[Track]++;
296  }
297  for (j = 0; j < MaxTrack; j++)
298  {
299  Nst[j] /= 2; // number of basetracks (microtracs/2)
300  }
301  init_rec(); // reconstruct one event
302  delete micro;
303  micro = 0;
304  fmicro = 0;
305  }
306  }
307 
309 
310  // rename .par files to event number 1
311  for (j = 58; j>0; j--)
312  {
313  sprintf(line,"mv -f par/%02d_%03d.par par/%02d_%03d.par &>/dev/null\n", j, i-1, j, 1);
314  gSystem->Exec(line);
315  }
316  if (scanning) return;
317  // save hists
318  rf = new TFile("RecDispNU.root","RECREATE","MC Vertex reconstruction");
319  hlist.Write();
320  rf->Close();
321  delete rf;
322  rf = 0;
323  printf(" Shift in Z0 is %f\n", z0shift);
324 }
const char filename[256]
Definition: RecDispNU.C:83
const char * INfile
Definition: RecDispNU.C:84
TFile * rf
Definition: RecDispNU.C:72
int Nvt
Definition: RecDispNU.C:89
TTree * TreeMS
Definition: RecDispNU.C:87
bool smear
Definition: RecDispNU.C:14
int NVt[500]
Definition: RecDispNU.C:102
TFile * fmicro
Definition: RecDispNU.C:85
My_Track * micro
Definition: RecDispNU.C:86
bool scanning
Definition: RecDispNU.C:11
void BookHistsV()
Definition: RecDispNU.C:1014
bool only_primary_vertex
Definition: RecDispNU.C:6
int Ntr
Definition: RecDispNU.C:88
double MassGeant(int val)
Definition: RecDispNU.C:1312
struct @7 P
strcpy(cmd,"cp Shower.root Shower2.root")
fclose(pFile)

◆ scan1()

void scan1 ( )
141 {
142  // analyze one event in scanning mode
143  evnum++;
144  if (evnum > 100)
145  {
146  if (nutype == 0)
147  {
148  evnum = 1;
149  nutypes = 1;
150  }
151  else
152  {
153  printf("No more events!");
154  evnum = 0;
155  scanning = false;
156  return;
157  }
158  }
160 }
int evnum
Definition: RecDispNU.C:119
int nutypes
Definition: RecDispNU.C:121
void run(int ib=1, int ie=100, int nutype=2)
Definition: RecDispNU.C:169

◆ scanend()

void scanend ( )
163 {
164  // stop scanning routine
165  scanning = false;
166  evnum = 0;
167 }

◆ SmearSegments()

void SmearSegments ( )
1376 {
1377  // smearing with parameters defined by ScanCond
1378 
1379  Float_t x,y,z,tx,ty;
1380  Float_t sx,sy,sz,stx,sty,sumz, sumzold;
1381 
1382  EdbPattern *pat = 0;
1383  EdbSegP *seg = 0;
1384  EdbTrackP *tr = 0;
1385  int trgind = 0, Track = 0;
1386  int n = vol->Npatterns();
1387 
1388  sumzold = -1.;
1389  for( int i=0; i<n; i++ ) {
1390  pat = vol->GetPattern(i);
1391 
1392  sumz = 0.;
1393  for( int j=0; j<pat->N(); j++ ) {
1394  seg = pat->GetSegment(j);
1395 
1396  Track = seg->Aid(1);
1397  trgind = -1;
1398  if (Track < 500) trgind = Numgent[Track];
1399  if (gener && trgind >= 0)
1400  {
1401  if (gener->eTracks)
1402  {
1403  if (trgind < gener->eTracks->GetEntries())
1404  {
1405  tr = (EdbTrackP *)gener->eTracks->At(trgind);
1406  if (tr) tr->AddSegment(seg);
1407  }
1408  }
1409  }
1410  if (smear)
1411  {
1412  sx = scan->SigmaX(seg->TX());
1413  sy = scan->SigmaY(seg->TY());
1414  sz = 0.;
1415  stx = scan->SigmaTX(seg->TX());
1416  sty = scan->SigmaTY(seg->TY());
1417 
1418  x = gRandom->Gaus(seg->X(), sx);
1419  y = gRandom->Gaus(seg->Y(), sy);
1420  z = gRandom->Gaus(seg->Z(), sz);
1421  tx = gRandom->Gaus(seg->TX(), stx);
1422  ty = gRandom->Gaus(seg->TY(), sty);
1423 
1424  seg->Set( seg->ID(), x, y, tx, ty, seg->W(), seg->Flag());
1425  seg->SetErrorsCOV( sx*sx, sy*sy, sz*sz, stx*stx, sty*sty );
1426  }
1427  if (setz)
1428  {
1429  z = seg->Z();
1430  sumz += z;
1431  hpp[0]->Fill(i, z);
1432  if (i && sumzold != -1.) hp[31]->Fill(sumzold - z);
1433  seg->SetZ( (n - i - 1)*1290. );
1434  }
1435  }
1436  if (pat->N()) sumzold = sumz/pat->N();
1437  else sumzold = -1.;
1438  }
1439 }
bool setz
Definition: RecDispNU.C:15
Definition: EdbPattern.h:280
float SigmaTX(float ax) const
Definition: EdbScanCond.h:106
float SigmaTY(float ay) const
Definition: EdbScanCond.h:107
float SigmaX(float ax) const
Definition: EdbScanCond.h:102
float SigmaY(float ay) const
Definition: EdbScanCond.h:103
Float_t TX() const
Definition: EdbSegP.h:172
void SetErrorsCOV(float sx2, float sy2, float sz2, float stx2, float sty2, float sp2=1.)
Definition: EdbSegP.cxx:71
Int_t ID() const
Definition: EdbSegP.h:144
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
Float_t Y() const
Definition: EdbSegP.h:171
Float_t W() const
Definition: EdbSegP.h:148
Float_t TY() const
Definition: EdbSegP.h:173
Int_t Aid(int i) const
Definition: EdbSegP.h:166
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66

Variable Documentation

◆ AngleAcceptance

float AngleAcceptance = 1.5

◆ back1_tetamax

float back1_tetamax = 0.35

◆ back2_plim

float back2_plim[2] = {0.5, 5.5}

◆ back2_tetamax

float back2_tetamax = 0.25

◆ DIRt

float DIRt[500]

◆ dpp

float dpp = 0.20

◆ ds

EdbDisplay* ds =0

◆ ds2

EdbDisplay* ds2 =0

◆ dset

EdbDataProc* dset =0

◆ evnum

int evnum = 0

◆ fiducial_border

float fiducial_border = 20000.

◆ fiducial_border_z

float fiducial_border_z = 20000.

◆ filename

const char filename[256]

◆ fmcdata

FILE* fmcdata = 0

◆ fmicro

TFile* fmicro

◆ gAli

EdbPVRec* gAli =0

◆ Geant

int Geant[2 *MAXCODES]

◆ gener

EdbPVGen* gener =0

◆ hld1

TObjArray hld1

◆ hld2

TObjArray hld2

◆ hld3

TObjArray hld3

◆ hld4

TObjArray hld4

◆ hld5

TObjArray hld5

◆ hld6

TObjArray hld6

◆ hld7

TObjArray hld7

◆ hld8

TObjArray hld8

◆ hlist

TObjArray hlist

◆ hp

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

◆ hpp

TProfile* hpp[10] = {0,0,0,0,0,0,0,0,0,0}

◆ INfile

const char* INfile = &filename[0]

◆ log

FILE* log
extern

◆ maxgaps

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

◆ MaxTrack

int MaxTrack = 0

◆ MaxVertex

int MaxVertex = 0

◆ micro

My_Track* micro = 0

◆ nsegMin

int nsegMin = 2

◆ Nst

int Nst[500]

◆ ntgood

int ntgood = 0

◆ Ntr

int Ntr = 0

◆ ntrgood_gen1

int ntrgood_gen1 = 0

◆ Numgent

int Numgent[500]

◆ Numgenv

int Numgenv[500]

◆ Numvtr

float Numvtr[500][500]

◆ nutypes

int nutypes = 0

◆ nvggood

int nvggood = 0

◆ Nvt

int Nvt = 0

◆ NVt

int NVt[500]

◆ Nvtr

float Nvtr[500]

◆ only_primary_vertex

bool only_primary_vertex = true

◆ PdgId

int PdgId[500]

◆ primary_vertex_ntracks_min

int primary_vertex_ntracks_min = 2

◆ 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

◆ Pt

float Pt[500]

◆ rec_primary_vertex_ntracks_min

int rec_primary_vertex_ntracks_min = 2

◆ rf

TFile* rf =0

◆ RightRatioMin

float RightRatioMin = 0.5

◆ scan

void scan =0

◆ scanning

bool scanning = false

◆ seg_s

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

◆ setz

bool setz = true

◆ smass

double smass = 0.1395700

◆ smear

bool smear = true

◆ stderr

FILE* stderr
extern

◆ stdout

FILE* stdout
extern

◆ TMass

float TMass[500]

◆ TreeMS

TTree* TreeMS = 0

◆ TXt

float TXt[500]

◆ TYt

float TYt[500]

◆ use_mc_mass

bool use_mc_mass = false

◆ use_mc_momentum

bool use_mc_momentum = false

◆ usemom

bool usemom =false

◆ vol

◆ VTx

float VTx[500]

◆ VTy

float VTy[500]

◆ VTz

float VTz[500]

◆ vxg

float vxg = 0.

◆ vxo

float vxo = 0.

◆ vyg

float vyg = 0.

◆ vyo

float vyo = 0.

◆ vzg

float vzg = 0.

◆ vzo

float vzo = 0.

◆ write_mc_data

bool write_mc_data = false

◆ z0shift

float z0shift = 295.