FEDRA emulsion software from the OPERA Collaboration
EdbPVGen Class Reference

#include <EdbPVGen.h>

Inheritance diagram for EdbPVGen:
Collaboration diagram for EdbPVGen:

Public Member Functions

void AddTrack (EdbTrackP *track)
 
void AddVertex (EdbVertex *vtx)
 
 EdbPVGen ()
 
void FillRecVolumeBT (EdbPatternsVolume &vrec)
 
void GenerateBackground (int n, float x[4], float sx[4], int flag=0)
 
void GenerateBackgroundTracks (int nb, float vlim[4], float lim[4], float plim[2], float TetaMax, float ProbGap, int eloss_flag)
 
void GenerateBeam (int n, float x[4], float sx[4], float lim[4], float z0, int flag=0)
 
void GeneratePhaseSpaceEvents (int nv, TGenPhaseSpace *pDecay, float vzlim[2], float vlim[4], float lim[4], float ProbGap, int eloss_flag, int *charges)
 
void GeneratePhaseSpaceEventsWithDecay (int nv, TGenPhaseSpace *pDecay, TGenPhaseSpace *pSecond, float vzlim[2], float vlim[4], float lim[4], float ProbGap, int eloss_flag, int *charges)
 
void GeneratePulsGaus (float amp, float mean, float sigma, float wmin=0, float wmax=0., int flag=0)
 
void GeneratePulsPoisson (float mean, float amp=1., float wmin=0, float wmax=0., int flag=0)
 
void GenerateUncorrelatedSegments (int nb, float lim[4], float TetaMax, int flag)
 
EdbPatternsVolumeGetVolume () const
 
int MakeTracksMC (int nsegmin, TObjArray *tracks)
 
float PropagateSegment (EdbSegP &s, float dz, float X0, float m, int eloss_flag)
 
void SetScanCond (EdbScanCond *scan)
 
void SetVolume (EdbPatternsVolume *pv)
 
void SmearPatterns (float shift, float rot)
 
void SmearSegment (EdbSegP &s, EdbScanCond &cond)
 
void SmearSegments ()
 
void TrackMC (float zlim[2], float lim[4], EdbTrackP &tr, int eloss_flag=0, float PGap=0.)
 
int TrackMC2 (EdbTrackP &tr, EdbLayer &lim, int eloss_flag, float PGap)
 
 ~EdbPVGen ()
 

Public Attributes

EdbVertexReceEVR
 
TObjArray * eTracks
 
TObjArray * eVTX
 

Private Attributes

EdbPatternsVolumeePVolume
 
EdbScanCondeScanCond
 

Constructor & Destructor Documentation

◆ EdbPVGen()

EdbPVGen::EdbPVGen ( )

◆ ~EdbPVGen()

EdbPVGen::~EdbPVGen ( )

34 {
35  if(eEVR) delete eEVR;
36  if(eTracks) delete eTracks;
37  if(eVTX) delete eVTX;
38 }
TObjArray * eTracks
Definition: EdbPVGen.h:27
EdbVertexRec * eEVR
Definition: EdbPVGen.h:29
TObjArray * eVTX
Definition: EdbPVGen.h:28

Member Function Documentation

◆ AddTrack()

void EdbPVGen::AddTrack ( EdbTrackP track)
inline
49  {
50  if(!eTracks) { eTracks = new TObjArray(); eEVR->eEdbTracks = eTracks; }
51  eTracks->Add(track);
52  }
TObjArray * eEdbTracks
Definition: EdbVertex.h:204
Definition: bitview.h:14

◆ AddVertex()

void EdbPVGen::AddVertex ( EdbVertex vtx)
inline
54  {
55  if(!eVTX) { eVTX = new TObjArray(); eEVR->eVTX = eVTX; }
56  eVTX->Add((TObject*)vtx);
57  }
TObjArray * eVTX
Definition: EdbVertex.h:205

◆ FillRecVolumeBT()

void EdbPVGen::FillRecVolumeBT ( EdbPatternsVolume vrec)
113 {
114  // fill extarnal volume vrec with basetracks
116  int npat = pv->Npatterns();
117  if( npat!= vrec.Npatterns()) {
118  Log(1,"EdbPVGen::FillRecVolumeBT","Error! different volumes structure");
119  return;
120  }
121  for( int i=0; i<pv->Npatterns(); i++ ) {
122  EdbPattern *pat = pv->GetPattern(i);
123  EdbPattern *patr = vrec.GetPattern(i);
124 
125  for( int j=0; j<pat->N(); j++ ) {
126  EdbSegP *seg = pat->GetSegment(j);
127  printf("%f %f \n", seg->W(), eScanCond->ProbSeg( seg->TX(), seg->TY(), seg->W()) );
128  if( eScanCond->ProbSeg( seg->TX(), seg->TY(), seg->W()) > 0.05 ) {
129  patr->AddSegment(*seg);
130  }
131  }
132  }
133 }
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
Int_t npat
Definition: Xi2HatStartScript.C:33
EdbPatternsVolume * GetVolume() const
Definition: EdbPVGen.h:36
EdbScanCond * eScanCond
Definition: EdbPVGen.h:24
Definition: EdbPattern.h:280
Definition: EdbPattern.h:348
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
float ProbSeg(float tx, float ty, float puls) const
Definition: EdbScanCond.cxx:119
Definition: EdbSegP.h:18
Float_t TX() const
Definition: EdbSegP.h:172
Float_t W() const
Definition: EdbSegP.h:148
Float_t TY() const
Definition: EdbSegP.h:173
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:71

◆ GenerateBackground()

void EdbPVGen::GenerateBackground ( int  n,
float  x[4],
float  sx[4],
int  flag = 0 
)
82 {
84 
85  Float_t x,y,z,tx,ty;
86 
87  EdbPattern *pat = 0;
88  EdbSegP *seg = new EdbSegP();
89 
90  for( int j=0; j<n; j++ ) {
91 
92  for (int i=0; i<pv->Npatterns(); i++ ) {
93 
94  pat = pv->GetPattern(i);
95  z = pat->Z();
96 
97  x = xmin[0] + (xmax[0]-xmin[0]) * gRandom->Rndm();
98  y = xmin[1] + (xmax[1]-xmin[1]) * gRandom->Rndm();
99  tx = xmin[2] + (xmax[2]-xmin[2]) * gRandom->Rndm();
100  ty = xmin[3] + (xmax[3]-xmin[3]) * gRandom->Rndm();
101 
102  seg->Set(j, x, y, tx, ty,1,0);
103  seg->SetZ(z);
104  seg->SetFlag(flag);
105  pat->AddSegment( *seg );
106 
107  }
108  }
109 }
void SetZ(float z)
Definition: EdbSegP.h:122
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
Float_t Z() const
Definition: EdbPattern.h:87
float xmin
Definition: emthickness.cpp:61
float xmax
Definition: emthickness.cpp:61

◆ GenerateBackgroundTracks()

void EdbPVGen::GenerateBackgroundTracks ( int  nb,
float  vlim[4],
float  lim[4],
float  plim[2],
float  TetaMax,
float  ProbGap,
int  eloss_flag 
)
643 {
644  // event generation
645  float x, y, z, costmin = TMath::Cos(TetaMax);
646  float cost, sint, phi, tx, ty, ex, ey, ez, p;
647  float zlim[2];
648  EdbTrackP *trb = 0;
650 
651  zlim[0] = (pv->GetPattern(0))->Z();
652  int np = pv->Npatterns();
653  zlim[1] = (pv->GetPattern(np-1))->Z();
654 
655  int id = 0;
656  if (eTracks) id = eTracks->GetEntries();
657 
658  for(int i=0; i<nb; i++) {
659 
660  x = vlim[0] + (vlim[2] - vlim[0])*gRandom->Rndm();
661  y = vlim[1] + (vlim[3] - vlim[1])*gRandom->Rndm();
662  z = zlim[0];
663 
664  cost = costmin + (1. - costmin)*gRandom->Rndm();
665  sint = TMath::Sqrt(1. - cost*cost);
666  phi = TMath::TwoPi()*gRandom->Rndm();
667  ex = sint*TMath::Cos(phi);
668  ey = sint*TMath::Sin(phi);
669  ez = cost;
670  tx = ex/ez;
671  ty = ey/ez;
672  trb = new EdbTrackP();
673  trb->Set(id++, x, y, tx, ty, 1, 0);
674  trb->SetZ(z);
675  trb->SetPID(0);
676  p = plim[0] + (plim[1] - plim[0])*gRandom->Rndm();
677  trb->SetP(p);
678  trb->SetM(0.139);
679 
680  // generation of background track segments
681 
682  TrackMC( zlim, lim, *trb, eloss_flag, ProbGap );
683 // delete trb;
684  if (trb->N() <= 0)
685  {
686  delete trb;
687  trb = 0;
688  id--;
689  }
690  else
691  {
692  AddTrack(trb);
693  }
694  }
695 
696 }
int eloss_flag
Definition: RecDispMC.C:89
brick lim[0]
Definition: RecDispMC.C:108
float ProbGap
Definition: RecDispMC.C:56
void TrackMC(float zlim[2], float lim[4], EdbTrackP &tr, int eloss_flag=0, float PGap=0.)
Definition: EdbPVGen.cxx:389
void AddTrack(EdbTrackP *track)
Definition: EdbPVGen.h:49
void SetPID(int pid)
Definition: EdbSegP.h:126
void SetP(float p)
Definition: EdbSegP.h:130
Definition: EdbPattern.h:118
Int_t N() const
Definition: EdbPattern.h:182
void SetM(float m)
Definition: EdbPattern.h:159
struct @8 Z
p
Definition: testBGReduction_AllMethods.C:8

◆ GenerateBeam()

void EdbPVGen::GenerateBeam ( int  n,
float  xx[4],
float  sxx[4],
float  lim[4],
float  z0,
int  flag = 0 
)

42 {
44 
45  Float_t x0,y0,x,y,z,tx,ty;
46 
47  EdbPattern *pat = 0;
48  EdbSegP *seg = new EdbSegP();
49 
50  int j=0;
51  while(j<n) {
52 
53  x0 = xx[0] + sxx[0] * gRandom->Gaus();
54  y0 = xx[1] + sxx[1] * gRandom->Gaus();
55  if(x0<lim[0]) continue;
56  if(y0<lim[1]) continue;
57  if(x0>lim[2]) continue;
58  if(y0>lim[3]) continue;
59  j++;
60  tx = xx[2] + sxx[2] * gRandom->Gaus();
61  ty = xx[3] + sxx[3] * gRandom->Gaus(); // starting point (at z0)
62 
63  for (int i=0; i<pv->Npatterns(); i++ ) {
64 
65  pat = pv->GetPattern(i);
66  z = pat->Z();
67 
68  x = x0 + tx*(z-z0);
69  y = y0 + ty*(z-z0);
70 
71  seg->Set(j, x, y, tx, ty,1,0);
72  seg->SetZ(z);
73  seg->SetFlag(flag);
74  pat->AddSegment( *seg );
75 
76  }
77  }
78 }
brick z0
Definition: RecDispMC.C:106

◆ GeneratePhaseSpaceEvents()

void EdbPVGen::GeneratePhaseSpaceEvents ( int  nv,
TGenPhaseSpace *  pDecay,
float  vzlim[2],
float  vlim[4],
float  lim[4],
float  ProbGap,
int  eloss_flag,
int *  charges 
)
703 {
704  // Phase Space event generation
705  float x;
706  float y;
707  float z;
708  float zlimt[2];
709  EdbVertex *vedb = 0;
710  EdbTrackP *tr = 0;
711  Double_t weight, tx, ty;
712  TLorentzVector *pi = 0;
713  int numt = 0, numv = 0, nt = 0, ntrgood = 0;
714  double pxs,pys,pzs,es, p2;
715  float mp, pp;
716 
717  if (eTracks) numt = eTracks->GetEntries();
718 
719  int nvmod = nv;
720 
721  if (eVTX) numv = eVTX->GetEntries();
722 
723  for(int iv=0; iv<nvmod; iv++) {
724  vedb = new EdbVertex();
725  x = vlim[0] + (vlim[2] - vlim[0])*gRandom->Rndm();
726  y = vlim[1] + (vlim[3] - vlim[1])*gRandom->Rndm();
727  z = vzlim[0] + (vzlim[1] - vzlim[0])*gRandom->Rndm();
728  vedb->SetXYZ(x, y, z);
729  vedb->SetFlag(1);
730 
731  weight = pDecay->Generate();
732 
733  nt = pDecay->GetNt();
734  pxs = 0.;
735  pys = 0.;
736  pzs = 0.;
737  es = 0.;
738  ntrgood = 0;
739 
740  for(int ip=0; ip<nt; ip++) {
741  pi = pDecay->GetDecay(ip);
742  pxs += pi->Px();
743  pys += pi->Py();
744  pzs += pi->Pz();
745  es += pi->E();
746  if (!charges[ip]) continue;
747  tr = new EdbTrackP();
748  tx = pi->Px()/pi->Pz();
749  ty = pi->Py()/pi->Pz();
750  tr->Set(numt++, x, y, (float)tx, (float)ty, 1, numv+1);
751  tr->SetZ(z);
752  tr->SetP(pi->P());
753  tr->SetM(pi->M());
754 
755  // generation of track segments for secondary particles
756 
757  if (pi->Pz() >= 0.)
758  {
759  zlimt[0] = z;
760  zlimt[1] = 200000.;
761  }
762  else
763  {
764  zlimt[0] = z;
765  zlimt[1] = -1000.;
766  }
767  TrackMC( zlimt, lim, *tr, eloss_flag, ProbGap);
768  if (tr->N() > 0)
769  {
770  if (pi->Pz() < 0.)
771  eEVR->AddTrack(*vedb, tr, 0);
772  else
773  eEVR->AddTrack(*vedb, tr, 1);
774  AddTrack(tr);
775  ntrgood++;
776  }
777  else
778  {
779  delete tr;
780  tr = 0;
781  numt--;
782  }
783  }
784 
785  // generate primary track
786  if (z > 300. && charges[nt])
787  {
788  p2 = pxs*pxs + pys*pys + pzs*pzs;
789  pp = TMath::Sqrt(p2);
790  mp = TMath::Sqrt(es*es - p2);
791  tr = new EdbTrackP();
792  tr->Set(numt++, x, y, 0., 0., 1, numv+1);
793  tr->SetZ(0);
794  tr->SetP(pp);
795 // tr->SetP(1000000.);
796  tr->SetM(mp);
797 
798  // generation of track segments for primary particle
799 
800  zlimt[0] = z;
801  zlimt[1] = -1000.;
802  TrackMC( zlimt, lim, *tr, 0, ProbGap );
803  if (tr->N() > 0)
804  {
805  eEVR->AddTrack(*vedb, tr, 0);
806  AddTrack(tr);
807  ntrgood++;
808  }
809  else
810  {
811  delete tr;
812  tr = 0;
813  numt--;
814  }
815  }
816 
817  if (ntrgood == 0)
818  {
819  delete vedb;
820  vedb = 0;
821 // nvmod++;
822  }
823  else
824  if (ntrgood == 1)
825  {
826  delete vedb;
827  vedb = 0;
828  if (tr) tr->SetFlag(0);
829 // nvmod++;
830  }
831  else
832  {
833  AddVertex(vedb);
834  numv++;
835  }
836  }
837 }
EdbVertex * vedb
Definition: RecDispMC.C:139
TGenPhaseSpace * pDecay
Definition: RecDispMC.C:187
int charges[101]
Definition: RecDispMC.C:148
TTree * tr
Definition: Shower_E_FromShowerRoot.C:5
void AddVertex(EdbVertex *vtx)
Definition: EdbPVGen.h:54
EdbVTA * AddTrack(EdbVertex &edbv, EdbTrackP *track, int zpos)
Definition: EdbVertex.cxx:900
Definition: EdbVertex.h:68
void SetFlag(int flag=0)
Definition: EdbVertex.h:158
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157

◆ GeneratePhaseSpaceEventsWithDecay()

void EdbPVGen::GeneratePhaseSpaceEventsWithDecay ( int  nv,
TGenPhaseSpace *  pDecay,
TGenPhaseSpace *  pSecond,
float  vzlim[2],
float  vlim[4],
float  lim[4],
float  ProbGap,
int  eloss_flag,
int *  charges 
)
845 {
846  // Phase Space event generation
847  float x, xd = 0.;
848  float y, yd = 0.;
849  float z, zd = 0.;
850  float zlimt[2];
851  TGenPhaseSpace *pCurrent = 0;
852  EdbVertex *vedb = 0;
853  EdbTrackP *tr = 0, *trdec = 0;
854  Double_t weight, tx, ty;
855  TLorentzVector *pi = 0;
856  int numt = 0, numv = 0, nt = 0, ntrgood = 0, nts = 0, zposprim = -1;
857  double pxs,pys,pzs,es, p2, masses[18];
858  float mp, pp;
859 
860  if (eTracks) numt = eTracks->GetEntries();
861 
862  int nvmod = nv;
863 
864  if (eVTX) numv = eVTX->GetEntries();
865 
866 
867  pSecond->Generate();
868  nts = pSecond->GetNt();
869  for(int ip=0; ip<nts; ip++) {
870  pi = pSecond->GetDecay(ip);
871  masses[ip] = pi->M();
872  }
873 
874  for(int iv=0; iv<nvmod; iv++) {
875 
876  pCurrent = pDecay;
877  x = vlim[0] + (vlim[2] - vlim[0])*gRandom->Rndm();
878  y = vlim[1] + (vlim[3] - vlim[1])*gRandom->Rndm();
879  z = vzlim[0] + (vzlim[1] - vzlim[0])*gRandom->Rndm();
880 
881  trdec = 0;
882 
883  zposprim = -1;
884 
885  for(int ic=0; ic<2; ic++) {
886 
887  ntrgood = 0;
888 
889  if (ic == 1)
890  {
891  pCurrent = pSecond;
892  x = xd;
893  y = yd;
894  z = zd;
895  }
896 
897  vedb = new EdbVertex();
898  vedb->SetXYZ(x, y, z);
899  if (ic==0) vedb->SetFlag(1);
900 
901  weight = pCurrent->Generate();
902 
903  nt = pCurrent->GetNt();
904  pxs = 0.;
905  pys = 0.;
906  pzs = 0.;
907  es = 0.;
908  ntrgood = 0;
909 
910  for(int ip=0; ip<nt; ip++) {
911  pi = pCurrent->GetDecay(ip);
912  pxs += pi->Px();
913  pys += pi->Py();
914  pzs += pi->Pz();
915  es += pi->E();
916  if ((charges[ip] == 0 && ic == 0) || pi->M() == .135) continue;
917  tx = pi->Px()/pi->Pz();
918  ty = pi->Py()/pi->Pz();
919  if (charges[ip] > 0 || ic == 1)
920  {
921  tr = new EdbTrackP();
922  tr->Set(numt++, x, y, (float)tx, (float)ty, 1, numv+1);
923  tr->SetZ(z);
924  tr->SetP(pi->P());
925  tr->SetM(pi->M());
926  if (pi->Pz() >= 0.)
927  {
928  zlimt[0] = z;
929  zlimt[1] = 200000.;
930  }
931  else
932  {
933  zlimt[0] = z;
934  zlimt[1] = -1000.;
935  }
936  }
937  // generation of track segments for secondary particles
938 
939  if (TMath::Abs((double)charges[ip]) > 10. && ic == 0)
940  {
941  double mpath = (pi->E()/pi->M())*TMath::Abs((double)charges[ip]);
942  double path = gRandom->Exp(mpath);
943  path = path*(pi->Pz()/pi->P());
944  if (pi->Pz() >= 0.)
945  {
946  zlimt[0] = z;
947  zlimt[1] = z+path;
948  zd = zlimt[1];
949  xd = x + tx*path;
950  yd = y + ty*path;
951  }
952  else
953  {
954  zlimt[0] = z;
955  zlimt[1] = z+path;
956  zd = zlimt[1];
957  xd = x - tx*path;
958  yd = y - ty*path;
959  }
960  pSecond->SetDecay(*pi, nts, (double *)&masses[0]);
961  if (charges[ip] < 0) continue;
962  }
963  TrackMC( zlimt, lim, *tr, eloss_flag, ProbGap);
964  if (tr->N() > 0)
965  {
966  if (pi->Pz() < 0.)
967  eEVR->AddTrack(*vedb, tr, 0);
968  else
969  eEVR->AddTrack(*vedb, tr, 1);
970  AddTrack(tr);
971  ntrgood++;
972  if (TMath::Abs((double)charges[ip]) > 10. && ic == 0)
973  {
974  trdec = tr;
975  if (pi->Pz() < 0.)
976  zposprim = 1;
977  else
978  zposprim = 0;
979  }
980  }
981  else
982  {
983  delete tr;
984  tr = 0;
985  numt--;
986  }
987  }
988 
989  // generate primary track
990  if (z > 300. && charges[nt] && ic == 0)
991  {
992  p2 = pxs*pxs + pys*pys + pzs*pzs;
993  pp = TMath::Sqrt(p2);
994  mp = TMath::Sqrt(es*es - p2);
995  tr = new EdbTrackP();
996  tr->Set(numt++, x, y, 0., 0., 1, numv+1);
997  tr->SetZ(0);
998  tr->SetP(pp);
999 // tr->SetP(1000000.);
1000  tr->SetM(mp);
1001 
1002  // generation of track segments for primary particle
1003 
1004  zlimt[0] = z;
1005  zlimt[1] = -1000.;
1006  TrackMC( zlimt, lim, *tr, 0, ProbGap );
1007  if (tr->N() > 0)
1008  {
1009  eEVR->AddTrack(*vedb, tr, 0);
1010  AddTrack(tr);
1011  ntrgood++;
1012  }
1013  else
1014  {
1015  delete tr;
1016  tr = 0;
1017  numt--;
1018  }
1019  }
1020 
1021  if (ntrgood == 0)
1022  {
1023  delete vedb;
1024  vedb = 0;
1025 // nvmod++;
1026  }
1027  else
1028  if (ntrgood == 1)
1029  {
1030  delete vedb;
1031  vedb = 0;
1032  if (tr) tr->SetFlag(0);
1033 // nvmod++;
1034  }
1035  else
1036  {
1037  AddVertex(vedb);
1038  numv++;
1039  if (ic==1 && trdec) eEVR->AddTrack(*vedb, trdec, zposprim);
1040  if (ic==1 && trdec) trdec->SetMC(numv, 0);
1041  }
1042  } // primary, secondary vertexes loop
1043  } // loop on vertexes pairs
1044 }

◆ GeneratePulsGaus()

void EdbPVGen::GeneratePulsGaus ( float  amp,
float  mean,
float  sigma,
float  wmin = 0,
float  wmax = 0.,
int  flag = 0 
)
165 {
167 
168  EdbPattern *pat = 0;
169  EdbSegP *seg = 0;
170  float w;
171 
172  for( int i=0; i<pv->Npatterns(); i++ ) {
173  pat = pv->GetPattern(i);
174 
175  for( int j=0; j<pat->N(); j++ ) {
176  seg = pat->GetSegment(j);
177  if(flag>0) if( seg->Flag() != flag) continue;
178 
179  REGEN:
180  w = (int)(amp * gRandom->Gaus(mean,sigma));
181  if(wmin>0) if(w<wmin) goto REGEN;
182  if(wmax>0) if(w>wmax) w = wmax;
183 
184  seg->SetW( w );
185  }
186  }
187 }
void SetW(float w)
Definition: EdbSegP.h:129
Int_t Flag() const
Definition: EdbSegP.h:146
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ GeneratePulsPoisson()

void EdbPVGen::GeneratePulsPoisson ( float  mean,
float  amp = 1.,
float  wmin = 0,
float  wmax = 0.,
int  flag = 0 
)
138 {
140 
141  EdbPattern *pat = 0;
142  EdbSegP *seg = 0;
143  float w;
144 
145  for( int i=0; i<pv->Npatterns(); i++ ) {
146  pat = pv->GetPattern(i);
147 
148  for( int j=0; j<pat->N(); j++ ) {
149  seg = pat->GetSegment(j);
150  if(flag>0) if( seg->Flag() != flag) continue;
151 
152  REGEN:
153  w = a * gRandom->Poisson(mean);
154  if(wmin>0) if(w<wmin) goto REGEN;
155  if(wmax>0) if(w>wmax) w = wmax;
156 
157  seg->SetW( w );
158  }
159  }
160 }
void a()
Definition: check_aligned.C:59

◆ GenerateUncorrelatedSegments()

void EdbPVGen::GenerateUncorrelatedSegments ( int  nb,
float  lim[4],
float  TetaMax,
int  flag 
)
589 {
590  // generation of uncorrelated segments background
591 
592  float x, y, z, tx, ty, costmin = TMath::Cos(TetaMax);
593  float cost, phi, ex, ey, ez, sint;
594  int segnum = 0;
595  EdbSegP *s=0;
596  EdbPattern *pat = 0;
598  s = new EdbSegP();
599 
600  Float_t sx=eScanCond->SigmaX(0.), sy=eScanCond->SigmaY(0.);
601  Float_t stx=eScanCond->SigmaTX(0.), sty=eScanCond->SigmaTY(0.);
602 
603  for(int np=0; np<pv->Npatterns(); np++)
604  {
605  pat = pv->GetPattern(np);
606  z = pat->Z();
607  segnum = pat->N();
608  for(int i=0; i<nb; i++) {
609 
610  x = lim[0] + (lim[2] - lim[0])*gRandom->Rndm();
611  y = lim[1] + (lim[3] - lim[1])*gRandom->Rndm();
612 
613  cost = costmin + (1. - costmin)*gRandom->Rndm();
614  sint = TMath::Sqrt(1. - cost*cost);
615  phi = TMath::TwoPi()*gRandom->Rndm();
616  ex = sint*TMath::Cos(phi);
617  ey = sint*TMath::Sin(phi);
618  ez = cost;
619  tx = ex/ez;
620  ty = ey/ez;
621  s->Set(segnum++, x, y, tx, ty, 1, flag);
622  s->SetZ(z);
623  s->SetP(4.);
624  s->SetPID(np);
625  s->SetDZ(290.);
626  tx = TMath::Sqrt(tx*tx+ty*ty);
627  sx=eScanCond->SigmaX(tx);
628  sy=eScanCond->SigmaY(0.);
629  stx=eScanCond->SigmaTX(tx);
630  sty=eScanCond->SigmaTY(0.);
631  s->SetErrorsCOV(sx*sx, sy*sy, 0., stx*stx, sty*sty, 0.);
632 
633  pat->AddSegment( *s );
634  }
635  }
636  delete s;
637 }
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
void SetErrorsCOV(float sx2, float sy2, float sz2, float stx2, float sty2, float sp2=1.)
Definition: EdbSegP.cxx:71
void SetDZ(float dz)
Definition: EdbSegP.h:123
EdbSegP * s
Definition: tlg2pattern.C:32

◆ GetVolume()

EdbPatternsVolume* EdbPVGen::GetVolume ( ) const
inline
36 { return ePVolume;}
EdbPatternsVolume * ePVolume
Definition: EdbPVGen.h:22

◆ MakeTracksMC()

int EdbPVGen::MakeTracksMC ( int  nsegmin,
TObjArray *  tracks 
)
1047 {
1048  // use MC data and form tracks array
1049 
1050  if (!eTracks) return 0;
1051  if (!tracks) return 0;
1052  tracks->Delete();
1053  tracks->Clear();
1054 
1055  printf("make tracks from MC information...\n");
1056 
1057  int nseg, ntr=0, ntrg = 0, n0 = 0;
1058  EdbSegP *seg = 0;
1059  EdbTrackP *track = 0, *trackg = 0;
1060 
1061  ntrg=eTracks->GetEntries();
1062  for(int it=0; it<ntrg; it++) {
1063 
1064  trackg = (EdbTrackP *)(eTracks->At(it));
1065  if (!trackg) continue;
1066  nseg = trackg->N();
1067  if( nseg < nsegments ) continue;
1068  track = new EdbTrackP(nseg);
1069 
1070  track->SetNpl( TMath::Abs(trackg->GetSegmentLast()->PID() -
1071  trackg->GetSegmentFirst()->PID()) + 1 );
1072 
1073  n0=0;
1074  for(int is=0; is<nseg; is++) {
1075  seg = trackg->GetSegment(is);
1076  if(seg->Flag()<0) n0++;
1077  track->AddSegment(seg);
1078  }
1079  track->SetN0(n0);
1080  track->SetID(it);
1081  tracks->Add(track);
1082  ntr++;
1083  }
1084 
1085  printf("%d tracks with >= %d segments are selected\n",ntr, nsegments);
1086  return ntr;
1087 }
TTree * tracks
Definition: check_tr.C:19

◆ PropagateSegment()

float EdbPVGen::PropagateSegment ( EdbSegP s,
float  dz,
float  X0,
float  m,
int  eloss_flag 
)
281 {
282  // propagate segment s to the distance dz in the media
283  // input : s - segment
284  // dz - distance to propagate (along z)
285  // X0 - rad length
286  // m - mass of the particle
287  // eloss_flag -
288  // output: s - segment with updated parameters
289  // return: energy loss in this step
290 
291  bool doMS = true;
292 
293  float tx=s.TX(), ty=s.TY();
294  float x =s.X(), y=s.Y(), z=s.Z();
295  double dx=0., dy=0., dtx=0., dty=0.;
296  double cost = TMath::Sqrt((double)1.+(double)tx*(double)tx+(double)ty*(double)ty);
297  double dzm = dz*cost;
298  double dzPb = dzm*1000./1300.; //TODO
299 
300  float p=s.P(), pa=s.P(), pn=0, de = 0.;
301  Float_t e = TMath::Sqrt((double)p*(double)p+(double)m*(double)m);
302 
303  if (eloss_flag == 1) de = EdbPhysics::DeAveragePb(s.P(), m, TMath::Abs(dzPb));
304  else if(eloss_flag == 2) de = EdbPhysics::DeLandauPb(p, m, TMath::Abs(dzPb));
305  else de = 0;
306  if(de<0) de = 0;
307  e = e - de;
308  if (e < m) e = m;
309  pn = TMath::Sqrt((double)e*(double)e - (double)m*(double)m);
310  pa = 0.5*(p+pn);
311  p = pn;
312 
313  float r1,r2, teta0;
314  if(doMS) {
315  teta0 = EdbPhysics::ThetaMS2( pa, m, dzm, X0);
316  teta0 = TMath::Sqrt(teta0);
317  do { gRandom->Rannor(r1,r2);} while (TMath::Abs(r1) > 50. || TMath::Abs(r2) > 50.);
318  dx = (0.5*r1+0.866025*r2)*dzm*teta0/1.73205;
319  dtx = r2*teta0;
320  do { gRandom->Rannor(r1,r2);} while (TMath::Abs(r1) > 50. || TMath::Abs(r2) > 50.);
321  dy = (0.5*r1+0.866025*r2)*dzm*teta0/1.73205;
322  dty = r2*teta0;
323  }
324 
325  s.SetX( x + tx*dz + dx );
326  s.SetY( y + ty*dz + dy );
327  s.SetTX(tx + dtx );
328  s.SetTY(ty + dty );
329  s.SetZ(z+dz);
330  s.SetDZ(300.); //TODO
331  s.SetP(p);
332 
333  return de;
334 }
brick dz
Definition: RecDispMC.C:107
static double DeLandauPb(float p, float mass, float dx)
Definition: EdbPhys.cxx:76
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:131
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:50
void SetY(Float_t y)
Definition: EdbSegP.h:175
void SetTX(Float_t tx)
Definition: EdbSegP.h:176
void SetX(Float_t x)
Definition: EdbSegP.h:174
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
void SetTY(Float_t ty)
Definition: EdbSegP.h:177
Float_t P() const
Definition: EdbSegP.h:149
Float_t Y() const
Definition: EdbSegP.h:171
float X0
Definition: emthickness.cpp:69

◆ SetScanCond()

void EdbPVGen::SetScanCond ( EdbScanCond scan)
inline
35 {eScanCond=scan;}
EdbScanCond * scan
Definition: RecDispNU.C:117

◆ SetVolume()

void EdbPVGen::SetVolume ( EdbPatternsVolume pv)
inline
34 {ePVolume=pv;}

◆ SmearPatterns()

void EdbPVGen::SmearPatterns ( float  shift,
float  rot 
)
214 {
216  EdbAffine2D a;
217 
218  for( int i=0; i<pv->Npatterns()-1; i++ ) {
219 
220  a.Rotate( gRandom->Gaus(0, rot) );
221  a.ShiftX( gRandom->Gaus(0, shift) );
222  a.ShiftY( gRandom->Gaus(0, shift) );
223 
224  pv->GetPattern(i)->Transform(&a);
225  }
226 
227 }
Definition: EdbAffine.h:17
virtual void Transform(const EdbAffine2D *a)
Definition: EdbVirtual.cxx:154

◆ SmearSegment()

void EdbPVGen::SmearSegment ( EdbSegP s,
EdbScanCond cond 
)

-----------—using angular corellation now------------------—

338 {
339  // smear parameters of segment s with taking into account angular corellation
340 
341  TVector2 vx,vt;
342  vt.Set( s.TX(), s.TY() );
343  vx.Set( s.X(), s.Y() );
344  float phi = vt.Phi();
345  vt.Rotate( -phi );
346  vx.Rotate( -phi );
347 
348  float rx,ry,rtx,rty;
349  gRandom->Rannor(rx,ry);
350  gRandom->Rannor(rtx,rty);
351 
353 /*
354  vx.Set( vx.X() + rx*cond.SigmaX(vt.X()),
355  vx.Y() + ry*cond.SigmaY(vt.Y()) );
356  */
357 
358  rx*= cond.SigmaX(0);
359  ry*= cond.SigmaY(0);
360  rtx*=cond.SigmaTXf(vt.X());
361  rty*=cond.SigmaTYf(vt.Y());
362 
363  vx.Set( vx.X() + rx+rtx*0.5*s.DZ(),
364  vx.Y() + ry+rty*0.5*s.DZ());
365  vt.Set( vt.X() + rtx,
366  vt.Y() + rty);
367 
368  vt.Rotate( phi );
369  vx.Rotate( phi );
370 
371  float sxd = s.X()-vx.X();
372  float syd = s.Y()-vx.Y();
373  float stxd = s.TX()-vt.X();
374  float styd = s.TY()-vt.Y();
375 
376  s.SetX( vx.X() );
377  s.SetY( vx.Y() );
378  s.SetTX( vt.X() );
379  s.SetTY( vt.Y() );
380 
381  //if (x_y_correlation)
382  s.SetErrorsCOV(sxd*sxd, syd*syd, 0., stxd*stxd, styd*styd, 0.);
383  //else
384  //s.SetErrors(sxd*sxd, syd*syd, 0., stxd*stxd, styd*styd, 0.);
385 
386 }
float SigmaTXf(float ax) const
full functions for sigmaTX(TX) - use them for simulation
Definition: EdbScanCond.h:109
float SigmaTYf(float ay) const
Definition: EdbScanCond.h:110
Float_t DZ() const
Definition: EdbSegP.h:151

◆ SmearSegments()

void EdbPVGen::SmearSegments ( )
191 {
192  // smearing with parameters defined by ScanCond
193 
195  EdbScanCond *cond = eScanCond;
196 
197  EdbPattern *pat = 0;
198  EdbSegP *seg = 0;
199 
200  for( int i=0; i<pv->Npatterns(); i++ ) {
201  pat = pv->GetPattern(i);
202 
203  for( int j=0; j<pat->N(); j++ ) {
204  seg = pat->GetSegment(j);
205 
206  SmearSegment(*seg, *cond);
207 
208  }
209  }
210 }
void SmearSegment(EdbSegP &s, EdbScanCond &cond)
Definition: EdbPVGen.cxx:337
Definition: EdbScanCond.h:10

◆ TrackMC()

void EdbPVGen::TrackMC ( float  zlim[2],
float  lim[4],
EdbTrackP tr,
int  eloss_flag = 0,
float  PGap = 0. 
)
391 {
392  // Segments generation for single MC track with taking into account MS and
393  // XY errors correllation
394 
395  // Input parameters:
396  // zlim - Z limits ( if zlim[0] > zlim[1] then direction of
397  // tracking is opposit Z-axis )
398  // lim - XY limits
399  // sigma - measuring sigma (x,y,tx,ty)
400  // tr - segments generated according to track parameters
401  //
402  // Output: fill associated volume with segments
403  // tr - add generated segments to the tr
404 
405  bool exact_angles = true; // exact new angles calculation after MS
406  bool x_y_correlation = true; // take into account x-y measurement correlation
407  Float_t eTPb = 1000./1300.;
408  Float_t x0 =tr.X();
409  Float_t y0 =tr.Y();
410  Float_t z0 =tr.Z();
411  Float_t tx0 =tr.TX();
412  Float_t ty0 =tr.TY();
413  Float_t p0 =tr.P();
414  Float_t m =tr.M();
415  Float_t sx=eScanCond->SigmaX(0.), sy=eScanCond->SigmaY(0.);
416  Float_t stx=eScanCond->SigmaTX(0.), sty=eScanCond->SigmaTY(0.);
417  Float_t sxd=sx, syd=sy, stxd=stx, styd=sty;
418  Float_t x,y,z,tx,ty, xs, ys, txs, tys;
419  Float_t dz, dzm, cost, r1, r2, teta0, zold, dzPb;
420  Float_t dx = 0., dy = 0., dtx = 0., dty = 0.;
421  Float_t dxs = 0., dys = 0., dtxs = 0., dtys = 0.;
422  Double_t Phi,CPhi,SPhi;
423  Float_t X0 = eScanCond->RadX0();
424  EdbPattern *pat = 0;
425  int segnum = 0;
426 
427  if ( x0 < lim[0] ) return;
428  if ( y0 < lim[1] ) return;
429  if ( x0 > lim[2] ) return;
430  if ( y0 > lim[3] ) return;
431 
432  EdbSegP *seg = new EdbSegP();
433 
434  Float_t p = p0, pa = p0, pn, de = 0., DE = 0.;
435  Float_t e = TMath::Sqrt((double)p*(double)p+(double)m*(double)m);
436  x = x0;
437  y = y0;
438  tx = tx0;
439  ty = ty0;
440  zold = z0;
441  int npat = ePVolume->Npatterns();
442  int k = 0, dir = 0;
443  for (int kc=0; kc<npat; kc++ ) {
444  if (zlim[0] > zlim[1])
445  {
446  k = npat - 1 - kc;
447  dir = -1;
448  }
449  else
450  {
451  k = kc;
452  dir = +1;
453  }
454  pat = ePVolume->GetPattern(k);
455  z = pat->Z();
456  segnum = pat->N();
457 
458  if ( dir > 0 ) if ( z < zlim[0] ) { continue; }
459  if ( dir > 0 ) if ( z > zlim[1] ) { continue; }
460  if ( dir < 0 ) if ( z > zlim[0] ) { continue; }
461  if ( dir < 0 ) if ( z < zlim[1] ) { continue; }
462  if ( dir > 0 ) if ( z < zold ) { continue; }
463  if ( dir < 0 ) if ( z >= zold ) { continue; }
464  if ( gRandom->Rndm() < (double)PGap) { continue; }
465 
466  dz = z - zold;
467  cost = TMath::Sqrt((double)1.+(double)tx*(double)tx+(double)ty*(double)ty);
468  if (cost >= 10.) break;
469  dzm = dz*cost;
470  dzPb = eTPb*dzm;
471  if (eloss_flag == 1)
472  {
473  de = EdbPhysics::DeAveragePb(p, m, TMath::Abs(dzPb));
474  if ( de < 0.) de = 0;
475  e = e - de;
476  if (e < m) e = m;
477  pn = TMath::Sqrt((double)e*(double)e - (double)m*(double)m);
478  pa = 0.5*(p+pn);
479  p = pn;
480  DE += de;
481 
482  }
483  else if (eloss_flag == 2)
484  {
485  de = EdbPhysics::DeLandauPb(p, m, TMath::Abs(dzPb));
486  if ( de < 0.) de = 0;
487  e = e - de;
488  if (e < m) e = m;
489  pn = TMath::Sqrt((double)e*(double)e - (double)m*(double)m);
490  pa = 0.5*(p+pn);
491  p = pn;
492  DE += de;
493  }
494  if (kc)
495  {
496  teta0 = EdbPhysics::ThetaMS2( pa, m, dzm, X0);
497  teta0 = TMath::Sqrt(teta0);
498  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
499  do { r2 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
500  dx = (0.5*r1+0.866025*r2)*dzm*teta0/1.73205;
501  dtx = r2*teta0;
502  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
503  do { r2 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
504  dy = (0.5*r1+0.866025*r2)*dzm*teta0/1.73205;
505  dty = r2*teta0;
506  }
507  else
508  {
509  teta0 = 0.;
510  dx = 0.;
511  dy = 0.;
512  dtx = 0.;
513  dty = 0.;
514  }
515  x = x + tx*dz + dx;
516  y = y + ty*dz + dy;
517  if (exact_angles)
518  {
519  tx = TMath::Tan(TMath::ATan(tx) + dtx);
520  ty = TMath::Tan(TMath::ATan(ty) + dty);
521  }
522  else
523  {
524  tx = tx + dtx;
525  ty = ty + dty;
526  }
527  zold = z;
528  if ( x < lim[0] ) break;
529  if ( y < lim[1] ) break;
530  if ( x > lim[2] ) break;
531  if ( y > lim[3] ) break;
532  double theta = TMath::Sqrt(tx*tx + ty*ty);
533  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
534  if (!x_y_correlation) sxd = eScanCond->SigmaX(tx);
535  else sxd = eScanCond->SigmaX(theta);
536  dxs = sxd*r1;
537  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
538  if (!x_y_correlation) syd = eScanCond->SigmaY(ty);
539  else syd = eScanCond->SigmaY(0.);
540  dys = syd*r1;
541  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
542  if (!x_y_correlation) stxd = eScanCond->SigmaTX(ty);
543  else stxd = eScanCond->SigmaTX(theta);
544  dtxs = stxd*r1;
545  do { r1 = gRandom->Gaus();} while (TMath::Abs(r1) > 50.);
546  if (!x_y_correlation) styd = eScanCond->SigmaTY(ty);
547  else styd = eScanCond->SigmaTY(0.);
548  dtys = styd*r1;
549  if (x_y_correlation)
550  {
551  Phi = TMath::ATan2(ty,tx); // azimuthal angle of the track
552  CPhi = TMath::Cos(Phi);
553  SPhi = TMath::Sin(Phi);
554  xs = x + dxs*CPhi - dys*SPhi; // smearing of track parameters with corellation
555  ys = y + dxs*SPhi + dys*CPhi; // along the track projection to XY plane
556  txs = tx + dtxs*CPhi - dtys*SPhi; // (regression line)
557  tys = ty + dtxs*SPhi + dtys*CPhi;
558  }
559  else
560  {
561  xs = x + dxs; // smearing of track parameters
562  ys = y + dys;
563  txs = tx + dtxs;
564  tys = ty + dtys;
565  }
566  seg->Set(segnum++, xs, ys, txs, tys, 25., tr.ID());
567  seg->SetMC(0, tr.ID());
568  seg->SetP(pa);
569  seg->SetZ(z);
570  seg->SetDZ(300.);
571  seg->SetPID(k);
572  if (x_y_correlation)
573  seg->SetErrorsCOV(sxd*sxd, syd*syd, 0., stxd*stxd, styd*styd, 0.);
574  else
575  seg->SetErrors(sxd*sxd, syd*syd, 0., stxd*stxd, styd*styd, 0.);
576 
577  tr.AddSegment( pat->AddSegment(*seg) );
578  if (p <= 0.050) break;
579  if (teta0 >= 1.00) break;
580  }
581  tr.SetDE(DE);
582  tr.SetCounters();
583 
584  delete seg;
585 }
double DE
Definition: RecDispMC_Profiles.C:465
float RadX0() const
Definition: EdbScanCond.h:58
void SetErrors()
Definition: EdbSegP.h:89
void SetMC(int mEvt, int mTrack)
Definition: EdbSegP.h:138

◆ TrackMC2()

int EdbPVGen::TrackMC2 ( EdbTrackP tr,
EdbLayer lim,
int  eloss_flag,
float  PGap 
)
233 {
234  // Segments generation for single MC track with taking into account MS and energy loss
235  // tr - input-output track
236  // lim - volume limits for segments generation
237  // eloss_flag - 0 - no energy loss
238  // 1 - average Pb energy loss
239  // PGap - gap probability = (1-efficiency)
240 
241  int ic=0;
243  EdbSegP s;
244  s.Copy(*(tr.TrackEnd()));
245  EdbPattern *pat=0;
246  float dz=0;
247  float de=0;
248 
249  while(1) {
250  if( !lim.IsInside( s.X(), s.Y(), s.Z() ) ) break;
251  pat = vol->NextPattern( s.Z(), tr.Dir() );
252  if( !pat ) break;
253 
254  dz = pat->Z()-s.Z();
255 
256  de += PropagateSegment( s, dz,
257  eScanCond->RadX0(),
258  tr.M(), eloss_flag );
259 
260  if( gRandom->Rndm() < (double)PGap ) continue;
261  if( s.TX()*s.TX()+s.TY()*s.TY()>1.) break;
262 
263  s.SetPID(pat->PID());
264  s.SetMC(0, tr.ID());
265  tr.AddSegment( pat->AddSegment(s) );
266  tr.AddSegmentF( new EdbSegP(s) );
267  ic++;
268  }
269 
270  tr.SetDE(de);
271  tr.SetCounters();
272 
273  return ic;
274 }
EdbPatternsVolume * vol
Definition: RecDispNU.C:116
float PropagateSegment(EdbSegP &s, float dz, float X0, float m, int eloss_flag)
Definition: EdbPVGen.cxx:277
int PID() const
Definition: EdbPattern.h:329
EdbPattern * NextPattern(float z, int dir) const
Definition: EdbPattern.cxx:2086
void Copy(const EdbSegP &s)
Definition: EdbSegP.cxx:104

Member Data Documentation

◆ eEVR

EdbVertexRec* EdbPVGen::eEVR

◆ ePVolume

EdbPatternsVolume* EdbPVGen::ePVolume
private

◆ eScanCond

EdbScanCond* EdbPVGen::eScanCond
private

◆ eTracks

TObjArray* EdbPVGen::eTracks

◆ eVTX

TObjArray* EdbPVGen::eVTX

The documentation for this class was generated from the following files: