ROOT logo
// $Id$
// Main authors: Paraskevi Ganoti: 2009

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#include "AliEveKink.h"

#include <TDatabasePDG.h>
#include <TEveTrack.h>
#include <TEveTrackPropagator.h>

#include <TEveManager.h>

/***********************************************************************
*
*  AliEveKink class
*
************************************************************************/

ClassImp(AliEveKink)

//______________________________________________________________________________
AliEveKink::AliEveKink() :
  TEvePointSet(),

  fRecKinkPosition(),
  fMotherMomentum(),
  fDaughterMomentum(),
  fMotherTrack(0),
  fDaughterTrack(0),
  fRnrStyleMoth(0),
  fRnrStyleDaugh(0),
  fESDKinkIndex(-1),
  fDaugMaxProbPdg(0),
  fDaugMaxProbPid(0)
{
  // Default constructor.

  // Override from TEveElement.
  fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0.0;
  fPickable = kTRUE;
}

//______________________________________________________________________________
AliEveKink::AliEveKink(TEveRecTrack* tMoth, TEveRecTrack* tDaug,
		   TEveRecKink* kink, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
  TEvePointSet(),
  fRecKinkPosition(kink->fVKink),
  fMotherMomentum(kink->fPMother),
  fDaughterMomentum(kink->fPDaughter),
  fMotherTrack(new TEveTrack(tMoth, rsMoth)),
  fDaughterTrack(new TEveTrack(tDaug, rsDaugh)),
  fRnrStyleMoth(rsMoth),
  fRnrStyleDaugh(rsDaugh),
  fESDKinkIndex(-1),
  fDaugMaxProbPdg(0),
  fDaugMaxProbPid(0)
{
  // Constructor with full kink specification.

  // Override from TEveElement.
  fPickable = kTRUE;
  fKinkAngle[0]=fKinkAngle[1]=fKinkAngle[2]=0;

  fMotherTrack->SetLineColor(2);  // red
  fMotherTrack->SetStdTitle();
  fMotherTrack->SetLineWidth(3);
  TEvePathMark* pmM = new TEvePathMark(TEvePathMark::kDecay);
  pmM->fV.Set(kink->fVKink);
  fMotherTrack->AddPathMark(*pmM);

  fDaughterTrack->SetLineColor(7);  // light blue
  fDaughterTrack->SetLineWidth(3);  //
  fDaughterTrack->SetStdTitle();

  fMotherTrack->IncDenyDestroy();
  AddElement(fMotherTrack);
  fDaughterTrack->IncDenyDestroy();
  AddElement(fDaughterTrack);
  delete pmM;
}

//______________________________________________________________________________
AliEveKink::~AliEveKink()
{
  // Destructor. Dereferences mother-daughter tracks

  fMotherTrack->DecDenyDestroy();
  fDaughterTrack->DecDenyDestroy();
}
//______________________________________________________________________________
void AliEveKink::SetMaxProbPdgPid(Int_t rPdg, Float_t rPid)
{
  // Sets the maximum probability Pdg value and Pid for the daughter
  // Should be moved to TEveTrack property eventually (or AliEveTrack creation)

    fDaugMaxProbPdg = rPdg;
    fDaugMaxProbPid = rPid;

}

//______________________________________________________________________________
Float_t AliEveKink::GetInvMass(Int_t dPdgCode) const
{
  // Returns Invariant Mass assuming the mass of the daughter particle
  TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
  TEveVector lMothMomentum = fMotherTrack->GetMomentum();
  Double_t dMass=TDatabasePDG::Instance()->GetParticle(dPdgCode)->Mass();

  Double_t eDaug = TMath::Sqrt(dMass*dMass + lDaugMomentum.Mag2());
  Double_t otherDaug=TMath::Sqrt(
  (lMothMomentum.fX-lDaugMomentum.fX)*(lMothMomentum.fX-lDaugMomentum.fX)+
  (lMothMomentum.fY-lDaugMomentum.fY)*(lMothMomentum.fY-lDaugMomentum.fY)+
  (lMothMomentum.fZ-lDaugMomentum.fZ)*(lMothMomentum.fZ-lDaugMomentum.fZ));

  return TMath::Sqrt( (eDaug+otherDaug)*(eDaug+otherDaug) - lMothMomentum.Mag2());
}

//______________________________________________________________________________
Float_t AliEveKink::GetQt() const
{
  // Returns the kink daughter Qt

  TEveVector lDaugMomentum = fDaughterTrack->GetMomentum();
  Float_t daugMom=TMath::Sqrt(
  (lDaugMomentum.fX)*(lDaugMomentum.fX)+
  (lDaugMomentum.fY)*(lDaugMomentum.fY)+
  (lDaugMomentum.fZ)*(lDaugMomentum.fZ));

  return TMath::Sin(fKinkAngle[2])*daugMom ;
}

//______________________________________________________________________________
void AliEveKink::MakeKink()
{
  // Set all dependant components for drawing.

  SetPoint(0, fRecKinkPosition.fX, fRecKinkPosition.fY, fRecKinkPosition.fZ);

  fMotherTrack->MakeTrack();
  fDaughterTrack->MakeTrack();

}


/***********************************************************************
*
*  AliEveKinkList class
*
************************************************************************/

ClassImp(AliEveKinkList)

//______________________________________________________________________________
AliEveKinkList::AliEveKinkList() :
  TEveElementList(),
  fRnrStyleMoth(0),
  fRnrStyleDaugh(0),
  fRnrKinkDaughter(kTRUE),
  fRnrKinkvtx(kTRUE),
  fMothColor(0),
  fDaugColor(0),
  fMinRCut(0),
  fMaxRCut(300),
  fMinKinkAngle(0),
  fMaxKinkAngle(300),
  fMinPt(0),
  fMaxPt(20),
  fMinInvariantMass(0),
  fMaxInvariantMass(1.0),
  fDaugCheckedPid(0),
  fDaugCheckedProb(0)
{
  // Default constructor.

  fChildClass = AliEveKink::Class(); // override member from base TEveElementList
}

//______________________________________________________________________________
AliEveKinkList::AliEveKinkList(TEveTrackPropagator* rsMoth,TEveTrackPropagator* rsDaugh) :
  TEveElementList(),
  fRnrStyleMoth(rsMoth),
  fRnrStyleDaugh(rsDaugh),
  fRnrKinkDaughter(kTRUE),
  fRnrKinkvtx(kTRUE),
  fMothColor(0),
  fDaugColor(0),
  fMinRCut(0),
  fMaxRCut(300),
  fMinKinkAngle(0),
  fMaxKinkAngle(300),
  fMinPt(0),
  fMaxPt(20),
  fMinInvariantMass(0),
  fMaxInvariantMass(1.0),
  fDaugCheckedPid(0),
  fDaugCheckedProb(0)
{
  // Constructor with given track-propagator..

  fChildClass = AliEveKink::Class(); // override member from base TEveElementList

  Init();
}

//______________________________________________________________________________
AliEveKinkList::AliEveKinkList(const Text_t* name, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh) :
  TEveElementList(),
  fRnrStyleMoth(rsMoth),
  fRnrStyleDaugh(rsDaugh),
  fRnrKinkDaughter(kTRUE),
  fRnrKinkvtx(kTRUE),
  fMothColor(0),
  fDaugColor(0),
  fMinRCut(0),
  fMaxRCut(300),
  fMinKinkAngle(0),
  fMaxKinkAngle(300),
  fMinPt(0),
  fMaxPt(20),
  fMinInvariantMass(0),
  fMaxInvariantMass(1.0),
  fDaugCheckedPid(0),
  fDaugCheckedProb(0)
{
  // Standard constructor.

  fChildClass = AliEveKink::Class(); // override member from base TEveElementList

  Init();
  SetName(name);
}

//______________________________________________________________________________
void AliEveKinkList::Init()
{
  // Initialize members needed for drawing operations.

  if (fRnrStyleMoth== 0) fRnrStyleMoth = new TEveTrackPropagator;
  if (fRnrStyleDaugh== 0) fRnrStyleDaugh = new TEveTrackPropagator;
}

/******************************************************************************/

//______________________________________________________________________________
void AliEveKinkList::MakeKinks()
{
  // Call MakeKink() for all elements.

  for(List_i i=fChildren.begin(); i!=fChildren.end(); ++i) {
    ((AliEveKink*)(*i))->MakeKink();
  }
  gEve->Redraw3D();
}

/******************************************************************************/

//______________________________________________________________________________
void AliEveKinkList::FilterByRadius(Float_t minR, Float_t maxR)
{
  // Select visibility of elements based on their axial radius.

  fMinRCut = minR;
  fMaxRCut = maxR;

  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
  {
    AliEveKink* kink = (AliEveKink*) *i;
    Float_t  rad = kink->GetKinkRadius();
    Bool_t  show = rad >= fMinRCut && rad <= fMaxRCut;
    kink->SetRnrState(show);
  }
  ElementChanged();
  gEve->Redraw3D();
}

/******************************************************************************/

//______________________________________________________________________________
void AliEveKinkList::FilterByKinkAngle(Float_t minKinkAngle, Float_t maxKinkAngle)
{
  // Select visibility of elements based on the kink angle.

  fMinKinkAngle = minKinkAngle;
  fMaxKinkAngle = maxKinkAngle;

  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
  {
    AliEveKink* kink = (AliEveKink*) *i;
    Float_t  angle = TMath::RadToDeg()*kink->GetKinkAngle(2);
    Bool_t  show = angle >= fMinKinkAngle && angle <= fMaxKinkAngle;
    kink->SetRnrState(show);
  }
  ElementChanged();
  gEve->Redraw3D();
}

/******************************************************************************/

//______________________________________________________________________________
void AliEveKinkList::FilterByPt(Float_t minPt, Float_t maxPt)
{
  // Select visibility of elements based on the kink pt.

  fMinPt = minPt;
  fMaxPt = maxPt;

  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
  {
    AliEveKink* kink = (AliEveKink*) *i;
    Float_t  pt = kink->GetKinkPMotherPerp();
    Bool_t  show = pt >= fMinPt && pt <= fMaxPt;
    kink->SetRnrState(show);
  }
  ElementChanged();
  gEve->Redraw3D();
}

//______________________________________________________________________________
void AliEveKinkList::FilterByInvariantMass(Float_t minInvariantMass, Float_t maxInvariantMass, Int_t dPdgCode)
{
  // Select visibility of elements based on the kink invariant mass.

  fMinInvariantMass = minInvariantMass;
  fMaxInvariantMass = maxInvariantMass;

  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
  {
    AliEveKink* kink = (AliEveKink*) *i;
    Float_t  invMass = kink->GetInvMass(dPdgCode);
    Bool_t  show = invMass >= fMinInvariantMass && invMass <= fMaxInvariantMass;
    kink->SetRnrState(show);
  }
  ElementChanged();
  gEve->Redraw3D();
}

//______________________________________________________________________________
void AliEveKinkList::FilterByCheckedPidMinProb(Int_t rFlag, Int_t rPid, Float_t rProb)
{
  // Select visibility of elements based on the kink daughter PID.

  fDaugCheckedPid  = rPid;
  fDaugCheckedProb = rProb;

  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
  {
    AliEveKink* kink = (AliEveKink*) *i;
    Int_t   pid  = 0;
    Float_t prob = 0;
    Bool_t  show = kFALSE;

    pid  = kink->GetDaugMaxProbPdg();
    prob = kink->GetDaugMaxProbPid();
    show = (pid == fDaugCheckedPid && prob > fDaugCheckedProb) || !rFlag ;

    kink->SetRnrState(show);
  }
  ElementChanged();
  gEve->Redraw3D();
}
 AliEveKink.cxx:1
 AliEveKink.cxx:2
 AliEveKink.cxx:3
 AliEveKink.cxx:4
 AliEveKink.cxx:5
 AliEveKink.cxx:6
 AliEveKink.cxx:7
 AliEveKink.cxx:8
 AliEveKink.cxx:9
 AliEveKink.cxx:10
 AliEveKink.cxx:11
 AliEveKink.cxx:12
 AliEveKink.cxx:13
 AliEveKink.cxx:14
 AliEveKink.cxx:15
 AliEveKink.cxx:16
 AliEveKink.cxx:17
 AliEveKink.cxx:18
 AliEveKink.cxx:19
 AliEveKink.cxx:20
 AliEveKink.cxx:21
 AliEveKink.cxx:22
 AliEveKink.cxx:23
 AliEveKink.cxx:24
 AliEveKink.cxx:25
 AliEveKink.cxx:26
 AliEveKink.cxx:27
 AliEveKink.cxx:28
 AliEveKink.cxx:29
 AliEveKink.cxx:30
 AliEveKink.cxx:31
 AliEveKink.cxx:32
 AliEveKink.cxx:33
 AliEveKink.cxx:34
 AliEveKink.cxx:35
 AliEveKink.cxx:36
 AliEveKink.cxx:37
 AliEveKink.cxx:38
 AliEveKink.cxx:39
 AliEveKink.cxx:40
 AliEveKink.cxx:41
 AliEveKink.cxx:42
 AliEveKink.cxx:43
 AliEveKink.cxx:44
 AliEveKink.cxx:45
 AliEveKink.cxx:46
 AliEveKink.cxx:47
 AliEveKink.cxx:48
 AliEveKink.cxx:49
 AliEveKink.cxx:50
 AliEveKink.cxx:51
 AliEveKink.cxx:52
 AliEveKink.cxx:53
 AliEveKink.cxx:54
 AliEveKink.cxx:55
 AliEveKink.cxx:56
 AliEveKink.cxx:57
 AliEveKink.cxx:58
 AliEveKink.cxx:59
 AliEveKink.cxx:60
 AliEveKink.cxx:61
 AliEveKink.cxx:62
 AliEveKink.cxx:63
 AliEveKink.cxx:64
 AliEveKink.cxx:65
 AliEveKink.cxx:66
 AliEveKink.cxx:67
 AliEveKink.cxx:68
 AliEveKink.cxx:69
 AliEveKink.cxx:70
 AliEveKink.cxx:71
 AliEveKink.cxx:72
 AliEveKink.cxx:73
 AliEveKink.cxx:74
 AliEveKink.cxx:75
 AliEveKink.cxx:76
 AliEveKink.cxx:77
 AliEveKink.cxx:78
 AliEveKink.cxx:79
 AliEveKink.cxx:80
 AliEveKink.cxx:81
 AliEveKink.cxx:82
 AliEveKink.cxx:83
 AliEveKink.cxx:84
 AliEveKink.cxx:85
 AliEveKink.cxx:86
 AliEveKink.cxx:87
 AliEveKink.cxx:88
 AliEveKink.cxx:89
 AliEveKink.cxx:90
 AliEveKink.cxx:91
 AliEveKink.cxx:92
 AliEveKink.cxx:93
 AliEveKink.cxx:94
 AliEveKink.cxx:95
 AliEveKink.cxx:96
 AliEveKink.cxx:97
 AliEveKink.cxx:98
 AliEveKink.cxx:99
 AliEveKink.cxx:100
 AliEveKink.cxx:101
 AliEveKink.cxx:102
 AliEveKink.cxx:103
 AliEveKink.cxx:104
 AliEveKink.cxx:105
 AliEveKink.cxx:106
 AliEveKink.cxx:107
 AliEveKink.cxx:108
 AliEveKink.cxx:109
 AliEveKink.cxx:110
 AliEveKink.cxx:111
 AliEveKink.cxx:112
 AliEveKink.cxx:113
 AliEveKink.cxx:114
 AliEveKink.cxx:115
 AliEveKink.cxx:116
 AliEveKink.cxx:117
 AliEveKink.cxx:118
 AliEveKink.cxx:119
 AliEveKink.cxx:120
 AliEveKink.cxx:121
 AliEveKink.cxx:122
 AliEveKink.cxx:123
 AliEveKink.cxx:124
 AliEveKink.cxx:125
 AliEveKink.cxx:126
 AliEveKink.cxx:127
 AliEveKink.cxx:128
 AliEveKink.cxx:129
 AliEveKink.cxx:130
 AliEveKink.cxx:131
 AliEveKink.cxx:132
 AliEveKink.cxx:133
 AliEveKink.cxx:134
 AliEveKink.cxx:135
 AliEveKink.cxx:136
 AliEveKink.cxx:137
 AliEveKink.cxx:138
 AliEveKink.cxx:139
 AliEveKink.cxx:140
 AliEveKink.cxx:141
 AliEveKink.cxx:142
 AliEveKink.cxx:143
 AliEveKink.cxx:144
 AliEveKink.cxx:145
 AliEveKink.cxx:146
 AliEveKink.cxx:147
 AliEveKink.cxx:148
 AliEveKink.cxx:149
 AliEveKink.cxx:150
 AliEveKink.cxx:151
 AliEveKink.cxx:152
 AliEveKink.cxx:153
 AliEveKink.cxx:154
 AliEveKink.cxx:155
 AliEveKink.cxx:156
 AliEveKink.cxx:157
 AliEveKink.cxx:158
 AliEveKink.cxx:159
 AliEveKink.cxx:160
 AliEveKink.cxx:161
 AliEveKink.cxx:162
 AliEveKink.cxx:163
 AliEveKink.cxx:164
 AliEveKink.cxx:165
 AliEveKink.cxx:166
 AliEveKink.cxx:167
 AliEveKink.cxx:168
 AliEveKink.cxx:169
 AliEveKink.cxx:170
 AliEveKink.cxx:171
 AliEveKink.cxx:172
 AliEveKink.cxx:173
 AliEveKink.cxx:174
 AliEveKink.cxx:175
 AliEveKink.cxx:176
 AliEveKink.cxx:177
 AliEveKink.cxx:178
 AliEveKink.cxx:179
 AliEveKink.cxx:180
 AliEveKink.cxx:181
 AliEveKink.cxx:182
 AliEveKink.cxx:183
 AliEveKink.cxx:184
 AliEveKink.cxx:185
 AliEveKink.cxx:186
 AliEveKink.cxx:187
 AliEveKink.cxx:188
 AliEveKink.cxx:189
 AliEveKink.cxx:190
 AliEveKink.cxx:191
 AliEveKink.cxx:192
 AliEveKink.cxx:193
 AliEveKink.cxx:194
 AliEveKink.cxx:195
 AliEveKink.cxx:196
 AliEveKink.cxx:197
 AliEveKink.cxx:198
 AliEveKink.cxx:199
 AliEveKink.cxx:200
 AliEveKink.cxx:201
 AliEveKink.cxx:202
 AliEveKink.cxx:203
 AliEveKink.cxx:204
 AliEveKink.cxx:205
 AliEveKink.cxx:206
 AliEveKink.cxx:207
 AliEveKink.cxx:208
 AliEveKink.cxx:209
 AliEveKink.cxx:210
 AliEveKink.cxx:211
 AliEveKink.cxx:212
 AliEveKink.cxx:213
 AliEveKink.cxx:214
 AliEveKink.cxx:215
 AliEveKink.cxx:216
 AliEveKink.cxx:217
 AliEveKink.cxx:218
 AliEveKink.cxx:219
 AliEveKink.cxx:220
 AliEveKink.cxx:221
 AliEveKink.cxx:222
 AliEveKink.cxx:223
 AliEveKink.cxx:224
 AliEveKink.cxx:225
 AliEveKink.cxx:226
 AliEveKink.cxx:227
 AliEveKink.cxx:228
 AliEveKink.cxx:229
 AliEveKink.cxx:230
 AliEveKink.cxx:231
 AliEveKink.cxx:232
 AliEveKink.cxx:233
 AliEveKink.cxx:234
 AliEveKink.cxx:235
 AliEveKink.cxx:236
 AliEveKink.cxx:237
 AliEveKink.cxx:238
 AliEveKink.cxx:239
 AliEveKink.cxx:240
 AliEveKink.cxx:241
 AliEveKink.cxx:242
 AliEveKink.cxx:243
 AliEveKink.cxx:244
 AliEveKink.cxx:245
 AliEveKink.cxx:246
 AliEveKink.cxx:247
 AliEveKink.cxx:248
 AliEveKink.cxx:249
 AliEveKink.cxx:250
 AliEveKink.cxx:251
 AliEveKink.cxx:252
 AliEveKink.cxx:253
 AliEveKink.cxx:254
 AliEveKink.cxx:255
 AliEveKink.cxx:256
 AliEveKink.cxx:257
 AliEveKink.cxx:258
 AliEveKink.cxx:259
 AliEveKink.cxx:260
 AliEveKink.cxx:261
 AliEveKink.cxx:262
 AliEveKink.cxx:263
 AliEveKink.cxx:264
 AliEveKink.cxx:265
 AliEveKink.cxx:266
 AliEveKink.cxx:267
 AliEveKink.cxx:268
 AliEveKink.cxx:269
 AliEveKink.cxx:270
 AliEveKink.cxx:271
 AliEveKink.cxx:272
 AliEveKink.cxx:273
 AliEveKink.cxx:274
 AliEveKink.cxx:275
 AliEveKink.cxx:276
 AliEveKink.cxx:277
 AliEveKink.cxx:278
 AliEveKink.cxx:279
 AliEveKink.cxx:280
 AliEveKink.cxx:281
 AliEveKink.cxx:282
 AliEveKink.cxx:283
 AliEveKink.cxx:284
 AliEveKink.cxx:285
 AliEveKink.cxx:286
 AliEveKink.cxx:287
 AliEveKink.cxx:288
 AliEveKink.cxx:289
 AliEveKink.cxx:290
 AliEveKink.cxx:291
 AliEveKink.cxx:292
 AliEveKink.cxx:293
 AliEveKink.cxx:294
 AliEveKink.cxx:295
 AliEveKink.cxx:296
 AliEveKink.cxx:297
 AliEveKink.cxx:298
 AliEveKink.cxx:299
 AliEveKink.cxx:300
 AliEveKink.cxx:301
 AliEveKink.cxx:302
 AliEveKink.cxx:303
 AliEveKink.cxx:304
 AliEveKink.cxx:305
 AliEveKink.cxx:306
 AliEveKink.cxx:307
 AliEveKink.cxx:308
 AliEveKink.cxx:309
 AliEveKink.cxx:310
 AliEveKink.cxx:311
 AliEveKink.cxx:312
 AliEveKink.cxx:313
 AliEveKink.cxx:314
 AliEveKink.cxx:315
 AliEveKink.cxx:316
 AliEveKink.cxx:317
 AliEveKink.cxx:318
 AliEveKink.cxx:319
 AliEveKink.cxx:320
 AliEveKink.cxx:321
 AliEveKink.cxx:322
 AliEveKink.cxx:323
 AliEveKink.cxx:324
 AliEveKink.cxx:325
 AliEveKink.cxx:326
 AliEveKink.cxx:327
 AliEveKink.cxx:328
 AliEveKink.cxx:329
 AliEveKink.cxx:330
 AliEveKink.cxx:331
 AliEveKink.cxx:332
 AliEveKink.cxx:333
 AliEveKink.cxx:334
 AliEveKink.cxx:335
 AliEveKink.cxx:336
 AliEveKink.cxx:337
 AliEveKink.cxx:338
 AliEveKink.cxx:339
 AliEveKink.cxx:340
 AliEveKink.cxx:341
 AliEveKink.cxx:342
 AliEveKink.cxx:343
 AliEveKink.cxx:344
 AliEveKink.cxx:345
 AliEveKink.cxx:346
 AliEveKink.cxx:347
 AliEveKink.cxx:348
 AliEveKink.cxx:349
 AliEveKink.cxx:350
 AliEveKink.cxx:351
 AliEveKink.cxx:352
 AliEveKink.cxx:353
 AliEveKink.cxx:354
 AliEveKink.cxx:355
 AliEveKink.cxx:356
 AliEveKink.cxx:357
 AliEveKink.cxx:358
 AliEveKink.cxx:359
 AliEveKink.cxx:360
 AliEveKink.cxx:361
 AliEveKink.cxx:362
 AliEveKink.cxx:363
 AliEveKink.cxx:364
 AliEveKink.cxx:365