FEDRA emulsion software from the OPERA Collaboration
EdbEDAUtil Namespace Reference

Namespaces

namespace  ROOTDict
 

Enumerations

enum  EDACOLOR {
  kCOLOR_BY_PLATE , kCOLOR_BY_PH , kCOLOR_BY_ID , kCOLOR_BY_MCID ,
  kCOLOR_BY_PARTICLE , kBLACKWHITE
}
 
enum  EDAEXTENDMODE {
  kExtendAuto , kExtendUpDown , kExtendDown , kExtendUp ,
  kExtendNo
}
 

Functions

bool AskYesNo (char *message)
 
double CalcDistance (EdbSegP *s1, EdbSegP *s2, double z)
 
double CalcDmin (EdbSegP *seg1, EdbSegP *seg2, double *dminz=NULL)
 
void CalcDTTransLongi (double tx1, double ty1, double tx2, double ty2, double *dtTransverse, double *dtLongitudinal)
 
void CalcDTTransLongi (EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
 
void CalcDXTransLongi (EdbSegP *s1, EdbSegP *s2, double *dxt, double *dxl)
 
double CalcEMCSelectron (EdbTrackP *t)
 
double CalcIP (EdbSegP *s, double x, double y, double z)
 
double CalcIP (EdbSegP *s, EdbVertex *v)
 
double CalcKinkAngle (EdbSegP *tparent, EdbSegP *tdaughter)
 
double CalcMinimumKinkAngle (EdbSegP *t1ry, EdbSegP *tdaughter, int z_is_middle_of_base=1)
 
double CalcMinimumKinkAngle (EdbVertex *v1ry, EdbSegP *tdaughter, int z_is_middle_of_base=1)
 
double CalcMinimumKinkAngle (TVector3 vertex, TVector3 daupos, TVector3 daumom)
 
EdbMomentumEstimatorCalcP (EdbTrackP *t, double &p, double &pmin, double &pmax, bool print=kTRUE)
 
void CalcPPartial (EdbTrackP *t, EdbSegP *s1st, EdbSegP *slast, double &p, double &pmin, double &pmax, bool print=kTRUE)
 
double CalcPt (EdbSegP *tparent, EdbSegP *tdaughter)
 
double CalcPtmin (EdbSegP *t1ry, EdbSegP *tdaughter, int z_is_middle_of_base=1)
 
double CalcPtmin (EdbVertex *v1ry, EdbSegP *tdaughter, int z_is_middle_of_base=1)
 
double CalcPtmin (TVector3 vertex, TVector3 daupos, TVector3 daumom)
 
EdbVertexCalcVertex (TObjArray *segments)
 calc vertex from the segments array (EdbSegP*) More...
 
EdbTrackPCleanTrack (EdbTrackP *t)
 
double DTRMS (EdbTrackP *t)
 
double DTRMS1Kink (EdbTrackP *t, int *NKinkAngleUsed=NULL)
 
double DTRMSelectron (EdbTrackP *t)
 
double DTRMSTL (EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *ndata=NULL)
 
double DTRMSTL1Kink (EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
 
double DTRMSTLGiven1Kink (EdbTrackP *t, int iKink, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
 
void ErrorMessage (char *message)
 
void ErrorMessage (char *title, char *message)
 
void FillTracksFromPatterns (EdbPVRec *pvr)
 
int FindBrickIDFromPath ()
 
char * FindProcDirClient ()
 
TEveCompound * GetTrackElement (EdbTrackP *t)
 
TEvePointSet * GetVertexElement (EdbVertex *v)
 
int InputID (char *message, EdbID &id)
 
int InputNumberInteger (char *message, int idefault=0)
 
double InputNumberReal (char *message, double default_num=0.0, TGNumberFormat::EStyle es=TGNumberFormat::kNESReal)
 
int IsIncludeCouples (EdbPattern *pat)
 
int IsSegment (TEveElement *e)
 
int IsSegment (TObject *o)
 
int IsTrack (TEveElement *e)
 
int IsTrack (TObject *o)
 
int IsVertex (TEveElement *e)
 
int IsVertex (TObject *o)
 
void MakePVRFromTracksArray (TObjArray *tracks_or_segments, EdbPVRec &pvr)
 
EdbPVRecReadFeedbackPVR (char *filename=NULL)
 
EdbPVRecReadMxxPVR (char *filename=NULL)
 
void WritePVRMxx (EdbPVRec *pvr, char *filename=NULL)
 
void WriteTracksMxx (TObjArray *pvr, char *filename=NULL)
 

Enumeration Type Documentation

◆ EDACOLOR

Enumerator
kCOLOR_BY_PLATE 
kCOLOR_BY_PH 
kCOLOR_BY_ID 
kCOLOR_BY_MCID 
kCOLOR_BY_PARTICLE 
kBLACKWHITE 
80 {
85 kCOLOR_BY_PARTICLE, // to be done
87 };
@ kCOLOR_BY_MCID
Definition: EdbEDAUtil.h:84
@ kBLACKWHITE
Definition: EdbEDAUtil.h:86
@ kCOLOR_BY_ID
Definition: EdbEDAUtil.h:83
@ kCOLOR_BY_PH
Definition: EdbEDAUtil.h:82
@ kCOLOR_BY_PARTICLE
Definition: EdbEDAUtil.h:85
@ kCOLOR_BY_PLATE
Definition: EdbEDAUtil.h:81

◆ EDAEXTENDMODE

Enumerator
kExtendAuto 
kExtendUpDown 
kExtendDown 
kExtendUp 
kExtendNo 
89 {
94 kExtendNo};
@ kExtendUpDown
Definition: EdbEDAUtil.h:91
@ kExtendAuto
Definition: EdbEDAUtil.h:90
@ kExtendUp
Definition: EdbEDAUtil.h:93
@ kExtendDown
Definition: EdbEDAUtil.h:92
@ kExtendNo
Definition: EdbEDAUtil.h:94

Function Documentation

◆ AskYesNo()

bool EdbEDAUtil::AskYesNo ( char *  message)

Open a message dialog and ask you YES or No.
if YES, return kTRUE
if NO, return kFALSE
else return kFALSE

484 {
489
490 int retval=0;
491 new TGMsgBox(gClient->GetRoot(), gEve? gEve->GetMainWindow() : 0,
492 "EdbEDAUtil::AskYesNo()", message, kMBIconQuestion, kMBYes|kMBNo, &retval);
493
494 if(retval==kMBYes) return kTRUE;
495 if(retval==kMBNo) return kFALSE;
496 else return kFALSE;
497}

◆ CalcDistance()

double EdbEDAUtil::CalcDistance ( EdbSegP s1,
EdbSegP s2,
double  z 
)

calculate distance

422 {
424 double x1 = s1->X() + s1->TX()*(z-s1->Z());
425 double y1 = s1->Y() + s1->TY()*(z-s1->Z());
426 double x2 = s2->X() + s2->TX()*(z-s2->Z());
427 double y2 = s2->Y() + s2->TY()*(z-s2->Z());
428 return sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
429}
Float_t TX() const
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t X() const
Definition: EdbSegP.h:173
Float_t Z() const
Definition: EdbSegP.h:153
Float_t Y() const
Definition: EdbSegP.h:174
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30

◆ CalcDmin()

double EdbEDAUtil::CalcDmin ( EdbSegP seg1,
EdbSegP seg2,
double *  dminz = NULL 
)

calculate minimum distance of 2 lines.
use the data of (the selected object)->X(), Y(), Z(), TX(), TY().
means, if the selected object == segment, use the data of the segment. or it == track, the use the fitted data.
original code from Tomoko Ariga
return deltaZ between Z(dmin) and Z(seg1). ==> if vertex is upstream, return plus value.

239 {
245 double x1,y1,z1,ax1,ay1;
246 double x2,y2,z2,ax2,ay2;
247 double s1,s2,s1bunsi,s1bunbo,s2bunsi,s2bunbo;
248 double p1x,p1y,p1z,p2x,p2y,p2z,p1p2;
249
250 if(seg1->ID()==seg2->ID()&&seg1->PID()==seg2->PID()) return 0.0;
251
252 x1 = seg1->X();
253 y1 = seg1->Y();
254 z1 = seg1->Z();
255 ax1= seg1->TX();
256 ay1= seg1->TY();
257
258 x2 = seg2->X();
259 y2 = seg2->Y();
260 z2 = seg2->Z();
261 ax2= seg2->TX();
262 ay2= seg2->TY();
263
264 s1bunsi=(ax2*ax2+ay2*ay2+1)*(ax1*(x2-x1)+ay1*(y2-y1)+z2-z1) - (ax1*ax2+ay1*ay2+1)*(ax2*(x2-x1)+ay2*(y2-y1)+z2-z1);
265 s1bunbo=(ax1*ax1+ay1*ay1+1)*(ax2*ax2+ay2*ay2+1) - (ax1*ax2+ay1*ay2+1)*(ax1*ax2+ay1*ay2+1);
266 s2bunsi=(ax1*ax2+ay1*ay2+1)*(ax1*(x2-x1)+ay1*(y2-y1)+z2-z1) - (ax1*ax1+ay1*ay1+1)*(ax2*(x2-x1)+ay2*(y2-y1)+z2-z1);
267 s2bunbo=(ax1*ax1+ay1*ay1+1)*(ax2*ax2+ay2*ay2+1) - (ax1*ax2+ay1*ay2+1)*(ax1*ax2+ay1*ay2+1);
268 s1=s1bunsi/s1bunbo;
269 s2=s2bunsi/s2bunbo;
270 p1x=x1+s1*ax1;
271 p1y=y1+s1*ay1;
272 p1z=z1+s1*1;
273 p2x=x2+s2*ax2;
274 p2y=y2+s2*ay2;
275 p2z=z2+s2*1;
276 p1p2=sqrt( (p1x-p2x)*(p1x-p2x)+(p1y-p2y)*(p1y-p2y)+(p1z-p2z)*(p1z-p2z) );
277
278 if(dminz!=NULL) *dminz = z1-p1z;
279 return p1p2;
280}
Int_t ID() const
Definition: EdbSegP.h:147
Int_t PID() const
Definition: EdbSegP.h:148
#define NULL
Definition: nidaqmx.h:84

◆ CalcDTTransLongi() [1/2]

void EdbEDAUtil::CalcDTTransLongi ( double  tx1,
double  ty1,
double  tx2,
double  ty2,
double *  dtTransverse,
double *  dtLongitudinal 
)
652 {
653 TVector3 v1,v2,v;
654 v1.SetXYZ( tx1, ty1, -1. );
655 v2.SetXYZ( tx2, ty2, -1. );
656
657 float phi = v1.Phi();
658 v1.RotateZ( -phi );
659 v2.RotateZ( -phi );
660
661 *dtLongitudinal = v2.X()-v1.X(); // longitudinal
662 *dtTransverse = v2.Y()-v1.Y(); // transverse. by definition v1->Y()=0.0
663}

◆ CalcDTTransLongi() [2/2]

void EdbEDAUtil::CalcDTTransLongi ( EdbSegP s1,
EdbSegP s2,
double *  dtTransverse,
double *  dtLongitudinal 
)
648 {
649 CalcDTTransLongi( s1->TX(), s1->TY(), s2->TX(), s2->TY(), dtTransverse, dtLongitudinal);
650}
void CalcDTTransLongi(EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
Definition: EdbEDAUtil.C:648

◆ CalcDXTransLongi()

void EdbEDAUtil::CalcDXTransLongi ( EdbSegP s1,
EdbSegP s2,
double *  dxt,
double *  dxl 
)
665 {
666
667 EdbSegP s11(*s1);
668 s11.PropagateTo(s2->Z());
669
670 TVector3 v1,vx1,vx2;
671 v1.SetXYZ( s1->TX(), s2->TY(), -1. );
672 float phi = v1.Phi();
673
674 vx1.SetXYZ( s11.X()-s1->X(), s11.Y()-s1->Y(), -1.);
675 vx2.SetXYZ( s2->X()-s1->X(), s2->Y()-s1->Y(), -1.);
676
677 vx1.RotateZ( -phi );
678 vx2.RotateZ( -phi );
679
680 *dxl = vx2.X()-vx1.X(); // longitudinal
681 *dxt = vx2.Y()-vx1.Y(); // transverse. by definition v1->Y()=0.0
682
683}
Definition: EdbSegP.h:21

◆ CalcEMCSelectron()

double EdbEDAUtil::CalcEMCSelectron ( EdbTrackP t)
201 {
202
203 if(t==NULL) return -99.0;
204
205 int nseg = t->N();
206
207 if(nseg>8) nseg=8;
208
209 // trk 1
210 double dtxsq=0., dtysq=0.;
211 EdbSegP *s0 = t->GetSegmentFirst();
212
213 for(int i=0;i<nseg-1;i++){
214 EdbSegP *s1 = (EdbSegP *) t->GetSegment(i);
215 EdbSegP *s2 = (EdbSegP *) t->GetSegment(i+1);
216
217 double dz = fabs( s2->Z()-s0->Z() ) / 1.3; // lead thickness
218 double correction_factor = exp( -dz/5612 );
219 double dtx = (s1->TX()-s2->TX())*correction_factor;
220 double dty = (s1->TY()-s2->TY())*correction_factor;
221 dtxsq += dtx*dtx;
222 dtysq += dty*dty;
223 }
224 if(nseg>4){
225
226 double dtrms = dtxsq/nseg + dtysq/nseg;
227
228 if(dtrms<0.0) { return 99.;}
229 else {
230 dtrms = sqrt(dtrms/2.);
231 return 0.0136/dtrms*sqrt(1/5.6)*(1+0.038*TMath::Log(1/5.6));
232 }
233 }
234 return -99;
235}
bool Log(int level, const char *location, const char *fmt,...)
Definition: EdbLog.cxx:75
brick dz
Definition: RecDispMC.C:107
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
TTree * t
Definition: check_shower.C:4

◆ CalcIP() [1/2]

double EdbEDAUtil::CalcIP ( EdbSegP s,
double  x,
double  y,
double  z 
)

Calculate IP between a given segment and a given x,y,z.
return the IP value.

85 {
88
89 double ax = s->TX();
90 double ay = s->TY();
91 double bx = s->X()-ax*s->Z();
92 double by = s->Y()-ay*s->Z();
93
94 double a;
95 double r;
96 double xx,yy,zz;
97
98 a = (ax*(x-bx)+ay*(y-by)+1.*(z-0.))/(ax*ax+ay*ay+1.);
99 xx = bx +ax*a;
100 yy = by +ay*a;
101 zz = 0. +1.*a;
102 r = sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)+(zz-z)*(zz-z));
103
104 return r;
105}
void a()
Definition: check_aligned.C:59
s
Definition: check_shower.C:55
void r(int rid=2)
Definition: test.C:201

◆ CalcIP() [2/2]

double EdbEDAUtil::CalcIP ( EdbSegP s,
EdbVertex v 
)

calculate IP between a given segment and a given vertex.
return the IP value.
this is used for IP cut.

if vertex is not given, use the selected vertex.
if(v==NULL) v=gEDA->GetSelectedVertex();

107 {
111
114
115 if(v==NULL) return -1.;
116 return CalcIP(s, v->X(), v->Y(), v->Z());
117}
Double_t CalcIP(EdbSegP *s, EdbVertex *v)
Definition: ShowRec.cpp:8872
Float_t X() const
Definition: EdbVertex.h:130
Float_t Z() const
Definition: EdbVertex.h:132
Float_t Y() const
Definition: EdbVertex.h:131

◆ CalcKinkAngle()

double EdbEDAUtil::CalcKinkAngle ( EdbSegP tparent,
EdbSegP tdaughter 
)

simple calcuration

186 {
188 TVector3 parent(tparent->TX(), tparent->TY(), 1.0);
189 TVector3 daughter(tdaughter->TX(), tdaughter->TY(), 1.0);
190
191 return parent.Angle(daughter);
192}

◆ CalcMinimumKinkAngle() [1/3]

double EdbEDAUtil::CalcMinimumKinkAngle ( EdbSegP t1ry,
EdbSegP tdaughter,
int  z_is_middle_of_base = 1 
)

calculate minimum kink angle
for the short decay with only 1 track from primary and 1 track from secondary vertex.
move virtual vertex in the lead, find minimimum kink angle.
if z_is_middle_of_base==1, move z position of tracks 150 microns upstream.

143 {
148
149 double min = 1000000000000;
150 EdbSegP t1=*t1ry;
151 EdbSegP td=*tdaughter;
152
153 if(z_is_middle_of_base){
154 t1.PropagateTo( t1.Z()-150);
155 td.PropagateTo( td.Z()-150);
156 }
157
158 float z1 = t1.Z();
159 for(int iz=0; iz<1000; iz++) { // move virtual vertex point
160 t1.PropagateTo(z1-iz);
161 TVector3 vertex( t1.X(), t1.Y(), t1.Z());
162 TVector3 daupos( td.X(), td.Y(), td.Z());
163 TVector3 daumom( td.TX(), td.TY(), 1);
164 double theta = CalcMinimumKinkAngle( vertex, daupos, daumom);
165 if(min>theta) min=theta;
166 }
167
168 return min;
169}
float min(TClonesArray *t)
Definition: bitview.cxx:275
void PropagateTo(float z)
Definition: EdbSegP.cxx:293
void td()
Definition: check_vertex.C:168
double CalcMinimumKinkAngle(TVector3 vertex, TVector3 daupos, TVector3 daumom)
Definition: EdbEDAUtil.C:120

◆ CalcMinimumKinkAngle() [2/3]

double EdbEDAUtil::CalcMinimumKinkAngle ( EdbVertex v1ry,
EdbSegP tdaughter,
int  z_is_middle_of_base = 1 
)

Minimum kink angle calculation in case that 1ry vertex is define && 1 daughter.

126 {
128
129 EdbSegP td = *tdaughter;
130
131 td.PrintNice();
132 printf("%lf %lf %lf\n",v1ry->X(), v1ry->Y(), v1ry->Z());
133
134 if(z_is_middle_of_base) td.PropagateTo( td.Z()-150);
135
136 TVector3 vertex( v1ry->X(), v1ry->Y(), v1ry->Z());
137 TVector3 daupos( td.X(), td.Y(), td.Z());
138 TVector3 daumom( td.TX(), td.TY(), 1.0);
139
140 return CalcMinimumKinkAngle( vertex, daupos, daumom);
141}

◆ CalcMinimumKinkAngle() [3/3]

double EdbEDAUtil::CalcMinimumKinkAngle ( TVector3  vertex,
TVector3  daupos,
TVector3  daumom 
)
120 {
121 TVector3 parent = daupos-vertex;
122
123 return daumom.Angle(parent);
124}

◆ CalcP()

EdbMomentumEstimator * EdbEDAUtil::CalcP ( EdbTrackP t,
double &  p,
double &  pmin,
double &  pmax,
bool  print = kTRUE 
)
369 {
370 p = pmin = pmax = -99;
371 if(t0==0) return NULL;
372 EdbTrackP *t=CleanTrack(t0); // remove microtrack and strange segment.
373 t->SetCounters();
374
375 if(t->Npl()<t->N()){
376 // in this case P estimation doesn't work.
377 // this can happen if a track is formed from 2 different data set.
378 // (PID definitions are defferent amond 2 data set. Npl is computed wrongly.)
379 // put absolute plate number as PID. (temporary solution)
380 for(int i=0;i<t->N();i++) t->GetSegment(i)->SetPID(t->GetSegment(i)->Plate());
381 }
382
383 if(t->N()<=2) return NULL;
384
385 if(print) printf("CalcP : itrk %i ( %1.4f, %1.4f ) nBT= %i\n",t->ID(),t->TX(),t->TY(),t->N());
386
388 tf->eMinEntr=3;
389 tf->PMS(*t);
390
391 if (sqrt(t->TX()*t->TX()+t->TY()*t->TY())<=0.2) // use P3D
392 {
393 p=tf->eP;
394 pmin=tf->ePmin;
395 pmax=tf->ePmax;
396 if(print) printf(" ->P3D=%7.2f - %6.2f + %6.2f GeV 90%%C.L.\n", tf->eP, tf->ePmin, tf->ePmax);
397 if(print) printf(" PT =%7.2f - %6.2f + %6.2f GeV 90%%C.L.\n", tf->ePy, tf->ePYmin, tf->ePYmax);
398 }
399 if (sqrt(t->TX()*t->TX()+t->TY()*t->TY())>0.2) // use PT
400 {
401 p=tf->ePy;
402 pmin=tf->ePYmin;
403 pmax=tf->ePYmax;
404 if(print) printf(" P3D=%7.2f - %6.2f + %6.2f GeV 90%%C.L.\n", tf->eP, tf->ePmin, tf->ePmax);
405 if(print) printf(" ->PT =%7.2f - %6.2f + %6.2f GeV 90%%C.L.\n", tf->ePy, tf->ePYmin, tf->ePYmax);
406 }
407 t0->SetP(p);
408
409 if(print){
410 double rms, rmst, rmsl;
411 DTRMSTL(t, &rms, &rmst, &rmsl);
412 printf("DTRMS (Sp,T,L) = ( %.4lf, %.4lf, %.4lf)\n", rms, rmst, rmsl);
413 }
414
415
416
417 if(t!=t0) delete t;
418 return tf;
419}
Definition: EdbMomentumEstimator.h:21
float ePmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:44
float eP
the output of PMSang
Definition: EdbMomentumEstimator.h:43
int eMinEntr
min number of entries in the cell to accept it for fitting (def=1)
Definition: EdbMomentumEstimator.h:28
float ePy
the estimated momentum
Definition: EdbMomentumEstimator.h:36
float ePmin
Definition: EdbMomentumEstimator.h:44
float ePYmax
momentum 90% errors range
Definition: EdbMomentumEstimator.h:40
float ePYmin
Definition: EdbMomentumEstimator.h:40
float PMS(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:121
Definition: EdbPattern.h:113
EdbTrackP * CleanTrack(EdbTrackP *t)
Definition: EdbEDAUtil.C:499
double DTRMSTL(EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *ndata=NULL)
Definition: EdbEDAUtil.C:686
p
Definition: testBGReduction_AllMethods.C:8

◆ CalcPPartial()

void EdbEDAUtil::CalcPPartial ( EdbTrackP t,
EdbSegP s1st,
EdbSegP slast,
double &  p,
double &  pmin,
double &  pmax,
bool  print = kTRUE 
)

momentum calculation partially using from s2 to slast.

344 {
346
347 // copy the track. and create a new track.
348 EdbTrackP *t = new EdbTrackP;
349 t->Copy(*t0);
350
351 int i;
352 // remove the segments before s1st.
353 for(i=0;s1st->PID()!=t->GetSegmentFirst()->PID();i++) t->RemoveSegment( t->GetSegmentFirst());
354
355 // remain the segments up to slast.
356 for(i=0;slast->PID()!=t->GetSegment(i)->PID();i++) {}
357
358 // remove the segment after the slast.
359 i++;
360 for(;t->GetSegment(i);) t->RemoveSegment( t->GetSegment(i));
361
362 // calculate momentum of the new track.
363 CalcP(t, p,pmin,pmax, print);
364
365 delete t;
366}
EdbMomentumEstimator * CalcP(EdbTrackP *t, double &p, double &pmin, double &pmax, bool print=kTRUE)
Definition: EdbEDAUtil.C:369

◆ CalcPt()

double EdbEDAUtil::CalcPt ( EdbSegP tparent,
EdbSegP tdaughter 
)
194 {
195
196 return tdaughter->P()*sin( CalcKinkAngle(tparent, tdaughter));
197
198}
Float_t P() const
Definition: EdbSegP.h:152
double CalcKinkAngle(EdbSegP *tparent, EdbSegP *tdaughter)
Definition: EdbEDAUtil.C:186

◆ CalcPtmin() [1/3]

double EdbEDAUtil::CalcPtmin ( EdbSegP t1ry,
EdbSegP tdaughter,
int  z_is_middle_of_base = 1 
)

Ptmin calculation in case that only 1ry track at 1ry vertex && 1 daughter.
move virtual vertex to find minimum kink angle. see also CalcMinimumKinkAngle()

180 {
183 return tdaughter->P()*sin(CalcMinimumKinkAngle(t1ry, tdaughter, z_is_middle_of_base));
184}

◆ CalcPtmin() [2/3]

double EdbEDAUtil::CalcPtmin ( EdbVertex v1ry,
EdbSegP tdaughter,
int  z_is_middle_of_base = 1 
)

Ptmin calculation in case that 1ry vertex is define && 1 daughter.

175 {
177 return tdaughter->P()*sin(CalcMinimumKinkAngle(v1ry, tdaughter, z_is_middle_of_base));
178}

◆ CalcPtmin() [3/3]

double EdbEDAUtil::CalcPtmin ( TVector3  vertex,
TVector3  daupos,
TVector3  daumom 
)
171 {
172 return daumom.Mag() * sin( CalcMinimumKinkAngle( vertex, daupos, daumom) );
173}

◆ CalcVertex()

EdbVertex * EdbEDAUtil::CalcVertex ( TObjArray *  segments)

calc vertex from the segments array (EdbSegP*)

calc vertex point with given segments. just topological calculation.
VTA is currently not set.
in case of Single-stop. make a vertex 650 micron upstream ob base.

282 {
286
287 double xx,yy,zz,Det,Ax,Ay,Az,Bx,By,Bz,Cx,Cy,Cz,Dx,Dy,Dz;
288 Ax=0.;Ay=0.;Az=0.;Bx=0.;By=0.;Bz=0.;Cx=0.;Cy=0.;Cz=0.;Dx=0.;Dy=0.;Dz=0.;
289
290 if(segments->GetEntries()==1){
291 // in case of Single-stop. make a vertex 650 micron upstream ob base.
292 EdbSegP *s = new EdbSegP(*((EdbSegP *) segments->At(0)));
293 s->PropagateTo(s->Z()-650);
294 xx=s->X();
295 yy=s->Y();
296 zz=s->Z();
297 delete s;
298 }
299 else {
300 for(int i=0;i<segments->GetEntries();i++){
301 EdbSegP *s = (EdbSegP *) segments->At(i);
302 double ax = s->TX();
303 double ay = s->TY();
304 double az = 1.0;
305 double x = s->X();
306 double y = s->Y();
307 double z = s->Z();
308 double a = ax*ax+ay*ay+az*az;
309 double c = -ax*x-ay*y-az*z;
310 double b = (ax*ax+ay*ay);
311 // double w = 1.0/a/a; // weight for small angle tracks.
312 double w = 1.0; // no weight
313
314 Ax+=2.0*w/b*( a*(ay*ay+az*az) );
315 Bx+=2.0*w/b*( -a*ax*ay );
316 Cx+=2.0*w/b*( -a*ax*az );
317 Dx+=2.0*w/b*( -(a*x+c*ax)*(ax*ax-a)-(a*y+c*ay)*ax*ay-(a*z+c*az)*az*ax );
318
319 Ay+=2.0*w/b*( -a*ay*ax );
320 By+=2.0*w/b*( a*(az*az+ax*ax) );
321 Cy+=2.0*w/b*( -a*ay*az );
322 Dy+=2.0*w/b*( -(a*y+c*ay)*(ay*ay-a)-(a*z+c*az)*ay*az-(a*x+c*ax)*ax*ay );
323
324 Az+=2.0*w/b*( -a*az*ax );
325 Bz+=2.0*w/b*( -a*az*ay );
326 Cz+=2.0*w/b*( a*b );
327 Dz+=2.0*w/b*( -(a*z+c*az)*(az*az-a)-(a*x+c*ax)*az*ax-(a*y+c*ay)*ay*az );
328
329 }
330
331 Det=fabs( Ax*(By*Cz-Cy*Bz)-Bx*(Ay*Cz-Cy*Az)+Cx*(Ay*Bz-By*Az) );
332 xx=( (By*Cz-Cy*Bz)*Dx-(Bx*Cz-Cx*Bz)*Dy+(Bx*Cy-Cx*By)*Dz)/Det;
333 yy=(-(Ay*Cz-Cy*Az)*Dx+(Ax*Cz-Cx*Az)*Dy-(Ax*Cy-Cx*Ay)*Dz)/Det;
334 zz=( (Ay*Bz-By*Az)*Dx-(Ax*Bz-Bx*Az)*Dy+(Ax*By-Bx*Ay)*Dz)/Det;
335 }
336
337 EdbVertex *v = new EdbVertex();
338 v->SetXYZ(xx,yy,zz);
339
340 return v;
341}
Definition: EdbVertex.h:69
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157
void w(int rid=2, int nviews=2)
Definition: test.C:27

◆ CleanTrack()

EdbTrackP * EdbEDAUtil::CleanTrack ( EdbTrackP t)

remove fake-segment/Microtrack/pl57. return a pointer to newly created track.;
if Nseg<=4, no fake-segment will be removed.
if fake-segments exist, create a new track without the fake segments and return the pointer.
1st segment will not be rejected as fake.
segment on pl57 will be rejected every time.

499 {
505
506 EdbTrackP *t1 = new EdbTrackP;
507 t1->Copy(*t0);
508 // remove microtrack and pl 57.
509 for(int i=0; i<t1->N()&&t1->N()>1; i++){
510 EdbSegP *s = t1->GetSegment(i);
511 if(s==NULL) break;
512 if(s->Side()!=0) {
513 printf("Microtrack removed pl%d\n", s->Plate());
514 t1->RemoveSegment(s);
515 i--;
516 }
517 if(s->Plate()>=57){
518 printf("Segment on plate 57 removed.\n");
519 t1->RemoveSegment(s);
520 i--;
521 }
522 }
523
524 t1->SetCounters();
525
526 // if nseg<=4 return as it is.
527 if(t1->N()<5) return t1;
528
529 // calculate rms, rejecting each 1 of the segments.
530 // DTRMS1Kink() give rms assuming 1 kink.
531 double *rms = new double[t1->N()];
532 for(int i=0; i<t1->N(); i++){
533 EdbTrackP *t = new EdbTrackP;
534 t->Copy(*t1);
535 t->RemoveSegment( t->GetSegment(i));
536 rms[i] = DTRMS1Kink(t);
537 delete t;
538 }
539
540 // calculate the significance of strange segment.
541 TObjArray *fakeseg = new TObjArray;
542 for(int i=1; i<t1->N(); i++) {
543 // think for the case to reject 1 segment.
544
545 // calculate mean(rms) for the cases rejecting other segments.
546 int k=0;
547 double mean=0.0;
548 for(int j=0; j<t1->N(); j++) if(j!=i) {mean+=rms[j]; k++;}
549 mean/=k;
550
551 // calculate error of rms (rms/sqrt((double)2*k))
552 double rmserr = rms[i]/sqrt((double)2*k);
553
554 // if mean-rms is bigger than 2 sigma, flag this segment to be rejected.
555 int flag = mean-rms[i]>rmserr*2;
556 EdbSegP *s = t1->GetSegment(i);
557 if(flag)fakeseg->Add(s);
558
559 if(flag)printf("CleanTrack Trkid %4d pid %2d id %6d rms %.4lf mean %.4lf rmserr %.4lf significance %4.1lf\n", t1->ID(), s->PID(), s->ID(), rms[i], mean, rmserr, (mean-rms[i])/rmserr);
560 }
561 delete rms;
562
563 // if fake-segment exist, copy the track and remove the segment. return the pointer.
564 if(fakeseg->GetEntries()){
565 EdbTrackP *t = new EdbTrackP;
566 t->Copy(*t1);
567 for(int i=0;i<fakeseg->GetEntries();i++){
568 t->RemoveSegment( (EdbSegP *) fakeseg->At(i));
569 }
570 delete t1;
571 t1=t;
572 }
573
574 delete fakeseg;
575
576 t1->SetCounters();
577
578 // return the track microtrack are rejected.
579 return t1;
580}
void RemoveSegment(EdbSegP *s)
Definition: EdbPattern.h:219
Int_t N() const
Definition: EdbPattern.h:177
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:195
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:473
void SetCounters()
Definition: EdbPattern.h:159
double DTRMS1Kink(EdbTrackP *t, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:583

◆ DTRMS()

double EdbEDAUtil::DTRMS ( EdbTrackP t)
431 {
432 int nseg = t->N();
433 if(nseg==1) return 0.0;
434 double rms=0.0;
435 for(int i=0;i<nseg-1;i++){
436 EdbSegP *s1 = t->GetSegment(i);
437 EdbSegP *s2 = t->GetSegment(i+1);
438 double dtx = s1->TX() - s2->TX();
439 double dty = s1->TY() - s2->TY();
440 rms+=dtx*dtx+dty*dty;
441 }
442 rms /= (nseg-1)*2;
443 rms = sqrt(rms);
444 return rms;
445}

◆ DTRMS1Kink()

double EdbEDAUtil::DTRMS1Kink ( EdbTrackP t,
int *  NKinkAngleUsed = NULL 
)

calculate rms of delta-theta assuming 1 kink exist(remove 1 biggest dtheta).
return rms(space), not projection. dtheta of 1 plate.
if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1)
rejection of 1 kink angle is for more than 4 segments.

583 {
588 int n = t->N();
589 double *DTX = new double [n-1];
590 double *DTY = new double [n-1];
591
592 int iMaxDT=0; // isegment of biggest kink angle.
593 double MaxDT=0.0; // biggest kink angle
594 int ndata=0; // number of combinations of dtx and dty.
595
596 for(int i=0;i<n-1;i++){
597 // calculation of kink angle.
598 EdbSegP *s1 = t->GetSegment(i);
599 EdbSegP *s2 = t->GetSegment(i+1);
600
601 double dtx = fabs(s1->TX()-s2->TX());
602 double dty = fabs(s1->TY()-s2->TY());
603
604 int dpid = s2->PID()-s1->PID();
605
606 double dt = sqrt(dtx*dtx + dty*dty);
607 if(MaxDT<dt) {
608 // recoding of maximum kink angle.
609 MaxDT = dt;
610 iMaxDT = i;
611 }
612
613 dtx /= sqrt((double)dpid);
614 dty /= sqrt((double)dpid);
615
616 DTX[i] = dtx;
617 DTY[i] = dty;
618 ndata++;
619 }
620
621 // prepare data for rms calculation
622 double rms=0.0;
623 for(int i=0; i<ndata; i++){
624 if(ndata>=2&&i==iMaxDT) {
625 // for more than 4 segments.
626 // remove a combination of dtx,dty with most biggest kink angle.
627 continue;
628 ndata--;
629 }
630 rms += DTX[i]*DTX[i];
631 rms += DTY[i]*DTY[i];
632 }
633 delete DTX;
634 delete DTY;
635
636 rms /= 2*ndata;
637 rms = sqrt(rms); // rms in projection
638 rms *= sqrt(2.0); // rms in space
639 if(rms<0.0015) rms = 0.0015; // minimum value of rms (angular resolution).
640
641// printf("t->N()=%d n=%d rms = %lf\n", t->N(), 2*ndata, rms);
642
643 if(NKinkAngleUsed) *NKinkAngleUsed = 2*ndata;
644
645 return rms;
646}

◆ DTRMSelectron()

double EdbEDAUtil::DTRMSelectron ( EdbTrackP t)
447 {
448 int nseg = t->N();
449 if(nseg==1) return 0.0;
450 double rms=0.0;
451 EdbSegP *s0 = t->GetSegmentFirst();
452
453 for(int i=0;i<nseg-1;i++){
454 EdbSegP *s1 = t->GetSegment(i);
455 EdbSegP *s2 = t->GetSegment(i+1);
456 double dtx = s1->TX() - s2->TX();
457 double dty = s1->TY() - s2->TY();
458 double dt2 = dtx*dtx+dty*dty;
459 double dz = fabs( s2->Z()-s0->Z() ) / 1.3; // lead thickness
460 double correction_factor2 = exp( -2*dz/5612 );
461 dt2 *= correction_factor2;
462 rms+=dt2;
463 }
464 rms /= (nseg-1)*2;
465 rms = sqrt(rms);
466 return rms;
467}

◆ DTRMSTL()

double EdbEDAUtil::DTRMSTL ( EdbTrackP t,
double *  rmsspace,
double *  rmstransverse,
double *  rmslongitudinal,
int *  ndata = NULL 
)

calculate dtheta-RMS for each components (Spase angle, Transverse angle, Longitudinal angle)
normally RMS(Transverse) is smaller than RMS(Longitudinal).
Transverse component doesn't have dependence on the angle.
ndata will be filled with number of data for transverse or longitudinal.
so that, actual ndata for rmsspace need to be multiplied by 2.

686 {
692 int n = t->N()-1;
693
694 double rmst = 0.0;
695 double rmsl = 0.0;
696
697 for(int i=0;i<n;i++){
698 EdbSegP *s1 = t->GetSegment(i);
699 EdbSegP *s2 = t->GetSegment(i+1);
700
701 // skip if s2 is on pl57
702 if(s2->Plate()>=57){
703 n--;
704 continue;
705 }
706
707 double dtt,dtl;
708 CalcDTTransLongi(s1,s2,&dtt, &dtl);
709
710 float dplate = s2->Plate()-s1->Plate();
711 dtt/=sqrt(dplate);
712 dtl/=sqrt(dplate);
713
714 rmst += dtt*dtt;
715 rmsl += dtl*dtl;
716 }
717
718 if(n==0){
719 rmst = -1.0;
720 rmsl = -1.0;
721 }
722 else {
723 rmst = sqrt(rmst/n); // n= t->N()-1
724 rmsl = sqrt(rmsl/n);
725 }
726
727 // minimum value of rms (angular resolution).
728 // double angle = sqrt(t->TX()*t->TX()+t->TY()*t->TY());
729 // if(rmst<=0.0015*sqrt(2.0)) rmst=0.0015*sqrt(2.0);
730 // if(rmsl<=0.0015*(1+angle*5)*sqrt(2.0)) rmsl=0.0015*(1+angle*5)*sqrt(2.0);
731 double rms = sqrt(rmsl*rmsl+rmst*rmst)/sqrt(2.0);
732
733 // if rmst > rmsl, means to low nseg or scattering dominant.
734 // to have more reliable value, use rms.
735 // if(rmst>rmsl) rmst=rmsl=rms;
736
737 *rmsspace = rms;
738 *rmstransverse = rmst;
739 *rmslongitudinal = rmsl;
740 if(ndata) *ndata=n;
741
742 return rmst;
743}
Int_t Plate() const
Definition: EdbSegP.h:159

◆ DTRMSTL1Kink()

double EdbEDAUtil::DTRMSTL1Kink ( EdbTrackP t,
double *  rmsspace,
double *  rmstransverse,
double *  rmslongitudinal,
int *  NKinkAngleUsed = NULL 
)

calculate rms of delta-theta assuming 1 kink exist(remove 1 biggest dtheta).
return rms(transverse).
if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1).
rejection of 1 kink angle is for more than 4 segments.
if a segment is on pl57, this segment will not used.

745 {
751
752 // remove Micro-tracks.
753 EdbTrackP *t = new EdbTrackP (*t0);
754 for(int i=0;i<t->N()&&t->N()>1;i++){
755 EdbSegP *s = t->GetSegment(i);
756 if(s->Side()!=0) t->RemoveSegment(s); // if it's microtrack, remove.
757 }
758 printf("microtrack remove nseg %d->%d\n", t0->N(), t->N());
759 int nseg = t->N();
760
761 int iMaxDT=0; // isegment of biggest kink angle.
762 double MaxDT=0.0; // biggest kink angle
763
764 for(int i=0;i<nseg-1;i++){
765 // calculation of kink angle.
766 EdbSegP *s1 = t->GetSegment(i);
767 EdbSegP *s2 = t->GetSegment(i+1);
768
769 // skip if s2 is on pl57
770 if(s2->Plate()>=57) continue;
771
772 double dtl, dtt;
773 CalcDTTransLongi(s1,s2, &dtt, &dtl);
774 double dt = sqrt(dtt*dtt+dtl*dtl);
775
776 if(MaxDT<dt) { // recoding of maximum kink angle.
777 MaxDT = dt;
778 iMaxDT = i;
779 }
780 }
781
782 if(nseg<4) DTRMSTL (t, rmsspace, rmstransverse, rmslongitudinal, NKinkAngleUsed);
783 else DTRMSTLGiven1Kink(t, iMaxDT, rmsspace, rmstransverse, rmslongitudinal, NKinkAngleUsed);
784
785 delete t;
786
787 return *rmstransverse;
788}
double DTRMSTLGiven1Kink(EdbTrackP *t, int iKink, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:790

◆ DTRMSTLGiven1Kink()

double EdbEDAUtil::DTRMSTLGiven1Kink ( EdbTrackP t,
int  iKink,
double *  rmsspace,
double *  rmstransverse,
double *  rmslongitudinal,
int *  NKinkAngleUsed = NULL 
)

calculate rms of delta-theta assuming 1 "given" kink.
return rms(transverse).
if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1).
if a segment is on pl57, this segment will not used.

790 {
795
796 int nseg = t->N();
797 int ndata=0;
798 double rmst=0.0, rmsl=0.0;
799 for(int i=0;i<nseg-1;i++){
800 // removal of the given delta-theta.
801 if(i==iKink) continue;
802 // calculation of kink angle.
803 EdbSegP *s1 = t->GetSegment(i);
804 EdbSegP *s2 = t->GetSegment(i+1);
805
806 // skip if s2 is on pl57
807 if(s2->Plate()>=57) continue;
808
809 double dtl, dtt;
810 CalcDTTransLongi(s1,s2, &dtt, &dtl);
811
812 float dplate = s2->Plate()-s1->Plate();
813
814 dtt /= sqrt(dplate); // if there is a hole, consider the effect of scatterning.
815 dtl /= sqrt(dplate);
816
817 rmst += dtt*dtt;
818 rmsl += dtl*dtl;
819
820 ndata++;
821 }
822 if(ndata==0) {
823 *rmsspace=*rmstransverse=*rmslongitudinal=-1.;
824 return -1;
825 }
826
827 if(ndata==0){
828 rmst = -1.0;
829 rmsl = -1.0;
830 }
831 else {
832 rmst = sqrt(rmst/ndata); // n= t->N()-1
833 rmsl = sqrt(rmsl/ndata);
834 }
835
836 double rms = sqrt(rmsl*rmsl+rmst*rmst)/sqrt(2.0);
837
838 *rmsspace = rms;
839 *rmstransverse = rmst;
840 *rmslongitudinal = rmsl;
841 if(NKinkAngleUsed) *NKinkAngleUsed = ndata;
842
843 return rmst;
844}

◆ ErrorMessage() [1/2]

void EdbEDAUtil::ErrorMessage ( char *  message)
476 {
477 ErrorMessage("Error", message);
478}
void ErrorMessage(char *title, char *message)
Definition: EdbEDAUtil.C:479

◆ ErrorMessage() [2/2]

void EdbEDAUtil::ErrorMessage ( char *  title,
char *  message 
)
479 {
480 printf("%s : %s\n", title, message);
481 new TGMsgBox(gClient->GetRoot(), gEve? gEve->GetMainWindow() : 0,"Error", message, kMBIconAsterisk, kMBOk);
482}

◆ FillTracksFromPatterns()

void EdbEDAUtil::FillTracksFromPatterns ( EdbPVRec pvr)

convert segments in patterns into Tracks in EdbPVRec object.
each track has 1 segment

1351 {
1354
1355 EdbScanCond cond;
1356
1357 for(int i=0; i<pvr->Npatterns(); i++){
1358 EdbPattern *pat = pvr->GetPattern(i);
1359
1360 for(int j=0; j<pat->N(); j++){
1361 EdbSegP *s = pat->GetSegment(j);
1362 // fill COV for vertexing
1363 if(s->SX()==0){
1364 s->SetErrors();
1365 cond.FillErrorsCov(s->TX(), s->TY(), s->COV());
1366 }
1367 EdbTrackP *t = new EdbTrackP(*s);
1368 t->AddSegment( s);
1369 pvr->AddTrack(t);
1370 }
1371 }
1372
1373}
void AddTrack(EdbTrackP *track)
Definition: EdbPVRec.h:246
Definition: EdbPattern.h:273
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Definition: EdbScanCond.h:10
void FillErrorsCov(float tx, float ty, TMatrixD &cov)
Definition: EdbScanCond.cxx:161
Int_t N() const
Definition: EdbPattern.h:86
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66

◆ FindBrickIDFromPath()

int EdbEDAUtil::FindBrickIDFromPath ( )
900 {
901 TString buf=gSystem->WorkingDirectory();
902 int index = buf.Index("ONLINE");
903 if(index==kNPOS) {
904 printf("FindBrickIDFromPath : Not found \"ONLINE\" in the path. set eBrickID = 0\n");
905 return 0;
906 }
907 int ibrick=0;
908 sscanf(buf.Data()+index+8,"%d", &ibrick);
909 printf("FindBrickIDFromPath : set eBrickID = %d\n", ibrick);
910 return ibrick;
911}

◆ FindProcDirClient()

char * EdbEDAUtil::FindProcDirClient ( )

Find ProcDirClient from the current path.
"ONLINE" is the hard coded name for ProcDirClient.

882 {
885 TString buf=gSystem->WorkingDirectory();
886
887 int index = buf.Index("ONLINE");
888 if(index==kNPOS) {
889 printf("FindProcDirClient : Not found \"ONLINE\" in the path. set eProcDirClient = \"..\"\n");
890 return "..";
891 }
892
893 char *path = new char[256];
894 strncpy(path, buf.Data(), index+6);
895 path[index+6]='\0';
896 printf("FindProcDirClient = %s\n", path);
897 return path;
898}

◆ GetTrackElement()

TEveCompound * EdbEDAUtil::GetTrackElement ( EdbTrackP t)
69 {
70 if(t==NULL) return NULL;
71 TEveEventManager *ev = gEve->GetCurrentEvent();
72 TEveElement::List_i it = ev->BeginChildren();
73 int n= ev->NumChildren();
74 for(int i=0; i<n; i++, it++){
75 TEveElement *e = *it;
76 EdbTrackP *tt = (EdbTrackP *) e->GetUserData();
77 if(t==tt) return (TEveCompound *)e;
78 }
79 return NULL;
80}

◆ GetVertexElement()

TEvePointSet * EdbEDAUtil::GetVertexElement ( EdbVertex v)

Return the correspoinding TEvePointSet element to the EdbVertex.

56 {
58 if (v==NULL) return NULL;
59 TEveElement::List_i it = gEve->GetCurrentEvent()->BeginChildren();
60 int n= gEve->GetCurrentEvent()->NumChildren();
61 for(int i=0;i<n;i++, it++){
62 TEvePointSet *e = (TEvePointSet *) *it;
63 EdbVertex *vv = (EdbVertex *) e->GetUserData();
64 if(v==vv) return e;
65 }
66 return NULL;
67}

◆ InputID()

int EdbEDAUtil::InputID ( char *  message,
EdbID id 
)

create a number entry window and return the number
return 1 if successful, 0 if cancel.

872 {
875 int ret=0;
876 new EdbIDDialog(message, id, &ret);
877 return ret;
878}
Definition: EdbEDAUtil.h:161

◆ InputNumberInteger()

int EdbEDAUtil::InputNumberInteger ( char *  message,
int  idefault = 0 
)
846 {
847
848 char buf[20];
849 sprintf(buf,"%d",idefault);
850 new TGInputDialog(gClient->GetRoot(), gEve?gEve->GetMainWindow():0, message, buf, buf);
851
852 sscanf(buf,"%d",&idefault);
853 return idefault;
854
855}

◆ InputNumberReal()

double EdbEDAUtil::InputNumberReal ( char *  message,
double  default_num = 0.0,
TGNumberFormat::EStyle  es = TGNumberFormat::kNESReal 
)

create a number entry window and return the number

858 {
860
861 char buf[20];
862 sprintf(buf,"%lf",default_num);
863 new TGInputDialog(gClient->GetRoot(), gEve?gEve->GetMainWindow():0, message, buf, buf);
864
865 sscanf(buf,"%lf",&default_num);
866 return default_num;
867}

◆ IsIncludeCouples()

int EdbEDAUtil::IsIncludeCouples ( EdbPattern pat)

if pattern includes BT, return 1.
check all segments whether the seg->Track()==-1 or not.

41 {
44
45 int flag=0;
46 for(int j=0;j<pat->N();j++){
47 EdbSegP *s = pat->GetSegment(j);
48 if(s->Track()==-1){ // if only tracks, s->Track() should have track id.
49 flag=1;
50 break;
51 }
52 }
53 return flag;
54}

◆ IsSegment() [1/2]

int EdbEDAUtil::IsSegment ( TEveElement *  e)
35 {
36 if(e==NULL) return 0;
37 TObject *o = (TObject *) e->GetUserData();
38 return IsSegment(o);
39}
AcqOdyssey * o
Definition: hwinit.C:2
int IsSegment(TObject *o)
Definition: EdbEDAUtil.C:29

◆ IsSegment() [2/2]

int EdbEDAUtil::IsSegment ( TObject *  o)
29 {
30 if(o==NULL) return 0;
31 if(strcmp(o->ClassName(),"EdbSegP")==0) return 1;
32 return 0;
33}

◆ IsTrack() [1/2]

int EdbEDAUtil::IsTrack ( TEveElement *  e)
23 {
24 if(e==NULL) return 0;
25 TObject *o = (TObject *) e->GetUserData();
26 return IsTrack(o);
27}
int IsTrack(TObject *o)
Definition: EdbEDAUtil.C:17

◆ IsTrack() [2/2]

int EdbEDAUtil::IsTrack ( TObject *  o)
17 {
18 if(o==NULL) return 0;
19 if(strcmp(o->ClassName(),"EdbTrackP")==0) return 1;
20 return 0;
21}

◆ IsVertex() [1/2]

int EdbEDAUtil::IsVertex ( TEveElement *  e)
11 {
12 if(e==NULL) return 0;
13 TObject *o = (TObject *) e->GetUserData();
14 return IsVertex(o);
15}
int IsVertex(TObject *o)
Definition: EdbEDAUtil.C:4

◆ IsVertex() [2/2]

int EdbEDAUtil::IsVertex ( TObject *  o)
4 {
5 if(o==NULL) return 0;
6 if(strcmp(o->ClassName(),"EdbVertex")==0) return 1;
7 return 0;
8}

◆ MakePVRFromTracksArray()

void EdbEDAUtil::MakePVRFromTracksArray ( TObjArray *  tracks_or_segments,
EdbPVRec pvr 
)

convert tracks or segments array into pvr.
if pointers of segments will not be consistent.

1312 {
1315
1316 EdbScanCond cond;
1317
1318 for(int i=0; i<tracks_or_segments->GetEntries(); i++){
1319 TObject *o = tracks_or_segments->At(i);
1320
1321 if(IsSegment(o)){
1322 EdbSegP *s = (EdbSegP *)o;
1323
1324 // fill COV for vertexing
1325 if(s->SX()==0){
1326 s->SetErrors();
1327 cond.FillErrorsCov(s->TX(), s->TY(), s->COV());
1328 }
1329
1330 // Add segment in PVRec and Track, keeping consistency of pointer in them.
1331 EdbSegP *s_in_pattern = pvr.AddSegment(*s);
1332
1333 EdbTrackP *t = new EdbTrackP(*s_in_pattern);
1334 t->AddSegment( s_in_pattern);
1335 pvr.AddTrack(t);
1336 }
1337
1338 else if (IsTrack(o)){
1339 EdbTrackP *t = (EdbTrackP *) o;
1340
1341 for(int j=0; j<t->N(); j++){
1342 EdbSegP *s = t->GetSegment(j);
1343 EdbSegP *s_in_pattern = pvr.AddSegment(*s);
1344 }
1345
1346 pvr.AddTrack(t);
1347 }
1348 }
1349}
EdbSegP * AddSegment(EdbSegP &s)
Definition: EdbPVRec.cxx:2925

◆ ReadFeedbackPVR()

EdbPVRec * EdbEDAUtil::ReadFeedbackPVR ( char *  filename = NULL)

Read feedback file format (ver 2009 Oct), and return EdbPVRec object.
eTracks, eVTX, patterns are filled.
stand alone function.

if filename is not given, open file browser.

914 {
918
920 if(filename==NULL){
921 TGFileInfo *fi=new TGFileInfo;
922 fi->fIniDir = StrDup(".");
923 const char *filetypes[] = { "Feedback File", "*.feedback", "All files","*",0,0};
924 fi->fFileTypes=filetypes;
925 new TGFileDialog(gClient->GetRoot(), gEve?gEve->GetMainWindow():0, kFDOpen, fi);
926 filename = fi->fFilename;
927 }
928
929 if(NULL==filename) {
930 EdbEDAUtil::ErrorMessage("No filename. stop.");
931 return NULL;
932 }
933
934 FILE *fp = fopen(filename,"rt");
935 if(fp==NULL) {
936 ErrorMessage(Form("File open error : %s . stop.\n", filename));
937 return NULL;
938 }
939
940 EdbPVRec *pvr = new EdbPVRec;
941 EdbScanCond cond;
942 EdbTrackP *t=0;
943
944
945 char buf[256];
946
947 while(fgets(buf,sizeof(buf),fp)){
948 TString line=buf;
949 printf("%s", line.Data());
950
951 // Remove comments
952 line.ReplaceAll("\t"," ");
953 int iposcmt = line.Index("//");
954 if(iposcmt!=kNPOS) line.Remove(iposcmt, line.Length()-iposcmt);
955
956 // Check number of columns.
957 TObjArray *tokens = line.Tokenize(" ");
958 int ntokens = tokens->GetEntries();
959 delete tokens;
960
961
962 if(ntokens==0) continue;
963
964 else if( ntokens == 10 ){
965 // Vertices
966 float x,y,z; int id,isprimary,istau, ischarm;
967 sscanf(line.Data(),"%d %f %f %f %d %d %d", &id, &x, &y, &z, &isprimary, &ischarm, &istau);
968 EdbVertex *v = new EdbVertex();
969 v->SetXYZ(x,y,z); v->SetID(id);
970 v->SetFlag(isprimary);
971 pvr->AddVertex(v);
972 printf("Vertex %d %f %f %f\n",v->ID(), v->X(), v->Y(), v->Z());
973 }
974
975 else if( ntokens == 27 ){
976 // Tracks
977 float x,y,z,ax,ay, ip_upvtx, ip_downvtx, p,pmin,pmax;
978 int id_track, id_upvtx, id_downvtx, manual, particle_id, scanback, darkness;
979 int OutOfBrick, LastPlate, nseg, iplRmax1, iplRmax2, result;
980 float RmaxT, RmaxL, rmst, rmsl;
981
982 int n,nn;
983 sscanf(line.Data(), "%d %d %d %f %f %f %f %f %f%n", &id_track, &id_upvtx, &id_downvtx, &x, &y, &z, &ax, &ay, &ip_upvtx, &nn);
984 sscanf(line.Data()+(n=nn), "%f %f %f %f %d %d %d %d %d%n", &ip_downvtx, &p,&pmin,&pmax, &manual, &particle_id, &scanback, &darkness, &OutOfBrick, &nn);
985 sscanf(line.Data()+(n+=nn), "%d %d %f %f %f %f %d %d %d", &LastPlate, &nseg, &RmaxT, &RmaxL, &rmst, &rmsl, &iplRmax1, &iplRmax2, &result);
986
987 // Create Track. "t" is defined out of main loop.
988 t = new EdbTrackP;
989 t->Set(id_track, x, y, ax, ay, 0, 0);
990 t->SetZ(z);
991 t->SetTrack(id_track);
992 t->SetFlag(particle_id);
993 pvr->AddTrack(t);
994
995 // fill COV for vertexing
996 t->SetErrors();
997 cond.FillErrorsCov(t->TX(), t->TY(), t->COV());
998
999 // associate to vertex.
1000 for(int i=0; i<pvr->Nvtx(); i++){
1001 EdbVertex *v = pvr->GetVertex(i);
1002 if(id_upvtx==v->ID()||id_downvtx==v->ID()){
1003 EdbVTA *vta = new EdbVTA(t, v);
1004 vta->SetZpos( t->Z()>v->Z() ? 1 : 0);
1005 vta->SetFlag(2);
1006 vta->SetImp( id_upvtx==v->ID()? ip_upvtx : ip_downvtx);
1007 v->AddVTA(vta);
1008 }
1009 }
1010 }
1011
1012 else if( ntokens == 9 ){
1013 // Segments
1014 int ipl, type, irec, ph;
1015 float x,y,z,ax,ay;
1016 sscanf(line.Data(),"%d %f %f %f %f %f %d %d %d", &ipl, &x, &y, &z, &ax, &ay, &type, &irec, &ph);
1017
1018 EdbSegP *s = new EdbSegP(t->ID(),x,y,ax,ay,0,0);
1019 s->SetZ(z);
1020 s->SetPID(ipl);
1021 s->SetPlate(ipl);
1022 s->SetW(ph);
1023 s->SetTrack(t->ID());
1024 s->SetSide(type);
1025
1026 // fill COV for vertexing
1027 s->SetErrors();
1028 cond.FillErrorsCov(s->TX(), s->TY(), s->COV());
1029
1030 // Add segment in PVRec and Track, keeping consistency of pointer in them.
1031 EdbSegP *s_in_pattern = pvr->AddSegment(*s);
1032 t->AddSegment( s_in_pattern);
1033 }
1034 else {
1035 cout << "EdbEDAUtil::ReadFeedbackPVR Warning: Reading feedback file: items = " << ntokens << ". This is NOT specified!" << endl;
1036 }
1037 }
1038
1039 for(int i=0;i<pvr->Npatterns(); i++) pvr->GetPattern(i)->SetPID(i);
1040 for(int i=0;i<pvr->Npatterns(); i++) pvr->GetPattern(i)->SetSegmentsPID();
1041 for(int i=0;i<pvr->Ntracks(); i++) pvr->GetTrack(i)->SetCounters();
1042
1043 printf("\nEdbPVRec summary. %d vertices, %d tracks.\n", pvr->Nvtx(), pvr->Ntracks());
1044 pvr->Print();
1045
1046 fclose(fp);
1047 return pvr;
1048}
const char filename[256]
Definition: RecDispNU.C:83
Definition: EdbPVRec.h:148
EdbVertex * GetVertex(Int_t &i)
Definition: EdbPVRec.h:256
Int_t Ntracks() const
Definition: EdbPVRec.h:203
void AddVertex(EdbVertex *vtx)
Definition: EdbPVRec.h:251
Int_t Nvtx() const
Definition: EdbPVRec.h:255
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
void SetSegmentsPID()
Definition: EdbPattern.cxx:1455
void SetPID(int pid)
Definition: EdbPattern.h:310
void Print() const
Definition: EdbPattern.cxx:1693
Definition: EdbVertex.h:26
void SetImp(float imp)
Definition: EdbVertex.h:57
void SetZpos(int zpos)
Definition: EdbVertex.h:55
void SetFlag(int flag)
Definition: EdbVertex.h:56
Int_t ID() const
Definition: EdbVertex.h:126
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:355
void SetID(int ID=0)
Definition: EdbVertex.h:156
void SetFlag(int flag=0)
Definition: EdbVertex.h:158
fclose(pFile)
UInt_t id
Definition: tlg2couples.C:117
Int_t type
Definition: testBGReduction_By_ANN.C:15

◆ ReadMxxPVR()

EdbPVRec * EdbEDAUtil::ReadMxxPVR ( char *  filename = NULL)
1051 {
1052
1053 if(filename==NULL){
1054 TGFileInfo *fi=new TGFileInfo;
1055 fi->fIniDir = StrDup(".");
1056 const char *filetypes[] = { "Mxx file", "*.all", 0,0};
1057 fi->fFileTypes=filetypes;
1058 new TGFileDialog(gClient->GetRoot(), gEve?gEve->GetMainWindow():0, kFDOpen, fi);
1059 filename = fi->fFilename;
1060 }
1061
1062 if(NULL==filename) {
1063 EdbEDAUtil::ErrorMessage("No filename. stop.");
1064 return NULL;
1065 }
1066
1067 FILE *fp = fopen(filename,"rt");
1068 if(fp==NULL) {
1069 ErrorMessage(Form("File open error : %s . stop.\n", filename));
1070 return NULL;
1071 }
1072
1073 int npid = 0, plid[100], pid[1000];
1074 double zlayer[100];
1075
1076 EdbPVRec *pvr = new EdbPVRec;
1077 EdbScanCond cond;
1078
1079 char buf[256];
1080 for(int i=0;i<100;i++) zlayer[i]=1.1E10;
1081
1082 printf("reanding m-file : %s\n", filename);
1083
1084 // Header
1085 // skip comment
1086 for(;NULL!=fgets(buf,sizeof(buf),fp);){
1087 if(buf[0]!='%') break;
1088 }
1089
1090 // skip 1st line
1091
1092 // nPlate
1093 fgets(buf,sizeof(buf),fp);
1094 sscanf(buf,"%d", &npid);
1095
1096 // pos list
1097 fgets(buf,sizeof(buf),fp);
1098 int n=0,nn;
1099 for(int j=npid-1;j>=0;j--){
1100 sscanf(buf+n,"%d%n", &plid[j], &nn);
1101 plid[j]/=10;
1102 plid[j]=58-plid[j];
1103 pid[plid[j]]=j;
1104 n+=nn;
1105 }
1106 // Header end
1107
1108 // track data
1109 for(int i=0;NULL!=fgets(buf,sizeof(buf),fp);i++){
1110
1111 int itrk, nseg, pos1, pos2;
1112 sscanf(buf, "%d %d %d %d", &itrk, &nseg, &pos1, &pos2); // track headers
1113
1114 EdbTrackP *t = new EdbTrackP();
1115 t->SetID(itrk);
1116
1117 //printf("t %s", buf);
1118 EdbSegP *s=0;
1119 for(int j=0;j<nseg;j++){ // data of segmetns.
1120 int pos,isg,ph;
1121 double ax,ay,x,y,z;
1122 fgets(buf,sizeof(buf),fp);
1123 sscanf(buf,"%d %*d %d %d %lf %lf %lf %lf %lf",
1124 &pos, &isg, &ph, &ax, &ay, &x, &y, &z);
1125 pos/=10;
1126 pos=58-pos;
1127 if(zlayer[pid[pos]]>=1E10) zlayer[pid[pos]]=z;
1128
1129 s = new EdbSegP(isg, x,y, ax,ay, ph/10000., 0);
1130 s->SetZ(z);
1131 s->SetPID(pid[pos]);
1132 s->SetPlate(pos);
1133 s->SetTrack(itrk);
1134
1135 // fill COV for vertexing
1136 s->SetErrors();
1137 cond.FillErrorsCov(s->TX(), s->TY(), s->COV());
1138
1139 t->AddSegment(s);
1140 pvr->AddSegment(*s);
1141 //t->AddSegmentF( new EdbSegP(*((EdbSegP*)(s))) );
1142
1143 }
1144 s = t->GetSegmentFirst();
1145 t->Set(itrk, s->X(), s->Y(), s->TX(), s->TY(), 0, 1);
1146 t->SetZ(s->Z());
1147 t->SetCounters();
1148 pvr->AddTrack(t);
1149 }
1150
1151
1152 for(int i=0;i<pvr->Ntracks();i++){
1153 EdbTrackP *t = pvr->GetTrack(i);
1154 // fill COV for vertexing
1155 t->SetErrors();
1156 cond.FillErrorsCov(t->TX(), t->TY(), t->COV());
1157 }
1158
1159
1160 for(int i=0;i<pvr->Npatterns(); i++) pvr->GetPattern(i)->SetPID(i);
1161 for(int i=0;i<pvr->Npatterns(); i++) pvr->GetPattern(i)->SetSegmentsPID();
1162
1163 pvr->Print();
1164
1165 return pvr;
1166}
int plid[100]
Definition: m2track.cpp:11
double zlayer[100]
Definition: m2track.cpp:12
int pid[1000]
Definition: m2track.cpp:13
int npid
Definition: m2track.cpp:10

◆ WritePVRMxx()

void EdbEDAUtil::WritePVRMxx ( EdbPVRec pvr,
char *  filename = NULL 
)
1168 {
1169
1170 if(filename==NULL){ // File dialog
1171 TGFileInfo *fi=new TGFileInfo;
1172 fi->fIniDir = StrDup(".");
1173 const char *filetypes[] = { "Mxx file", "*.all", "All files","*",0,0};
1174 fi->fFileTypes = filetypes;
1175 new TGFileDialog(gClient->GetRoot(), gEve->GetMainWindow(), kFDSave, fi);
1176 if(fi->fFilename!=NULL) filename = fi->fFilename;
1177 }
1178
1179 if(NULL==filename||strlen(filename)==0) {
1180 return;
1181 }
1182 FILE *fp=fopen(filename,"wt");
1183 if(NULL==fp){
1184 printf("Couldn't open file : %s\n", filename);
1185 return;
1186 }
1187
1188 // Header
1189
1190 // comment
1191 fprintf(fp,"%% Created by EDA\n");
1192 time_t tim;
1193 time(&tim);
1194 fprintf(fp,"%% on %s",ctime(&tim));
1195
1196 // dummy module id
1197 fprintf(fp," 0 0 3 0 0.0 0.0000\n");
1198
1199 // number of plates
1200 fprintf(fp,"%d\n", pvr->Npatterns());
1201
1202 // list of pos
1203 for(int i=pvr->Npatterns()-1;i>=0;i--){
1204 fprintf(fp,"%d ", (58-pvr->GetPattern(i)->Plate())*10+1);
1205 }
1206 fprintf(fp,"\n");
1207
1208 // Tracks + Segments
1209 for(int i=0;i<pvr->Ntracks();i++){
1210 EdbTrackP *t = pvr->GetTrack(i);
1211
1212 EdbSegP *s1 = t->GetSegmentFirst();
1213 EdbSegP *s2 = t->GetSegmentLast();
1214
1215 fprintf(fp, "%3d %2d %3d %3d\n", t->ID(), t->N(), (58-s2->Plate())*10+1, (58-s1->Plate())*10+1);
1216 // write segment information
1217 for(int j=0;j<t->N();j++){
1218 EdbSegP *s = t->GetSegment(t->N()-j-1);
1219 fprintf(fp,"%3d %5d %7d %6d %7.4f %7.4f %8.1f %8.1f %8.1f\n",
1220 (58-s->Plate())*10+1, t->ID(), s->ID(), (int)(s->W()*10000), s->TX(), s->TY(), s->X(), s->Y(), s->Z());
1221
1222 }
1223 }
1224
1225 fclose(fp);
1226
1227 printf("file %s was written.\n", filename);
1228
1229}
Int_t Plate() const
Definition: EdbPattern.h:327

◆ WriteTracksMxx()

void EdbEDAUtil::WriteTracksMxx ( TObjArray *  pvr,
char *  filename = NULL 
)
1231 {
1232
1233 if(filename==NULL){ // File dialog
1234 TGFileInfo *fi=new TGFileInfo;
1235 fi->fIniDir = StrDup(".");
1236 const char *filetypes[] = { "Mxx file", "*.all", "All files","*",0,0};
1237 fi->fFileTypes = filetypes;
1238 new TGFileDialog(gClient->GetRoot(), gEve->GetMainWindow(), kFDSave, fi);
1239 if(fi->fFilename!=NULL) filename = fi->fFilename;
1240 }
1241
1242 if(NULL==filename||strlen(filename)==0) {
1243 return;
1244 }
1245 FILE *fp=fopen(filename,"wt");
1246 if(NULL==fp){
1247 printf("Couldn't open file : %s\n", filename);
1248 return;
1249 }
1250
1251 // Header
1252
1253 // comment
1254 fprintf(fp,"%% Created by EDA\n");
1255 time_t tim;
1256 time(&tim);
1257 fprintf(fp,"%% on %s",ctime(&tim));
1258
1259 // dummy module id
1260 fprintf(fp," 0 0 3 0 0.0 0.0000\n");
1261
1262
1263 // plates information
1264 std::vector<long > vec;
1266
1267 for(int i=0;i<tracks->GetEntries();i++){
1268 EdbTrackP *t = (EdbTrackP *) tracks->At(i);
1269 for(int j=0;j<t->N();j++){
1270 EdbSegP *s = t->GetSegment(j);
1271 int ipl=(58-s->Plate())*10+1;
1272 it = find(vec.begin(), vec.end(), ipl);
1273 if(it==vec.end()) vec.push_back( ipl);
1274 }
1275 }
1276
1277 sort(vec.begin(), vec.end());
1278
1279 // number of plates
1280 fprintf(fp,"%d\n", (int) vec.size());
1281
1282 // list of pos
1283 for(int i=0;i<(int) vec.size();i++){
1284 fprintf(fp,"%d ", (int) vec[i]);
1285 }
1286 fprintf(fp,"\n");
1287
1288 // Tracks + Segments
1289 for(int i=0;i<tracks->GetEntries();i++){
1290 EdbTrackP *t = (EdbTrackP *) tracks->At(i);
1291
1292 EdbSegP *s1 = t->GetSegmentFirst();
1293 EdbSegP *s2 = t->GetSegmentLast();
1294
1295 fprintf(fp, "%3d %2d %3d %3d\n", t->ID(), t->N(), (58-s2->Plate())*10+1, (58-s1->Plate())*10+1);
1296 // write segment information
1297 for(int j=0;j<t->N();j++){
1298 EdbSegP *s = t->GetSegment(t->N()-j-1);
1299 fprintf(fp,"%3d %5d %7d %6d %7.4f %7.4f %8.1f %8.1f %8.1f\n",
1300 (58-s->Plate())*10+1, t->ID(), s->ID(), (int)(s->W()*10000), s->TX(), s->TY(), s->X(), s->Y(), s->Z());
1301
1302 }
1303 }
1304
1305 fclose(fp);
1306
1307 printf("file %s was written.\n", filename);
1308
1309}
TTree * tracks
Definition: check_tr.C:19
RelationIterator iterator
Definition: VtRelationList.hh:53