]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
From Paraskevi Ganoti.
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Apr 2009 17:44:10 +0000 (17:44 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 1 Apr 2009 17:44:10 +0000 (17:44 +0000)
New classes and macros for kink visualization.
These are now enabled by default in visscan_init.C.

EVE/EveBase/AliEveKink.cxx [new file with mode: 0644]
EVE/EveBase/AliEveKink.h [new file with mode: 0644]
EVE/EveBase/AliEveKinkEditor.cxx [new file with mode: 0644]
EVE/EveBase/AliEveKinkEditor.h [new file with mode: 0644]
EVE/EveBase/AliEveKinkListEditor.cxx [new file with mode: 0644]
EVE/EveBase/AliEveKinkListEditor.h [new file with mode: 0644]
EVE/EveBase/EveBaseLinkDef.h
EVE/alice-macros/esd_kink.C [new file with mode: 0644]
EVE/alice-macros/esd_kink_points.C [new file with mode: 0644]
EVE/macros/visscan_init.C

diff --git a/EVE/EveBase/AliEveKink.cxx b/EVE/EveBase/AliEveKink.cxx
new file mode 100644 (file)
index 0000000..22d58c2
--- /dev/null
@@ -0,0 +1,376 @@
+// $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 <TEveTrack.h>
+#include <TEveManager.h>
+
+#include <TPolyLine3D.h>
+#include <TPolyMarker3D.h>
+#include <TColor.h>
+
+#include <TDatabasePDG.h>
+#include <TParticlePDG.h>
+
+#include <vector>
+
+
+/***********************************************************************
+*
+*  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 = 0;
+  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);
+}
+
+//______________________________________________________________________________
+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(),
+  fTitle(),
+  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(),
+  fTitle(),
+  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(),
+  fTitle(),
+  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)
+{
+
+    fDaugCheckedPid  = rPid;
+    fDaugCheckedProb = rProb;
+  // Select visibility of elements based on the kink daughter PID
+  for(List_i i = fChildren.begin(); i != fChildren.end(); ++i)
+  {
+    AliEveKink* kink = (AliEveKink*) *i;
+    Int_t   pid = 0;
+    Float_t prob = 0.0;
+    Bool_t  show = 0;
+      pid  = kink->GetDaugMaxProbPdg();
+      prob = kink->GetDaugMaxProbPid();
+      show = (pid == fDaugCheckedPid && prob > fDaugCheckedProb) || !rFlag ; 
+    
+    kink->SetRnrState(show);
+  }
+  ElementChanged();
+  gEve->Redraw3D();
+}
diff --git a/EVE/EveBase/AliEveKink.h b/EVE/EveBase/AliEveKink.h
new file mode 100644 (file)
index 0000000..330c5d3
--- /dev/null
@@ -0,0 +1,183 @@
+// $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.                                                 *
+ **************************************************************************/
+#ifndef AliEveKink_H
+#define AliEveKink_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               
+***************************************************************************/
+
+#include <TEveVSDStructs.h>
+#include <TEveElement.h>
+#include <TEveTrack.h>
+#include <TEveTrackPropagator.h>
+
+#include <TPolyMarker3D.h>
+#include <TPolyLine3D.h>
+
+#include <TPDGCode.h>
+
+class TH1F;
+class TH2F;
+
+class AliEveKinkList;
+
+class AliEveKink : public TEvePointSet
+{
+  friend class AliEveKinkList;
+  friend class AliEveKinkEditor;
+
+public:
+  AliEveKink();
+  AliEveKink(TEveRecTrack* tMoth, TEveRecTrack* tDaug, TEveRecKink* kink, TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh);
+  virtual ~AliEveKink();
+
+  void MakeKink();
+
+  virtual void SetMainColor(Color_t col)
+  {
+    TEvePointSet::SetMainColor(col);
+  }
+
+  void SetRnrStyleMother(TEveTrackPropagator* rsMoth)  {fRnrStyleMoth=rsMoth;}
+  void SetRnrStyleDaughter(TEveTrackPropagator* rsDaugh)  {fRnrStyleDaugh=rsDaugh;}   
+  Double_t GetKinkAngle(Int_t i) const { return fKinkAngle[i]; }
+  void SetKinkAngle(Int_t i, Double_t anglekink) {fKinkAngle[i] = anglekink; }
+  
+  Float_t GetKinkRadius() const { return fRecKinkPosition.Perp(); }
+  
+  Float_t GetKinkPMother() const { return fMotherMomentum.Mag(); }
+  Float_t GetKinkPMotherPerp() const { return fMotherMomentum.Perp(); } 
+  Float_t GetKinkPDaughter() const { return fDaughterMomentum.Mag(); }
+  
+  Float_t GetInvMass(Int_t dPdgCode) const;
+  Float_t GetQt() const;
+  
+  void SetMaxProbPdgPid(Int_t rPdg, Float_t rPid);
+  Int_t   GetDaugMaxProbPdg() const { return fDaugMaxProbPdg; }
+  Float_t GetDaugMaxProbPid() const { return fDaugMaxProbPid; }
+
+  Int_t GetESDKinkIndex() const { return fESDKinkIndex; }
+  void  SetESDKinkIndex(Int_t ind) { fESDKinkIndex = ind;}
+
+  virtual const Text_t* GetName() const    { return Form("ESDkink_%i",fESDKinkIndex); }
+  virtual const Text_t* GetTitle() const   { return Form("ESDkink_%i",fESDKinkIndex); }
+
+  TEveTrack* GetMotherTrack() { return fMotherTrack; }
+  TEveTrack* GetDaughterTrack() { return fDaughterTrack; }
+
+protected:
+  TEveVector       fRecKinkPosition;
+  TEveVector       fMotherMomentum;
+  TEveVector       fDaughterMomentum;
+
+  TEveTrack        *fMotherTrack;
+  TEveTrack        *fDaughterTrack;
+
+  TEveTrackPropagator  *fRnrStyleMoth;
+  TEveTrackPropagator  *fRnrStyleDaugh;
+  
+  Int_t             fESDKinkIndex;    // Index in ESD Kink array.
+  Double_t          fKinkAngle[3]; //
+  
+  Int_t             fDaugMaxProbPdg; // Maximum PDG probability for the daughter
+  Float_t           fDaugMaxProbPid; // Maximum PID probability for the daughter 
+
+private:
+  AliEveKink(const AliEveKink&);            // Not implemented
+  AliEveKink& operator=(const AliEveKink&); // Not implemented
+
+  ClassDef(AliEveKink, 0); // Visual representation of a AliEveKink.
+};
+
+
+/******************************************************************************/
+// AliEveKinkList
+/******************************************************************************/
+
+class AliEveKinkList : public TEveElementList
+{
+  friend class AliEveKinkListEditor;
+
+public:
+  AliEveKinkList();
+  AliEveKinkList(TEveTrackPropagator* rsMoth, TEveTrackPropagator* rsDaugh);
+  AliEveKinkList(const Text_t* name, TEveTrackPropagator* rsMoth=0, TEveTrackPropagator* rsDaugh=0);
+  virtual ~AliEveKinkList() {}
+
+  virtual const Text_t* GetTitle() const { return fTitle; }
+  virtual void SetTitle(const Text_t* t) { fTitle = t; }
+  virtual void SetTracksColor(Color_t cMoth, Color_t cDaug) {
+  fMothColor = cMoth; fDaugColor = cDaug;}
+
+  virtual Bool_t CanEditMainColor() const { return kTRUE; }
+
+  void  SetRnrStyleMoth(TEveTrackPropagator* rstMoth) { fRnrStyleMoth = rstMoth; }
+  TEveTrackPropagator* GetPropagatorMoth()        { return fRnrStyleMoth; }
+   
+  void  SetRnrStyleDaugh(TEveTrackPropagator* rstDaugh) { fRnrStyleDaugh = rstDaugh; }
+  TEveTrackPropagator* GetPropagatorDaugh()        { return fRnrStyleDaugh; }
+
+  Bool_t GetRnrKinkvtx()     const { return fRnrKinkvtx; }
+  Bool_t GetRnrKinkDaughter() const { return fRnrKinkDaughter; }   //not yet be sure about this!!!
+
+  void   MakeKinks();
+
+  void   FilterByRadius(Float_t minR, Float_t maxR);
+  void   FilterByKinkAngle(Float_t minKinkAngle, Float_t maxKinkAngle);
+  void   FilterByPt(Float_t minPt, Float_t maxPt);
+  void   FilterByInvariantMass(Float_t minPt, Float_t maxPt, Int_t dPdgCode);
+  
+  void   FilterByCheckedPidMinProb(Int_t rFlag, Int_t rPid, Float_t rProb);
+  void   SetDaugCheckedPid(Int_t rDaugCheckedPid) {fDaugCheckedPid = rDaugCheckedPid;}
+  Int_t  GetDaugCheckedPid() {return fDaugCheckedPid;}
+
+  void   SetDaugCheckedProb(Float_t rDaugCheckedProb) {fDaugCheckedProb = rDaugCheckedProb;}
+  Float_t  GetDaugCheckedProb() {return fDaugCheckedProb;}
+
+
+protected:
+  TString              fTitle;
+
+  TEveTrackPropagator *fRnrStyleMoth;
+  TEveTrackPropagator *fRnrStyleDaugh; 
+
+  Bool_t               fRnrKinkDaughter;
+  Bool_t               fRnrKinkvtx;
+
+  Color_t              fMothColor;
+  Color_t              fDaugColor;
+
+  Float_t              fMinRCut;
+  Float_t              fMaxRCut;
+
+  Float_t              fMinKinkAngle;
+  Float_t              fMaxKinkAngle;
+
+  Float_t              fMinPt;
+  Float_t              fMaxPt;
+
+  Float_t              fMinInvariantMass;
+  Float_t              fMaxInvariantMass;
+  
+  Int_t                fDaugCheckedPid;
+  Float_t              fDaugCheckedProb;  
+
+private:
+  void Init();
+
+  AliEveKinkList(const AliEveKinkList&);            // Not implemented
+  AliEveKinkList& operator=(const AliEveKinkList&); // Not implemented
+
+  ClassDef(AliEveKinkList, 0); // A list of AliEveKink objecs.
+};
+
+
+#endif
diff --git a/EVE/EveBase/AliEveKinkEditor.cxx b/EVE/EveBase/AliEveKinkEditor.cxx
new file mode 100644 (file)
index 0000000..e1a00fb
--- /dev/null
@@ -0,0 +1,144 @@
+// $Id$
+// Author: 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 "AliEveKinkEditor.h"
+#include "AliEveKink.h"
+
+#include "TVirtualPad.h"
+#include "TColor.h"
+
+// Cleanup these includes:
+#include "TGLabel.h"
+#include "TGButton.h"
+#include "TGNumberEntry.h"
+#include "TGColorSelect.h"
+#include "TGDoubleSlider.h"
+#include "TMath.h"
+
+//______________________________________________________________________________
+// GUI editor for AliEveKink.
+//
+
+ClassImp(AliEveKinkEditor)
+
+//______________________________________________________________________________
+AliEveKinkEditor::AliEveKinkEditor(const TGWindow *p, Int_t width, Int_t height,
+                               UInt_t options, Pixel_t back) :
+  TGedFrame(p, width, height, options | kVerticalFrame, back),
+  fM(0),
+  fInfoLabel0(0),
+  fInfoLabel1(0),
+  fInfoLabelDaughter(0),
+  fXButton(0)
+  // Initialize widget pointers to 0
+{
+  // Constructor.
+
+  MakeTitle("AliEveKink");
+
+  fInfoLabel0 = new TGLabel(this);
+  fInfoLabel0->SetTextJustify(kTextLeft);
+  AddFrame(fInfoLabel0, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
+                                          8, 0, 2, 0));
+
+  fInfoLabel1 = new TGLabel(this);
+  fInfoLabel1->SetTextJustify(kTextLeft);
+  AddFrame(fInfoLabel1, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
+                                          8, 0, 2, 0));
+                                         
+  fInfoLabelDaughter = new TGLabel(this);
+  fInfoLabelDaughter->SetTextJustify(kTextLeft);
+  AddFrame(fInfoLabelDaughter, new TGLayoutHints(kLHintsLeft|kLHintsExpandX,
+                                                   8, 0, 2, 0));                                         
+
+  fXButton = new TGTextButton(this, "Detailed View");
+  AddFrame(fXButton, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 0, 0));
+  fXButton->Connect("Clicked()", "AliEveKinkEditor", this, "DisplayDetailed()");
+}
+
+/******************************************************************************/
+
+//______________________________________________________________________________
+void AliEveKinkEditor::SetModel(TObject* obj)
+{
+  // Set model object.
+
+  fM = dynamic_cast<AliEveKink*>(obj);
+
+  // Set values of widgets
+  fInfoLabel0->SetText(Form("Radius = %f, Kink Angle = %f", fM->GetKinkRadius(), (fM->GetKinkAngle(2))*TMath::RadToDeg() ));
+  fInfoLabel1->SetText(Form("Mother Pt = %f", fM->GetKinkPMotherPerp()));
+  fInfoLabelDaughter->SetText(Form("Daughter Prob= %f for Pdg= %d", fM->GetDaugMaxProbPid(), fM->GetDaugMaxProbPdg()));
+}
+
+/******************************************************************************/
+
+#include <TEveManager.h>
+#include <TEveWindow.h>
+#include <TEveViewer.h>
+#include <TEveScene.h>
+
+#include <TGLCamera.h>
+#include <TGLViewer.h>
+
+#include <TLatex.h>
+#include <TRootEmbeddedCanvas.h>
+
+void AliEveKinkEditor::DisplayDetailed()
+{
+  TEveWindowSlot *slot = TEveWindow::CreateWindowMainFrame();
+  TEveWindowPack *pack = slot->MakePack();
+  pack->SetShowTitleBar(kFALSE);
+  pack->SetHorizontal();
+
+  //
+  // This part is for the bending plane view
+  //
+  pack->NewSlot()->MakeCurrent();
+  TEveViewer *bpViewer = gEve->SpawnNewViewer("Kink bending plane View");
+  TEveScene  *bpScene  = gEve->SpawnNewScene("Kink bending plane Scene");
+  bpViewer->AddScene(bpScene);
+  bpScene->AddElement(fM);
+  bpViewer->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+  bpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
+  TGLCamera& bpCam = bpViewer->GetGLViewer()->CurrentCamera();
+  bpCam.SetExternalCenter(kTRUE);
+  bpCam.SetCenterVec(fM->fRecKinkPosition.fX, fM->fRecKinkPosition.fY, fM->fRecKinkPosition.fZ);
+
+  //
+  // This part is for the decay plane view
+  //
+  pack->NewSlot()->MakeCurrent();
+  TEveViewer *dpViewer = gEve->SpawnNewViewer("Kink decay plane View");
+  TEveScene  *dpScene  = gEve->SpawnNewScene("Kink decay plane Scene");
+  dpViewer->AddScene(dpScene);
+  dpScene->AddElement(fM);
+  dpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
+  TGLCamera& dpCam = dpViewer->GetGLViewer()->CurrentCamera();
+  dpCam.SetExternalCenter(kTRUE);
+  dpCam.SetCenterVec(fM->fRecKinkPosition.fX, fM->fRecKinkPosition.fY, fM->fRecKinkPosition.fZ);
+
+  // This part is for displaying the information
+  slot = pack->NewSlot();
+  
+  TEveWindowFrame *frame = slot->MakeFrame(new TRootEmbeddedCanvas());
+  frame->SetElementName("Details");
+  
+  char info[100] = {0};
+  TLatex* ltx = new TLatex(0.1, 0.9, info);
+  ltx->SetTextSize(0.08);
+
+  sprintf(info,"radius = %.3f [cm]",fM->GetKinkRadius());
+  ltx->DrawLatex(0.1, 0.8, info);
+  sprintf(info,"mass_{K^{+, -}} = %.3f [GeV/c^{2}]",fM->GetInvMass(13));
+  ltx->DrawLatex(0.1, 0.3, info);
+
+  gEve->Redraw3D();
+}
diff --git a/EVE/EveBase/AliEveKinkEditor.h b/EVE/EveBase/AliEveKinkEditor.h
new file mode 100644 (file)
index 0000000..a578f0a
--- /dev/null
@@ -0,0 +1,52 @@
+// $Id$
+// Author: 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.                                                 *
+ **************************************************************************/
+
+#ifndef AliEveKinkEditor_H
+#define AliEveKinkEditor_H
+
+#include "TGedFrame.h"
+
+class TGButton;
+class TGCheckButton;
+class TGNumberEntry;
+class TGColorSelect;
+
+class AliEveKink;
+
+//______________________________________________________________________________
+// Short description of AliEveKinkEditor
+//
+
+class AliEveKinkEditor : public TGedFrame
+{
+public:
+  AliEveKinkEditor(const TGWindow* p=0, Int_t width=170, Int_t height=30,
+                 UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground());
+  virtual ~AliEveKinkEditor() {}
+
+  virtual void SetModel(TObject* obj);
+  void DisplayDetailed();
+
+protected:
+  AliEveKink  *fM; // Model object.
+
+  TGLabel   *fInfoLabel0; // label
+  TGLabel   *fInfoLabel1; // label
+  TGLabel   *fInfoLabelDaughter; // label  
+  
+  TGButton  *fXButton;
+
+private:
+  AliEveKinkEditor(const AliEveKinkEditor&);            // Not implemented
+  AliEveKinkEditor& operator=(const AliEveKinkEditor&); // Not implemented
+
+  ClassDef(AliEveKinkEditor, 0); // GUI editor for AliEveKink.
+};
+
+#endif
diff --git a/EVE/EveBase/AliEveKinkListEditor.cxx b/EVE/EveBase/AliEveKinkListEditor.cxx
new file mode 100644 (file)
index 0000000..382fad6
--- /dev/null
@@ -0,0 +1,176 @@
+// $Id$
+// Author: 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 "AliEveKinkListEditor.h"
+#include "AliEveKink.h"
+
+#include "TEveGValuators.h"
+
+#include "TVirtualPad.h"
+#include "TColor.h"
+
+// Cleanup these includes:
+#include "TGLabel.h"
+#include "TGButton.h"
+#include "TGNumberEntry.h"
+#include "TGColorSelect.h"
+#include "TGDoubleSlider.h"
+#include "TGComboBox.h"
+#include "TGLabel.h"
+
+//______________________________________________________________________________
+// GUI editor for AliEveKinkList.
+//
+
+ClassImp(AliEveKinkListEditor)
+
+//______________________________________________________________________________
+AliEveKinkListEditor::AliEveKinkListEditor(const TGWindow *p, Int_t width, Int_t height,
+             UInt_t options, Pixel_t back) :
+  TGedFrame(p, width, height, options | kVerticalFrame, back),
+  fM(0),
+  fMinMaxRCut(0),
+  fMinMaxKinkAngleCut (0),
+  fMinMaxPt(0),
+  fMinMaxInvariantMass(0),
+  fDaughterSpecies(0),
+  fDaughterCheckMaxPidProbability(0),
+  fDaughterLevelPidProbability(0)
+{
+  // Constructor.
+
+  MakeTitle("AliEveKinkList");
+
+   fMinMaxRCut = new TEveGDoubleValuator(this,"Radius:", 130, 0);
+   fMinMaxRCut->SetNELength(5);
+   fMinMaxRCut->SetLabelWidth(74);
+   fMinMaxRCut->Build();
+   fMinMaxRCut->GetSlider()->SetWidth(200);
+   fMinMaxRCut->SetLimits(0, 250, TGNumberFormat::kNESRealOne);
+   fMinMaxRCut->Connect("ValueSet()", "AliEveKinkListEditor", this, "DoMinMaxRCut()");
+   AddFrame(fMinMaxRCut, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
+   
+   fMinMaxKinkAngleCut = new TEveGDoubleValuator(this,"Kink Angle:", 130, 0);
+   fMinMaxKinkAngleCut->SetNELength(5);
+   fMinMaxKinkAngleCut->SetLabelWidth(74);
+   fMinMaxKinkAngleCut->Build();
+   fMinMaxKinkAngleCut->GetSlider()->SetWidth(200);
+   fMinMaxKinkAngleCut->SetLimits(0, 280, TGNumberFormat::kNESRealOne);
+   fMinMaxKinkAngleCut->Connect("ValueSet()", "AliEveKinkListEditor", this, "DoMinMaxKinkAngleCut()");
+   AddFrame(fMinMaxKinkAngleCut, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));  
+
+   fMinMaxPt = new TEveGDoubleValuator(this,"pT:", 80, 0);
+   fMinMaxPt->SetNELength(5);
+   fMinMaxPt->SetLabelWidth(74);
+   fMinMaxPt->Build();
+   fMinMaxPt->GetSlider()->SetWidth(200);
+   fMinMaxPt->SetLimits(0, 20, TGNumberFormat::kNESRealOne);
+   fMinMaxPt->Connect("ValueSet()", "AliEveKinkListEditor", this, "DoMinMaxPt()");
+   AddFrame(fMinMaxPt, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
+
+   fMinMaxInvariantMass = new TEveGDoubleValuator(this,"Inv. Mass:", 80, 0);
+   fMinMaxInvariantMass->SetNELength(5);
+   fMinMaxInvariantMass->SetLabelWidth(74);
+   fMinMaxInvariantMass->Build();
+   fMinMaxInvariantMass->GetSlider()->SetWidth(200);
+   fMinMaxInvariantMass->SetLimits(0, 1.0, TGNumberFormat::kNESRealThree);
+   fMinMaxInvariantMass->Connect("ValueSet()", "AliEveKinkListEditor", this, "DoMinMaxInvariantMass()");
+   AddFrame(fMinMaxInvariantMass, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
+   
+   TGHorizontalFrame* fDaugFrame = new TGHorizontalFrame(this);
+   TGLabel* labDaug = new TGLabel(fDaugFrame, "Daug:");
+   fDaugFrame->AddFrame(labDaug, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 1, 1, 1));
+   fDaughterSpecies = new TGComboBox(fDaugFrame);
+   fDaughterSpecies->AddEntry("e", 11);
+   fDaughterSpecies->AddEntry("mu", 13);
+   fDaughterSpecies->AddEntry("pi", 211);
+   TGListBox* lbaug = fDaughterSpecies->GetListBox();
+   lbaug->Resize(lbaug->GetWidth(), 2*18);
+   fDaughterSpecies->Resize(45, 20);
+   fDaughterSpecies->Connect("Selected(Int_t)", "AliEveKinkListEditor", this, "DoSelectDaugPid(Int_t)");
+   fDaugFrame->AddFrame(fDaughterSpecies, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
+   AddFrame(fDaugFrame);
+
+   fDaughterCheckMaxPidProbability = new TGCheckButton(fDaugFrame, "Check");
+   fDaugFrame->AddFrame(fDaughterCheckMaxPidProbability, new TGLayoutHints(kLHintsLeft, 0, 2, 1, 1));
+   fDaughterCheckMaxPidProbability->Connect("Toggled(Bool_t)", "AliEveKinkListEditor", this, "DoCheckDaugPid()");
+
+   fDaughterLevelPidProbability = new TGNumberEntry(fDaugFrame, 0.5, 3, -1, TGNumberFormat::kNESRealTwo, TGNumberFormat::kNEANonNegative,TGNumberFormat::kNELLimitMinMax, 0, 1);
+   fDaughterLevelPidProbability->Resize(50,20);
+   fDaughterLevelPidProbability->Connect("ValueSet(Long_t)", "AliEveKinkListEditor", this, "DoSelectDaugProb()");
+   fDaugFrame->AddFrame(fDaughterLevelPidProbability, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 1, 1, 1, 1)); 
+}
+
+/******************************************************************************/
+
+//______________________________________________________________________________
+void AliEveKinkListEditor::SetModel(TObject* obj)
+{
+  // Set model object.
+
+  fM = dynamic_cast<AliEveKinkList*>(obj);
+
+  // Set values of widgets
+  // fXYZZ->SetValue(fM->GetXYZZ());
+
+  fMinMaxRCut->SetValues(fM->fMinRCut, fM->fMaxRCut);
+  fMinMaxKinkAngleCut->SetValues(fM->fMinKinkAngle, fM->fMaxKinkAngle);
+  fMinMaxPt->SetValues(fM->fMinPt, fM->fMaxPt);
+  fMinMaxInvariantMass->SetValues(fM->fMinInvariantMass, fM->fMaxInvariantMass);
+}
+
+/******************************************************************************/
+
+// Implements callback/slot methods
+
+//______________________________________________________________________________
+
+void AliEveKinkListEditor::DoMinMaxRCut()
+{
+  fM->FilterByRadius(fMinMaxRCut->GetMin(), fMinMaxRCut->GetMax());
+}
+
+void AliEveKinkListEditor::DoMinMaxKinkAngleCut()
+{
+  fM->FilterByKinkAngle(fMinMaxRCut->GetMin(), fMinMaxRCut->GetMax());
+}
+
+void AliEveKinkListEditor::DoMinMaxPt()
+{
+  fM->FilterByPt(fMinMaxPt->GetMin(), fMinMaxPt->GetMax());
+}
+
+void AliEveKinkListEditor::DoMinMaxInvariantMass()
+{
+    fM->FilterByInvariantMass(fMinMaxInvariantMass->GetMin(), fMinMaxInvariantMass->GetMax(),13);
+}
+
+void AliEveKinkListEditor::DoSelectDaugPid(Int_t rDaugPid)
+{
+  fM->SetDaugCheckedPid(rDaugPid);
+  Update();
+}
+
+void AliEveKinkListEditor::DoCheckDaugPid()
+{
+  Int_t   lDaugPid  = fM->GetDaugCheckedPid();
+  Float_t lDaugProb = fM->GetDaugCheckedProb();
+  if (lDaugPid) {
+    fM->FilterByCheckedPidMinProb(fDaughterCheckMaxPidProbability->IsOn(),lDaugPid,lDaugProb);
+    printf("Selection for daughter pid %d prob %.2f \n",lDaugPid,lDaugProb);
+    Update();
+  }
+}
+
+void AliEveKinkListEditor::DoSelectDaugProb()
+{
+  Float_t rMinDaugProb = (Float_t)fDaughterLevelPidProbability->GetNumber();
+  fM->SetDaugCheckedProb(rMinDaugProb);
+  Update();
+}
diff --git a/EVE/EveBase/AliEveKinkListEditor.h b/EVE/EveBase/AliEveKinkListEditor.h
new file mode 100644 (file)
index 0000000..89dbe0e
--- /dev/null
@@ -0,0 +1,66 @@
+// $Id$
+// Author: 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.                                                 *
+ **************************************************************************/
+
+#ifndef AliEveKinkListEditor_H
+#define AliEveKinkListEditor_H
+
+#include "TGedFrame.h"
+
+class TGButton;
+class TGCheckButton;
+class TGNumberEntry;
+class TGColorSelect;
+class TEveGDoubleValuator;
+class TGComboBox;
+
+class AliEveKinkList;
+
+//______________________________________________________________________________
+// Short description of AliEveKinkListEditor
+//
+
+class AliEveKinkListEditor : public TGedFrame
+{
+public:
+  AliEveKinkListEditor(const TGWindow* p=0, Int_t width=170, Int_t height=30,
+                     UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground());
+  virtual ~AliEveKinkListEditor() {}
+
+  virtual void SetModel(TObject* obj);
+
+  // Declare callback/slot methods
+  void DoMinMaxRCut();
+  void DoMinMaxKinkAngleCut();
+  void DoMinMaxPt();
+  void DoMinMaxInvariantMass();
+  void DoSelectDaugPid(Int_t rDaugPid);
+  void DoCheckDaugPid();
+  void DoSelectDaugProb();
+
+protected:
+  AliEveKinkList            *fM; // Model object.
+
+  // Declare widgets
+  // TGSomeWidget*   fXYZZ;
+  TEveGDoubleValuator* fMinMaxRCut;
+  TEveGDoubleValuator* fMinMaxKinkAngleCut; 
+  TEveGDoubleValuator* fMinMaxPt;
+  TEveGDoubleValuator* fMinMaxInvariantMass;
+  TGComboBox*          fDaughterSpecies; 
+  TGCheckButton*       fDaughterCheckMaxPidProbability;
+  TGNumberEntry*       fDaughterLevelPidProbability;  
+
+private:
+  AliEveKinkListEditor(const AliEveKinkListEditor&);            // Not implemented
+  AliEveKinkListEditor& operator=(const AliEveKinkListEditor&); // Not implemented
+
+  ClassDef(AliEveKinkListEditor, 0); // GUI editor for AliEveKinkList.
+};
+
+#endif
index 10c303240dbc19d45b1e3ef5e40584e4a92f023e..239a982f54971dd73b583f26231702126ed198ac 100644 (file)
@@ -58,3 +58,9 @@
 #pragma link C++ class AliEveV0List+;
 #pragma link C++ class AliEveV0Editor+;
 #pragma link C++ class AliEveV0ListEditor+;
+
+// AliEveKink
+#pragma link C++ class AliEveKink+;
+#pragma link C++ class AliEveKinkList+;
+#pragma link C++ class AliEveKinkEditor+;
+#pragma link C++ class AliEveKinkListEditor+;
diff --git a/EVE/alice-macros/esd_kink.C b/EVE/alice-macros/esd_kink.C
new file mode 100644 (file)
index 0000000..a3c9df0
--- /dev/null
@@ -0,0 +1,149 @@
+// $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.                                                 *
+ **************************************************************************/
+
+void esd_kink_init_rectrackMother(TEveRecTrack& rt, AliExternalTrackParam* tp)
+{
+  Double_t pbuf[3], vbuf[3];
+
+  rt.fSign = tp->GetSign();
+  tp->GetXYZ(vbuf);     rt.fV.Set(vbuf);
+  tp->GetPxPyPz(pbuf);  rt.fP.Set(pbuf);
+  
+  rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
+}
+
+void esd_kink_init_rectrackDaughter(TEveRecTrack& rt, AliExternalTrackParam* tp, TEveVector* svt,TEveVector* spt)
+{
+  rt.fSign = tp->GetSign();
+  rt.fV.Set(*svt);
+  rt.fP.Set(*spt);
+  
+  rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
+}
+
+AliEveKink* esd_make_kink(TEveTrackPropagator* rnrStyleMoth,TEveTrackPropagator* rnrStyleDaugh, AliESDtrack* moth, AliESDtrack* daug, AliESDkink* kink, Int_t i)
+{
+  TEveRecTrack  rcMoth;
+  TEveRecTrack  rcDaug;
+  TEveRecKink   rcKink;
+  
+  const TVector3 p1(kink->GetMotherP());
+  rcKink.fPMother.Set(p1);
+  const TVector3 p2(kink->GetDaughterP());
+  rcKink.fPDaughter.Set(p2);
+
+  const TVector3 r1(kink->GetPosition());
+  rcKink.fVKink.Set(r1);
+  
+  for (Int_t j=0; j<3; ++j) rckink.fKinkAngle[j]=kink->GetAngle(j);
+  
+  Double_t r[3], r2[3];
+
+  moth->GetTPCInnerParam()->GetXYZ(r2);  rcKink.fVMother.Set(r2);
+  daug->GetOuterParam()->GetXYZ(r);  rcKink.fVDaughter.Set(r);
+
+  esd_kink_init_rectrackMother(rcMoth, (moth->GetTPCInnerParam()));  
+  rcMoth.fIndex = moth->GetID();
+  
+  esd_kink_init_rectrackDaughter(rcDaug, daug->GetOuterParam(), &rcKink.fVKink, &rcKink.fPDaughter);
+  rcDaug.fIndex = daug->GetID();
+  
+  AliEveKink* myKink = new AliEveKink(&rcMoth, &rcDaug, &rcKink, rnrStyleMoth,rnrStyleDaugh);
+  
+  myKink->SetElementName(Form("ESDkink %d  \n", i));
+  myKink->SetESDKinkIndex(i);
+  for (Int_t j=0; j<3; ++j) myKink->SetKinkAngle(j, kink->GetAngle(j));
+  Double_t daugProbability[10];
+  Double_t daugP = 0.0;
+  daug->GetESDpid(daugProbability);
+  daugP = daug->P();
+
+  // ****** Tentative particle type "concentrations"
+  Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
+  AliPID::SetPriors(c);
+
+  AliPID daugPid(daugProbability);
+
+  Int_t   daugMostProbPdg =  0;
+
+  switch (daugPid.GetMostProbable()){
+  case 0:
+    daugMostProbPdg =   11; break;
+  case 1:
+    daugMostProbPdg =   13; break;
+  case 2:
+    daugMostProbPdg =  211; break;
+  default :
+    daugMostProbPdg =  13; break;
+  }
+
+  Float_t daugMaxProbPid  = daugPid.GetProbability(daugPid.GetMostProbable());
+
+  myKink->SetMaxProbPdgPid(daugMostProbPdg,daugMaxProbPid);//????????????
+
+  return myKink;
+} 
+
+
+AliEveKinkList* esd_kink()
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+  AliEveKinkList* cont = new AliEveKinkList("ESD kink");
+  cont->SetMainColor(3); // green
+  TEveTrackPropagator* rnrStyleMoth = cont->GetPropagatorMoth();
+  rnrStyleMoth->SetMagField( 0.1*esd->GetMagneticField() );
+  TEveTrackPropagator* rnrStyleDaugh = cont->GetPropagatorDaugh();
+  rnrStyleDaugh->SetMagField( 0.1*esd->GetMagneticField() ); 
+  rnrStyleDaugh->SetMaxR(520);
+  gEve->AddElement(cont);
+
+  Int_t count = 0;
+//   for (Int_t n=0; n<esd->GetNumberOfKinks(); ++n) 
+//   {
+//     AliESDkink *kink = esd->GetKink(n);  //???????????
+//     printf("kink number = %d,  label of mother = %d , label of daug = %d --", n, kink->GetLabel(0), kink->GetLabel(1));
+//   }   To be investigated...
+    for (Int_t n=0; n<esd->GetNumberOfTracks(); ++n)
+    { 
+         AliESDtrack* mtrack = esd->GetTrack(n);
+         if(mtrack->GetKinkIndex(0)<0){
+    
+         AliESDkink *kink = new AliESDkink;
+    
+         kink=esd->GetKink(TMath::Abs(mtrack->GetKinkIndex(0))-1);
+      
+         for (Int_t m=0; m<esd->GetNumberOfTracks(); ++m)
+         { 
+              AliESDtrack * dtrack = esd->GetTrack(m);
+
+              if((dtrack->GetKinkIndex(0)>0)&&(dtrack->GetKinkIndex(0)==TMath::Abs(mtrack->GetKinkIndex(0)))) {
+              AliESDtrack* mothTr = esd->GetTrack(n);
+              AliESDtrack* daugTr = esd->GetTrack(m);
+      
+              AliEveKink* myKink = esd_make_kink(rnrStyleMoth, rnrStyleDaugh, mothTr, daugTr, kink, (TMath::Abs(mtrack->GetKinkIndex(0))-1));
+              if (myKink)
+              {
+                 gEve->AddElement(myKink, cont);
+                 ++count;
+              }
+              }
+         }  // inner track loop
+    
+         }  //mother kink index <0
+    } // Outer track loop
+
+  cont->SetTitle("test");
+
+  cont->MakeKinks();
+  gEve->Redraw3D();
+
+  return cont;
+}
diff --git a/EVE/alice-macros/esd_kink_points.C b/EVE/alice-macros/esd_kink_points.C
new file mode 100644 (file)
index 0000000..16c704a
--- /dev/null
@@ -0,0 +1,43 @@
+// $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.                                                 *
+ **************************************************************************/
+
+void esd_kink_fill_pointset(TEvePointSet* ps)
+{
+  AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+  for (Int_t n=0; n<esd->GetNumberOfTracks(); ++n)
+  { 
+      AliESDtrack* track = esd->GetTrack(n);
+      if(track->GetKinkIndex(0)<0){
+    
+          AliESDkink *kink = esd->GetKink(TMath::Abs(track->GetKinkIndex(0))-1);
+         const TVector3 Position(kink->GetPosition());
+         ps->SetNextPoint(Position.X(), Position.Y(), Position.Z());
+          ps->SetPointId(kink);
+      }
+  }
+
+}
+
+TEvePointSet* esd_kink_points()
+{
+  TEvePointSet* points = new TEvePointSet("Kink vertex locations");
+
+  esd_kink_fill_pointset(points);
+
+  points->SetTitle(Form("N=%d", points->Size()));
+  points->SetMarkerStyle(4);
+  points->SetMarkerSize(1.5);
+  points->SetMarkerColor(kOrange+8);
+
+  gEve->AddElement(points);
+  gEve->Redraw3D();
+
+  return points;
+}
index ee21f4ef0bd89422c184fe53f4d837f5a84602fb..e0cc6e15395b963a2ee515a370eac5638a8525a3 100644 (file)
@@ -187,6 +187,8 @@ void visscan_init(Bool_t show_extra_geo=kFALSE)
   exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC V0",   "esd_V0.C",              "esd_V0"));
   exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC CSCD", "esd_cascade_points.C",  "esd_cascade_points"));
   exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC CSCD", "esd_cascade.C",         "esd_cascade"));
+  exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC KINK", "esd_kink_points.C",     "esd_kink_points"));
+  exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC KINK", "esd_kink.C",            "esd_kink"));
 
   exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC Track", "esd_tracks.C", "esd_tracks",             "", kFALSE));
   exec->AddMacro(new AliEveMacro(AliEveMacro::kESD, "REC Track", "esd_tracks.C", "esd_tracks_MI",          "", kFALSE));