* AliEveMagField
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 31 Mar 2009 18:26:37 +0000 (18:26 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 31 Mar 2009 18:26:37 +0000 (18:26 +0000)
New class that provides a bridge between AliMagF and EVE track
propagator.

* alice-macros/kine_tracks.C
* alice-macros/esd_tracks.C
Use true magnetic field for track extrapolation.
Global macro variables can be used to switch back to constant field as
well as to use RK stepper (which can't count number of orbits at the moment).

EVE/EveBase/AliEveMagField.cxx [new file with mode: 0644]
EVE/EveBase/AliEveMagField.h [new file with mode: 0644]
EVE/EveBase/EveBaseLinkDef.h
EVE/alice-macros/esd_tracks.C
EVE/alice-macros/kine_tracks.C

diff --git a/EVE/EveBase/AliEveMagField.cxx b/EVE/EveBase/AliEveMagField.cxx
new file mode 100644 (file)
index 0000000..1b7e91b
--- /dev/null
@@ -0,0 +1,47 @@
+// $Id$
+// Author: Matevz Tadel 2009
+
+/**************************************************************************
+ * Copyright(c) 1998-2009, ALICE Experiment at CERN, all rights reserved. *
+ * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
+ * full copyright notice.                                                 *
+ **************************************************************************/
+
+#include "AliEveMagField.h"
+#include "AliEveEventManager.h"
+
+#include <AliMagF.h>
+
+//______________________________________________________________________________
+// Full description of AliEveMagField
+//
+
+ClassImp(AliEveMagField)
+
+//______________________________________________________________________________
+AliEveMagField::AliEveMagField(AliMagF* mf) :
+  TEveMagField(),
+  fField(mf)
+{
+  // Constructor.
+
+  if (fField == 0)
+  {
+    fField = AliEveEventManager::AssertMagField();
+  }
+}
+
+//______________________________________________________________________________
+TEveVector AliEveMagField::GetField(Float_t x, Float_t y, Float_t z) const
+{
+  // Return magnetic field at requested point.
+
+  Double_t rb[3] = { x, y, z };
+  Double_t bb[3];
+
+  fField->Field(rb, bb);
+
+  TEveVector b(bb);
+  b *= -0.1f;
+  return b;
+}
diff --git a/EVE/EveBase/AliEveMagField.h b/EVE/EveBase/AliEveMagField.h
new file mode 100644 (file)
index 0000000..0bf67d3
--- /dev/null
@@ -0,0 +1,39 @@
+// $Id$
+// Author: Matevz Tadel 2009
+
+/**************************************************************************
+ * Copyright(c) 1998-2009, ALICE Experiment at CERN, all rights reserved. *
+ * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
+ * full copyright notice.                                                 *
+ **************************************************************************/
+
+#ifndef AliEveMagField_H
+#define AliEveMagField_H
+
+#include "TEveTrackPropagator.h"
+
+class AliMagF;
+
+//______________________________________________________________________________
+// Short description of AliEveMagField
+//
+
+class AliEveMagField : public TEveMagField
+{
+public:
+  AliEveMagField(AliMagF* mf=0);
+  virtual ~AliEveMagField() {}
+
+  virtual TEveVector GetField(Float_t x, Float_t y, Float_t z) const;
+
+protected:
+  AliMagF *fField; //! Pointer to the magnetic field.
+
+private:
+  AliEveMagField(const AliEveMagField&);            // Not implemented
+  AliEveMagField& operator=(const AliEveMagField&); // Not implemented
+
+  ClassDef(AliEveMagField, 0); // Short description.
+};
+
+#endif
index 53aa0b8..10c3032 100644 (file)
@@ -23,7 +23,7 @@
 #pragma link C++ class AliEveMacroExecutorWindow+;
 
 #pragma link C++ class AliEveKineTools+;
-
+#pragma link C++ class AliEveMagField+;
 #pragma link C++ class AliEveVSDCreator+;
 
 // AliEveTrack
index 498ed30..ca616b7 100644 (file)
 // Use inner-tpc track params when its refit failed.
 Bool_t g_esd_tracks_use_ip_on_failed_its_refit = kFALSE;
 
+// Use magnetic-field as retrieved from GRP.
+Bool_t g_esd_tracks_true_field = kTRUE;
+
+// Use Runge-Kutta track stepper.
+Bool_t g_esd_tracks_rk_stepper = kFALSE;
+
+
+//==============================================================================
+
+void esd_track_propagator_setup(TEveTrackPropagator* trkProp,
+                               Float_t magF, Float_t maxR)
+{
+  if (g_esd_tracks_true_field)
+  {
+    trkProp->SetMagFieldObj(new AliEveMagField);
+  }
+  else
+  {
+    trkProp->SetMagField(magF);
+  }
+  if (g_esd_tracks_rk_stepper)
+  {
+    trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
+  }
+  trkProp->SetMaxR(maxR);
+}
+
+//==============================================================================
+
 TString esd_track_title(AliESDtrack* t)
 {
   TString s;
@@ -51,6 +80,8 @@ TString esd_track_title(AliESDtrack* t)
   return s;
 }
 
+//==============================================================================
+
 void esd_track_add_param(AliEveTrack* track, AliExternalTrackParam* tp)
 {
   // Add additional track parameters as a path-mark to track.
@@ -68,6 +99,8 @@ void esd_track_add_param(AliEveTrack* track, AliExternalTrackParam* tp)
   track->AddPathMark(pm);
 }
 
+//==============================================================================
+
 TEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
 {
   // Make a standard track representation and put it into given container.
@@ -117,15 +150,20 @@ TEveTrack* esd_make_track(AliESDtrack *at, TEveTrackList* cont)
   return track;
 }
 
+
+//==============================================================================
+// esd_tracks()
+//==============================================================================
+
 TEveTrackList* esd_tracks()
 {
   AliESDEvent* esd = AliEveEventManager::AssertESD();
 
   TEveTrackList* cont = new TEveTrackList("ESD Tracks");
   cont->SetMainColor(6);
-  TEveTrackPropagator* trkProp = cont->GetPropagator();
-  trkProp->SetMagField(0.1*esd->GetMagneticField());
-  trkProp->SetMaxR    (520);
+
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
 
   gEve->AddElement(cont);
 
@@ -173,9 +211,10 @@ TEveElementList* esd_tracks_MI()
   return cont;
 }
 
-/******************************************************************************/
+
+//==============================================================================
 // esd_tracks_from_array()
-/******************************************************************************/
+//==============================================================================
 
 TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
 {
@@ -186,9 +225,9 @@ TEveTrackList* esd_tracks_from_array(TCollection* col, AliESDEvent* esd=0)
 
   TEveTrackList* cont = new TEveTrackList("ESD Tracks");
   cont->SetMainColor(6);
-  TEveTrackPropagator* trkProp = cont->GetPropagator();
-  trkProp->SetMagField(0.1*esd->GetMagneticField());
-  trkProp->SetMaxR    (520);
+
+  esd_track_propagator_setup(cont->GetPropagator(),
+                            0.1*esd->GetMagneticField(), 520);
 
   gEve->AddElement(cont);
 
@@ -229,9 +268,10 @@ void esd_tracks_alianalcuts_demo()
   esd_tracks_from_array(atc.GetAcceptedTracks(esd), esd);
 }
 
-/******************************************************************************/
+
+//==============================================================================
 // esd_tracks_by_category
-/******************************************************************************/
+//==============================================================================
 
 Float_t get_sigma_to_vertex(AliESDtrack* esdTrack)
 {
@@ -299,50 +339,43 @@ TEveElementList* esd_tracks_by_category()
 
   tl[0] = new TEveTrackList("Sigma < 3");
   tc[0] = 0;
-  tl[0]->GetPropagator()->SetMagField(magF);
-  tl[0]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[0]->GetPropagator(), magF, maxR);
   tl[0]->SetMainColor(3);
   cont->AddElement(tl[0]);
 
   tl[1] = new TEveTrackList("3 < Sigma < 5");
   tc[1] = 0;
-  tl[1]->GetPropagator()->SetMagField(magF);
-  tl[1]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[1]->GetPropagator(), magF, maxR);
   tl[1]->SetMainColor(7);
   cont->AddElement(tl[1]);
 
   tl[2] = new TEveTrackList("5 < Sigma");
   tc[2] = 0;
-  tl[2]->GetPropagator()->SetMagField(magF);
-  tl[2]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[2]->GetPropagator(), magF, maxR);
   tl[2]->SetMainColor(46);
   cont->AddElement(tl[2]);
 
   tl[3] = new TEveTrackList("no ITS refit; Sigma < 5");
   tc[3] = 0;
-  tl[3]->GetPropagator()->SetMagField(magF);
-  tl[3]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[3]->GetPropagator(), magF, maxR);
   tl[3]->SetMainColor(41);
   cont->AddElement(tl[3]);
 
   tl[4] = new TEveTrackList("no ITS refit; Sigma > 5");
   tc[4] = 0;
-  tl[4]->GetPropagator()->SetMagField(magF);
-  tl[4]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[4]->GetPropagator(), magF, maxR);
   tl[4]->SetMainColor(48);
   cont->AddElement(tl[4]);
 
   tl[5] = new TEveTrackList("no TPC refit");
   tc[5] = 0;
-  tl[5]->GetPropagator()->SetMagField(magF);
-  tl[5]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[5]->GetPropagator(), magF, maxR);
   tl[5]->SetMainColor(kRed);
   cont->AddElement(tl[5]);
 
   tl[6] = new TEveTrackList("ITS stand-alone");
   tc[6] = 0;
-  tl[6]->GetPropagator()->SetMagField(magF);
-  tl[6]->GetPropagator()->SetMaxR    (maxR);
+  esd_track_propagator_setup(tl[6]->GetPropagator(), magF, maxR);
   tl[6]->SetMainColor(kMagenta - 9);
   cont->AddElement(tl[6]);
 
index a0adf67..a6b8b49 100644 (file)
 
 #include "TParticlePDG.h"
 
+// Use magnetic-field as retrieved from GRP.
+Bool_t g_kine_tracks_true_field = kTRUE;
+
+// Use Runge-Kutta track stepper.
+Bool_t g_kine_tracks_rk_stepper = kFALSE;
+
+
+//==============================================================================
+
+void kine_track_propagator_setup(TEveTrackPropagator* trkProp)
+{
+  AliMagF* fld = AliEveEventManager::AssertMagField();
+
+  if (g_kine_tracks_true_field)
+  {
+    trkProp->SetMagFieldObj(new AliEveMagField(fld));
+  }
+  else
+  {
+    trkProp->SetMagField(-0.1*fld->SolenoidField());
+  }
+  if (g_kine_tracks_rk_stepper)
+  {
+    trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
+  }
+}
+
+//==============================================================================
+
 TEveTrackList*
 kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
            Bool_t   pdg_col = kTRUE, Bool_t   recurse = kTRUE,
@@ -32,9 +61,7 @@ kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
   cont->SetMainColor(3);
   TEveTrackPropagator* trkProp = cont->GetPropagator();
 
-  AliMagF* fld = AliEveEventManager::AssertMagField();
-  // !!! Watch the '-', apparently different sign convention then for ESD.
-  trkProp->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
+  kine_track_propagator_setup(trkProp);
 
   gEve->AddElement(cont);
   Int_t count = 0;
@@ -223,8 +250,7 @@ kine_track(Int_t  label,
 
       TEveTrackPropagator* trkProp = tlist->GetPropagator();
 
-      AliMagF* fld = AliEveEventManager::AssertMagField();
-      trkProp->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
+      kine_track_propagator_setup(trkProp);
 
       char tooltip[1000];
       sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());