FEDRA emulsion software from the OPERA Collaboration
EdbEDADecaySearch Class Reference

#include <EdbEDADecaySearch.h>

Inheritance diagram for EdbEDADecaySearch:
Collaboration diagram for EdbEDADecaySearch:

Public Types

enum  { kParentSearch =0x01 , kBaseTrackSearch =0x02 , kDaughterSearch =0x04 }
 

Public Member Functions

TObjArray * CheckInTrackKink (EdbTrackP *trk)
 
TObjArray * CheckInTrackKinks (TObjArray *tracks=NULL)
 
TObjArray * DoSearch ()
 
 EdbEDADecaySearch (int DSversion=2)
 
EdbVertexFindPrimaryVertex ()
 
EdbEDATrackPFindTrack (EdbTrackP *t)
 
TObjArray * FindUpstreamVertices ()
 
EdbEDADecayVertexGetDecayVertex (int i)
 
float GetIPCut (EdbVertex *v, EdbSegP *s)
 
TObjArray * GetKinks (void)
 
EdbVertexGetPrimaryVertex ()
 
EdbPVRecGetPVR ()
 
EdbEDATrackPGetTrack (int i)
 
EdbEDATrackSetGetTrackSet ()
 
double GetTSDauIP1 (double dz)
 
double GetTSDauIP2 (double dz)
 
void KinkSearch ()
 
EdbVertexMakeFakeVertex (EdbTrackP *t, double dz=1150)
 
void MTSearch2seg (TObjArray *tracks)
 
void MTSearchAll (TObjArray *tracks)
 
int NDecayVertices ()
 
int Ntracks ()
 
void PrintRunTracking ()
 
void PrintTracks ()
 
void SetBTSearch (int do_search=1, int npl_up=0, int npl_down=2, float ipcut=20, float phcut=17)
 
void SetIPHist1 (TH1F *h)
 
void SetIPHist2 (TH1F *h)
 
void SetParentSearch (int do_search=1, int npl=2, float ipcut=20, float phcut=17)
 
void SetPVR (EdbPVRec *pvr)
 
void SetSmallKinkSearch (int do_search=1, int npl_down=5, float Rmin=5.)
 
void SetTracks (TObjArray *array)
 
void SetTrackSet (EdbEDATrackSet *set)
 
void SetVertex (EdbVertex *v)
 
void ShortDecaySearch ()
 
void SmallKinkSearch ()
 
TObjArray * TSBaseTracks (int ipl)
 
TObjArray * TSDaughterTracks (TObjArray *base)
 
void TSDaughterTracks2 ()
 
TObjArray * TSParentTracks (TObjArray *base)
 
virtual ~EdbEDADecaySearch ()
 

Public Attributes

int eBT
 
double eBTIP
 
double eBTPH
 
int eBTPlateDown
 
int eBTPlateUp
 
TObjArray * eDecayVertices
 
int eDSVer
 
TObjArray * eKinks
 
double eKinkSigma
 
int eMT2seg
 
int eMTAll
 
EdbPVRecePVR
 
TObjArray * eSegments
 
EdbEDATrackSeteSet
 
int eSmallKink
 
int eSmallKinkNpl
 
float eSmallKinkRmin
 
TObjArray * eTracks
 
int eTSDau
 
int eTSDau2
 
TH1F * eTSDauIPHist1
 
TH1F * eTSDauIPHist2
 
int eTSDauNseg
 
int eTSDauNseg2
 
double eTSDauPH
 
int eTSPar
 
double eTSParIP
 
int eTSParNseg
 
double eTSParPH
 
int eTSParPlate
 
EdbVertexeVertex
 
int eVertexPlatePID
 
TObjArray * eVertices
 
int eVtxUp
 
int eVtxUpDZ
 
int eVtxUpIP
 

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
kParentSearch 
kBaseTrackSearch 
kDaughterSearch 
215  {
216  kParentSearch =0x01,
217  kBaseTrackSearch =0x02,
218  kDaughterSearch =0x04
219  };
@ kParentSearch
Definition: EdbEDADecaySearch.h:216
@ kBaseTrackSearch
Definition: EdbEDADecaySearch.h:217
@ kDaughterSearch
Definition: EdbEDADecaySearch.h:218

Constructor & Destructor Documentation

◆ EdbEDADecaySearch()

EdbEDADecaySearch::EdbEDADecaySearch ( int  DSversion = 2)
inline
273  :
274  eDSVer (DSversion),
275  eVertex (NULL),
276  eTracks (new TObjArray),
277  eSegments (new TObjArray),
278  eVertices (new TObjArray),
279  eSet (NULL),
280 
281  eTSDau (1),
282  eTSDauNseg (2),
283  eTSDauPH (17),
284 
285  eMT2seg (0),
286  eMTAll (1),
287 
288  eTSDau2 (1),
289  eTSDauNseg2 (3),
290 
291  eSmallKink (0),
292  eSmallKinkNpl (5),
293  eSmallKinkRmin(5.),
294 
295  eTSPar (0),
296  eTSParPlate(2),
297  eTSParNseg (1),
298  eTSParIP (20),
299  eTSParPH (17),
300 
301  eBT (0),
302  eBTPlateUp (0),
303  eBTPlateDown (2),
304  eBTIP (20),
305  eBTPH (17),
306 
307  eVtxUp (0),
308  eVtxUpDZ (3000),
309  eVtxUpIP (500),
310 
311  eKinkSigma(3.),
312  eKinks (new TObjArray),
313  eDecayVertices(new TObjArray)
314 
315  {
316 
317  float ipcutdau_lt_1 = eDSVer==1 ? 500 : 300;
318  float ipcutdau_gt_1 = eDSVer==1 ? 800 : 500;
319 
320  if(gDirectory->Get("eTSDauIPHist1")) gDirectory->Delete("eTSDauIPHist1");
321  eTSDauIPHist1 = new TH1F ("eTSDauIPHist1","IP cut function along dZ, 1st.", 121, -100, 12000);
322  // Fill function
323  TH1F *h = eTSDauIPHist1;
324  h->SetFillColor(kBlue);
325  h->SetXTitle("dZ (#mum)");
326  h->SetYTitle("IP cut (#mum)");
327  for(int i=1;i<=100;i++){
328  if(0<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<1000) h->SetBinContent(i, ipcutdau_lt_1);
329  else if(1000<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<11700) h->SetBinContent(i, ipcutdau_gt_1);
330  else if(11700<=h->GetBinLowEdge(i)) h->SetBinContent(i,0);
331  }
332  if(gDirectory->Get("eTSDauIPHist1")) gDirectory->Delete("eTSDauIPHist2");
333  eTSDauIPHist2 = new TH1F ("eTSDauIPHist2","IP cut function along dZ, 2nd", 121, -100, 12000);
334  // Fill function
335  h = eTSDauIPHist2;
336  h->SetFillColor(kBlue);
337  h->SetXTitle("dZ (#mum)");
338  h->SetYTitle("IP cut (#mum)");
339  for(int i=1;i<=100;i++){
340  if(0<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<1000) h->SetBinContent(i, ipcutdau_lt_1);
341  else if(1000<=h->GetBinLowEdge(i)&&h->GetBinLowEdge(i)<6000) h->SetBinContent(i, ipcutdau_gt_1);
342  else if(6000<=h->GetBinLowEdge(i)) h->SetBinContent(i,0);
343  }
344  }
double eBTIP
Definition: EdbEDADecaySearch.h:260
int eMT2seg
Definition: EdbEDADecaySearch.h:238
int eTSDau
Definition: EdbEDADecaySearch.h:233
int eTSParPlate
Definition: EdbEDADecaySearch.h:251
int eTSDauNseg2
Definition: EdbEDADecaySearch.h:242
EdbVertex * eVertex
Definition: EdbEDADecaySearch.h:223
int eVtxUp
Definition: EdbEDADecaySearch.h:263
TObjArray * eSegments
Definition: EdbEDADecaySearch.h:228
int eTSPar
Definition: EdbEDADecaySearch.h:250
int eBT
Definition: EdbEDADecaySearch.h:257
double eTSDauPH
Definition: EdbEDADecaySearch.h:235
int eVtxUpIP
Definition: EdbEDADecaySearch.h:265
TObjArray * eDecayVertices
Definition: EdbEDADecaySearch.h:271
TH1F * eTSDauIPHist1
Definition: EdbEDADecaySearch.h:236
int eBTPlateUp
Definition: EdbEDADecaySearch.h:258
TH1F * eTSDauIPHist2
Definition: EdbEDADecaySearch.h:243
int eMTAll
Definition: EdbEDADecaySearch.h:239
int eBTPlateDown
Definition: EdbEDADecaySearch.h:259
double eTSParIP
Definition: EdbEDADecaySearch.h:253
TObjArray * eVertices
Definition: EdbEDADecaySearch.h:229
float eSmallKinkRmin
Definition: EdbEDADecaySearch.h:247
int eSmallKink
Definition: EdbEDADecaySearch.h:245
double eKinkSigma
Definition: EdbEDADecaySearch.h:269
int eTSDau2
Definition: EdbEDADecaySearch.h:241
int eVtxUpDZ
Definition: EdbEDADecaySearch.h:264
double eBTPH
Definition: EdbEDADecaySearch.h:261
int eSmallKinkNpl
Definition: EdbEDADecaySearch.h:246
int eTSDauNseg
Definition: EdbEDADecaySearch.h:234
double eTSParPH
Definition: EdbEDADecaySearch.h:254
TObjArray * eKinks
Definition: EdbEDADecaySearch.h:270
int eDSVer
Definition: EdbEDADecaySearch.h:221
TObjArray * eTracks
Definition: EdbEDADecaySearch.h:227
int eTSParNseg
Definition: EdbEDADecaySearch.h:252
EdbEDATrackSet * eSet
Definition: EdbEDADecaySearch.h:231
#define NULL
Definition: nidaqmx.h:84

◆ ~EdbEDADecaySearch()

virtual EdbEDADecaySearch::~EdbEDADecaySearch ( )
inlinevirtual
345 {}

Member Function Documentation

◆ CheckInTrackKink()

TObjArray * EdbEDADecaySearch::CheckInTrackKink ( EdbTrackP trk)
151  {
152  // Search kink. return TObjArray of EdbEDASmallKink
153 
154  if(trk->N()<2) {
155  printf("Track %d nseg=%d, too short for kink search\n", trk->ID(), trk->N());
156  return NULL;
157  }
158  EdbTrackP *t = CleanTrack(trk); // Remove fake segment/microtracks.
159 
160  double rms,rmst,rmsl;
161  DTRMSTL1Kink(t, &rms, &rmst, &rmsl); // DTRMS for each projection.
162 
163  if(t->N()<=2) {
164  printf("Track %d nseg=%d. too short to calculate delta-theta rms. use 2.0mrad.\n", t->ID(), t->N());
165  rms=rmst=rmsl=2.0;
166  }
167 
168  TObjArray *kinks = new TObjArray;
169 
170  int vtxpl;
171  if(gEDA) vtxpl=gEDA->GetIPLZ(eVertex->Z());
172  else {
173  vtxpl=0; // TODO
174  printf("VERTEX plate is not set!!!!! \n");
175  }
176 
177  for(int i=0; i<ePVR->Npatterns(); i++){
178  EdbPattern *pat = ePVR->GetPattern(i);
179  if( eVertex->Z()<pat->Z()) {
180  vtxpl = pat->Plate();
181  break;
182  }
183  }
184 
185  int n=t->N();
186  for(int j=0;j<n-1;j++){
187  EdbSegP *s1 = t->GetSegment(j);
188  EdbSegP *s2 = t->GetSegment(j+1);
189 
190  // if s1 is more downstream than 5 plates from vertex, skip. search only kink between 1-x,2-x,3-x,4-x.
191  if(s1->Plate()>vtxpl+eSmallKinkNpl) continue;
192 
193  // calculate kink angle in transverse and longitudinal projection.
194  double dtt, dtl;
195  CalcDTTransLongi(s1,s2, &dtt, &dtl);
196  double dt = sqrt(dtt*dtt+dtl*dtl);
197 
198  // calculate position difference from 1st segment.
199  double dxt, dxl;
200  CalcDXTransLongi(t->GetSegmentFirst(),s2, &dxt, &dxl);
201 
202  if( fabs(dtt)>rmst*eSmallKinkRmin || fabs(dtl)>rmsl*eSmallKinkRmin ) {
203  // if there is kink.
204  // if kink angle is bigger than 5 times delta-theta rms in one of the 2 projection.
205 
206  // momentum calculation using downstream from s2.
207  double p,pmin,pmax;
208  CalcPPartial(t,s2,t->GetSegmentLast(), p, pmin, pmax);
209 
210  // calculate Pt at the kink, using downstream momentum.
211  double Pt = p>0 ? p*dt : -1.;
212 
213  // calculate vertex point with 2 segments.
214  TObjArray segs;
215  segs.Add(s1);
216  segs.Add(s2);
217  EdbVertex *v = CalcVertex(&segs);
218 
219  int ndau = n-j-1;
220  // put the data in a struct.
221  EdbEDASmallKink *kink = new EdbEDASmallKink(v, t, s1, s2, dtt, dtl, dxt, dxl, ndau, p, pmin, pmax, Pt, rmst, rmsl);
222 
223  if(gEDA) gEDA->AddVertex(v);
224  kinks->Add(kink); // for this track
225  eKinks->Add(kink); // for all tracks.
226 
227  {
228  // Make Decay vertex
229  // this is a temporary solution.
230  EdbEDADecayVertex *vdecay = new EdbEDADecayVertex;
231  vdecay->SetXYZ( v->X(), v->Y(), v->Z());
232  vdecay->SetPrimaryVertex(eVertex);
233 
234  EdbTrackP *tp = new EdbTrackP(*t);
235  tp->Clear();
236  for(int i=0; i<=j; i++) tp->AddSegment( t->GetSegment(i));
237  tp->SetCounters();
238  vdecay->SetParent( new EdbEDATrackP(tp, eVertex));
239 
240  EdbTrackP *td = new EdbTrackP(*t);
241  td->Clear();
242  for(int i=j+1; i<t->N(); i++) td->AddSegment( t->GetSegment(i));
243  td->SetCounters();
244  vdecay->SetDaughter( new EdbEDATrackP(td, eVertex));
246  eDecayVertices->Add(vdecay);
247  }
248 
249 
250  printf("Kink candidate. itrk %d plate %d - %d kink angle %.4lf P %.3lf Pt %.3lf ",
251  t->ID(), s1->PID(), s2->PID(), dt, p, Pt);
252  printf("(Trans, Longi) = ( %.4lf, %.4lf ) thr ( %.4lf, %.4lf )\n",
253  dtt, dtl, rmst*3, rmsl*3);
254  //gEDA->AddDrawObject(kink);
255  }
256  }
257 
258  printf("%d kink candidates are found.\n", kinks->GetEntriesFast());
259 
260  return kinks;
261 }
EdbEDA * gEDA
Definition: EdbEDA.C:3
float Pt[500]
Definition: RecDispNU.C:99
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
EdbVertex * CalcVertex(TObjArray *segments)
Definition: ShowRec.cpp:9043
TTree * t
Definition: check_shower.C:4
void td()
Definition: check_vertex.C:168
int GetIPLZ(float z)
Definition: EdbEDA.h:267
EdbPVRec * ePVR
Definition: EdbEDADecaySearch.h:230
Definition: EdbEDADecaySearch.h:120
void SetType(int type)
Definition: EdbEDADecaySearch.h:151
void SetParent(EdbEDATrackP *parent)
Definition: EdbEDADecaySearch.C:80
void SetDaughter(EdbEDATrackP *daughter)
Definition: EdbEDADecaySearch.C:85
void SetPrimaryVertex(EdbVertex *v)
Definition: EdbEDADecaySearch.h:143
@ kSmallKink
Definition: EdbEDADecaySearch.h:132
@ kLong
Definition: EdbEDADecaySearch.h:132
Definition: EdbEDADecaySearch.h:161
Definition: EdbEDADecaySearch.h:9
void AddVertex(EdbVertex *v)
Definition: EdbEDA.h:661
Definition: EdbPattern.h:280
Int_t Plate() const
Definition: EdbPattern.h:340
Int_t Npatterns() const
Definition: EdbPattern.h:380
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1887
Definition: EdbSegP.h:18
Int_t ID() const
Definition: EdbSegP.h:144
Int_t Plate() const
Definition: EdbSegP.h:156
Int_t PID() const
Definition: EdbSegP.h:145
Float_t Z() const
Definition: EdbPattern.h:87
Definition: EdbPattern.h:118
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:219
Int_t N() const
Definition: EdbPattern.h:182
void Clear()
Definition: EdbPattern.h:271
void SetCounters()
Definition: EdbPattern.h:164
Definition: EdbVertex.h:68
Float_t X() const
Definition: EdbVertex.h:130
void SetXYZ(float x, float y, float z)
Definition: EdbVertex.h:157
Float_t Z() const
Definition: EdbVertex.h:132
Float_t Y() const
Definition: EdbVertex.h:131
void CalcDXTransLongi(EdbSegP *s1, EdbSegP *s2, double *dxt, double *dxl)
Definition: EdbEDAUtil.C:665
void CalcDTTransLongi(EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
Definition: EdbEDAUtil.C:648
EdbTrackP * CleanTrack(EdbTrackP *t)
Definition: EdbEDAUtil.C:499
double DTRMSTL1Kink(EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:745
void CalcPPartial(EdbTrackP *t, EdbSegP *s1st, EdbSegP *slast, double &p, double &pmin, double &pmax, bool print=kTRUE)
Definition: EdbEDAUtil.C:344
p
Definition: testBGReduction_AllMethods.C:8
EdbSegP * s1
Definition: tlg2pattern.C:30
EdbSegP * s2
Definition: tlg2pattern.C:31

◆ CheckInTrackKinks()

TObjArray* EdbEDADecaySearch::CheckInTrackKinks ( TObjArray *  tracks = NULL)
inline
397  {
398  if(NULL==tracks) tracks=eTracks;
399  for(int i=0;i<tracks->GetEntriesFast();i++) {
400  CheckInTrackKink((EdbTrackP *) tracks->At(i));
401  }
402  return eKinks;
403  }
TObjArray * CheckInTrackKink(EdbTrackP *trk)
Definition: EdbEDADecaySearch.C:151
TTree * tracks
Definition: check_tr.C:19

◆ DoSearch()

TObjArray * EdbEDADecaySearch::DoSearch ( )
306  {
307  // Do track search
308 
309 
310  // clear previous results.
311  eTracks->Clear();
312  eSegments->Clear();
313 
314  int nAll=-1;
315  int nTSDau1=-1;
316  int nTSDau2=-1;
317  if(gEve) gEve->SetStatusLine("Start Track search");
318  printf("######### Track Search #########\n");
319  if(eVertex==NULL) {
320  printf("Vertex is not selected!! End.\n");
321  return eTracks;
322  }
323  if(ePVR==NULL){
324  printf("No PVRec set\n");
325  return eTracks;
326  }
327 
328  int hall[11],hdau1[11];
329  int hdau2[11],hmt[11];
330  for(int i=0;i<11;i++) hall[i]=hdau1[i]=hdau2[i]=hmt[i]=0;
331 
332  printf(" target vertex = ( %8.1f, %8.1f, %8.1f) on pid%d.\n", eVertex->X(), eVertex->Y(), eVertex->Z(), eVertexPlatePID);
333  printf(" with %d track\n", ePVR->Ntracks());
334 
335  TObjArray *base = ePVR->eTracks;
336 
337  for(int i=0;i<base->GetEntriesFast();i++) hall[((EdbTrackP *) base->At(i))->N()>=10?10:((EdbTrackP *) base->At(i))->N()]++;
338  nAll=base->GetEntriesFast();
339 
340  // Daughter search 1st
341  if(eTSDau) TSDaughterTracks(base);
342 
343  for(int i=0;i<eTracks->GetEntriesFast();i++) {
344  EdbTrackP *t = ((EdbEDATrackP *) eTracks->At(i))->GetOriginal();
345  int nseg= t->N();
346  if( nseg>10) nseg=10;
347  hdau1[nseg]++;
348  }
349  nTSDau1 = eTracks->GetEntriesFast();
350  printf("%d\n", nTSDau1);
351 
352  // Microtrack search
354  if(eMTAll) {
356  }
357  for(int i=0;i<eTracks->GetEntriesFast();i++) hmt[((EdbEDATrackP *) eTracks->At(i))->GetOriginal()->N()>=10?10:((EdbEDATrackP *) eTracks->At(i))->GetOriginal()->N()]++;
358 
359  // Daughter cut 2nd.
360  if(eTSDau2){
361  TObjArray tmp = *eTracks;
363  }
364  for(int i=0;i<eTracks->GetEntriesFast();i++) hdau2[((EdbEDATrackP *) eTracks->At(i))->N()>=10?10:((EdbEDATrackP *) eTracks->At(i))->GetOriginal()->N()]++;
365 
366  nTSDau2 = eTracks->GetEntriesFast();
367 
368  // small kin search
370 
371  if(eTSPar) TSParentTracks(base);
372 
373  if(eBT){
374  printf(" Base track search. ");
375  printf("Upstream %d plates, Downstream %d plates ip<%.1lf w>%.1lf\n",
377  for(int dPlate=-eBTPlateUp+1; dPlate<=eBTPlateDown; dPlate++){
378  int pid = eVertexPlatePID + dPlate -1;
379  if(pid<0||ePVR->Npatterns()-1<pid) continue;
380  TSBaseTracks(pid);
381  }
382  }
383 
384  PrintTracks();
385 
386  printf("------ SUMMARY --------------\n");
387  printf(" nseg ");
388  for(int i=1;i<11;i++) printf("%3d ", i);
389  printf("\n");
390  printf(" Total %4d tracks ", nAll);
391  for(int i=1;i<11;i++) printf("%3d ", hall[i]);
392  printf("\n");
393  printf(" Daughter search %4d tracks ", nTSDau1);
394  for(int i=1;i<11;i++) printf("%3d ", hdau1[i]);
395  printf("\n");
396  printf(" Microtrack search ");
397  for(int i=1;i<11;i++) printf("%3d ", hmt[i]);
398  printf("\n");
399  printf(" Nseg>=3 (inc.MT) %4d tracks ", nTSDau2);
400  for(int i=1;i<11;i++) printf("%3d ", hdau2[i]);
401  printf("\n");
402  printf("-------------------------------\n");
403 
404  return eTracks;
405 }
void SmallKinkSearch()
Definition: EdbEDADecaySearch.C:139
void MTSearchAll(TObjArray *tracks)
Definition: EdbEDADecaySearch.C:289
TObjArray * TSDaughterTracks(TObjArray *base)
Definition: EdbEDADecaySearch.C:449
void PrintTracks()
Definition: EdbEDADecaySearch.C:266
void MTSearch2seg(TObjArray *tracks)
Definition: EdbEDADecaySearch.C:274
TObjArray * TSBaseTracks(int ipl)
Definition: EdbEDADecaySearch.C:588
int eVertexPlatePID
Definition: EdbEDADecaySearch.h:224
TObjArray * TSParentTracks(TObjArray *base)
Definition: EdbEDADecaySearch.C:535
void TSDaughterTracks2()
Definition: EdbEDADecaySearch.C:505
Int_t Ntracks() const
Definition: EdbPVRec.h:203
TObjArray * eTracks
Definition: EdbPVRec.h:161
int pid[1000]
Definition: m2track.cpp:13

◆ FindPrimaryVertex()

EdbVertex * EdbEDADecaySearch::FindPrimaryVertex ( )
666  {
667  // Find Best Vertex.
668  // select best one from pvr->eVertex
669 
670  printf("FindBestVertex(): \n");
671  if( ePVR->Nvtx()==0 ){
672  printf("No vertex is set. make a fake vertex.");
673 
674  EdbTrackP *tup=NULL;
675  for(int i=0; i<ePVR->Ntracks(); i++){
676  EdbTrackP *t = ePVR->GetTrack(i);
677  if(t->N()<3) continue;
678  if(EdbEDAUtil::DTRMS(t)>0.02) continue;
679  if(tup==NULL) tup=t;
680  if(t->Z()<tup->Z()) tup=t;
681  }
682  if(tup==NULL) return NULL;
683 
684  EdbVertex *v = MakeFakeVertex( tup, -650);
685 
686  return v;
687  }
688 
689  // select most upstream vertex
690  int zero=0;
691  EdbVertex *v_most_upstream = ePVR->GetVertex(zero);
692  for(int i=1; i<ePVR->Nvtx(); i++){
693  EdbVertex *v = ePVR->GetVertex(i);
694  if(v->Z()<v_most_upstream->Z()) v_most_upstream=v;
695  }
696 
697  // gather all vertex near the most upstream vertex
698  // vertices within 200 micron in Z.
699 
700  printf("TODO: FindPrimaryVertex... find real vertex, especially QE like kink event.\n");
701  printf("memo: currently mostly 2 track vertex is selected.");
702  printf("TODO: use SB info.\n");
703  printf("TODO: constraint for vertex Z < SB stop Z\n");
704  TObjArray *vertices = new TObjArray;
705  for(int i=0; i<ePVR->Nvtx(); i++){
706  EdbVertex *v = ePVR->GetVertex(i);
707  if(v->Z()<v_most_upstream->Z()+200) vertices->Add(v);
708  }
709 
710  // select most high probability vertex
711  EdbVertex *v_highest_prob= (EdbVertex *) vertices->At(0);
712  for(int i=1; i<vertices->GetEntriesFast(); i++){
713  EdbVertex *v= (EdbVertex *) vertices->At(i);
714  if(v->V()->prob()>v_highest_prob->V()->prob()) v_highest_prob = v;
715  }
716 
717 
718  printf("select upstream and high probable vertex: %d vertex\n", ePVR->Nvtx());
719  for(int i=0; i<ePVR->Nvtx();i++){
720  EdbVertex *v = ePVR->GetVertex(i);
721  int flag = 0;
722  for(int j=0; j<vertices->GetEntriesFast(); j++) { if(v==vertices->At(j)) flag=1;}
723  printf("vertex %2d, %2d tracks z=%8.1f prob=%7.5f %s %s, %s\n", i, v->N(), v->Z(), v->V()->prob(),
724  v==v_most_upstream?"most":" ",
725  flag?"upstream": " ",
726  v==v_highest_prob?"highest prob":"");
727  }
728 
729  delete vertices;
730  return v_highest_prob;
731  //return v_most_upstream;
732 
733 }
EdbVertex * MakeFakeVertex(EdbTrackP *t, double dz=1150)
Definition: EdbEDADecaySearch.C:648
EdbVertex * GetVertex(Int_t &i)
Definition: EdbPVRec.h:256
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Int_t Nvtx() const
Definition: EdbPVRec.h:255
Float_t Z() const
Definition: EdbSegP.h:150
Int_t N() const
Definition: EdbVertex.h:121
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
float prob() const
upper tail $\chi^2$ probability
Definition: VtVertex.C:237
double DTRMS(EdbTrackP *t)
Definition: EdbEDAUtil.C:431

◆ FindTrack()

EdbEDATrackP* EdbEDADecaySearch::FindTrack ( EdbTrackP t)
inline
371  {
372  for(int i=0;i<Ntracks();i++){
373  if(GetTrack(i)->ID()==t->ID()) return GetTrack(i);
374  }
375  return NULL;
376  }
EdbEDATrackP * GetTrack(int i)
Definition: EdbEDADecaySearch.h:379
int Ntracks()
Definition: EdbEDADecaySearch.h:378

◆ FindUpstreamVertices()

TObjArray * EdbEDADecaySearch::FindUpstreamVertices ( )
426  {
427 
428  printf("Find upstream vertices. Nvtx_base = %d\n", ePVR->Nvtx());
429  TObjArray *vertices= new TObjArray;
430 
431  for(int i=0;i<ePVR->Nvtx();i++){
432  EdbVertex *v = ePVR->GetVertex(i);
433  double dz = v->Z() - eVertex->Z();
434  if( dz < -eVtxUpDZ || 0 < dz ) continue;
435 
436  int flag=0;
437  for(int j=0;j<eVertex->N();j++){
439  if(CalcIP(s,v)<eVtxUpIP) flag++;
440  }
441  if(flag ==0) continue;
442  vertices->Add(v);
443  }
444 
445  return vertices;
446 }
brick dz
Definition: RecDispMC.C:107
Double_t CalcIP(EdbSegP *s, EdbVertex *v)
Definition: ShowRec.cpp:8872
EdbSegP * GetSegmentFirst() const
Definition: EdbPattern.h:194
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
EdbSegP * s
Definition: tlg2pattern.C:32

◆ GetDecayVertex()

EdbEDADecayVertex* EdbEDADecaySearch::GetDecayVertex ( int  i)
inline
381 { return (EdbEDADecayVertex *)eDecayVertices->At(i);}

◆ GetIPCut()

float EdbEDADecaySearch::GetIPCut ( EdbVertex v,
EdbSegP s 
)
785  {
786  // calculate IP cut for given 1ry vertex and segment.
787  // if segment is BT, Z of segment is assumed Z=s->Z()-150;
788  // otherwise, use s->Z();
789 
790  float Z = s->Side()==0? s->Z()-150 : s->Z();
791  float dZ = fabs( Z-v->Z());
792  return 5.0+0.01*dZ;
793 }
Int_t Side() const
Definition: EdbSegP.h:167
struct @8 Z

◆ GetKinks()

TObjArray* EdbEDADecaySearch::GetKinks ( void  )
inline
405 { return eKinks;}

◆ GetPrimaryVertex()

EdbVertex* EdbEDADecaySearch::GetPrimaryVertex ( )
inline
347 { return eVertex;}

◆ GetPVR()

EdbPVRec* EdbEDADecaySearch::GetPVR ( )
inline
384 { return ePVR;}

◆ GetTrack()

EdbEDATrackP* EdbEDADecaySearch::GetTrack ( int  i)
inline
379 { return (EdbEDATrackP *) eTracks->At(i);}

◆ GetTrackSet()

EdbEDATrackSet* EdbEDADecaySearch::GetTrackSet ( )
inline
390 { return eSet;}

◆ GetTSDauIP1()

double EdbEDADecaySearch::GetTSDauIP1 ( double  dz)
117  {
118  TH1F *h = eTSDauIPHist1;
119 
120  if(dz<h->GetXaxis()->GetXmin()) return h->GetBinContent(1);
121  if(dz>h->GetXaxis()->GetXmax()) return h->GetBinContent(h->GetNbinsX());
122  for(int i=1;i<h->GetNbinsX();i++){
123  if(dz>=h->GetBinLowEdge(i)&&dz<h->GetBinLowEdge(i)+h->GetBinWidth(i)) return h->GetBinContent(i);
124  }
125  return 0.0;
126 }
h_chi2_v_ttheta GetXaxis() -> SetTitle("ttheta")

◆ GetTSDauIP2()

double EdbEDADecaySearch::GetTSDauIP2 ( double  dz)
128  {
129  TH1F *h = eTSDauIPHist2;
130 
131  if(dz<h->GetXaxis()->GetXmin()) return h->GetBinContent(1);
132  if(dz>h->GetXaxis()->GetXmax()) return h->GetBinContent(h->GetNbinsX());
133  for(int i=1;i<h->GetNbinsX();i++){
134  if(dz>=h->GetBinLowEdge(i)&&dz<h->GetBinLowEdge(i)+h->GetBinWidth(i)) return h->GetBinContent(i);
135  }
136  return 0.0;
137 }

◆ KinkSearch()

void EdbEDADecaySearch::KinkSearch ( )
735  {
736  printf("------------------------------\n");
737  printf("Kink search in selected tracks\n");
738  for(int i=0; i<Ntracks(); i++){
739  for(int j=0; j<Ntracks(); j++){
740 
741  if(i==j) continue;
742 
743  EdbEDATrackP *t1 = GetTrack(i);
744  EdbEDATrackP *t2 = GetTrack(j);
745 
746  EdbSegP *s1 = t1->GetSegmentLast();
747  EdbSegP *s2 = t2->GetSegmentFirst();
748 
749  if(s1->Plate() >= s2->Plate()) continue;
750  // if last segment of t1 is upstream of first segment of t2.
751 
752  // ignore kink angle < 20 mrad.
753  float kinkangle = sqrt((s1->TX()-s2->TX())*(s1->TX()-s2->TX())+(s1->TY()-s2->TY())*(s1->TY()-s2->TY()));
754  if( kinkangle<0.02) continue;
755 
756  // remove very low momentum
757  double rmss, rmst, rmsl;
758  DTRMSTL(t2, &rmss, &rmst, &rmsl);
759  if( rmst>0.015 && rmsl>0.015) continue;
760 
761  TObjArray segs;
762  segs.Add(s1);
763  segs.Add(s2);
764  EdbVertex *v = EdbEDAUtil::CalcVertex(&segs);
765  float ip1 = EdbEDAUtil::CalcIP(s1, v);
766  float ip2 = EdbEDAUtil::CalcIP(s2, v);
767 
768  // cut with IP and Z. (Z should between 2 segments.)
769  if(ip1<20 && ip2<20 && s1->Z()-500<v->Z() && v->Z()<s2->Z()+500){
770  printf("Decay vertex t1 %d t2 %d ip1 %f ip2 %f\n", t1->ID(), t2->ID(), ip1, ip2);
772  dv->SetXYZ( v->X(), v->Y(), v->Z());
773  dv->SetParent(t1);
774  dv->SetDaughter(t2);
776  printf("kink found, %d %f %f %f\n", dv->N(), dv->X(), dv->Y(), dv->Z());
777  eDecayVertices->Add(dv);
778  }
779 
780  delete v;
781  }
782  }
783 }
Float_t TX() const
Definition: EdbSegP.h:172
Float_t TY() const
Definition: EdbSegP.h:173
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:195
EdbVertex * CalcVertex(TObjArray *segments)
Definition: EdbEDAUtil.C:282
double DTRMSTL(EdbTrackP *t, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *ndata=NULL)
Definition: EdbEDAUtil.C:686
double CalcIP(EdbSegP *s, double x, double y, double z)
Definition: EdbEDAUtil.C:85

◆ MakeFakeVertex()

EdbVertex * EdbEDADecaySearch::MakeFakeVertex ( EdbTrackP t,
double  dz = 1150 
)
648  {
649  EdbSegP *s0 = t->GetSegmentFirst();
650 
651  EdbSegP s(*s0);
652  s.PropagateTo(s0->Z()+dz);
653 
654  EdbVertex *v = new EdbVertex;
655  v->SetID(t->ID());
656  v->SetXYZ(s.X(),s.Y(),s.Z());
657 
658  EdbVTA *vta = new EdbVTA(t, v);
659  vta->SetZpos(1);
660  vta->SetFlag(2);
661  vta->SetImp(EdbEDAUtil::CalcIP(&s,v));
662  v->AddVTA(vta);
663  return v;
664 }
void PropagateTo(float z)
Definition: EdbSegP.cxx:292
Float_t X() const
Definition: EdbSegP.h:170
Float_t Y() const
Definition: EdbSegP.h:171
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
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:377
void SetID(int ID=0)
Definition: EdbVertex.h:156

◆ MTSearch2seg()

void EdbEDADecaySearch::MTSearch2seg ( TObjArray *  tracks)
274  {
275  // Microtrack search for 2 segment track.
276  // if eSet is not set, do nothing.
277 
278  // if eSet==NULL or Preparation is failed, do nothing.
279  int ret = eSet ? eSet->PrepareScanSetForMT() : -1;
280  if(ret==-1) {
281  printf("ScanSet error. stop.\n");
282  return;
283  }
284  for(int i=0;i<tracks->GetEntriesFast();i++){
285  EdbTrackP *t = ((EdbEDATrackP *) tracks->At(i))->GetOriginal();
286  if(t->N()==2) eSet->MicroTrackSearch(t);
287  }
288 }
int MicroTrackSearch(EdbTrackP *t, EdbSegP *pred, int ipl)
Definition: EdbEDATrackSet.C:1355
int PrepareScanSetForMT()
Definition: EdbEDATrackSet.C:1307

◆ MTSearchAll()

void EdbEDADecaySearch::MTSearchAll ( TObjArray *  tracks)
289  {
290  // Microtrack search for all tracks.
291  // if eSet is not set, do nothing.
292 
293  // if eSet==NULL or Preparation is failed, do nothing.
294  int ret = eSet ? eSet->PrepareScanSetForMT() : -1;
295  if(ret==-1) {
296  printf("ScanSet error. stop.\n");
297  return;
298  }
299  for(int i=0;i<tracks->GetEntriesFast();i++){
300  gEve->SetStatusLine(Form("MicroTrackSearch %d/%d", i+1, tracks->GetEntriesFast()));
301  EdbTrackP *t = ((EdbEDATrackP *) tracks->At(i))->GetOriginal();
303  }
304 }

◆ NDecayVertices()

int EdbEDADecaySearch::NDecayVertices ( )
inline
380 { return eDecayVertices->GetEntriesFast();}

◆ Ntracks()

int EdbEDADecaySearch::Ntracks ( )
inline
378 { return eTracks->GetEntriesFast();}

◆ PrintRunTracking()

void EdbEDADecaySearch::PrintRunTracking ( )
inline
417  {
418  if(eSet) eSet->eRunTracking.Print();
419  else printf("No EdbEDATrackSet is set\n");
420  }
EdbRunTracking eRunTracking
Definition: EdbEDATrackSet.h:62
void Print()
Definition: EdbRunTracking.cxx:65

◆ PrintTracks()

void EdbEDADecaySearch::PrintTracks ( )
266  {
267  printf("ibrick trkid flag pl ns x y z tx ty pl pa cs dk ip1ry class PBDLU comment\n");
268  for(int i=0;i<Ntracks();i++){
269  EdbEDATrackP *t = GetTrack(i);
270  t->Print();
271  }
272 }

◆ SetBTSearch()

void EdbEDADecaySearch::SetBTSearch ( int  do_search = 1,
int  npl_up = 0,
int  npl_down = 2,
float  ipcut = 20,
float  phcut = 17 
)
inline
407  {
408  eBT = do_search; eBTPlateUp = npl_up; eBTPlateDown = npl_down; eBTIP = ipcut; eBTPH = phcut;}

◆ SetIPHist1()

void EdbEDADecaySearch::SetIPHist1 ( TH1F *  h)
inline
392 { eTSDauIPHist1=h;}

◆ SetIPHist2()

void EdbEDADecaySearch::SetIPHist2 ( TH1F *  h)
inline
393 { eTSDauIPHist2=h;}

◆ SetParentSearch()

void EdbEDADecaySearch::SetParentSearch ( int  do_search = 1,
int  npl = 2,
float  ipcut = 20,
float  phcut = 17 
)
inline
409  {
410  eTSPar = do_search; eTSParPlate = npl; eTSParIP = ipcut; eTSParPH = phcut;}

◆ SetPVR()

void EdbEDADecaySearch::SetPVR ( EdbPVRec pvr)
inline
383 { ePVR = pvr;}

◆ SetSmallKinkSearch()

void EdbEDADecaySearch::SetSmallKinkSearch ( int  do_search = 1,
int  npl_down = 5,
float  Rmin = 5. 
)
inline
411  {
412  eSmallKink = do_search; eSmallKinkNpl = npl_down; eSmallKinkRmin = Rmin;}

◆ SetTracks()

void EdbEDADecaySearch::SetTracks ( TObjArray *  array)
inline
395 {eTracks=array;}

◆ SetTrackSet()

void EdbEDADecaySearch::SetTrackSet ( EdbEDATrackSet set)
inline
386  {
387  eSet = set;
388  SetPVR(set->GetPVRec());
389  }
void SetPVR(EdbPVRec *pvr)
Definition: EdbEDADecaySearch.h:383
EdbScanSet * set
Definition: emtraceback.cpp:14

◆ SetVertex()

void EdbEDADecaySearch::SetVertex ( EdbVertex v)
408  {
409  eVertex = v;
410  if(NULL==v) return;
411  double vertexplz = 1e9;
412 
413  printf("vertex z = %f\n", v->Z());
414  for(int i=0;i<ePVR->Npatterns();i++){
415  EdbPattern *pat = ePVR->GetPattern(i);
416  if(pat==NULL) continue;
417  if(pat->Z()<v->Z()) continue;
418  if(pat->Z()<vertexplz) {
419  vertexplz = pat->Z();
420  eVertexPlatePID = pat->ID(); // Set eVertexPlatePID
421  }
422  }
423  printf("VertexPlatePID=%d\n", eVertexPlatePID);
424 }
int ID() const
Definition: EdbPattern.h:328

◆ ShortDecaySearch()

void EdbEDADecaySearch::ShortDecaySearch ( )
797  {
798  printf(" --------------------------\n");
799  printf("// Short decay search //\n");
800  printf("-------------------------- \n");
801  printf("Using tracks which start from vertex plate and Nseg>=3\n");
802  printf("TODO: Microtrack search!!\n");
803 
804  // select tracks in vertex plate
805  TObjArray tracks;
806  for(int i=0; i<Ntracks(); i++){
807  EdbEDATrackP *t = GetTrack(i);
808  EdbSegP *s1 = t->GetSegmentFirst();
809 
810  // Nseg cut
811  if(t->N()<=2) continue;
812 
813  // use only tracks which start from vertex plate.
814  if(s1->PID()!=eVertexPlatePID) continue;
815 
816  tracks.Add(t);
817  }
818  printf("Tracks selection for short decay : %d -> %d\n", Ntracks(), tracks.GetEntriesFast());
819 
820  if(tracks.GetEntriesFast()==0) return;
821 
822  // Calculate vertex with all tracks. First time.
823  TObjArray segs;
824  for(int i=0; i<tracks.GetEntriesFast(); i++) segs.Add( ((EdbEDATrackP *)tracks.At(i))->GetSegmentFirst());
825  EdbVertex *v = CalcVertex(&segs);
826  float ipcut = GetIPCut(v, (EdbSegP *)segs.At(0));
827  printf("Vertex with all tracks: %.1f %.1f %.1f\n", v->X(), v->Y(), v->Z());
828  printf("dZ=%.1f microns -> IP cut %.1f\n", ((EdbSegP *)segs.At(0))->Z()-v->Z(), ipcut);
829 
830  int flag=0;
831  // check if short decay candidate exists or not.
832 
833  if(tracks.GetEntriesFast()==2){ // 2 track case.
834  EdbEDATrackP *t1 = (EdbEDATrackP *) tracks.At(0);
835  EdbSegP *s1 = t1->GetSegmentFirst();
836  EdbEDATrackP *t2 = (EdbEDATrackP *) tracks.At(1);
837  EdbSegP *s2 = t2->GetSegmentFirst();
838  float ip = CalcDmin(s1,s2);
839  printf("track %5d x track %5d, dmin %4.1f %s\n", t1->ID(), t2->ID(), ip, ip>ipcut?">ipcut":"");
840  if(ip>ipcut) flag=2;
841  }
842  else { // more tracks case
843  float ipmean=0.0;
844  for(int i=0; i<tracks.GetEntriesFast(); i++){
845  EdbEDATrackP *t = (EdbEDATrackP *) tracks.At(i);
846  EdbSegP *s = t->GetSegmentFirst();
847  float ip = CalcIP( s, v);
848 
849  printf("track %5d (%7.4f, %7.4f) ip %4.1f %s\n", t->ID(), t->TX(), t->TY(), ip, ip>ipcut?">ipcut":"");
850  ipmean +=ip;
851  if(ip>ipcut) flag++;
852  }
853  ipmean /= tracks.GetEntriesFast();
854  printf("IP mean %.1lf microns with %d tracks\n", ipmean, tracks.GetEntriesFast());
855  }
856  if(flag==0) {
857  printf("No short decay. stop.\n");
858  return;
859  }
860  printf("%d short decay candidates\n", flag);
861 
862  printf("Vertex refinement by removing one or more tracks.\n");
863 
864  while(flag&&tracks.GetEntriesFast()!=2){
865  // loop to make vertex removing one track.
866  int imax=-1;
867  float ipmax = 0;
868  for(int i=0; i<tracks.GetEntriesFast(); i++){
869  EdbEDATrackP *t = (EdbEDATrackP *) tracks.At(i);
870  EdbSegP *s = t->GetSegmentFirst();
871 
872  TObjArray segs2 = segs;
873  segs2.Remove( s);
874  segs2.Sort();
875 
876  EdbVertex *v2 = CalcVertex(&segs2);
877  float ip = CalcIP(s, v2);
878 
879  if(ip>ipmax) {
880  imax=i;
881  ipmax=ip;
882  }
883  }
884 
885  // if ipmax>ipcut.
886  if(ipmax>ipcut) {
887  EdbEDATrackP *tsd = (EdbEDATrackP *) tracks.At(imax);
888 
889  // Calculate new vertex position.
890  tracks.Remove(tsd);
891  tracks.Sort();
892  segs.Clear();
893  for(int i=0; i<tracks.GetEntriesFast(); i++) segs.Add( ((EdbEDATrackP *)tracks.At(i))->GetSegmentFirst());
894  EdbVertex *v2 = CalcVertex(&segs);
895 
896  // Set as Primary vertex.
897  eVertex = v2;
898 
899  // remove very low momentum
900  double rmss, rmst, rmsl;
901  DTRMSTL(tsd, &rmss, &rmst, &rmsl);
902  if( rmst>0.015 && rmsl>0.015) continue;
903 
904  // Make Short Decay vertex
905  EdbVertex *vsd = MakeFakeVertex( tsd, -150);
906  EdbEDADecayVertex *vdecay = new EdbEDADecayVertex;
907  vdecay->SetXYZ( vsd->X(), vsd->Y(), vsd->Z());
908  vdecay->SetPrimaryVertex(v2);
909  vdecay->SetDaughter( tsd);
911 
912  eDecayVertices->Add(vdecay);
913 
914 
915  printf("Short decay of track %d is found. ip = %5.1f. \n", tsd->ID(), ipmax);
916 
917  // Check if no other tracks has ip>ipcut
918  flag=0;
919  if(tracks.GetEntriesFast()==2){
920  EdbEDATrackP *t1 = (EdbEDATrackP *) tracks.At(0);
921  EdbSegP *s1 = t1->GetSegmentFirst();
922  EdbEDATrackP *t2 = (EdbEDATrackP *) tracks.At(1);
923  EdbSegP *s2 = t2->GetSegmentFirst();
924  float ip = CalcDmin(s1,s2);
925  printf("track %5d x track %5d, dmin %4.1f %s\n", t1->ID(), t2->ID(), ip, ip>ipcut?">ipcut":"");
926  if(ip>ipcut) flag=2;
927  }
928  else {
929  float ipmean=0.0;
930  for(int i=0; i<segs.GetEntriesFast(); i++){
931  EdbSegP *s = (EdbSegP *) segs.At(i);
932  float ip = CalcIP(s, v2);
933  if(ip>ipcut) flag++;
934  ipmean += ip;
935  }
936  ipmean /= segs.GetEntriesFast();
937  printf("IP mean %.1lf microns with %d tracks, removing track %d\n", ipmean, tracks.GetEntriesFast(), tsd->ID());
938  }
939  } else flag=0;
940 
941  }
942 
943 
944  if( flag && tracks.GetEntriesFast()==2){
945  // Short decay with only 1 partner track. (without vertex)
946  for(int i=0; i<2; i++){
947  EdbEDATrackP *t1 = (EdbEDATrackP *) tracks.At(i);
948  EdbSegP *s1 = t1->GetSegmentFirst();
949  EdbEDATrackP *t2 = (EdbEDATrackP *) tracks.At(!i);
950  EdbSegP *s2 = t2->GetSegmentFirst();
951 
952  // remove very low momentum
953  double rmss, rmst, rmsl;
954  DTRMSTL(t1, &rmss, &rmst, &rmsl);
955  if( rmst>0.015 && rmsl>0.015) continue;
956 
957  EdbVertex *vsd = MakeFakeVertex( t1, -150);
958  EdbEDADecayVertex *vdecay = new EdbEDADecayVertex;
959  vdecay->SetXYZ( vsd->X(), vsd->Y(), vsd->Z());
960  vdecay->SetDaughter( t1);
961  vdecay->SetPartner( t2);
963  eDecayVertices->Add(vdecay);
964 
965  }
966  }
967 
968  for(int i=0; i<NDecayVertices(); i++){
971  }
972 }
float GetIPCut(EdbVertex *v, EdbSegP *s)
Definition: EdbEDADecaySearch.C:785
int NDecayVertices()
Definition: EdbEDADecaySearch.h:380
EdbEDADecayVertex * GetDecayVertex(int i)
Definition: EdbEDADecaySearch.h:381
void SetPartner(EdbEDATrackP *partner)
Definition: EdbEDADecaySearch.h:142
EdbVertex * GetPrimaryVertex()
Definition: EdbEDADecaySearch.h:149
@ kShort
Definition: EdbEDADecaySearch.h:132
double CalcDmin(EdbSegP *seg1, EdbSegP *seg2, double *dminz=NULL)
Definition: EdbEDAUtil.C:239

◆ SmallKinkSearch()

void EdbEDADecaySearch::SmallKinkSearch ( )
139  {
140  for(int i=0;i<Ntracks();i++){
141  EdbEDATrackP *t = GetTrack(i);
142  TObjArray *kinks=CheckInTrackKink(t);
143  if(kinks->GetEntriesFast()!=0) {
144  if(gEDA==NULL) continue;
146  if(p!=NULL) p->CheckKink(t);
147  }
148  }
149 }
Definition: EdbEDAPlotTab.h:14
EdbEDAPlotTab * GetPlotTab()
Definition: EdbEDA.h:726

◆ TSBaseTracks()

TObjArray * EdbEDADecaySearch::TSBaseTracks ( int  ipl)
588  {
589  // Search Tracks and set eTracks. return TObjArray filled with selected segments.
590  TObjArray *filtered = new TObjArray();
591  printf(" pid=%2d ", pid);
592  EdbPattern *pat = ePVR->GetPattern(pid);
593 
594  if(pat==NULL) {
595  printf("No pattern is available for pid=%d\n", pid);
596  return filtered;
597  }
598 
599  int found=0;
600  int found_as_track=0;
601  for(int i=0;i<pat->N();i++){
602  EdbSegP *s = pat->GetSegment(i);
603  if(s==NULL) continue;
604 
605  // IP cut
606  double ip=CalcIP(s, eVertex);
607  if( ip > eBTIP ) continue;
608 
609  // PH cut
610  if( s->W() < eBTPH ) continue;
611 
612  found++;
613  // already found as tracks to be drawn?
614  int flag=0;
615  for(int j=0;j<eTracks->GetEntriesFast();j++){
616  EdbTrackP *t = (EdbTrackP *)eTracks->At(j);
617  for(int k=0;k<t->N();k++){
618  EdbSegP *ss = t->GetSegment(k);
619  if(ss->PID()==s->PID()&&ss->ID()==s->ID()){
620  flag++;
621  found_as_track++;
622  }
623  }
624  }
625  if(flag) continue;
626 
627  // add to array
628  filtered->Add(s);
629  eSegments->Add(s);
630  // add to array
631  EdbTrackP *t = new EdbTrackP(s);
632  t->SetCounters();
633 
634  EdbEDATrackP *t2 = new EdbEDATrackP(t, eVertex);
636  t2->SetIPUp(ip);
637  eTracks->Add(t2);
638 
639  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
640  t->GetSegmentFirst()->PID(),
641  t->GetSegmentLast()->PID(),
642  t->TX(),t->TY());
643  }
644  printf("%5d segments from pid %2d. (%d found, %d already selected as track)\n", filtered->GetEntriesFast(), pid, found, found_as_track);
645  return filtered;
646 }
void SetIPUp(double ip)
Definition: EdbEDADecaySearch.h:103
int TrackSearch()
Definition: EdbEDADecaySearch.h:87
void SetTrackSearch(int v)
Definition: EdbEDADecaySearch.h:86
Float_t W() const
Definition: EdbSegP.h:148
Int_t N() const
Definition: EdbPattern.h:89
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
ss
Definition: energy.C:62

◆ TSDaughterTracks()

TObjArray * EdbEDADecaySearch::TSDaughterTracks ( TObjArray *  base)
449  {
450  // Search Tracks and set eTracks. return TObjArray filled with selected tracks.
451  printf(" Daughter track search. ");
452  printf("nseg>=%d, ip=func of dz, w>%.1lf\n", eTSDauNseg,eTSDauPH);
453 // printf("nseg>=%d, start within %d plates, ip<%.1lf w>%.1lf\n",
454 // eTSDauNseg, eTSDauPlate, 0.0 /*eTSDauIP*/, eTSDauPH);
455 
456  TObjArray *filtered = new TObjArray;
457 
458  int inew=0;
459 
460  for(int i=0;i<base->GetEntriesFast();i++){
461  EdbTrackP *t = (EdbTrackP *) base->At(i);
462  if(t==NULL) continue;
463  EdbSegP *s = t->GetSegmentFirst();
464 
465  // Nseg cut
466  if( t->N() < eTSDauNseg ) continue;
467 
468  // dPlate cut
469  //int dPlate = s->PID() - eVertexPlatePID + 1; //
470  //if( dPlate < 1 || eTSDauPlate < dPlate ) continue; // 0 <= dPlate <= eTSDauPlate
471 
472  // IP cut
473  double ip = CalcIP(s, eVertex);
474 
475  double dz = s->Z() - eVertex->Z();
476 
477  if( ip > GetTSDauIP1(dz) ) continue;
478 
479  // PH cut
480  double ph = t->Wgrains()/t->N();
481  if( ph < eTSDauPH ) continue;
482 
483 
484  // add to array
485  filtered->Add(t);
486  EdbEDATrackP *t2 = FindTrack(t);
487  if(t2) t2->SetTrackSearch( t2->TrackSearch()|kDaughterSearch);
488  else {
489  inew++;
490  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
491  t->GetSegmentFirst()->PID(),
492  t->GetSegmentLast()->PID(),
493  t->TX(),t->TY());
494 
495  t2 = new EdbEDATrackP(t,eVertex);
497  t2->SetIPUp(ip);
498  eTracks->Add(t2);
499  }
500  }
501  printf("%5d tracks are selected (new %2d tracks)\n", filtered->GetEntriesFast(), inew);
502  return filtered;
503 }
double GetTSDauIP1(double dz)
Definition: EdbEDADecaySearch.C:117
EdbEDATrackP * FindTrack(EdbTrackP *t)
Definition: EdbEDADecaySearch.h:371

◆ TSDaughterTracks2()

void EdbEDADecaySearch::TSDaughterTracks2 ( )
505  {
506  // Filter 2segment tracks after microtrack search.
507  // sevior dz cut will be applied.
508 
509  printf(" Daughter track search2. ");
510  printf("nseg>=%d, ip=func of dz\n", eTSDauNseg2);
511 
512  int ntrk=eTracks->GetEntriesFast();
513  for(int i=0;i<ntrk;i++){
514  EdbEDATrackP *tt = (EdbEDATrackP *) eTracks->At(i);
515  EdbTrackP *t = tt->GetOriginal();
516  if(t==NULL) continue;
517 
518  EdbSegP *s = t->GetSegmentFirst();
519 
520  // Nseg cut
521  // IP cut
522  double ip = CalcIP(s, eVertex);
523  double dz = s->Z() - eVertex->Z();
524 
525  if( ip < GetTSDauIP2(dz) && t->N() >= eTSDauNseg2) continue;
526 
527  // remove this track
528  eTracks->Remove(tt);
529  }
530  eTracks->Sort();
531  printf("%5d tracks are remained. original %d tracks\n", eTracks->GetEntriesFast(), ntrk);
532 }
double GetTSDauIP2(double dz)
Definition: EdbEDADecaySearch.C:128
EdbTrackP * GetOriginal()
Definition: EdbEDADecaySearch.h:113

◆ TSParentTracks()

TObjArray * EdbEDADecaySearch::TSParentTracks ( TObjArray *  base)
535  {
536  // Search Tracks and set eTracks. return TObjArray filled with selected tracks.
537 
538  printf(" Parent track search. ");
539  printf("nseg>=%d, start within %d plates, ip<%.1lf w>%.1lf\n",
541 
542  printf("eVertexPlatePID=%d\n", eVertexPlatePID);
543 
544  TObjArray *filtered = new TObjArray;
545  int inew=0;
546  for(int i=0;i<base->GetEntriesFast();i++){
547  EdbTrackP *t = (EdbTrackP *) base->At(i);
548  if(t==NULL) continue;
549  EdbSegP *s = t->GetSegmentFirst();
550 
551  // Nseg cut
552  if( t->N() < eTSParNseg ) continue;
553 
554  // dPlate cut
555  int dPlate = s->PID() - eVertexPlatePID + 1;
556  if( dPlate <= -eTSParPlate || eTSParPlate < dPlate ) continue; // 0 <= dPlate <= eTSParPlate
557 
558  // IP cut
559  double ip = CalcIP(s, eVertex);
560  if( ip > eTSParIP ) continue;
561 
562  // PH cut
563  double ph = t->Wgrains()/t->N();
564  if( ph < eTSParPH ) continue;
565 
566 
567  // add to array
568  filtered->Add(t);
569  EdbEDATrackP *t2 = FindTrack(t);
570  if(t2) t2->SetTrackSearch( t2->TrackSearch()|kParentSearch);
571  else {
572  inew++;
573  printf(" Track id=%6d ip=%5.1lf pid%02d->%02d %7.4lf %7.4lf\n", t->ID(), ip,
574  t->GetSegmentFirst()->PID(),
575  t->GetSegmentLast()->PID(),
576  t->TX(),t->TY());
577  EdbEDATrackP *t2 = new EdbEDATrackP( t, eVertex);
579  eTracks->Add(t2);
580  }
581  }
582 
583  printf("%5d tracks are selected (new %2d tracks)\n", filtered->GetEntriesFast(), inew);
584  return filtered;
585 }

Member Data Documentation

◆ eBT

int EdbEDADecaySearch::eBT

◆ eBTIP

double EdbEDADecaySearch::eBTIP

◆ eBTPH

double EdbEDADecaySearch::eBTPH

◆ eBTPlateDown

int EdbEDADecaySearch::eBTPlateDown

◆ eBTPlateUp

int EdbEDADecaySearch::eBTPlateUp

◆ eDecayVertices

TObjArray* EdbEDADecaySearch::eDecayVertices

◆ eDSVer

int EdbEDADecaySearch::eDSVer

◆ eKinks

TObjArray* EdbEDADecaySearch::eKinks

◆ eKinkSigma

double EdbEDADecaySearch::eKinkSigma

◆ eMT2seg

int EdbEDADecaySearch::eMT2seg

◆ eMTAll

int EdbEDADecaySearch::eMTAll

◆ ePVR

EdbPVRec* EdbEDADecaySearch::ePVR

◆ eSegments

TObjArray* EdbEDADecaySearch::eSegments

◆ eSet

EdbEDATrackSet* EdbEDADecaySearch::eSet

◆ eSmallKink

int EdbEDADecaySearch::eSmallKink

◆ eSmallKinkNpl

int EdbEDADecaySearch::eSmallKinkNpl

◆ eSmallKinkRmin

float EdbEDADecaySearch::eSmallKinkRmin

◆ eTracks

TObjArray* EdbEDADecaySearch::eTracks

◆ eTSDau

int EdbEDADecaySearch::eTSDau

◆ eTSDau2

int EdbEDADecaySearch::eTSDau2

◆ eTSDauIPHist1

TH1F* EdbEDADecaySearch::eTSDauIPHist1

◆ eTSDauIPHist2

TH1F* EdbEDADecaySearch::eTSDauIPHist2

◆ eTSDauNseg

int EdbEDADecaySearch::eTSDauNseg

◆ eTSDauNseg2

int EdbEDADecaySearch::eTSDauNseg2

◆ eTSDauPH

double EdbEDADecaySearch::eTSDauPH

◆ eTSPar

int EdbEDADecaySearch::eTSPar

◆ eTSParIP

double EdbEDADecaySearch::eTSParIP

◆ eTSParNseg

int EdbEDADecaySearch::eTSParNseg

◆ eTSParPH

double EdbEDADecaySearch::eTSParPH

◆ eTSParPlate

int EdbEDADecaySearch::eTSParPlate

◆ eVertex

EdbVertex* EdbEDADecaySearch::eVertex

◆ eVertexPlatePID

int EdbEDADecaySearch::eVertexPlatePID

◆ eVertices

TObjArray* EdbEDADecaySearch::eVertices

◆ eVtxUp

int EdbEDADecaySearch::eVtxUp

◆ eVtxUpDZ

int EdbEDADecaySearch::eVtxUpDZ

◆ eVtxUpIP

int EdbEDADecaySearch::eVtxUpIP

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