]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RALICE/AliJet.cxx
26-sep-2007 NvE AliTrack extended with GetNsignals for a specific signal class.
[u/mrichter/AliRoot.git] / RALICE / AliJet.cxx
CommitLineData
4c039060 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
f531a546 16// $Id$
4c039060 17
959fbac5 18///////////////////////////////////////////////////////////////////////////
19// Class AliJet
20// Creation and investigation of a jet of particle tracks.
21// An AliJet can be constructed by adding AliTracks.
22//
c1f25d1d 23// To provide maximal flexibility to the user, two modes of track storage
24// are provided by means of the memberfunction SetTrackCopy().
25//
26// a) SetTrackCopy(0) (which is the default).
27// Only the pointers of the 'added' tracks are stored.
28// This mode is typically used by making jet studies based on a fixed list
29// of tracks which stays under user control or is contained for instance
30// in an AliEvent.
31// In this way the AliJet just represents a 'logical structure' for the
32// physics analysis which can be embedded in e.g. an AliEvent or AliVertex.
35044448 33//
34// Note :
c1f25d1d 35// Modifications made to the original tracks also affect the AliTrack objects
36// which are stored in the AliJet.
35044448 37//
c1f25d1d 38// b) SetTrackCopy(1).
39// Of every 'added' track a private copy will be made of which the pointer
40// will be stored.
41// In this way the AliJet represents an entity on its own and modifications
42// made to the original tracks do not affect the AliTrack objects which are
43// stored in the AliJet.
44// This mode will allow 'adding' many different AliTracks into an AliJet by
45// creating only one AliTrack instance in the main programme and using the
46// AliTrack::Reset() and AliTrack parameter setting memberfunctions.
47//
8e8e6c7f 48// See also the documentation provided for the memberfunction SetOwner().
49//
959fbac5 50// Coding example to make 2 jets j1 and j2.
51// ----------------------------------------
c1f25d1d 52// j1 contains the AliTracks t1 and t2
53// j2 contains 10 different AliTracks via tx
959fbac5 54//
c1f25d1d 55// AliTrack t1,t2;
959fbac5 56// ...
57// ... // code to fill the AliTrack data
58// ...
c1f25d1d 59// AliJet j1();
f531a546 60// j1.AddTrack(t1);
61// j1.AddTrack(t2);
c1f25d1d 62//
63// AliJet j2();
64// j2.SetTrackCopy(1);
65// AliTrack* tx=new AliTrack();
66// for (Int_t i=0; i<10; i++)
67// {
68// ...
69// ... // code to set momentum etc... of the track tx
70// ...
71// j2.AddTrack(tx);
72// tx->Reset();
73// }
959fbac5 74//
84bb7c66 75// j1.Data();
76// j2.Data("sph");
959fbac5 77//
78// Float_t e1=j1.GetEnergy();
79// Float_t pnorm=j1->GetMomentum();
80// Ali3Vector p=j1->Get3Momentum();
81// Float_t m=j1.GetInvmass();
82// Int_t ntk=j1.GetNtracks();
83// AliTrack* tj=j1.GetTrack(1);
84//
c1f25d1d 85// delete tx;
86//
25eefd00 87// Note : By default all quantities are in GeV, GeV/c or GeV/c**2
88// but the user can indicate the usage of a different scale
89// for the energy-momentum units via the SetEscale() memberfunction.
90// The actual energy-momentum unit scale can be obtained via the
91// GetEscale() memberfunction.
959fbac5 92//
93//--- Author: Nick van Eijndhoven 10-jul-1997 UU-SAP Utrecht
f531a546 94//- Modified: NvE $Date$ UU-SAP Utrecht
959fbac5 95///////////////////////////////////////////////////////////////////////////
96
d88f97cc 97#include "AliJet.h"
c72198f1 98#include "Riostream.h"
d88f97cc 99
100ClassImp(AliJet) // Class implementation to enable ROOT I/O
101
387a745b 102AliJet::AliJet() : TNamed(),Ali4Vector()
d88f97cc 103{
104// Default constructor
105// All variables initialised to 0
106// Initial maximum number of tracks is set to the default value
6516b62d 107 Init();
108 Reset();
109 SetNtinit();
110}
111///////////////////////////////////////////////////////////////////////////
112void AliJet::Init()
113{
114// Initialisation of pointers etc...
d88f97cc 115 fTracks=0;
116 fNtinit=0;
c1f25d1d 117 fTrackCopy=0;
413d0114 118 fRef=0;
ea0b5b7f 119 fSelected=0;
25eefd00 120 fEscale=1;
d88f97cc 121}
122///////////////////////////////////////////////////////////////////////////
387a745b 123AliJet::AliJet(Int_t n) : TNamed(),Ali4Vector()
d88f97cc 124{
125// Create a jet to hold initially a maximum of n tracks
126// All variables initialised to 0
6516b62d 127 Init();
d88f97cc 128 Reset();
129 if (n > 0)
130 {
131 SetNtinit(n);
132 }
133 else
134 {
135 cout << endl;
136 cout << " *AliJet* Initial max. number of tracks entered : " << n << endl;
137 cout << " This is invalid. Default initial maximum will be used." << endl;
138 cout << endl;
139 SetNtinit();
140 }
141}
142///////////////////////////////////////////////////////////////////////////
143AliJet::~AliJet()
144{
145// Default destructor
c1f25d1d 146 if (fTracks)
147 {
c1f25d1d 148 delete fTracks;
149 fTracks=0;
150 }
413d0114 151 if (fRef)
152 {
153 delete fRef;
154 fRef=0;
155 }
ea0b5b7f 156 if (fSelected)
157 {
158 delete fSelected;
159 fSelected=0;
160 }
d88f97cc 161}
162///////////////////////////////////////////////////////////////////////////
8e8e6c7f 163void AliJet::SetOwner(Bool_t own)
164{
165// Set ownership of all added objects.
166// The default parameter is own=kTRUE.
167//
168// Invokation of this memberfunction also sets all the copy modes
169// (e.g. TrackCopy & co.) according to the value of own.
170//
171// This function (with own=kTRUE) is particularly useful when reading data
172// from a tree/file, since Reset() will then actually remove all the
173// added objects from memory irrespective of the copy mode settings
174// during the tree/file creation process. In this way it provides a nice way
175// of preventing possible memory leaks in the reading/analysis process.
176//
177// In addition this memberfunction can also be used as a shortcut to set all
178// copy modes in one go during a tree/file creation process.
179// However, in this case the user has to take care to only set/change the
180// ownership (and copy mode) for empty objects (e.g. newly created objects
181// or after invokation of the Reset() memberfunction) otherwise it will
182// very likely result in inconsistent destructor behaviour.
183
184 Int_t mode=1;
185 if (!own) mode=0;
186 if (fTracks) fTracks->SetOwner(own);
187 fTrackCopy=mode;
188}
189///////////////////////////////////////////////////////////////////////////
261c0caf 190AliJet::AliJet(const AliJet& j) : TNamed(j),Ali4Vector(j)
6516b62d 191{
192// Copy constructor
c72198f1 193 fNtinit=j.fNtinit;
194 fNtmax=j.fNtmax;
195 fQ=j.fQ;
25eefd00 196 fEscale=j.fEscale;
c72198f1 197 fNtrk=j.fNtrk;
198 fTrackCopy=j.fTrackCopy;
199 fUserId=j.fUserId;
413d0114 200 if (j.fRef) fRef=new AliPositionObj(*(j.fRef));
c72198f1 201
ea0b5b7f 202 fSelected=0;
203
c72198f1 204 fTracks=0;
205 if (fNtrk)
206 {
207 fTracks=new TObjArray(fNtmax);
208 if (fTrackCopy) fTracks->SetOwner();
209 }
6516b62d 210
c72198f1 211 for (Int_t i=1; i<=fNtrk; i++)
6516b62d 212 {
c72198f1 213 AliTrack* tx=j.GetTrack(i);
214 if (fTrackCopy)
215 {
5f25234b 216 fTracks->Add(tx->Clone());
c72198f1 217 }
218 else
219 {
220 fTracks->Add(tx);
221 }
6516b62d 222 }
223}
224///////////////////////////////////////////////////////////////////////////
d88f97cc 225void AliJet::SetNtinit(Int_t n)
226{
227// Set the initial maximum number of tracks for this jet
228 fNtinit=n;
229 fNtmax=n;
f4d1f676 230
79830a7e 231 if (fTracks)
c1f25d1d 232 {
c1f25d1d 233 delete fTracks;
234 fTracks=0;
235 }
413d0114 236 if (fRef)
237 {
238 delete fRef;
239 fRef=0;
240 }
d88f97cc 241}
242///////////////////////////////////////////////////////////////////////////
243void AliJet::Reset()
244{
245// Reset all variables to 0
246// The max. number of tracks is set to the initial value again
25eefd00 247// Note : The scale for the energy/momentum units will not be changed.
d88f97cc 248 fNtrk=0;
249 fQ=0;
43bfa5be 250 fUserId=0;
d88f97cc 251 Double_t a[4]={0,0,0,0};
252 SetVector(a,"sph");
253 if (fNtinit > 0) SetNtinit(fNtinit);
254}
255///////////////////////////////////////////////////////////////////////////
1fbffa23 256void AliJet::AddTrack(AliTrack& t)
d88f97cc 257{
35044448 258// Add a track to the jet.
d88f97cc 259// In case the maximum number of tracks has been reached
260// space will be extended to hold an additional amount of tracks as
35044448 261// was initially reserved.
1fbffa23 262// See SetTrackCopy() to tailor the functionality of the stored structures.
5f25234b 263//
1f241680 264// Notes :
265// -------
5f25234b 266// In case a private copy is made, this is performed via the Clone() memberfunction.
267// All AliTrack and derived classes have the default TObject::Clone() memberfunction.
268// However, derived classes generally contain an internal data structure which may
269// include pointers to other objects. Therefore it is recommended to provide
270// for all derived classes a specific copy constructor and override the default Clone()
271// memberfunction using this copy constructor.
272// An example for this may be seen from AliTrack.
1f241680 273//
274// In case NO private copy is made, a check will be performed if this
275// specific track is already present in the jet.
276// If this is the case, no action is performed to prevent multiple
277// additions of the same track.
278
5f25234b 279
1fbffa23 280 AddTrack(t,1);
281}
282///////////////////////////////////////////////////////////////////////////
283void AliJet::AddTrack(AliTrack& t,Int_t copy)
284{
285// Internal memberfunction to actually add a track to the jet.
286// In case the maximum number of tracks has been reached
287// space will be extended to hold an additional amount of tracks as
288// was initially reserved.
289//
290// If copy=0 NO copy of the track will be made, irrespective of the setting
291// of the TrackCopy flag.
292// This allows a proper treatment of automatically generated connecting
293// tracks between vertices.
5f25234b 294//
1f241680 295// In case NO copy of the track is made, a check will be performed if this
296// specific track is already present in the jet.
297// If this is the case, no action is performed to prevent multiple
298// additions of the same track.
299//
5f25234b 300// Note :
301// In case a private copy is made, this is performed via the Clone() memberfunction.
302
6516b62d 303 if (!fTracks)
304 {
305 fTracks=new TObjArray(fNtmax);
306 if (fTrackCopy) fTracks->SetOwner();
307 }
1f241680 308 else if (!fTrackCopy || !copy) // Check if this track is already present
309 {
310 for (Int_t i=0; i<fNtrk; i++)
311 {
312 AliTrack* tx=(AliTrack*)fTracks->At(i);
313 if (tx == &t) return;
314 }
315 }
316
d88f97cc 317 if (fNtrk == fNtmax) // Check if maximum track number is reached
318 {
319 fNtmax+=fNtinit;
320 fTracks->Expand(fNtmax);
321 }
322
323 // Add the track to this jet
324 fNtrk++;
6516b62d 325 if (fTrackCopy && copy)
c1f25d1d 326 {
5f25234b 327 fTracks->Add(t.Clone());
c1f25d1d 328 }
329 else
330 {
331 fTracks->Add(&t);
332 }
35044448 333
d88f97cc 334 fQ+=t.GetCharge();
35044448 335
25eefd00 336 Ali4Vector p4=(Ali4Vector)t;
337 Float_t tscale=t.GetEscale();
338 if ((tscale/fEscale > 1.1) || (fEscale/tscale > 1.1)) p4=p4*(tscale/fEscale);
339 (*this)+=p4;
340
d88f97cc 341}
342///////////////////////////////////////////////////////////////////////////
1f241680 343void AliJet::Data(TString f,TString u)
d88f97cc 344{
345// Provide jet information within the coordinate frame f
1f241680 346//
347// The string argument "u" allows to choose between different angular units
348// in case e.g. a spherical frame is selected.
349// u = "rad" : angles provided in radians
350// "deg" : angles provided in degrees
351//
352// The defaults are f="car" and u="rad".
353
5f25234b 354 const char* name=GetName();
355 const char* title=GetTitle();
356
357 cout << " *AliJet::Data*";
358 if (strlen(name)) cout << " Name : " << GetName();
359 if (strlen(title)) cout << " Title : " << GetTitle();
360 cout << endl;
387a745b 361 cout << " Id : " << fUserId << " Invmass : " << GetInvmass() << " Charge : " << fQ
25eefd00 362 << " Momentum : " << GetMomentum() << " Energy scale : " << fEscale << " GeV" << endl;
ea0b5b7f 363
364 ShowTracks(0);
c72198f1 365
1f241680 366 Ali4Vector::Data(f,u);
d88f97cc 367}
368///////////////////////////////////////////////////////////////////////////
1f241680 369void AliJet::List(TString f,TString u)
d88f97cc 370{
371// Provide jet and primary track information within the coordinate frame f
1f241680 372//
373// The string argument "u" allows to choose between different angular units
374// in case e.g. a spherical frame is selected.
375// u = "rad" : angles provided in radians
376// "deg" : angles provided in degrees
377//
378// The defaults are f="car" and u="rad".
d88f97cc 379
1f241680 380 Data(f,u); // Information of the current jet
413d0114 381 if (fRef) { cout << " Ref-point :"; fRef->Data(f,u); }
d88f97cc 382
383 // The tracks of this jet
384 AliTrack* t;
385 for (Int_t it=1; it<=fNtrk; it++)
386 {
387 t=GetTrack(it);
388 if (t)
389 {
390 cout << " ---Track no. " << it << endl;
391 cout << " ";
1f241680 392 t->Data(f,u);
d88f97cc 393 }
394 else
395 {
396 cout << " *AliJet::List* Error : No track present." << endl;
397 }
398 }
399}
400///////////////////////////////////////////////////////////////////////////
1f241680 401void AliJet::ListAll(TString f,TString u)
d88f97cc 402{
403// Provide jet and prim.+sec. track information within the coordinate frame f
1f241680 404//
405// The string argument "u" allows to choose between different angular units
406// in case e.g. a spherical frame is selected.
407// u = "rad" : angles provided in radians
408// "deg" : angles provided in degrees
409//
410// The defaults are f="car" and u="rad".
d88f97cc 411
1f241680 412 Data(f,u); // Information of the current jet
413d0114 413 if (fRef) { cout << " Ref-point :"; fRef->Data(f,u); }
d88f97cc 414
415 // The tracks of this jet
416 AliTrack* t;
417 for (Int_t it=1; it<=fNtrk; it++)
418 {
419 t=GetTrack(it);
420 if (t)
421 {
422 cout << " ---Track no. " << it << endl;
423 cout << " ";
1f241680 424 t->ListAll(f,u);
d88f97cc 425 }
426 else
427 {
428 cout << " *AliJet::List* Error : No track present." << endl;
429 }
430 }
431}
432///////////////////////////////////////////////////////////////////////////
325b076c 433Int_t AliJet::GetNtracks(Int_t idmode,Int_t chmode,Int_t pcode)
d88f97cc 434{
325b076c 435// Provide the number of user selected tracks in this jet based on the
436// idmode, chmode and pcode selections as specified by the user.
437// For specification of the selection parameters see GetTracks().
438// The default parameters correspond to no selection, which implies
439// that invokation of GetNtracks() just returns the total number of
440// tracks registered in this jet.
441//
442// Note : In case certain selections are specified, this function
443// invokes GetTracks(idmode,chmode,pcode) to determine the
444// number of tracks corresponding to the selections.
445// When the jet contains a large number of tracks, invokation
446// of GetTracks(idmode,chmode,pcode) and subsequently invoking
447// GetEntries() for the resulting TObjArray* might be slightly
448// faster.
449
450 Int_t n=0;
451 if (idmode==0 && chmode==2 && pcode==0)
452 {
453 return fNtrk;
454 }
455 else
456 {
457 TObjArray* arr=GetTracks(idmode,chmode,pcode);
caa58e1a 458 if (arr) n=arr->GetEntries();
325b076c 459 return n;
460 }
d88f97cc 461}
462///////////////////////////////////////////////////////////////////////////
caa58e1a 463Int_t AliJet::GetNtracks(TString name)
464{
465// Provide the number of tracks with the specified name.
466//
467// Note :
468// ------
469// This facility invokes the corresponding GetTracks memberfunction
470// and as such may result in overwriting existing track selection
471// arrays. Please refer to the docs of GetTracks for further details.
472
473 Int_t n=0;
474
475 TObjArray* arr=GetTracks(name);
476 if (arr) n=arr->GetEntries();
477 return n;
478}
479///////////////////////////////////////////////////////////////////////////
25eefd00 480Double_t AliJet::GetEnergy(Float_t scale)
d88f97cc 481{
25eefd00 482// Return the total energy of the jet.
483// By default the energy is returned in the units as it was stored in the jet
484// structure. However, the user can select a different energy unit scale by
485// specification of the scale parameter.
486// The convention is that scale=1 corresponds to GeV, so specification
487// of scale=0.001 will provide the energy in MeV.
488// The error can be obtained by invoking GetResultError() after
489// invokation of GetEnergy().
490 Double_t E=GetScalar();
491 if (E>0)
492 {
493 if (scale>0)
494 {
495 E*=fEscale/scale;
496 fDresult*=fEscale/scale;
497 }
498 return E;
499 }
500 else
501 {
502 return 0;
503 }
d88f97cc 504}
505///////////////////////////////////////////////////////////////////////////
25eefd00 506Double_t AliJet::GetMomentum(Float_t scale)
d88f97cc 507{
508// Return the value of the total jet 3-momentum
25eefd00 509// By default the momentum is returned in the units as it was stored in the jet
510// structure. However, the user can select a different momentum unit scale by
511// specification of the scale parameter.
512// The convention is that scale=1 corresponds to GeV/c, so specification
513// of scale=0.001 will provide the momentum in MeV/c.
d071d629 514// The error can be obtained by invoking GetResultError() after
515// invokation of GetMomentum().
25eefd00 516
d071d629 517 Double_t norm=fV.GetNorm();
518 fDresult=fV.GetResultError();
25eefd00 519 if (scale>0)
520 {
521 norm*=fEscale/scale;
522 fDresult*=fEscale/scale;
523 }
d071d629 524 return norm;
d88f97cc 525}
526///////////////////////////////////////////////////////////////////////////
25eefd00 527Ali3Vector AliJet::Get3Momentum(Float_t scale) const
d88f97cc 528{
529// Return the the total jet 3-momentum
25eefd00 530// By default the components of the 3-momentum are returned in the units
531// as they were stored in the jet structure.
532// However, the user can select a different momentum unit scale for the
533// components by specification of the scale parameter.
534// The convention is that scale=1 corresponds to GeV/c, so specification
535// of scale=0.001 will provide the 3-momentum in MeV/c.
536
d88f97cc 537 Ali3Vector p=Get3Vector();
25eefd00 538 if (scale>0) p*=fEscale/scale;
d88f97cc 539 return p;
540}
541///////////////////////////////////////////////////////////////////////////
25eefd00 542Double_t AliJet::GetInvmass(Float_t scale)
d88f97cc 543{
25eefd00 544// Return the invariant mass of the jet.
545// By default the mass is returned in the units as it was stored in the jet
546// structure. However, the user can select a different mass unit scale by
547// specification of the scale parameter.
548// The convention is that scale=1 corresponds to GeV/c**2, so specification
549// of scale=0.001 will provide the invariant mass in MeV/c**2.
550// The error can be obtained by invoking GetResultError() after
551// invokation of GetInvmass().
552
553 Double_t inv=Dot(*this);
554 Double_t dinv=GetResultError();
555 Double_t dm=0;
556 if (inv >= 0)
d88f97cc 557 {
25eefd00 558 Double_t m=sqrt(inv);
559 if (m) dm=dinv/(2.*m);
560 if (scale>0)
561 {
562 m*=fEscale/scale;
563 dm*=fEscale/scale;
564 }
565 fDresult=dm;
566 return m;
d88f97cc 567 }
568 else
569 {
25eefd00 570 fDresult=dm;
d88f97cc 571 return 0;
572 }
573}
574///////////////////////////////////////////////////////////////////////////
261c0caf 575Float_t AliJet::GetCharge() const
d88f97cc 576{
577// Return the total charge of the jet
578 return fQ;
579}
580///////////////////////////////////////////////////////////////////////////
261c0caf 581AliTrack* AliJet::GetTrack(Int_t i) const
d88f97cc 582{
583// Return the i-th track of this jet
ea0b5b7f 584
585 if (!fTracks) return 0;
586
587 if (i<=0 || i>fNtrk)
f34f4acb 588 {
ea0b5b7f 589 cout << " *AliJet*::GetTrack* Invalid argument i : " << i
590 << " Ntrk = " << fNtrk << endl;
f34f4acb 591 return 0;
592 }
593 else
594 {
ea0b5b7f 595 return (AliTrack*)fTracks->At(i-1);
f34f4acb 596 }
d88f97cc 597}
598///////////////////////////////////////////////////////////////////////////
261c0caf 599AliTrack* AliJet::GetIdTrack(Int_t id) const
43bfa5be 600{
601// Return the track with user identifier "id" of this jet
4f368c8c 602 if (!fTracks) return 0;
603
43bfa5be 604 AliTrack* tx=0;
4f368c8c 605 for (Int_t i=0; i<fNtrk; i++)
43bfa5be 606 {
4f368c8c 607 tx=(AliTrack*)fTracks->At(i);
608 if (id == tx->GetId()) return tx;
43bfa5be 609 }
4f368c8c 610 return 0; // No matching id found
43bfa5be 611}
612///////////////////////////////////////////////////////////////////////////
ea0b5b7f 613TObjArray* AliJet::GetTracks(Int_t idmode,Int_t chmode,Int_t pcode)
614{
615// Provide references to user selected tracks based on the idmode, chmode
616// and pcode selections as specified by the user.
617//
618// The following selection combinations are available :
619// ----------------------------------------------------
620// idmode = -1 ==> Select tracks with negative user identifier "id"
621// 0 ==> No selection on user identifier
622// 1 ==> Select tracks with positive user identifier "id"
623//
624// chmode = -1 ==> Select tracks with negative charge
625// 0 ==> Select neutral tracks
626// 1 ==> Select tracks with positive charge
627// 2 ==> No selection on charge
325b076c 628// 3 ==> Select all charged tracks
ea0b5b7f 629//
630// pcode = 0 ==> No selection on particle code
631// X ==> Select tracks with particle code +X or -X
632// This allows selection of both particles and anti-particles
633// in case of PDG particle codes.
634// Selection of either particles or anti-particles can be
635// obtained in combination with the "chmode" selector.
636//
637// Examples :
638// ----------
639// idmode=-1 chmode=0 pcode=0 : Selection of all neutral tracks with negative id.
640// idmode=0 chmode=2 pcode=211 : Selection of all charged pions (PDG convention).
641// idmode=0 chmode=1 pcode=321 : Selection of all positive kaons (PDG convention).
642//
643// The default values are idmode=0 chmode=2 pcode=0 (i.e. no selections applied).
644//
645// Notes :
646// -------
647// 1) In case the user has labeled simulated tracks with negative id and
648// reconstructed tracks with positive id, this memberfunction provides
649// easy access to either all simulated or reconstructed tracks.
650// 2) Subsequent invokations of this memberfunction with e.g. chmode=-1 and chmode=1
651// provides a convenient way to investigate particle pairs with opposite charge
652// (e.g. for invariant mass analysis).
50e93041 653// 3) The selected track pointers are returned via a multi-purpose array,
654// which will be overwritten by subsequent selections.
655// In case the selected track list is to be used amongst other selections,
656// the user is advised to store the selected track pointers in a local
657// TObjArray or TRefArray.
ea0b5b7f 658
659 if (fSelected)
660 {
661 fSelected->Clear();
662 }
663 else
664 {
665 fSelected=new TObjArray();
666 }
667
668 if (!fTracks) return fSelected;
669
670 AliTrack* tx=0;
671 Int_t code=0;
672 Int_t id=0;
673 Float_t q=0;
674 for (Int_t i=0; i<fNtrk; i++)
675 {
676 tx=(AliTrack*)fTracks->At(i);
677 if (!tx) continue;
678
679 code=tx->GetParticleCode();
680 if (pcode && abs(pcode)!=abs(code)) continue;
681
682 id=tx->GetId();
683 if (idmode==-1 && id>=0) continue;
684 if (idmode==1 && id<=0) continue;
685
686 q=tx->GetCharge();
687 if (chmode==-1 && q>=0) continue;
688 if (chmode==0 && fabs(q)>1e-10) continue;
689 if (chmode==1 && q<=0) continue;
325b076c 690 if (chmode==3 && fabs(q)<1e-10) continue;
ea0b5b7f 691
692 fSelected->Add(tx);
693 }
694
695 return fSelected;
696}
697///////////////////////////////////////////////////////////////////////////
50e93041 698TObjArray* AliJet::GetTracks(TString name)
699{
700// Provide references to all tracks with the specified name.
701//
702// Notes :
703// -------
704// 1) In case the user has labeled reconstructed tracks with the name of
705// the applied reconstruction algorithm, this memberfunction provides
706// easy access to all tracks reconstructed by a certain method.
707// 2) The selected track pointers are returned via a multi-purpose array,
708// which will be overwritten by subsequent selections.
709// In case the selected track list is to be used amongst other selections,
710// the user is advised to store the selected track pointers in a local
711// TObjArray or TRefArray.
712
713 if (fSelected)
714 {
715 fSelected->Clear();
716 }
717 else
718 {
719 fSelected=new TObjArray();
720 }
721
722 if (!fTracks) return fSelected;
723
724 AliTrack* tx=0;
725 TString s;
726 for (Int_t i=0; i<fNtrk; i++)
727 {
728 tx=(AliTrack*)fTracks->At(i);
729 if (!tx) continue;
730
731 s=tx->GetName();
732 if (s == name) fSelected->Add(tx);
733 }
734
735 return fSelected;
736}
737///////////////////////////////////////////////////////////////////////////
30672a96 738void AliJet::RemoveTracks(TString name)
739{
740// Remove all tracks with the specified name.
741// If name="*" all tracks will be removed.
742//
743// Note :
744// ------
745// In case the user has labeled reconstructed tracks with the name of
746// the applied reconstruction algorithm, this memberfunction provides
747// easy removal of all tracks reconstructed by a certain method.
748
749 if (!fTracks) return;
750
751 AliTrack* tx=0;
752 TString s;
753 TObject* obj=0;
754 for (Int_t i=0; i<fNtrk; i++)
755 {
756 tx=(AliTrack*)fTracks->At(i);
757 if (!tx) continue;
758
759 s=tx->GetName();
760 if (s==name || name=="*")
761 {
762 obj=fTracks->Remove(tx);
763 if (obj && fTracks->IsOwner()) delete tx;
764 }
765 }
766 fTracks->Compress();
767 fNtrk=fTracks->GetEntries();
768}
769///////////////////////////////////////////////////////////////////////////
770void AliJet::RemoveTracks(Int_t idmode,Int_t chmode,Int_t pcode)
771{
772// Remove user selected tracks based on the idmode, chmode and pcode
773// selections as specified by the user.
774// For defintions of these selections see the corresponding GetTracks()
775// memberfunction.
776
777 if (!fTracks) return;
778
779 TObjArray* arr=GetTracks(idmode,chmode,pcode);
780 if (!arr) return;
781
782 Int_t ntk=arr->GetEntries();
783 if (!ntk) return;
784
785 AliTrack* tx=0;
786 TObject* obj=0;
787 for (Int_t i=0; i<ntk; i++)
788 {
789 tx=(AliTrack*)arr->At(i);
790 if (!tx) continue;
791
792 obj=fTracks->Remove(tx);
793 if (obj && fTracks->IsOwner()) delete tx;
794 }
795 fTracks->Compress();
796 fNtrk=fTracks->GetEntries();
797 arr->Clear();
798}
799///////////////////////////////////////////////////////////////////////////
325b076c 800void AliJet::ShowTracks(Int_t mode)
ea0b5b7f 801{
802// Provide an overview of the available tracks.
803// The argument mode determines the amount of information as follows :
804// mode = 0 ==> Only printout of the number of tracks
805// 1 ==> Provide a listing with 1 line of info for each track
806//
807// The default is mode=1.
808//
809 Int_t ntk=GetNtracks();
810 if (ntk)
811 {
812 if (!mode)
813 {
814 cout << " There are " << ntk << " tracks available." << endl;
815 }
816 else
817 {
818 cout << " The following " << ntk << " tracks are available :" << endl;
819 for (Int_t i=1; i<=ntk; i++)
820 {
821 AliTrack* tx=GetTrack(i);
822 if (tx)
823 {
824 const char* name=tx->GetName();
825 const char* title=tx->GetTitle();
826 cout << " Track : " << i;
827 cout << " Id : " << tx->GetId();
828 cout << " Q : " << tx->GetCharge() << " m : " << tx->GetMass() << " p : " << tx->GetMomentum();
829 if (strlen(name)) cout << " Name : " << name;
830 if (strlen(title)) cout << " Title : " << title;
831 cout << endl;
832 }
833 }
834 }
835 }
836 else
837 {
838 cout << " No tracks are present." << endl;
839 }
840}
841///////////////////////////////////////////////////////////////////////////
25eefd00 842Double_t AliJet::GetPt(Float_t scale)
d071d629 843{
25eefd00 844// Provide the transverse momentum value w.r.t. z-axis.
845// By default the value is returned in the units as it was stored in the jet
846// structure. However, the user can select a different momentum unit scale by
847// specification of the scale parameter.
848// The convention is that scale=1 corresponds to GeV/c, so specification
849// of scale=0.001 will provide the transverse momentum in MeV/c.
d071d629 850// The error on the value can be obtained by GetResultError()
851// after invokation of GetPt().
852 Ali3Vector v;
853 v=GetVecTrans();
854 Double_t norm=v.GetNorm();
855 fDresult=v.GetResultError();
25eefd00 856 if (scale>0)
857 {
858 norm*=fEscale/scale;
859 fDresult*=fEscale/scale;
860 }
d071d629 861
862 return norm;
863}
864///////////////////////////////////////////////////////////////////////////
25eefd00 865Double_t AliJet::GetPl(Float_t scale)
d071d629 866{
25eefd00 867// Provide the longitudinal momentum value w.r.t. z-axis.
868// By default the value is returned in the units as it was stored in the jet
869// structure. However, the user can select a different momentum unit scale by
870// specification of the scale parameter.
871// The convention is that scale=1 corresponds to GeV/c, so specification
872// of scale=0.001 will provide the longitudinal momentum in MeV/c.
8adaf597 873// Note : the returned value can also be negative.
d071d629 874// The error on the value can be obtained by GetResultError()
875// after invokation of GetPl().
25eefd00 876
d071d629 877 Ali3Vector v;
878 v=GetVecLong();
8adaf597 879
880 Double_t pl=v.GetNorm();
d071d629 881 fDresult=v.GetResultError();
882
8adaf597 883 Double_t a[3];
884 v.GetVector(a,"sph");
885 if (cos(a[1])<0) pl=-pl;
25eefd00 886 if (scale>0)
887 {
888 pl*=fEscale/scale;
889 fDresult*=fEscale/scale;
890 }
8adaf597 891
892 return pl;
d071d629 893}
894///////////////////////////////////////////////////////////////////////////
25eefd00 895Double_t AliJet::GetEt(Float_t scale)
d071d629 896{
25eefd00 897// Provide transverse energy value w.r.t. z-axis.
898// By default the value is returned in the units as it was stored in the jet
899// structure. However, the user can select a different energy unit scale by
900// specification of the scale parameter.
901// The convention is that scale=1 corresponds to GeV, so specification
902// of scale=0.001 will provide the transverse energy in MeV.
d071d629 903// The error on the value can be obtained by GetResultError()
904// after invokation of GetEt().
25eefd00 905
d071d629 906 Double_t et=GetScaTrans();
25eefd00 907 if (scale>0)
908 {
909 et*=fEscale/scale;
910 fDresult*=fEscale/scale;
911 }
d071d629 912
913 return et;
914}
915///////////////////////////////////////////////////////////////////////////
25eefd00 916Double_t AliJet::GetEl(Float_t scale)
d071d629 917{
25eefd00 918// Provide longitudinal energy value w.r.t. z-axis.
919// By default the value is returned in the units as it was stored in the jet
920// structure. However, the user can select a different energy unit scale by
921// specification of the scale parameter.
922// The convention is that scale=1 corresponds to GeV, so specification
923// of scale=0.001 will provide the longitudinal energy in MeV.
8adaf597 924// Note : the returned value can also be negative.
d071d629 925// The error on the value can be obtained by GetResultError()
926// after invokation of GetEl().
25eefd00 927
d071d629 928 Double_t el=GetScaLong();
25eefd00 929 if (scale>0)
930 {
931 el*=fEscale/scale;
932 fDresult*=fEscale/scale;
933 }
d071d629 934
935 return el;
936}
937///////////////////////////////////////////////////////////////////////////
25eefd00 938Double_t AliJet::GetMt(Float_t scale)
d071d629 939{
940// Provide transverse mass value w.r.t. z-axis.
25eefd00 941// By default the value is returned in the units as it was stored in the jet
942// structure. However, the user can select a different energy unit scale by
943// specification of the scale parameter.
944// The convention is that scale=1 corresponds to GeV, so specification
945// of scale=0.001 will provide the transverse mass in MeV.
d071d629 946// The error on the value can be obtained by GetResultError()
947// after invokation of GetMt().
948 Double_t pt=GetPt();
949 Double_t dpt=GetResultError();
950 Double_t m=GetInvmass();
951 Double_t dm=GetResultError();
952
953 Double_t mt=sqrt(pt*pt+m*m);
954 Double_t dmt2=0;
955 if (mt) dmt2=(pow((pt*dpt),2)+pow((m*dm),2))/(mt*mt);
956
957 fDresult=sqrt(dmt2);
25eefd00 958 if (scale>0)
959 {
960 mt*=fEscale/scale;
961 fDresult*=fEscale/scale;
962 }
d071d629 963 return mt;
964}
965///////////////////////////////////////////////////////////////////////////
8adaf597 966Double_t AliJet::GetRapidity()
967{
968// Provide rapidity value w.r.t. z-axis.
969// The error on the value can be obtained by GetResultError()
970// after invokation of GetRapidity().
971// Note : Also GetPseudoRapidity() is available since this class is
972// derived from Ali4Vector.
973 Double_t e=GetEnergy();
974 Double_t de=GetResultError();
975 Double_t pl=GetPl();
976 Double_t dpl=GetResultError();
977 Double_t sum=e+pl;
978 Double_t dif=e-pl;
979
980 Double_t y=9999,dy2=0;
981 if (sum && dif) y=0.5*log(sum/dif);
982
983 if (sum*dif) dy2=(1./(sum*dif))*(pow((pl*de),2)+pow((e*dpl),2));
984
985 fDresult=sqrt(dy2);
986 return y;
987}
988///////////////////////////////////////////////////////////////////////////
c1f25d1d 989void AliJet::SetTrackCopy(Int_t j)
990{
991// (De)activate the creation of private copies of the added tracks.
992// j=0 ==> No private copies are made; pointers of original tracks are stored.
993// j=1 ==> Private copies of the tracks are made and these pointers are stored.
994//
995// Note : Once the storage contains pointer(s) to AliTrack(s) one cannot
996// change the TrackCopy mode anymore.
997// To change the TrackCopy mode for an existing AliJet containing
998// tracks one first has to invoke Reset().
999 if (!fTracks)
1000 {
1001 if (j==0 || j==1)
1002 {
1003 fTrackCopy=j;
1004 }
1005 else
1006 {
1007 cout << "*AliJet::SetTrackCopy* Invalid argument : " << j << endl;
1008 }
1009 }
1010 else
1011 {
1012 cout << "*AliJet::SetTrackCopy* Storage already contained tracks."
1013 << " ==> TrackCopy mode not changed." << endl;
1014 }
1015}
1016///////////////////////////////////////////////////////////////////////////
261c0caf 1017Int_t AliJet::GetTrackCopy() const
c1f25d1d 1018{
1019// Provide value of the TrackCopy mode.
1020// 0 ==> No private copies are made; pointers of original tracks are stored.
1021// 1 ==> Private copies of the tracks are made and these pointers are stored.
1022 return fTrackCopy;
1023}
1024///////////////////////////////////////////////////////////////////////////
43bfa5be 1025void AliJet::SetId(Int_t id)
1026{
1027// Set a user defined identifier for this jet.
1028 fUserId=id;
1029}
1030///////////////////////////////////////////////////////////////////////////
261c0caf 1031Int_t AliJet::GetId() const
43bfa5be 1032{
1033// Provide the user defined identifier of this jet.
1034 return fUserId;
1035}
1036///////////////////////////////////////////////////////////////////////////
413d0114 1037void AliJet::SetReferencePoint(AliPosition& p)
1038{
1039// Store the position of the jet reference-point.
1040// The reference-point of a jet provides a means to define a generic
1041// space-time location for the jet as a whole.
1042// This doesn't have to be necessarily the location where all the constituent
1043// tracks originate (e.g. a bundle of parallel tracks doesn't have such
1044// a location). As such the meaning of this reference-point is different from
1045// a normal vertex position and allows to provide complimentary information.
1046// This reference point is the preferable point to start e.g. extrapolations
1047// and investigate coincidences in space and/or time.
1048 if (fRef) delete fRef;
1049 fRef=new AliPositionObj(p);
1050}
1051///////////////////////////////////////////////////////////////////////////
1052AliPosition* AliJet::GetReferencePoint()
1053{
1054// Provide the position of the jet reference-point.
1055// The reference-point of a jet provides a means to define a generic
1056// space-time location for the jet as a whole.
1057// This doesn't have to be necessarily the location where all the constituent
1058// tracks originate (e.g. a bundle of parallel tracks doesn't have such
1059// a location). As such the meaning of this reference-point is different from
1060// a normal vertex position and allows to provide complimentary information.
1061// This reference point is the preferable point to start e.g. extrapolations
1062// and investigate coincidences in space and/or time.
1063 return fRef;
1064}
1065///////////////////////////////////////////////////////////////////////////
e51b7d1a 1066TObjArray* AliJet::SortTracks(Int_t mode,TObjArray* tracks)
1067{
1068// Order the references to an array of tracks by looping over the input array "tracks"
1069// and checking the value of a certain observable.
1070// The ordered array is returned as a TObjArray.
1071// In case tracks=0 (default), the registered tracks of the current jet are used.
1072// Note that the original track array is not modified.
1073// Via the "mode" argument the user can specify the observable to be checked upon
1074// and specify whether sorting should be performed in decreasing order (mode<0)
1075// or in increasing order (mode>0).
1076//
1077// The convention for the observable selection is the following :
1078// mode : 1 ==> Number of signals associated to the track
1079// 2 ==> Track energy
1080// 3 ==> Track momentum
1081// 4 ==> Mass of the track
1082// 5 ==> Transverse momentum of the track
1083// 6 ==> Longitudinal momentum of the track
1084// 7 ==> Transverse energy of the track
1085// 8 ==> Longitudinal energy of the track
1086// 9 ==> Transverse mass of the track
1087// 10 ==> Track rapidity
1088// 11 ==> Pseudo-rapidity of the track
25eefd00 1089// 12 ==> Charge of the track
1090// 13 ==> Probability of the track hypothesis
e51b7d1a 1091//
1092// The default is mode=-1.
1093//
1094// Note : This sorting routine uses a common area in memory, which is used
1095// by various other sorting facilities as well.
1096// This means that the resulting sorted TObjArray may be overwritten
1097// when another sorting is invoked.
1098// To retain the sorted list of pointers, the user is advised to copy
1099// the pointers contained in the returned TObjArray into a private
1100// TObjArray instance.
1101
1102 if (fSelected)
1103 {
1104 delete fSelected;
1105 fSelected=0;
1106 }
1107
1108 if (!tracks) tracks=fTracks;
1109
25eefd00 1110 if (!mode || abs(mode)>13 || !tracks) return fSelected;
e51b7d1a 1111
1112 Int_t ntracks=tracks->GetEntries();
1113 if (!ntracks)
1114 {
1115 return fSelected;
1116 }
1117 else
1118 {
1119 fSelected=new TObjArray(ntracks);
1120 }
1121
1122 Double_t val1,val2; // Values of the observable to be tested upon
1123
1124 Int_t nord=0;
1125 for (Int_t i=0; i<ntracks; i++) // Loop over all tracks of the array
1126 {
1127 AliTrack* tx=(AliTrack*)tracks->At(i);
1128
1129 if (!tx) continue;
1130
1131 if (nord == 0) // store the first track at the first ordered position
1132 {
1133 nord++;
1134 fSelected->AddAt(tx,nord-1);
1135 continue;
1136 }
1137
1138 for (Int_t j=0; j<=nord; j++) // put track in the right ordered position
1139 {
1140 if (j == nord) // track has smallest (mode<0) or largest (mode>0) observable value seen so far
1141 {
1142 nord++;
1143 fSelected->AddAt(tx,j); // add track at the end
1144 break; // go for next track
1145 }
64b63904 1146
1147 val1=0;
1148 val2=0;
1149
e51b7d1a 1150 switch (abs(mode))
1151 {
1152 case 1:
1153 val1=tx->GetNsignals();
1154 val2=((AliTrack*)fSelected->At(j))->GetNsignals();
1155 break;
1156 case 2:
25eefd00 1157 val1=tx->GetEnergy(1);
1158 val2=((AliTrack*)fSelected->At(j))->GetEnergy(1);
e51b7d1a 1159 break;
1160 case 3:
25eefd00 1161 val1=tx->GetMomentum(1);
1162 val2=((AliTrack*)fSelected->At(j))->GetMomentum(1);
e51b7d1a 1163 break;
1164 case 4:
25eefd00 1165 val1=tx->GetMass(1);
1166 val2=((AliTrack*)fSelected->At(j))->GetMass(1);
e51b7d1a 1167 break;
1168 case 5:
25eefd00 1169 val1=tx->GetPt(1);
1170 val2=((AliTrack*)fSelected->At(j))->GetPt(1);
e51b7d1a 1171 break;
1172 case 6:
25eefd00 1173 val1=tx->GetPl(1);
1174 val2=((AliTrack*)fSelected->At(j))->GetPl(1);
e51b7d1a 1175 break;
1176 case 7:
25eefd00 1177 val1=tx->GetEt(1);
1178 val2=((AliTrack*)fSelected->At(j))->GetEt(1);
e51b7d1a 1179 break;
1180 case 8:
25eefd00 1181 val1=tx->GetEl(1);
1182 val2=((AliTrack*)fSelected->At(j))->GetEl(1);
e51b7d1a 1183 break;
1184 case 9:
25eefd00 1185 val1=tx->GetMt(1);
1186 val2=((AliTrack*)fSelected->At(j))->GetMt(1);
e51b7d1a 1187 break;
1188 case 10:
1189 val1=tx->GetRapidity();
1190 val2=((AliTrack*)fSelected->At(j))->GetRapidity();
1191 break;
1192 case 11:
1193 val1=tx->GetPseudoRapidity();
1194 val2=((AliTrack*)fSelected->At(j))->GetPseudoRapidity();
1195 break;
25eefd00 1196 case 12:
1197 val1=tx->GetCharge();
1198 val2=((AliTrack*)fSelected->At(j))->GetCharge();
1199 break;
1200 case 13:
1201 val1=tx->GetProb();
1202 val2=((AliTrack*)fSelected->At(j))->GetProb();
1203 break;
e51b7d1a 1204 }
1205
f5b75967 1206 if (mode<0 && val1 <= val2) continue;
1207 if (mode>0 && val1 >= val2) continue;
e51b7d1a 1208
1209 nord++;
1210 for (Int_t k=nord-1; k>j; k--) // create empty position
1211 {
1212 fSelected->AddAt(fSelected->At(k-1),k);
1213 }
1214 fSelected->AddAt(tx,j); // put track at empty position
1215 break; // go for next track
1216 }
1217 }
1218 return fSelected;
1219}
1220///////////////////////////////////////////////////////////////////////////
25eefd00 1221Double_t AliJet::GetDistance(AliPosition* p,Float_t scale)
9427ac75 1222{
1223// Provide distance of the current jet to the position p.
1224// The error on the result can be obtained as usual by invoking
1225// GetResultError() afterwards.
1226//
25eefd00 1227// By default the distance will be provided in the metric unit scale of
1228// the AliPosition p.
1229// However, the user can select a different metric unit scale by
1230// specification of the scale parameter.
1231// The convention is that scale=1 corresponds to meter, so specification
1232// of scale=0.01 will provide the distance in cm.
9427ac75 1233// As such it is possible to obtain a correctly computed distance even in case
1234// the jet parameters have a different unit scale.
1235// However, it is recommended to work always with one single unit scale.
1236//
1237// Note : In case of incomplete information, a distance value of -1 is
1238// returned.
1239
1240 Double_t dist=-1.;
1241 fDresult=0.;
1242
1243 if (!p) return dist;
1244
1245 // Obtain a defined position on this jet
1246 AliPosition* rx=fRef;
1247
1248 if (!rx) return dist;
1249
1250 Ali3Vector pj=Get3Momentum();
1251
1252 if (pj.GetNorm() <= 0.) return dist;
1253
1254 AliTrack tj;
1255 tj.Set3Momentum(pj);
1256 tj.SetReferencePoint(*rx);
25eefd00 1257 dist=tj.GetDistance(p,scale);
9427ac75 1258 fDresult=tj.GetResultError();
1259 return dist;
1260}
1261///////////////////////////////////////////////////////////////////////////
25eefd00 1262Double_t AliJet::GetDistance(AliTrack* t,Float_t scale)
9427ac75 1263{
1264// Provide distance of the current jet to the track t.
1265// The error on the result can be obtained as usual by invoking
1266// GetResultError() afterwards.
1267//
25eefd00 1268// By default the distance will be provided in the metric unit scale of
1269// the current jet.
1270// However, the user can specify a required metric unit scale by specification
1271// of the scale parameter.
1272// The convention is that scale=1 corresponds to meter, so specification
1273// of scale=0.01 will provide the distance in cm.
9427ac75 1274// As such it is possible to obtain a correctly computed distance even in case
1275// the jet and track parameters have a different unit scale.
1276// However, it is recommended to work always with one single unit scale.
1277//
1278// Note : In case of incomplete information, a distance value of -1 is
1279// returned.
1280
1281 Double_t dist=-1.;
1282 fDresult=0.;
1283
1284 if (!t) return dist;
1285
1286 // Obtain a defined position on this jet
1287 AliPosition* rx=fRef;
1288
1289 if (!rx) return dist;
1290
1291 Ali3Vector pj=Get3Momentum();
1292
1293 if (pj.GetNorm() <= 0.) return dist;
1294
1295 AliTrack tj;
1296 tj.Set3Momentum(pj);
1297 tj.SetReferencePoint(*rx);
25eefd00 1298 dist=tj.GetDistance(t,scale);
9427ac75 1299 fDresult=tj.GetResultError();
1300 return dist;
1301}
1302///////////////////////////////////////////////////////////////////////////
25eefd00 1303Double_t AliJet::GetDistance(AliJet* j,Float_t scale)
9427ac75 1304{
1305// Provide distance of the current jet to the jet j.
1306// The error on the result can be obtained as usual by invoking
1307// GetResultError() afterwards.
1308//
25eefd00 1309// By default the distance will be provided in the metric unit scale of
1310// the current jet.
1311// This implies that the results of j1.GetDistance(j2) and j2.GetDistance(j1)
1312// may be numerically different in case j1 and j2 have different metric units.
1313// However, the user can specify a required metric unit scale by specification
1314// of the scale parameter.
1315// The convention is that scale=1 corresponds to meter, so specification
1316// of scale=0.01 will provide the distance in cm.
9427ac75 1317// As such it is possible to obtain a correctly computed distance even in case
25eefd00 1318// the jet parameters have a different unit scale.
9427ac75 1319// However, it is recommended to work always with one single unit scale.
1320//
1321// Note : In case of incomplete information, a distance value of -1 is
1322// returned.
1323
1324 Double_t dist=-1.;
1325 fDresult=0.;
1326
1327 if (!j) return dist;
1328
1329 // Obtain a defined position on jet j
1330 AliPosition* rx=j->GetReferencePoint();
1331
1332 if (!rx) return dist;
1333
1334 Ali3Vector pj=j->Get3Momentum();
1335
1336 if (pj.GetNorm() <= 0.) return dist;
1337
1338 AliTrack tj;
1339 tj.Set3Momentum(pj);
1340 tj.SetReferencePoint(*rx);
25eefd00 1341 dist=GetDistance(tj,scale);
9427ac75 1342 return dist;
1343}
1344///////////////////////////////////////////////////////////////////////////
25eefd00 1345Int_t AliJet::GetNsignals() const
1346{
1347// Provide the number of signals associated to the jet tracks.
1348// Note : Multiple occurrences of the same signal are only counted once.
1349
1350 if (fNtrk<1) return 0;
1351
1352 TObjArray arr;
1353
1354 Int_t n=0;
1355 AliTrack* tx=0;
1356 Int_t exists=0;
1357 for (Int_t i=1; i<=fNtrk; i++)
1358 {
1359 tx=GetTrack(i);
1360 for (Int_t j=1; j<=tx->GetNsignals(); j++)
1361 {
1362 AliSignal* sx=tx->GetSignal(j);
1363 if (!sx) continue;
1364 exists=0;
1365 for (Int_t k=0; k<arr.GetEntries(); k++)
1366 {
1367 if (sx==(AliSignal*)arr.At(k))
1368 {
1369 exists=1;
1370 break;
1371 }
1372 }
1373 if (!exists) arr.Add(sx);
1374 }
1375 }
1376 n=arr.GetEntries();
1377 return n;
1378}
1379///////////////////////////////////////////////////////////////////////////
1380void AliJet::SetEscale(Float_t scale)
1381{
1382// Indicate the energy/momentum scale as used by the user.
1383// The convention is that scale=1 indicates values in units
1384// of GeV, GeV/c or GeV/c**2.
1385// So, in case one decides to store values in units of MeV, MeV/c or MeV/c**2
1386// the scale indicator should be set to scale=0.001.
1387//
1388// By default scale=1 is set in the constructor.
1389
1390 if (scale>0)
1391 {
1392 fEscale=scale;
1393 }
1394 else
1395 {
1396 cout << " *AliJet::SetEscale* Invalid scale value : " << scale << endl;
1397 }
1398}
1399///////////////////////////////////////////////////////////////////////////
1400Float_t AliJet::GetEscale() const
1401{
1402// Provide the energy/momentum scale as used by the user.
1403// The convention is that scale=1 indicates values in units
1404// of GeV, GeV/c or GeV/c**2.
1405// So, a value of scale=0.001 indicates that energy/momentum values are
1406// stored in units of MeV, MeV/c or MeV/c**2.
1407 return fEscale;
1408}
1409///////////////////////////////////////////////////////////////////////////
261c0caf 1410TObject* AliJet::Clone(const char* name) const
5f25234b 1411{
1412// Make a deep copy of the current object and provide the pointer to the copy.
1413// This memberfunction enables automatic creation of new objects of the
1414// correct type depending on the object type, a feature which may be very useful
1415// for containers when adding objects in case the container owns the objects.
1416// This feature allows e.g. AliVertex to store either AliJet objects or
1417// objects derived from AliJet via the AddJet memberfunction, provided
1418// these derived classes also have a proper Clone memberfunction.
1419
1420 AliJet* jet=new AliJet(*this);
1421 if (name)
1422 {
1423 if (strlen(name)) jet->SetName(name);
1424 }
1425 return jet;
1426}
1427///////////////////////////////////////////////////////////////////////////