* EveBase/AliEveEventManager.cxx
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 11 Feb 2009 17:11:04 +0000 (17:11 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 11 Feb 2009 17:11:04 +0000 (17:11 +0000)
* EveBase/AliEveEventManager.h
Reintroduce AssertMagField() - somebody has to initialize it, right?
Duplicate code fro AliReconstruction for initalization of mag field.

Add support for containers of transient objects, register one via:
  static void RegisterTransientList(TEveElement* element);

* alice-macros/clusters.C
Use again the reintroduced AliEveEventManager::AssertMagField() to
make sure magnetic field is initialized.

Disable TRD - it requires reco-params to be initialized and we don't
have those.

* alice-macros/trd_qaRec.C
* alice-macros/kine_tracks.C
Use again the reintroduced AliEveEventManager::AssertMagField() to
make sure magnetic field is initialized.

* alice-macros/primary_vertex.C
Fix wrong member access operator warnings.

* EveBase/AliEveV0Editor.cxx
With Boris - new version of V0 detailed view.

EVE/EveBase/AliEveEventManager.cxx
EVE/EveBase/AliEveEventManager.h
EVE/EveBase/AliEveV0Editor.cxx
EVE/alice-macros/clusters.C
EVE/alice-macros/kine_tracks.C
EVE/alice-macros/primary_vertex.C
EVE/alice-macros/trd_qaRec.C

index 1841490..0bf8430 100644 (file)
 #include <AliMagF.h>
 #include <AliCDBManager.h>
 #include <AliCDBStorage.h>
+#include <AliCDBEntry.h>
+#include <AliGRPObject.h>
 #include <AliHeader.h>
 #include <AliGeomManager.h>
 
 #include <TFile.h>
 #include <TTree.h>
 #include <TGeoManager.h>
+#include <TGeoGlobalMagField.h>
 #include <TSystem.h>
 #include <TTimeStamp.h>
+#include <TPRegexp.h>
+#include <TError.h>
 
 //==============================================================================
 //==============================================================================
@@ -79,6 +84,10 @@ TString  AliEveEventManager::fgCdbUri("local://$ALICE_ROOT/OCDB");
 
 TList*   AliEveEventManager::fgAODfriends = 0;
 
+AliGRPObject* AliEveEventManager::fgGRPData      = 0;
+AliMagF*      AliEveEventManager::fgMagField     = 0;
+Bool_t        AliEveEventManager::fgUniformField = kFALSE;
+
 AliEveEventManager* AliEveEventManager::fgMaster  = 0;
 AliEveEventManager* AliEveEventManager::fgCurrent = 0;
 
@@ -107,7 +116,11 @@ void AliEveEventManager::InitInternals()
 
   fTransients = new TEveElementList("Transients", "Transient per-event elements.");
   fTransients->IncDenyDestroy();
-  gEve->AddToListTree(fTransients, kTRUE);
+  gEve->AddToListTree(fTransients, kFALSE);
+
+  fTransientLists = new TEveElementList("Transient Lists", "Containers of transient elements.");
+  fTransientLists->IncDenyDestroy();
+  gEve->AddToListTree(fTransientLists, kFALSE);
 }
 
 AliEveEventManager::AliEveEventManager(const TString& name) :
@@ -122,7 +135,7 @@ AliEveEventManager::AliEveEventManager(const TString& name) :
   fAutoLoad  (kFALSE), fAutoLoadTime (5.),     fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
   fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0), fTransients(0),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -143,7 +156,7 @@ AliEveEventManager::AliEveEventManager(const TString& name, const TString& path,
   fAutoLoad  (kFALSE), fAutoLoadTime (5),      fAutoLoadTimer(0),
   fIsOpen    (kFALSE), fHasEvent     (kFALSE), fExternalCtrl (kFALSE),
   fSelectOnTriggerType(kFALSE), fTriggerType(""),
-  fExecutor    (0), fTransients(0),
+  fExecutor    (0), fTransients(0), fTransientLists(0),
   fSubManagers (0),
   fAutoLoadTimerRunning(kFALSE)
 {
@@ -171,6 +184,9 @@ AliEveEventManager::~AliEveEventManager()
 
   fTransients->DecDenyDestroy();
   fTransients->Destroy();
+
+  fTransientLists->DecDenyDestroy();
+  fTransientLists->Destroy();
 }
 
 /******************************************************************************/
@@ -675,6 +691,11 @@ void AliEveEventManager::GotoEvent(Int_t event)
   // a bit gentler, checking for objs owning their external refs and having
   // additinal parents.
   fTransients->DestroyElements();
+  for (TEveElement::List_i i = fTransientLists->BeginChildren();
+       i != fTransientLists->EndChildren(); ++i)
+  {
+    (*i)->DestroyElements();
+  }
   DestroyElements();
 
   if (fESDTree) {
@@ -950,6 +971,37 @@ AliRawReader* AliEveEventManager::AssertRawReader()
   return fgCurrent->fRawReader;
 }
 
+//==============================================================================
+
+AliMagF* AliEveEventManager::AssertMagField()   
+{       
+  // Make sure AliMagF is initialized and returns it.   
+  // Throws exception in case magnetic field is not available.          
+  // Static utility for macros.         
+
+  static const TEveException kEH("AliEveEventManager::AssertMagField ");        
+                
+  if (fgMagField)
+    return fgMagField;
+
+  if (fgGRPData == 0)
+  {
+    InitGRP();
+  }
+
+  if (TGeoGlobalMagField::Instance())
+  {
+    fgMagField = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
+    if (fgMagField == 0)
+      throw kEH + "Global field set, but it is not AliMagF.";
+  }
+  else
+  {
+    throw kEH + "Could not initialize magnetic field.";
+  }
+
+  return fgMagField;    
+}
 
 TGeoManager* AliEveEventManager::AssertGeometry()
 {
@@ -1055,6 +1107,11 @@ void AliEveEventManager::RegisterTransient(TEveElement* element)
   GetCurrent()->fTransients->AddElement(element);
 }
 
+void AliEveEventManager::RegisterTransientList(TEveElement* element)
+{
+  GetCurrent()->fTransientLists->AddElement(element);
+}
+
 //------------------------------------------------------------------------------
 // Autoloading of events
 //------------------------------------------------------------------------------
@@ -1341,3 +1398,291 @@ TString AliEveEventManager::GetEventInfoVertical() const
 
   return rawInfo + "\n" + esdInfo;
 }
+
+
+//==============================================================================
+// Reading of GRP and MagneticField.
+// This is a reap-off from reconstruction ... should really be a common
+// code to do this somewhere in STEER.
+//==============================================================================
+
+Bool_t AliEveEventManager::InitGRP()
+{
+  //------------------------------------
+  // Initialization of the GRP entry 
+  //------------------------------------
+
+  static const TEveException kEH("AliEveEventManager::InitGRP ");
+
+  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
+
+  if (entry)
+  {
+    TMap* m = dynamic_cast<TMap*>(entry->GetObject());  // old GRP entry
+
+    if (m)
+    {
+      ::Info(kEH, "Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
+      fgGRPData = new AliGRPObject();
+      fgGRPData->ReadValuesFromMap(m);
+    }
+    else
+    {
+      ::Info(kEH, "Found an AliGRPObject in GRP/GRP/Data, reading it");
+      fgGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject());  // new GRP entry
+      entry->SetOwner(0);
+    }
+
+    AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
+  }
+
+  if (!fgGRPData)
+  {
+    ::Error(kEH, "No GRP entry found in OCDB!");
+    return kFALSE;
+  }
+
+  TString lhcState = fgGRPData->GetLHCState();
+  if (lhcState==AliGRPObject::GetInvalidString())
+  {
+    ::Error(kEH, "GRP/GRP/Data entry:  missing value for the LHC state ! Using UNKNOWN");
+    lhcState = "UNKNOWN";
+  }
+
+  TString beamType = fgGRPData->GetBeamType();
+  if (beamType==AliGRPObject::GetInvalidString())
+  {
+    ::Error(kEH, "GRP/GRP/Data entry:  missing value for the beam type ! Using UNKNOWN");
+    beamType = "UNKNOWN";
+  }
+
+  Float_t beamEnergy = fgGRPData->GetBeamEnergy();
+  if (beamEnergy==AliGRPObject::GetInvalidFloat())
+  {
+    ::Error(kEH, "GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
+    beamEnergy = 0;
+  }
+  beamEnergy /= 120E3; // energy is provided in MeV*120
+
+  TString runType = fgGRPData->GetRunType();
+  if (runType==AliGRPObject::GetInvalidString())
+  {
+    ::Error(kEH, "GRP/GRP/Data entry:  missing value for the run type ! Using UNKNOWN");
+    runType = "UNKNOWN";
+  }
+
+  Int_t activeDetectors = fgGRPData->GetDetectorMask();
+  if (activeDetectors==AliGRPObject::GetInvalidUInt())
+  {
+    ::Error(kEH, "GRP/GRP/Data entry:  missing value for the detector mask ! Using 1074790399");
+    activeDetectors = 1074790399;
+  }
+
+
+  // Might become useful.
+  /*
+    fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
+    printf("AliRunInfo - %s %s %f %s %d\n", lhcState.Data(), beamType.Data(), beamEnergy, runType.Data(), activeDetectors);
+    fRunInfo->Dump();
+
+
+    // Process the list of active detectors
+    if (activeDetectors) {
+    UInt_t detMask = activeDetectors;
+    fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
+    fRunTracking = MatchDetectorList(fRunTracking,detMask);
+    fFillESD = MatchDetectorList(fFillESD,detMask);
+    fQADetectors = MatchDetectorList(fQADetectors,detMask);
+    fLoadCDB.Form("%s %s %s %s",
+    fRunLocalReconstruction.Data(),
+    fRunTracking.Data(),
+    fFillESD.Data(),
+    fQADetectors.Data());
+    fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
+    if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) {
+    // switch off the vertexer
+    ::Info(kEH, "SPD is not in the list of active detectors. Vertexer switched off.");
+    fRunVertexFinder = kFALSE;
+    }
+    if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
+    // switch off the reading of CTP raw-data payload
+    if (fFillTriggerESD) {
+    ::Info(kEH, "CTP is not in the list of active detectors. CTP data reading switched off.");
+    fFillTriggerESD = kFALSE;
+    }
+    }
+    }
+
+    ::Info(kEH, "===================================================================================");
+    ::Info(kEH, "Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data());
+    ::Info(kEH, "Running tracking for detectors: %s",fRunTracking.Data());
+    ::Info(kEH, "Filling ESD for detectors: %s",fFillESD.Data());
+    ::Info(kEH, "Quality assurance is active for detectors: %s",fQADetectors.Data());
+    ::Info(kEH, "CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data());
+    ::Info(kEH, "===================================================================================");
+  */
+
+  //*** Dealing with the magnetic field map
+  if (TGeoGlobalMagField::Instance()->IsLocked())
+  {
+    ::Info(kEH, "Running with externally locked B field!");
+  }
+  else
+  {
+    // Construct the field map out of the information retrieved from GRP.
+
+    Float_t l3Current = fgGRPData->GetL3Current((AliGRPObject::Stats)0);
+    if (l3Current == AliGRPObject::GetInvalidFloat())
+      throw kEH + "GRPData entry: missing value for the L3 current!";
+    
+    Char_t l3Polarity = fgGRPData->GetL3Polarity();
+    if (l3Polarity == AliGRPObject::GetInvalidChar())
+      throw kEH + "GRPData entry: missing value for the L3 polarity!";
+
+    Float_t diCurrent = fgGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
+    if (diCurrent == AliGRPObject::GetInvalidFloat())
+      throw kEH + "GRPData entry: missing value for the dipole current!";
+
+    Char_t diPolarity = fgGRPData->GetDipolePolarity();
+    if (diPolarity == AliGRPObject::GetInvalidChar()) 
+      throw kEH + "GRPData entry: missing value for the dipole polarity!";
+
+    if (!SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1))
+      throw kEH + "Failed to create B field map!";
+
+    ::Info(kEH, "Running with the B field constructed from GRP.");
+  }
+  
+  //*** Get the diamond profiles from OCDB
+  // Eventually useful.
+
+  /*
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
+    if (entry) {
+    fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No SPD diamond profile found in OCDB!");
+    }
+
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
+    if (entry) {
+    fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No diamond profile found in OCDB!");
+    }
+
+    entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
+    if (entry) {
+    fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());  
+    } else {
+    ::Error(kEH, "No TPC diamond profile found in OCDB!");
+    }
+  */
+
+  return kTRUE;
+} 
+
+Bool_t AliEveEventManager::SetFieldMap(Float_t l3Cur, Float_t diCur,
+                                      Float_t l3Pol, Float_t diPol,
+                                      Float_t beamenergy,
+                                      const Char_t *beamtype,
+                                      const Char_t *path) 
+{
+  //------------------------------------------------
+  // The magnetic field map, defined externally...
+  // L3 current 30000 A  -> 0.5 T
+  // L3 current 12000 A  -> 0.2 T
+  // dipole current 6000 A
+  // The polarities must be the same
+  //------------------------------------------------
+
+  static const TEveException kEH("AliEveEventManager::SetFieldMap ");
+
+  const Float_t l3NominalCurrent1 = 30000.0; // (A)
+  const Float_t l3NominalCurrent2 = 12000.0; // (A)
+  const Float_t diNominalCurrent  = 6000.0;  // (A)
+
+  const Float_t tolerance = 0.03; // relative current tolerance
+  const Float_t zero      = 77.0; // "zero" current (A)
+
+  TString s = (l3Pol < 0) ? "L3: -" : "L3: +";
+
+  AliMagF::BMap_t map = AliMagF::k5kG;
+
+  double fcL3, fcDip;
+
+  l3Cur = TMath::Abs(l3Cur);
+  if (TMath::Abs(l3Cur-l3NominalCurrent1)/l3NominalCurrent1 < tolerance)
+  {
+    fcL3 = l3Cur/l3NominalCurrent1;
+    map  = AliMagF::k5kG;
+    s   += "0.5 T;  ";
+  }
+  else if (TMath::Abs(l3Cur-l3NominalCurrent2)/l3NominalCurrent2 < tolerance)
+  {
+    fcL3 = l3Cur/l3NominalCurrent2;
+    map  = AliMagF::k2kG;
+    s   += "0.2 T;  ";
+  }
+  else if (l3Cur <= zero)
+  {
+    fcL3 = 0;
+    map  = AliMagF::k5kGUniform;
+    s   += "0.0 T;  ";
+    fgUniformField = kTRUE; // track with the uniform (zero) B field
+  }
+  else
+  {
+    ::Error(kEH, "Wrong L3 current (%f A)!", l3Cur);
+    return kFALSE;
+  }
+
+  diCur = TMath::Abs(diCur);
+  if (TMath::Abs(diCur-diNominalCurrent)/diNominalCurrent < tolerance)
+  {
+    // 3% current tolerance...
+    fcDip = diCur/diNominalCurrent;
+    s    += "Dipole ON";
+  }
+  else if (diCur <= zero)
+  { // some small current..
+    fcDip = 0.;
+    s    += "Dipole OFF";
+  }
+  else
+  {
+    ::Error(kEH, "Wrong dipole current (%f A)!", diCur);
+    return kFALSE;
+  }
+
+  if (l3Pol != diPol && (map==AliMagF::k5kG || map==AliMagF::k2kG) && fcDip != 0)
+  {
+    ::Error(kEH, "L3 and Dipole polarities must be the same");
+    return kFALSE;
+  }
+
+  if (l3Pol<0) fcL3  = -fcL3;
+  if (diPol<0) fcDip = -fcDip;
+
+  AliMagF::BeamType_t btype = AliMagF::kNoBeamField;
+  TString btypestr = beamtype;
+  btypestr.ToLower();
+
+  TPRegexp protonBeam("(proton|p)\\s*-?\\s*\\1");
+  TPRegexp ionBeam   ("(lead|pb|ion|a)\\s*-?\\s*\\1");
+
+  if (btypestr.Contains(ionBeam))
+    btype = AliMagF::kBeamTypeAA;
+  else if (btypestr.Contains(protonBeam))
+    btype = AliMagF::kBeamTypepp;
+  else
+    ::Info(kEH, "Cannot determine the beam type from %s, assume no LHC magnet field",
+          beamtype);
+
+  AliMagF* fld = new AliMagF("MagneticFieldMap", s.Data(), 2, fcL3, fcDip, 10., map, path, 
+                            btype,beamenergy);
+  TGeoGlobalMagField::Instance()->SetField(fld);
+  TGeoGlobalMagField::Instance()->Lock();
+
+  return kTRUE;
+}
index 092a220..0e398a6 100644 (file)
@@ -22,6 +22,7 @@ class AliESDfriend;
 class AliAODEvent;
 class AliRawReader;
 
+class AliGRPObject;
 class AliMagF;
 
 class TFile;
@@ -91,6 +92,7 @@ public:
   static AliAODEvent*  AssertAOD();
   static AliRawReader* AssertRawReader();
 
+  static AliMagF*      AssertMagField();
   static TGeoManager*  AssertGeometry();
 
   static AliEveEventManager* AddDependentManager(const TString& name, const TString& path);
@@ -99,7 +101,8 @@ public:
   static AliEveEventManager* GetMaster();
   static AliEveEventManager* GetCurrent();
 
-  static void                RegisterTransient(TEveElement* element);
+  static void                RegisterTransient    (TEveElement* element);
+  static void                RegisterTransientList(TEveElement* element);
 
 
   Double_t      GetAutoLoadTime()        const { return fAutoLoadTime; }
@@ -153,6 +156,7 @@ protected:
   AliEveMacroExecutor *fExecutor;       // Executor for std macros
 
   TEveElementList     *fTransients;     // Container for additional transient (per event) elements.
+  TEveElementList     *fTransientLists; // Container for lists of transient (per event) elements.
 
   TList        *fSubManagers;           // Dependent event-managers, used for event embedding.
 
@@ -167,6 +171,10 @@ protected:
 
   static TList   *fgAODfriends;         // Global list of AOD friend names to be attached during opening of the event-data (empty by default).
 
+  static AliGRPObject *fgGRPData;       // Global run parameters.
+  static AliMagF      *fgMagField;      // Global pointer to magnetic field.
+  static Bool_t        fgUniformField;  // Track with uniform field.
+
 private:
   AliEveEventManager(const AliEveEventManager&);            // Not implemented
   AliEveEventManager& operator=(const AliEveEventManager&); // Not implemented
@@ -175,6 +183,13 @@ private:
   void StartAutoLoadTimer();
   void StopAutoLoadTimer();
 
+  static Bool_t InitGRP();
+  static Bool_t SetFieldMap(Float_t l3Cur, Float_t diCur,
+                           Float_t l3Pol, Float_t diPol,
+                           Float_t beamenergy     = 7000,
+                           const Char_t *beamtype = "pp",
+                           const Char_t *path     = "$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
+
   Bool_t fAutoLoadTimerRunning; // State of auto-load timer.
 
   static AliEveEventManager* fgMaster;
index f2e02f9..e23eb28 100644 (file)
@@ -121,29 +121,8 @@ void AliEveV0Editor::DisplayDetailed()
   pack->SetHorizontal();
 
   //
-  // This part is for the bending plane view
+  // This part is for getting the different objects to display
   //
-  pack->NewSlot()->MakeCurrent();
-  TEveViewer *bpViewer = gEve->SpawnNewViewer("V0 bending plane View");
-  TEveScene  *bpScene  = gEve->SpawnNewScene("V0 bending plane Scene");
-
-  TEveUtil::LoadMacro("geom_gentle.C");
-  Long_t result = gInterpreter->ProcessLine("geom_gentle_rphi()");
-  if (result)
-  {
-    TEveGeoShape *geomRPhi = reinterpret_cast<TEveGeoShape*>(result);
-    geomRPhi->IncDenyDestroy();
-    TEveProjectionManager *projMgr = new TEveProjectionManager();
-    projMgr->ImportElements(geomRPhi, bpScene);
-  }
-  else
-  {
-    Warning("DisplayDetailed", "Import of R-Phi geometry failed.");
-  }
-
-  bpViewer->AddScene(bpScene);
-  bpScene->AddElement(fM);
-
   char displayInfo[100] = {0};
   sprintf(displayInfo,"pt = %.3f",fM->GetPt());
   TEveLine *lv0TransverseMomentumDirection = new TEveLine(displayInfo);
@@ -151,11 +130,9 @@ void AliEveV0Editor::DisplayDetailed()
   lv0TransverseMomentumDirection->SetLineWidth(2);
   lv0TransverseMomentumDirection->SetLineStyle(2);
   lv0TransverseMomentumDirection->SetLineWidth(2);
-  Float_t scalePt = 100.;
+  Float_t scalePt = 100.; // this needs to be available as a ruler
   lv0TransverseMomentumDirection->SetPoint(0,fM->fRecDecayV.fX, fM->fRecDecayV.fY, fM->fRecDecayV.fZ);
   lv0TransverseMomentumDirection->SetPoint(1,scalePt*fM->fRecDecayP.fX, scalePt*fM->fRecDecayP.fY,0);
-  
-  bpScene->AddElement(lv0TransverseMomentumDirection);
 
   TEvePointSet *pvlocation = new TEvePointSet("PV location");
   pvlocation->SetNextPoint(fM->fRecBirthV.fX, fM->fRecBirthV.fY, fM->fRecBirthV.fZ);
@@ -163,7 +140,6 @@ void AliEveV0Editor::DisplayDetailed()
   pvlocation->SetMarkerStyle(4);
   pvlocation->SetMarkerSize(2.5);
   pvlocation->SetMarkerColor(7);
-  bpScene->AddElement(pvlocation);
 
   TEvePointSet *v0location = new TEvePointSet("V0 location");
   v0location->SetNextPoint(fM->fRecDecayV.fX, fM->fRecDecayV.fY, fM->fRecDecayV.fZ);
@@ -171,17 +147,45 @@ void AliEveV0Editor::DisplayDetailed()
   v0location->SetMarkerStyle(4);
   v0location->SetMarkerSize(2.5);
   v0location->SetMarkerColor(kOrange+8);
-  bpScene->AddElement(v0location);
 
-  // show V0 position with a marker in orange
-  // show the pv in light blue...
+  //
+  // This part is for the bending plane view
+  //
+  pack->NewSlot()->MakeCurrent();
+  TEveViewer *bpViewer = gEve->SpawnNewViewer("V0 bending plane View");
+  TEveScene  *bpScene  = gEve->SpawnNewScene("V0 bending plane Scene");
+
+  TEveUtil::LoadMacro("geom_gentle.C");
+  Long_t result = gInterpreter->ProcessLine("geom_gentle_rphi()");
+  if (result)
+  {
+    TEveGeoShape *geomRPhi = reinterpret_cast<TEveGeoShape*>(result);
+    geomRPhi->IncDenyDestroy();
+    TEveProjectionManager *projMgr = new TEveProjectionManager();
+    projMgr->ImportElements(geomRPhi, bpScene);
+  }
+  else
+  {
+    Warning("DisplayDetailed", "Import of R-Phi geometry failed.");
+  }
+
+  bpViewer->AddScene(bpScene);
+  bpScene->AddElement(fM);
+  bpScene->AddElement(lv0TransverseMomentumDirection);
+  bpScene->AddElement(pvlocation);
+  bpScene->AddElement(v0location);
 
   // This is the to-do list for the bending plane:
   // 1. fix the view to orthographic XOY (no rotation allowed but moving the center ok) ->done! 
-  // 2. show axis and tickles along X and Y   ->done!
+  // 2. show axis and tickles along X and Y ->done!
+  //       -> note for the projection the cartesian scales are not very useful
+  //       -> propose a phi and R scale which rotates with a reset at 0;
+  //       -> propose a transformation for an eta scale (keep the z one);
   // 3. show the center, the main vertex and the detectors for this view ->done!
   // 4. show V0 direction in the bending plane with arrow length proportional to pT ->done!
   // 5. show angles with respect to axis (phi angle) ->almost.
+  // 6. show clusters in the ITS and in the TPC associated with the daughter tracks
+  //       -> include a radius cut for plotting only ITS and TPC
   bpViewer->GetGLViewer()->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
   bpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
   TGLViewer *lbpGLViewer = bpViewer->GetGLViewer();
@@ -189,8 +193,6 @@ void AliEveV0Editor::DisplayDetailed()
   co->SetShowOrthographic(true); //(false);
   co->SetOrthographicMode(TGLCameraOverlay::kAxis); // ::kPlaneIntersect or ::kBar
   // end of the bending plane part
-  
-
 
   //
   // This part is for the decay plane view
@@ -198,22 +200,49 @@ void AliEveV0Editor::DisplayDetailed()
   pack->NewSlot()->MakeCurrent();
   TEveViewer *dpViewer = gEve->SpawnNewViewer("V0 decay plane View");
   TEveScene  *dpScene  = gEve->SpawnNewScene("V0 decay plane Scene");
+
   dpViewer->AddScene(dpScene);
+
+  result = gInterpreter->ProcessLine("geom_gentle(kFALSE)");
+  if (result)
+  {
+    TEveGeoShape *geom = reinterpret_cast<TEveGeoShape*>(result);
+    geom->IncDenyDestroy();
+    geom->FindChild("TRD+TOF")->SetRnrState(kFALSE);
+    geom->FindChild("PHOS")   ->SetRnrState(kFALSE);
+    geom->FindChild("HMPID")  ->SetRnrState(kFALSE);
+    dpScene->AddElement(geom);
+  }
+  else
+  {
+    Warning("DisplayDetailed", "Import of 3D geometry failed.");
+  }
+
   dpScene->AddElement(fM);
+  dpScene->AddElement(lv0TransverseMomentumDirection);
+  dpScene->AddElement(pvlocation);
+  dpScene->AddElement(v0location);
+
   // This is the to-do list for the decay plane:
   // 1. fix the view to decay plane (no rotation allowed but moving the center ok)
-  // 2. show V0 direction with a vertical arrow length proportional to pT;
-  // 3. show the center, the main vertex and the detectors for this view;
-  // 4. show the x,y and z axis and the different angles;
+  // 2. show V0 direction with a vertical arrow length proportional to pT -> done!
+  // 3. show the center, the main vertex and the detectors for this view -> done!
+  // 4. show the x,y and z axis and the different angles
+  //       -> this needs a referential object that we can move around
+  //          or fix to a selected point (origin being the default)
   // 5. draw the dca between daughters and the extrapolation to the main vertex.
+  //       -> this is an issue since we only store the distance: check with J.Belikov
+  // 6. show clusters in the ITS and in the TPC associated with the daughter tracks
+  //       -> include a radius cut for plotting only ITS and TPC
   dpViewer->GetGLViewer()->ResetCamerasAfterNextUpdate();
   TGLCamera& dpCam = dpViewer->GetGLViewer()->CurrentCamera();
   dpCam.SetExternalCenter(kTRUE);
   dpCam.SetCenterVec(fM->fRecDecayV.fX, fM->fRecDecayV.fY, fM->fRecDecayV.fZ);
   // end of the decay plane part
 
-
+  //
   // This part is for displaying the information
+  //
   slot = pack->NewSlot();
   
   TEveWindowFrame *frame = slot->MakeFrame(new TRootEmbeddedCanvas());
index 10c5e82..ee52430 100644 (file)
@@ -21,13 +21,11 @@ void clusters()
 
   AliRunLoader *rl        = AliEveEventManager::AssertRunLoader();
   AliESDEvent  *esd       = AliEveEventManager::AssertESD();
-  AliESDfriend *esdfriend = AliEveEventManager::AssertESDfriend();
-  AliMagF      *magfield  = AliEveEventManager::AssertMagField();
+  AliEveEventManager::AssertESDfriend();
+  AliEveEventManager::AssertMagField();
 
-  AliTracker::SetFieldMap(magfield, kFALSE);
-
-  const char* detNames[] = { "ITS", "TPC", "TRD", "TOF", "HMPID" };
-  const Int_t detIds[]   = {   0,     1,     2,     3,     5   };
+  const char* detNames[] = { "ITS", "TPC", /*"TRD",*/ "TOF", "HMPID" };
+  const Int_t detIds[]   = {   0,     1,   /*  2,  */   3,     5   };
   const Int_t detN       = sizeof(detNames)/sizeof(char*);
 
   // Hack - AliReconstruction does wonders with gGeoManager.
index 3f38153..1d925b7 100644 (file)
@@ -20,7 +20,8 @@ kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
   AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
   rl->LoadKinematics();
   AliStack* stack = rl->Stack();
-  if (!stack) {
+  if (!stack)
+  {
     Error("kine_tracks.C", "can not get kinematics.");
     return 0;
   }
@@ -29,9 +30,11 @@ kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
 
   TEveTrackList* cont = new TEveTrackList("Kine Tracks");
   cont->SetMainColor(3);
-  TEveTrackPropagator* rnrStyle = cont->GetPropagator();
-  AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
-  rnrStyle->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
+  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);
 
   gEve->AddElement(cont);
   Int_t count = 0;
@@ -45,7 +48,7 @@ kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
       if (p->Pt() < min_pt && p->P() < min_p) continue;
 
       ++count;
-      TEveTrack* track = new TEveTrack(p, i, rnrStyle);
+      TEveTrack* track = new TEveTrack(p, i, trkProp);
 
       //PH The line below is replaced waiting for a fix in Root
       //PH which permits to use variable siza arguments in CINT
@@ -77,7 +80,7 @@ kine_tracks(Double_t min_pt  = 0,     Double_t min_p   = 0,
   if (use_track_refs && rl->LoadTrackRefs() == 0)
   {
     kt.SetTrackReferences(cont, rl->TreeTR(), recurse);
-    rnrStyle->SetEditPathMarks(kTRUE);
+    trkProp->SetEditPathMarks(kTRUE);
   }
   kt.SortPathMarks(cont, recurse);
 
@@ -218,15 +221,16 @@ kine_track(Int_t  label,
        (Form("Kinematics of %d", label, p->GetNDaughters()));
       cont = tlist;
 
-      TEveTrackPropagator* rnrStyle = tlist->GetPropagator();
-      // !!! Watch the '-', apparently different sign convention then for ESD.
-      AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
-      rnrStyle->SetMagField( fld ? -0.1*fld->SolenoidField() : 0 );
+      TEveTrackPropagator* trkProp = tlist->GetPropagator();
+
+      AliMagF* fld = AliEveEventManager::AssertMagField();
+      trkProp->SetMagField(fld ? -0.1*fld->SolenoidField() : 0);
+
       char tooltip[1000];
       sprintf(tooltip,"Ndaughters=%d", p->GetNDaughters());
       tlist->SetTitle(tooltip);
-      rnrStyle->fMaxOrbs = 2;
-      rnrStyle->SetEditPathMarks(kTRUE);
+      trkProp->fMaxOrbs = 2;
+      trkProp->SetEditPathMarks(kTRUE);
 
       gEve->AddElement(cont);
       rs = tlist->GetPropagator();
index a41cae3..62eedb8 100644 (file)
@@ -54,7 +54,7 @@ make_vertex_cross(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Flo
   }
   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
                x[0], x[1], x[2], e[0], e[1], e[2]);
-  ls.SetTitle(title);
+  ls->SetTitle(title);
 
   ls->AddLine(e[0], 0,    0,   -e[0], 0,    0);
   ls->AddLine(0,    e[1], 0,    0,   -e[1], 0);
@@ -84,7 +84,7 @@ make_vertex_ellipse(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, F
   }
   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
                x[0], x[1], x[2], e[0], e[1], e[2]);
-  ls.SetTitle(title);
+  ls->SetTitle(title);
 
   const Int_t   N = 32;
   const Float_t S = 2*TMath::Pi()/N;
@@ -128,7 +128,7 @@ make_vertex_box(AliESDVertex* v, Bool_t use_sigma, Float_t fx, Float_t fy, Float
   }
   title += Form("\nx=%.5f, y=%.5f, z=%.5f\nsx=%.5f, sy=%.5f, sz=%.5f",
                x[0], x[1], x[2], e[0], e[1], e[2]);
-  ls.SetTitle(title);
+  ls->SetTitle(title);
 
   // pos z
   ls->AddLine( e[0],  e[1],  e[2],  e[0], -e[1],  e[2]);
index 537e4e4..5bc4f00 100644 (file)
@@ -16,6 +16,7 @@ void trd_qaRec()
   cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
   cdb->SetRun(0);
   AliEveEventManager::AssertGeometry();
+  AliEveEventManager::AssertMagField();
 
   AliTRDReconstructor *reco = new AliTRDReconstructor();
   reco->SetRecoParam(AliTRDrecoParam::GetLowFluxParam());