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
 Basetrack search. More...
 
double eBTIP
 IP cut for Basetrack. More...
 
double eBTPH
 PH cut for Basetrack. More...
 
int eBTPlateDown
 nplates downstream for Basetrack Search More...
 
int eBTPlateUp
 nplates upstream or Basetrack search More...
 
TObjArray * eDecayVertices
 
int eDSVer
 
TObjArray * eKinks
 
double eKinkSigma
 
int eMT2seg
 Microtrack search for 2 segment. More...
 
int eMTAll
 Microtrack search to fill holes and upstream, downstream. More...
 
EdbPVRecePVR
 
TObjArray * eSegments
 
EdbEDATrackSeteSet
 
int eSmallKink
 Small-Kink search. More...
 
int eSmallKinkNpl
 
float eSmallKinkRmin
 
TObjArray * eTracks
 
int eTSDau
 Daughter track search. More...
 
int eTSDau2
 Daughter track search. 2nd (after microtrack search) More...
 
TH1F * eTSDauIPHist1
 Histgram for IP function along dz. More...
 
TH1F * eTSDauIPHist2
 Histgram for IP function along dz. More...
 
int eTSDauNseg
 Nseg cut for Daughter tracks. More...
 
int eTSDauNseg2
 Nseg cut for Daughter tracks. 2nd. More...
 
double eTSDauPH
 PH cut for Daughter tracks. More...
 
int eTSPar
 Parent track search. More...
 
double eTSParIP
 IP cut for Parent tracks. More...
 
int eTSParNseg
 Nseg cut for Parent tracks. More...
 
double eTSParPH
 PH cut for Parent tracks. More...
 
int eTSParPlate
 nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plate+1plate... More...
 
EdbVertexeVertex
 
int eVertexPlatePID
 vertex plate. 1st stream plate from vertex More...
 
TObjArray * eVertices
 
int eVtxUp
 Search Upstream vertex if the ntrk of selected vertex <=3. More...
 
int eVtxUpDZ
 dz from selected vertex and upstream vertex to be searched. More...
 
int eVtxUpIP
 Ip cut from the tracks belong to the selected vertex. More...
 

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
IP cut for Basetrack.
Definition: EdbEDADecaySearch.h:260
int eMT2seg
Microtrack search for 2 segment.
Definition: EdbEDADecaySearch.h:238
int eTSDau
Daughter track search.
Definition: EdbEDADecaySearch.h:233
int eTSParPlate
nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plat...
Definition: EdbEDADecaySearch.h:251
int eTSDauNseg2
Nseg cut for Daughter tracks. 2nd.
Definition: EdbEDADecaySearch.h:242
EdbVertex * eVertex
Definition: EdbEDADecaySearch.h:223
int eVtxUp
Search Upstream vertex if the ntrk of selected vertex <=3.
Definition: EdbEDADecaySearch.h:263
TObjArray * eSegments
Definition: EdbEDADecaySearch.h:228
int eTSPar
Parent track search.
Definition: EdbEDADecaySearch.h:250
int eBT
Basetrack search.
Definition: EdbEDADecaySearch.h:257
double eTSDauPH
PH cut for Daughter tracks.
Definition: EdbEDADecaySearch.h:235
int eVtxUpIP
Ip cut from the tracks belong to the selected vertex.
Definition: EdbEDADecaySearch.h:265
TObjArray * eDecayVertices
Definition: EdbEDADecaySearch.h:271
TH1F * eTSDauIPHist1
Histgram for IP function along dz.
Definition: EdbEDADecaySearch.h:236
int eBTPlateUp
nplates upstream or Basetrack search
Definition: EdbEDADecaySearch.h:258
TH1F * eTSDauIPHist2
Histgram for IP function along dz.
Definition: EdbEDADecaySearch.h:243
int eMTAll
Microtrack search to fill holes and upstream, downstream.
Definition: EdbEDADecaySearch.h:239
int eBTPlateDown
nplates downstream for Basetrack Search
Definition: EdbEDADecaySearch.h:259
double eTSParIP
IP cut for Parent tracks.
Definition: EdbEDADecaySearch.h:253
TObjArray * eVertices
Definition: EdbEDADecaySearch.h:229
float eSmallKinkRmin
Definition: EdbEDADecaySearch.h:247
int eSmallKink
Small-Kink search.
Definition: EdbEDADecaySearch.h:245
double eKinkSigma
Definition: EdbEDADecaySearch.h:269
int eTSDau2
Daughter track search. 2nd (after microtrack search)
Definition: EdbEDADecaySearch.h:241
int eVtxUpDZ
dz from selected vertex and upstream vertex to be searched.
Definition: EdbEDADecaySearch.h:264
double eBTPH
PH cut for Basetrack.
Definition: EdbEDADecaySearch.h:261
int eSmallKinkNpl
Definition: EdbEDADecaySearch.h:246
int eTSDauNseg
Nseg cut for Daughter tracks.
Definition: EdbEDADecaySearch.h:234
double eTSParPH
PH cut for Parent tracks.
Definition: EdbEDADecaySearch.h:254
TObjArray * eKinks
Definition: EdbEDADecaySearch.h:270
int eDSVer
Definition: EdbEDADecaySearch.h:221
TObjArray * eTracks
Definition: EdbEDADecaySearch.h:227
int eTSParNseg
Nseg cut for Parent tracks.
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)

Search kink. return TObjArray of EdbEDASmallKink

151 {
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.
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->GetEntries());
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
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:273
Int_t Plate() const
Definition: EdbPattern.h:327
Int_t Npatterns() const
Definition: EdbPattern.h:366
EdbPattern * GetPattern(int id) const
Definition: EdbPattern.cxx:1721
Definition: EdbSegP.h:21
Int_t ID() const
Definition: EdbSegP.h:147
Int_t Plate() const
Definition: EdbSegP.h:159
Int_t PID() const
Definition: EdbSegP.h:148
Float_t Z() const
Definition: EdbPattern.h:84
Definition: EdbPattern.h:113
void AddSegment(EdbSegP *s)
Definition: EdbPattern.h:214
Int_t N() const
Definition: EdbPattern.h:177
void Clear()
Definition: EdbPattern.h:264
void SetCounters()
Definition: EdbPattern.h:159
Definition: EdbVertex.h:69
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
TTree * t
Definition: check_shower.C:4
void td()
Definition: check_vertex.C:168
EdbSegP * s1
Definition: tlg2couples.C:29
EdbSegP * s2
Definition: tlg2couples.C:30
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

◆ CheckInTrackKinks()

TObjArray * EdbEDADecaySearch::CheckInTrackKinks ( TObjArray *  tracks = NULL)
inline
397 {
399 for(int i=0;i<tracks->GetEntries();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 ( )

Do track search

clear previous results.

306 {
308
309
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->GetEntries();i++) hall[((EdbTrackP *) base->At(i))->N()>=10?10:((EdbTrackP *) base->At(i))->N()]++;
338 nAll=base->GetEntries();
339
340 // Daughter search 1st
341 if(eTSDau) TSDaughterTracks(base);
342
343 for(int i=0;i<eTracks->GetEntries();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->GetEntries();
350 printf("%d\n", nTSDau1);
351
352 // Microtrack search
354 if(eMTAll) {
356 }
357 for(int i=0;i<eTracks->GetEntries();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->GetEntries();i++) hdau2[((EdbEDATrackP *) eTracks->At(i))->N()>=10?10:((EdbEDATrackP *) eTracks->At(i))->GetOriginal()->N()]++;
365
366 nTSDau2 = eTracks->GetEntries();
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;
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
vertex plate. 1st stream plate from vertex
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 ( )

Find Best Vertex.
select best one from pvr->eVertex

666 {
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->GetEntries(); 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->GetEntries(); 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
Int_t Nvtx() const
Definition: EdbPVRec.h:255
EdbTrackP * GetTrack(int i) const
Definition: EdbPVRec.h:241
Float_t Z() const
Definition: EdbSegP.h:153
VERTEX::Vertex * V() const
Definition: EdbVertex.h:154
Int_t N() const
Definition: EdbVertex.h:121
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 }
int Ntracks()
Definition: EdbEDADecaySearch.h:378
EdbEDATrackP * GetTrack(int i)
Definition: EdbEDADecaySearch.h:379

◆ 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:189
EdbTrackP * GetTrack(int i)
Definition: EdbVertex.h:141
s
Definition: check_shower.C:55

◆ GetDecayVertex()

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

◆ GetIPCut()

float EdbEDADecaySearch::GetIPCut ( EdbVertex v,
EdbSegP s 
)

calculate IP cut for given 1ry vertex and segment.
if segment is BT, Z of segment is assumed Z=s->Z()-150;
otherwise, use s->Z();

785 {
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}
Double_t Z
Definition: tlg2couples.C:104

◆ 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);
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
tangens = deltaX/deltaZ
Definition: EdbSegP.h:175
Float_t TY() const
tangens = deltaY/deltaZ
Definition: EdbSegP.h:176
EdbSegP * GetSegmentLast() const
Definition: EdbPattern.h:190
EdbVertex * CalcVertex(TObjArray *segments)
calc vertex from the segments array (EdbSegP*)
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}
Definition: EdbVertex.h:26
void SetImp(float imp)
Definition: EdbVertex.h:57
void SetZpos(int zpos)
Definition: EdbVertex.h:55
void SetFlag(int flag)
Definition: EdbVertex.h:56
void AddVTA(EdbVTA *vta)
Definition: EdbVertex.cxx:355
void SetID(int ID=0)
Definition: EdbVertex.h:156

◆ MTSearch2seg()

void EdbEDADecaySearch::MTSearch2seg ( TObjArray *  tracks)

Microtrack search for 2 segment track.
if eSet is not set, do nothing.

if eSet==NULL or Preparation is failed, do nothing.

274 {
277
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->GetEntries();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)

Microtrack search for all tracks.
if eSet is not set, do nothing.

if eSet==NULL or Preparation is failed, do nothing.

289 {
292
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->GetEntries();i++){
300 gEve->SetStatusLine(Form("MicroTrackSearch %d/%d", i+1, tracks->GetEntries()));
301 EdbTrackP *t = ((EdbEDATrackP *) tracks->At(i))->GetOriginal();
303 }
304}

◆ NDecayVertices()

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

◆ Ntracks()

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

◆ PrintRunTracking()

void EdbEDADecaySearch::PrintRunTracking ( )
inline
417 {
419 else printf("No EdbEDATrackSet is set\n");
420 }
EdbRunTracking eRunTracking
Run Tracking for microtrack search.
Definition: EdbEDATrackSet.h:62
void Print()
Definition: EdbRunTracking.cxx:66

◆ 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:319

◆ 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.GetEntries());
819
820 if(tracks.GetEntries()==0) return;
821
822 // Calculate vertex with all tracks. First time.
823 TObjArray segs;
824 for(int i=0; i<tracks.GetEntries(); 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.GetEntries()==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.GetEntries(); 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.GetEntries();
854 printf("IP mean %.1lf microns with %d tracks\n", ipmean, tracks.GetEntries());
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.GetEntries()!=2){
865 // loop to make vertex removing one track.
866 int imax=-1;
867 float ipmax = 0;
868 for(int i=0; i<tracks.GetEntries(); 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.GetEntries(); 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);
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.GetEntries()==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.GetEntries(); 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.GetEntries();
937 printf("IP mean %.1lf microns with %d tracks, removing track %d\n", ipmean, tracks.GetEntries(), tsd->ID());
938 }
939 } else flag=0;
940
941 }
942
943
944 if( flag && tracks.GetEntries()==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);
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
EdbVertex * GetPrimaryVertex()
Definition: EdbEDADecaySearch.h:149
void SetPartner(EdbEDATrackP *partner)
Definition: EdbEDADecaySearch.h:142
@ 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->GetEntries()!=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)

Search Tracks and set eTracks. return TObjArray filled with selected segments.

588 {
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->GetEntries();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
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->GetEntries(), 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
Int_t N() const
Definition: EdbPattern.h:86
EdbSegP * GetSegment(int i) const
Definition: EdbPattern.h:66
ss
Definition: energy.C:62

◆ TSDaughterTracks()

TObjArray * EdbEDADecaySearch::TSDaughterTracks ( TObjArray *  base)

Search Tracks and set eTracks. return TObjArray filled with selected tracks.

449 {
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->GetEntries();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->GetEntries(), inew);
502 return filtered;
503}
EdbEDATrackP * FindTrack(EdbTrackP *t)
Definition: EdbEDADecaySearch.h:371
double GetTSDauIP1(double dz)
Definition: EdbEDADecaySearch.C:117

◆ TSDaughterTracks2()

void EdbEDADecaySearch::TSDaughterTracks2 ( )

Filter 2segment tracks after microtrack search.
sevior dz cut will be applied.

505 {
508
509 printf(" Daughter track search2. ");
510 printf("nseg>=%d, ip=func of dz\n", eTSDauNseg2);
511
512 int ntrk=eTracks->GetEntries();
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->GetEntries(), ntrk);
532}
double GetTSDauIP2(double dz)
Definition: EdbEDADecaySearch.C:128
EdbTrackP * GetOriginal()
Definition: EdbEDADecaySearch.h:113

◆ TSParentTracks()

TObjArray * EdbEDADecaySearch::TSParentTracks ( TObjArray *  base)

Search Tracks and set eTracks. return TObjArray filled with selected tracks.

535 {
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->GetEntries();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->GetEntries(), inew);
584 return filtered;
585}

Member Data Documentation

◆ eBT

int EdbEDADecaySearch::eBT

Basetrack search.

◆ eBTIP

double EdbEDADecaySearch::eBTIP

IP cut for Basetrack.

◆ eBTPH

double EdbEDADecaySearch::eBTPH

PH cut for Basetrack.

◆ eBTPlateDown

int EdbEDADecaySearch::eBTPlateDown

nplates downstream for Basetrack Search

◆ eBTPlateUp

int EdbEDADecaySearch::eBTPlateUp

nplates upstream or Basetrack search

◆ eDecayVertices

TObjArray* EdbEDADecaySearch::eDecayVertices

◆ eDSVer

int EdbEDADecaySearch::eDSVer

◆ eKinks

TObjArray* EdbEDADecaySearch::eKinks

◆ eKinkSigma

double EdbEDADecaySearch::eKinkSigma

◆ eMT2seg

int EdbEDADecaySearch::eMT2seg

Microtrack search for 2 segment.

◆ eMTAll

int EdbEDADecaySearch::eMTAll

Microtrack search to fill holes and upstream, downstream.

◆ ePVR

EdbPVRec* EdbEDADecaySearch::ePVR

◆ eSegments

TObjArray* EdbEDADecaySearch::eSegments

◆ eSet

EdbEDATrackSet* EdbEDADecaySearch::eSet

◆ eSmallKink

int EdbEDADecaySearch::eSmallKink

Small-Kink search.

◆ eSmallKinkNpl

int EdbEDADecaySearch::eSmallKinkNpl

◆ eSmallKinkRmin

float EdbEDADecaySearch::eSmallKinkRmin

◆ eTracks

TObjArray* EdbEDADecaySearch::eTracks

◆ eTSDau

int EdbEDADecaySearch::eTSDau

Daughter track search.

◆ eTSDau2

int EdbEDADecaySearch::eTSDau2

Daughter track search. 2nd (after microtrack search)

◆ eTSDauIPHist1

TH1F* EdbEDADecaySearch::eTSDauIPHist1

Histgram for IP function along dz.

◆ eTSDauIPHist2

TH1F* EdbEDADecaySearch::eTSDauIPHist2

Histgram for IP function along dz.

◆ eTSDauNseg

int EdbEDADecaySearch::eTSDauNseg

Nseg cut for Daughter tracks.

◆ eTSDauNseg2

int EdbEDADecaySearch::eTSDauNseg2

Nseg cut for Daughter tracks. 2nd.

◆ eTSDauPH

double EdbEDADecaySearch::eTSDauPH

PH cut for Daughter tracks.

◆ eTSPar

int EdbEDADecaySearch::eTSPar

Parent track search.

◆ eTSParIP

double EdbEDADecaySearch::eTSParIP

IP cut for Parent tracks.

◆ eTSParNseg

int EdbEDADecaySearch::eTSParNseg

Nseg cut for Parent tracks.

◆ eTSParPH

double EdbEDADecaySearch::eTSParPH

PH cut for Parent tracks.

◆ eTSParPlate

int EdbEDADecaySearch::eTSParPlate

nPlate to be searched for Parent tracks. eTSParPlate==1:vertex-plate only. eTSParPlate==2:vertex-plate+1plate...

◆ eVertex

EdbVertex* EdbEDADecaySearch::eVertex

◆ eVertexPlatePID

int EdbEDADecaySearch::eVertexPlatePID

vertex plate. 1st stream plate from vertex

◆ eVertices

TObjArray* EdbEDADecaySearch::eVertices

◆ eVtxUp

int EdbEDADecaySearch::eVtxUp

Search Upstream vertex if the ntrk of selected vertex <=3.

◆ eVtxUpDZ

int EdbEDADecaySearch::eVtxUpDZ

dz from selected vertex and upstream vertex to be searched.

◆ eVtxUpIP

int EdbEDADecaySearch::eVtxUpIP

Ip cut from the tracks belong to the selected vertex.


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