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
array of vertex
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:273
Definition: EdbPattern.h:334
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
float ProbSeg(float tx, float ty, float puls) const
Definition: EdbScanCond.cxx:119
Definition: EdbSegP.h:21
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t W() const
Definition: EdbSegP.h:151
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
Int_t N() const
Definition: EdbPattern.h:86
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
EdbSegP * AddSegment(int i, EdbSegP &s)
Definition: EdbPattern.cxx:72

◆ 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:125
void SetFlag(int flag)
Definition: EdbSegP.h:130
void Set(int id, float x, float y, float tx, float ty, float w, int flag)
Definition: EdbSegP.h:87
Float_t Z() const
Definition: EdbPattern.h:84

◆ 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:129
void SetP(float p)
Definition: EdbSegP.h:133
Definition: EdbPattern.h:113
Int_t N() const
Definition: EdbPattern.h:177
void SetM(float m)
Definition: EdbPattern.h:154
Double_t Z
Definition: tlg2couples.C:104
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 {
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:878
Definition: EdbVertex.h:69
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:132
Int_t Flag() const
Definition: EdbSegP.h:149
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
s
Definition: check_shower.C:55

◆ 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
brick X0
Definition: RecDispMC.C:112
static double DeLandauPb(float p, float mass, float dx)
Definition: EdbPhys.cxx:77
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:132
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:51

◆ SetScanCond()

void EdbPVGen::SetScanCond ( EdbScanCond scan)
inline
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{
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:155

◆ 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

◆ 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:90
void SetErrorsCOV(float sx2, float sy2, float sz2, float stx2, float sty2, float sp2=1.)
Definition: EdbSegP.cxx:72
void SetMC(int mEvt, int mTrack)
Definition: EdbSegP.h:141
void SetDZ(float dz)
Definition: EdbSegP.h:126

◆ 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:320
EdbPattern * NextPattern(float z, int dir) const
Definition: EdbPattern.cxx:1920

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: