FEDRA emulsion software from the OPERA Collaboration
EdbEDAUtil Namespace Reference

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 (const 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)
 
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 (const char *message)
 
void ErrorMessage (const char *title, const char *message)
 
void FillTracksFromPatterns (EdbPVRec *pvr)
 
int FindBrickIDFromPath ()
 
char * FindProcDirClient ()
 
TEveCompound * GetTrackElement (EdbTrackP *t)
 
TEvePointSet * GetVertexElement (EdbVertex *v)
 
int InputID (const char *message, EdbID &id)
 
int InputNumberInteger (const char *message, int idefault=0)
 
double InputNumberReal (const 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 (const char *filename=NULL)
 
EdbPVRecReadMxxPVR (const char *filename=NULL)
 
void WritePVRMxx (EdbPVRec *pvr, const char *filename=NULL)
 
void WriteTracksMxx (TObjArray *pvr, const 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  {
93  kExtendUp,
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 ( const char *  message)
484  {
485  // Open a message dialog and ask you YES or No.
486  // if YES, return kTRUE
487  // if NO, return kFALSE
488  // else return kFALSE
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 
)
422  {
423  // calculate distance
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
Definition: EdbSegP.h:172
Float_t X() const
Definition: EdbSegP.h:170
Float_t Z() const
Definition: EdbSegP.h:150
Float_t Y() const
Definition: EdbSegP.h:171
Float_t TY() const
Definition: EdbSegP.h:173
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ CalcDmin()

double EdbEDAUtil::CalcDmin ( EdbSegP seg1,
EdbSegP seg2,
double *  dminz = NULL 
)
239  {
240 // calculate minimum distance of 2 lines.
241 // use the data of (the selected object)->X(), Y(), Z(), TX(), TY().
242 // means, if the selected object == segment, use the data of the segment. or it == track, the use the fitted data.
243 // original code from Tomoko Ariga
244 // return deltaZ between Z(dmin) and Z(seg1). ==> if vertex is upstream, return plus value.
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:144
Int_t PID() const
Definition: EdbSegP.h:145
#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:18

◆ 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 
)
85  {
86  // Calculate IP between a given segment and a given x,y,z.
87  // return the IP value.
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
void r(int rid=2)
Definition: test.C:201
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CalcIP() [2/2]

double EdbEDAUtil::CalcIP ( EdbSegP s,
EdbVertex v 
)
107  {
108  // calculate IP between a given segment and a given vertex.
109  // return the IP value.
110  // this is used for IP cut.
111 
112  // if vertex is not given, use the selected vertex.
113  // if(v==NULL) v=gEDA->GetSelectedVertex();
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 
)
186  {
187  // simple calcuration
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 
)
143  {
144  // calculate minimum kink angle
145  // for the short decay with only 1 track from primary and 1 track from secondary vertex.
146  // move virtual vertex in the lead, find minimimum kink angle.
147  // if z_is_middle_of_base==1, move z position of tracks 150 microns upstream.
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 td()
Definition: check_vertex.C:168
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
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 
)
126  {
127  // Minimum kink angle calculation in case that 1ry vertex is define && 1 daughter.
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:20
float ePmax
Definition: EdbMomentumEstimator.h:43
float eP
Definition: EdbMomentumEstimator.h:42
int eMinEntr
Definition: EdbMomentumEstimator.h:27
float ePy
Definition: EdbMomentumEstimator.h:35
float ePmin
Definition: EdbMomentumEstimator.h:43
float ePYmax
Definition: EdbMomentumEstimator.h:39
float ePYmin
Definition: EdbMomentumEstimator.h:39
float PMS(EdbTrackP &tr)
Definition: EdbMomentumEstimator.cxx:121
Definition: EdbPattern.h:118
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 
)
344  {
345  // momentum calculation partially using from s2 to slast.
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:149
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 
)
180  {
181  // Ptmin calculation in case that only 1ry track at 1ry vertex && 1 daughter.
182  // move virtual vertex to find minimum kink angle. see also CalcMinimumKinkAngle()
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 
)
175  {
176  // Ptmin calculation in case that 1ry vertex is define && 1 daughter.
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)
282  {
283  // calc vertex point with given segments. just topological calculation.
284  // VTA is currently not set.
285  // in case of Single-stop. make a vertex 650 micron upstream ob base.
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->GetEntriesFast()==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->GetEntriesFast();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:68
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)
499  {
500  // remove fake-segment/Microtrack/pl57. return a pointer to newly created track.;
501  // if Nseg<=4, no fake-segment will be removed.
502  // if fake-segments exist, create a new track without the fake segments and return the pointer.
503  // 1st segment will not be rejected as fake.
504  // segment on pl57 will be rejected every time.
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->GetEntriesFast()){
565  EdbTrackP *t = new EdbTrackP;
566  t->Copy(*t1);
567  for(int i=0;i<fakeseg->GetEntriesFast();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 }
Int_t Plate() const
Definition: EdbSegP.h:156
Int_t Side() const
Definition: EdbSegP.h:167
void RemoveSegment(EdbSegP *s)
Definition: EdbPattern.h:224
Int_t N() const
Definition: EdbPattern.h:182
void Copy(const EdbTrackP &tr)
Definition: EdbPattern.cxx:516
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:200
void SetCounters()
Definition: EdbPattern.h:164
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 
)
583  {
584  // calculate rms of delta-theta assuming 1 kink exist(remove 1 biggest dtheta).
585  // return rms(space), not projection. dtheta of 1 plate.
586  // if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1)
587  // rejection of 1 kink angle is for more than 4 segments.
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 
)
686  {
687  // calculate dtheta-RMS for each components (Spase angle, Transverse angle, Longitudinal angle)
688  // normally RMS(Transverse) is smaller than RMS(Longitudinal).
689  // Transverse component doesn't have dependence on the angle.
690  // ndata will be filled with number of data for transverse or longitudinal.
691  // so that, actual ndata for rmsspace need to be multiplied by 2.
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 }

◆ DTRMSTL1Kink()

double EdbEDAUtil::DTRMSTL1Kink ( EdbTrackP t,
double *  rmsspace,
double *  rmstransverse,
double *  rmslongitudinal,
int *  NKinkAngleUsed = NULL 
)
745  {
746  // calculate rms of delta-theta assuming 1 kink exist(remove 1 biggest dtheta).
747  // return rms(transverse).
748  // if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1).
749  // rejection of 1 kink angle is for more than 4 segments.
750  // if a segment is on pl57, this segment will not used.
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 
)
790  {
791  // calculate rms of delta-theta assuming 1 "given" kink.
792  // return rms(transverse).
793  // if nhale exists, the dtheta is calculated as dtheta=dtheta/sqrt(nhole+1).
794  // if a segment is on pl57, this segment will not used.
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 ( const char *  message)
476  {
477  ErrorMessage("Error", message);
478 }
void ErrorMessage(const char *title, const char *message)
Definition: EdbEDAUtil.C:479

◆ ErrorMessage() [2/2]

void EdbEDAUtil::ErrorMessage ( const char *  title,
const 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)
1351  {
1352  // convert segments in patterns into Tracks in EdbPVRec object.
1353  // each track has 1 segment
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:280
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Definition: EdbScanCond.h:10
void FillErrorsCov(float tx, float ty, TMatrixD &cov)
Definition: EdbScanCond.cxx:161
void SetErrors()
Definition: EdbSegP.h:89
TMatrixD & COV() const
Definition: EdbSegP.h:120
Float_t SX() const
Definition: EdbSegP.h:159
Int_t N() const
Definition: EdbPattern.h:89
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 ( )
882  {
883  // Find ProcDirClient from the current path.
884  // "ONLINE" is the hard coded name for ProcDirClient.
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)
56  {
57  // Return the correspoinding TEvePointSet element to the EdbVertex.
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 ( const char *  message,
EdbID id 
)
872  {
873  // create a number entry window and return the number
874  // return 1 if successful, 0 if cancel.
875  int ret=0;
876  new EdbIDDialog(message, id, &ret);
877  return ret;
878 }
Definition: EdbEDAUtil.h:161

◆ InputNumberInteger()

int EdbEDAUtil::InputNumberInteger ( const 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 ( const char *  message,
double  default_num = 0.0,
TGNumberFormat::EStyle  es = TGNumberFormat::kNESReal 
)
858  {
859  // create a number entry window and return the number
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)
41  {
42  // if pattern includes BT, return 1.
43  // check all segments whether the seg->Track()==-1 or not.
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 }
Int_t Track() const
Definition: EdbSegP.h:147

◆ 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 
)
1312  {
1313  // convert tracks or segments array into pvr.
1314  // if pointers of segments will not be consistent.
1315 
1316  EdbScanCond cond;
1317 
1318  for(int i=0; i<tracks_or_segments->GetEntriesFast(); 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:2921

◆ ReadFeedbackPVR()

EdbPVRec * EdbEDAUtil::ReadFeedbackPVR ( const char *  filename = NULL)
914  {
915  // Read feedback file format (ver 2009 Oct), and return EdbPVRec object.
916  // eTracks, eVTX, patterns are filled.
917  // stand alone function.
918 
919  // if filename is not given, open file browser.
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 }
Definition: EdbPVRec.h:148
EdbVertex * GetVertex(Int_t &i)
Definition: EdbPVRec.h:256
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Int_t Ntracks() const
Definition: EdbPVRec.h:203
void AddVertex(EdbVertex *vtx)
Definition: EdbPVRec.h:251
Int_t Nvtx() const
Definition: EdbPVRec.h:255
void SetSegmentsPID()
Definition: EdbPattern.cxx:1548
void SetPID(int pid)
Definition: EdbPattern.h:319
void Print() const
Definition: EdbPattern.cxx:1853
void SetPID(int pid)
Definition: EdbSegP.h:126
void SetSide(int side=0)
Definition: EdbSegP.h:136
void SetTrack(int trid)
Definition: EdbSegP.h:128
void SetZ(float z)
Definition: EdbSegP.h:122
void SetW(float w)
Definition: EdbSegP.h:129
void SetPlate(int plateid)
Definition: EdbSegP.h:139
Definition: EdbVertex.h:25
void SetImp(float imp)
Definition: EdbVertex.h:56
void SetZpos(int zpos)
Definition: EdbVertex.h:54
void SetFlag(int flag)
Definition: EdbVertex.h:55
Int_t ID() const
Definition: EdbVertex.h:126
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:377
void SetID(int ID=0)
Definition: EdbVertex.h:156
void SetFlag(int flag=0)
Definition: EdbVertex.h:158
string filename
Definition: emthickness.cpp:34
fclose(pFile)
UInt_t id
Definition: tlg2pattern.C:118
Int_t type
Definition: testBGReduction_By_ANN.C:15

◆ ReadMxxPVR()

EdbPVRec * EdbEDAUtil::ReadMxxPVR ( const 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,
const 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:340
Float_t W() const
Definition: EdbSegP.h:148

◆ WriteTracksMxx()

void EdbEDAUtil::WriteTracksMxx ( TObjArray *  pvr,
const 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->GetEntriesFast();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->GetEntriesFast();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