]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
authorhristov <Peter.Hristov@cern.ch>
Tue, 4 Feb 2014 16:54:51 +0000 (17:54 +0100)
committerhristov <Peter.Hristov@cern.ch>
Tue, 4 Feb 2014 16:54:51 +0000 (17:54 +0100)
20 files changed:
ANALYSIS/ESDfilter/AliAnalysisTaskESDfilter.cxx
ITS/UPGRADE/AliITSUSuze02.cxx
ITS/UPGRADE/AliITSUSuze02.h
ITS/UPGRADE/AliITSUv1Layer.cxx
PWGDQ/dielectron/macrosLMEE/AddTask_Remi_LMEEPbPb2011AOD_SemiCent1.C
PWGGA/PHOSTasks/ClusterSelection/AliPHOSClusterSelectionTask.cxx [new file with mode: 0644]
PWGGA/PHOSTasks/ClusterSelection/AliPHOSClusterSelectionTask.h
PWGHF/hfe/AliAnalysisTaskFlowITSTPCTOFQCSP.h
PWGHF/hfe/AliAnalysisTaskFlowTPCEMCalQCSP.h
PWGHF/hfe/AliHFEpidQA.cxx
PWGJE/EMCALJetTasks/AliJetModelBaseTask.cxx
STEER/AOD/AliAODEvent.cxx
STEER/AOD/AliAODEvent.h
STEER/AOD/AliAODInputHandler.cxx
STEER/AOD/AliAODTrack.h
STEER/ESD/AliESDEvent.cxx
STEER/ESD/AliESDEvent.h
STEER/ESD/AliESDInputHandler.cxx
STEER/ESD/AliESDtrack.h
STEER/STEERBase/AliVTrack.h

index 994e6b79d434272e31c06a6d391d992b41ae4eeb..fca0f556f91a89f862744d1e85ca3f005dd279f8 100644 (file)
@@ -2194,7 +2194,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD()
   // loop over events and fill them
   // Multiplicity information needed by the header (to be revised!)
   Int_t nTracks    = esd->GetNumberOfTracks();
-  for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
+
+// The line below should not be needed anymore (tracks already connected)
+//  for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
 
   // Update the header
   Int_t nV0s      = esd->GetNumberOfV0s();
index c5d18bf2c36cb8caee5e1ea40a6fe654e0f85478..a988cf86624f9173f93db4e3be0b29bf8f853208 100644 (file)
 
 ClassImp(AliITSUSuze02)
 
-AliITSUSuze02::AliITSUSuze02(Int_t Nrows, Int_t Ncols) {
-  if(Ncols%(kNumberOfFSBB*kNumberOfHalfFSBB)==0){  
-    fNRowsModule=Nrows;
-    fNColsModule=Ncols;
-    fModule=new TMatrixF(fNRowsModule,fNColsModule); 
-    
-    fNWindowsPer32colsMax=0;
-    fNWindowsPerHalfFSBBMax=0;
-    fNWindowsPerFSBBMax=0;
-    
-    fTestColumnSize=2;
-    fTestRowSize=2;
-  }
-  else{
+AliITSUSuze02::AliITSUSuze02(Int_t Nrows, Int_t Ncols):
+  fNRowsModule(Nrows),
+  fNColsModule(Ncols),
+  fModule(new TMatrixF(Nrows,Ncols)), 
+  fTestColumnSize(2),
+  fTestRowSize(2),
+  fNWindowsPer32colsMax(0),
+  fNWindowsPerHalfFSBBMax(0),
+  fNWindowsPerFSBBMax(0),
+  fNDigitsEncoded(0), 
+  fNEncodedWindows(0),
+  fNDigitsLost(0),
+  fNLostWindows(0),
+  fDataSizePerModule(0),
+  fNWindowsPer32colsMin(0),
+  fNWindowsPerHalfFSBBMin(0),
+  fNWindowsPerFSBBMin(0)
+{
+  if (Ncols%(kNumberOfFSBB*kNumberOfHalfFSBB) != 0) {
     printf("Number of columns should be multiple of %d. SUZE matrix wasn't created\n",kNumberOfFSBB*kNumberOfHalfFSBB);
   }
 }  
   
+AliITSUSuze02::AliITSUSuze02(const AliITSUSuze02& suze): 
+  fNRowsModule(suze.fNRowsModule),
+  fNColsModule(suze.fNColsModule),
+  fModule(new TMatrixF(*suze.fModule)), 
+  fTestColumnSize(suze.fTestColumnSize),
+  fTestRowSize(suze.fTestRowSize),
+  fNWindowsPer32colsMax(suze.fNWindowsPer32colsMax),
+  fNWindowsPerHalfFSBBMax(suze.fNWindowsPerHalfFSBBMax),
+  fNWindowsPerFSBBMax(suze.fNWindowsPerFSBBMax),
+  fNDigitsEncoded(suze.fNDigitsEncoded), 
+  fNEncodedWindows(suze.fNEncodedWindows),
+  fNDigitsLost(suze.fNDigitsLost),
+  fNLostWindows(suze.fNLostWindows),
+  fDataSizePerModule(suze.fDataSizePerModule),
+  fNWindowsPer32colsMin(suze.fNWindowsPer32colsMin),
+  fNWindowsPerHalfFSBBMin(suze.fNWindowsPerHalfFSBBMin),
+  fNWindowsPerFSBBMin(suze.fNWindowsPerFSBBMin)
+{
+}
+
+AliITSUSuze02 &AliITSUSuze02::operator=(const AliITSUSuze02& suze) {
+  if (&suze == this) return *this;
+
+  fNRowsModule = suze.fNRowsModule;
+  fNColsModule = suze.fNColsModule;
+  fModule = new TMatrixF(*suze.fModule);  
+  fTestColumnSize = suze.fTestColumnSize;
+  fTestRowSize = suze.fTestRowSize;
+  fNWindowsPer32colsMax = suze.fNWindowsPer32colsMax;
+  fNWindowsPerHalfFSBBMax = suze.fNWindowsPerHalfFSBBMax;
+  fNWindowsPerFSBBMax = suze.fNWindowsPerFSBBMax;
+  fNDigitsEncoded = suze.fNDigitsEncoded;
+  fNEncodedWindows = suze.fNEncodedWindows;
+  fNDigitsLost = suze.fNDigitsLost;
+  fNLostWindows = suze.fNLostWindows;
+  fDataSizePerModule = suze.fDataSizePerModule;
+  fNWindowsPer32colsMin = suze.fNWindowsPer32colsMin;
+  fNWindowsPerHalfFSBBMin = suze.fNWindowsPerHalfFSBBMin;
+  fNWindowsPerFSBBMin = suze.fNWindowsPerFSBBMin;
+
+  return *this;
+}
+
 AliITSUSuze02::~AliITSUSuze02() {
   if(fModule) delete fModule;
 }
index 8f9fa5191d425bf13d15cd38a45d2765a5e84b52..ef9350aef0450ffaf7316be5185b7259099c3e63 100644 (file)
@@ -16,6 +16,8 @@
 class AliITSUSuze02{
   public:
   AliITSUSuze02(Int_t Nrows, Int_t Ncols);
+  AliITSUSuze02(const AliITSUSuze02& suze);
+  AliITSUSuze02 &operator=(const AliITSUSuze02& suze);
   virtual ~AliITSUSuze02();
   
   void SetEncodingWindowSize(Int_t Wrows, Int_t Wcols);
index 05153c83b72b743b5d817766b3e59825a05e66b4..a4ed8fc82ee4fce1f3ec2dea61d988d6a1647b91 100644 (file)
@@ -2243,7 +2243,7 @@ TGeoVolume* AliITSUv1Layer::CreateSpaceFrameOuterB0(const Double_t xlen,
   
   TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,alpha*TMath::RadToDeg());
   //AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
-  AddTranslationToCombiTrans(ctSideR, 0, ladderHeight/2-2.85/*2.765250/*triangleHeight*/, 0);
+  AddTranslationToCombiTrans(ctSideR, 0, ladderHeight/2-2.85/*2.765250*//*triangleHeight*/, 0);
   TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,-alpha*TMath::RadToDeg());
   //AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
   AddTranslationToCombiTrans(ctSideL, 0, ladderHeight/2-2.85/*triangleHeight*/, 0);
index acbcc4bd1252e2fd98853f8530338c1a61d9b4fc..208cbab57d9113e925cc14582a0b61bb03d29fab 100644 (file)
@@ -1,4 +1,4 @@
-AliAnalysisTask *AddTask_Remi_LMEEPbPb2011AODSemiCent1(Char_t* outputFileName="LMEEoutput.root", Bool_t runAll=kFALSE,Bool_t setMC=kFALSE,Bool_t getFromAlien=kFALSE, Bool_t PIDbaseline=kFALSE, Bool_t rejOnly=kTRUE) {
+AliAnalysisTask *AddTask_Remi_LMEEPbPb2011AOD_SemiCent1(Char_t* outputFileName="LMEEoutput.root", Bool_t runAll=kFALSE,Bool_t setMC=kFALSE,Bool_t getFromAlien=kFALSE, Bool_t PIDbaseline=kFALSE, Bool_t rejOnly=kTRUE) {
 
   Bool_t bESDANA=kFALSE; //Autodetect via InputHandler
   //get the current analysis manager
diff --git a/PWGGA/PHOSTasks/ClusterSelection/AliPHOSClusterSelectionTask.cxx b/PWGGA/PHOSTasks/ClusterSelection/AliPHOSClusterSelectionTask.cxx
new file mode 100644 (file)
index 0000000..9031efb
--- /dev/null
@@ -0,0 +1,122 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+#include "TBits.h"
+#include "TRefArray.h"
+
+#include "AliVCluster.h"
+
+// Analysis task to fill histograms with PHOS ESD or AOD clusters and cells
+// Authors : Henrik Qvigstad
+// Date    : 28.05.2011
+/* $Id$ */
+
+#include "AliPHOSClusterSelectionTask.h"
+ClassImp(AliPHOSClusterSelectionTask);
+
+AliPHOSClusterSelectionTask::AliPHOSClusterSelectionTask(const char* name = "AliPHOSClusterSelectionTask")
+  : AliAnalysisTaskSE(name), 
+    fClusters(0x0)
+{
+  return;
+}
+
+AliPHOSClusterSelectionTask::~AliPHOSClusterSelectionTask()
+{
+  delete fClusters;
+}
+  
+void AliPHOSClusterSelectionTask::UserCreateOutputObjects()
+{
+  //TODO: implement
+  return;
+}
+
+void AliPHOSClusterSelectionTask::UserExec(Option_t *option)
+{
+  AliVEvent* event = InputEvent();
+  
+  if( 0x0 == fClusters ) fClusters = new TRefArray;
+  // Get PHOS Clusters
+  event->GetPHOSClusters( fClusters );
+  
+  // Remove Clusters
+  for(int index = 0; index < fClusters->GetEntriesFast(); ++index) {
+    AliVCluster* cluster = (AliVCluster*) fClusters->At(iClu);
+    
+    if( cluster->E() < kMinClusterEnergy // Low Energy Clusters
+       || cluster->GetDistanceToBadChannel() < kMinBCDistance // to close to Bad Channel
+       || cluster->GetNCells() < kMinNCells // to few cells
+       || cluster->GetM02() < kMinM02 
+       ) 
+      fClusters->RemoveAt(index);
+  }
+  
+  // Compact array after removel of clusters
+  fClusters->Compact();
+}
+
+TRefArray* AliPHOSClusterSelectionTask::GetPHOSClusters() const
+{
+  return fClusters;
+}
+
+TBits* AliPHOSClusterSelectionTask::GetPHOSClustersSelected(const AliPHOSClusterSelection* selection)
+{
+  int nClu = fClusters->GetEntriesFast();
+  
+  static TBits* sBits = 0x0;
+  if( 0x0 == sBits ) sBits = new TBits(nClu);
+
+  if( sBits->GetNbits != nClu ){
+    delete sBits;
+    sBits = new TBits( nClu );
+  }
+
+  
+  // Determine selection:
+  for(int iClu = 0; iClu < nClu; ++iClu) {
+    AliVCluster* cluster = (AliVCluster*) fClusters->At(iClu);
+    bool sel = selection->IsSelected(cluster);
+    sBits->SetBitNumber(iClu, sel);
+  }
+  
+  return sBits;
+
+
+  // TMap initialization
+  if( 0x0 == fSelectionMap ) {
+    fSelectionMap = new TMap;
+    fSelectionMap->SetOwnerValue(true);
+  }
+
+  // Fetch Selection Bits
+  TObject* value = fSelectionMap->GetValue(selection);
+}
+
+
+static AliPHOSClusterSelectionTask* AliPHOSClusterSelectionTask::GetTask(const char* name)
+{
+  // Get AliPHOSClusterSelectionTask from AliAnalysisManager
+  
+  AliAnalysisManager* analysisManager = dynamic_cast<AliAnalysisManager*>(AliAnalysisManager::GetAnalysisManager());
+  AliAnalysisTask* task = analysisManager->GetTask(name);
+  if( !task ) AliWarning( Form("No task with name: %s", name) );
+
+  AliPHOSClusterSelectionTask* stask = dynamic_cast<AliAnalysisTask*>(task);
+  if( !stask) AliWarning( Form("No AliPHOSClusterSelectionTask with name: %s", name) );
+  
+  return stask;
+}
index d8527730204b7cd6908295f3a905fb7e13991729..2a356635c463a43068d466fee6d3350594c710e1 100644 (file)
@@ -5,13 +5,17 @@
  * See cxx source for full Copyright notice                               */
 
 // Analysis Task for selecting PHOS clusters for other analysis
+// Makes some basic selections cuts, universal to all PHOS Analysis.
+// Additional selection cuts can be applied via AliPHOSClusterSelection.
+// 
 // Authors : Henrik Qvigstad
 // Date    : 16.01.2014
 /* $Id$ */
 
-class AliVCluster;
+class TBits;
+class TRefArray;
 
-#include "TArrayI.h"
+class AliVCluster;
 
 #include "AliAnalysisTaskSE.h"
 
@@ -24,14 +28,22 @@ class AliPHOSClusterSelectionTask : AliAnalysisTaskSE {
   virtual void   UserExec(Option_t *option);
   /* virtual void   Terminate(Option_t *); */
 
-  int GetNClusters() const; // Number of clusters in the current event
-  AliVCluster* GetCluster(int index) const; // get cluster of index
-  TArrayI GetIndexOfSelected(const AliPHOSClusterSelection* selection) const;
+  TRefArray* GetPHOSClusters() const;
+  virtual TBits* GetPHOSClustersSelected(const AliPHOSClusterSelection* selection);
+
+  static AliPHOSClusterSelectionTask* GetTask(const char* name = "AliPHOSClusterSelectionTask");
 
  protected:
   AliPHOSClusterSelectionTask(const AliPHOSClusterSelectionTask&); // not implemented
   AliPHOSClusterSelectionTask& operator=(const AliPHOSClusterSelectionTask&); // not implemented
 
+  TRefArray* fClusters;
+
+  // cluster cut variables:
+  static const Double_t kMinClusterEnergy;
+  static const Double_t kMinBCDistance;  //distance to nearest bad channel
+  static const Int_t    kMinNCells;
+  static const Double_t kMinM02;
   
   ClassDef(AliPHOSClusterSelectionTask, 1);
 };
index bb793b79f540ce13a5ed3b8fb6c5319e202c858b..6a3a07c7a9684d9f363b979f5e81e7ad8b11b610 100755 (executable)
@@ -90,7 +90,7 @@ private:
     AliHFEpidQAmanager   *fPIDqa; //! PID QA manager
     AliFlowTrackCuts     *fCutsRP; // track cuts for reference particles
     AliFlowTrackCuts     *fNullCuts; // dummy cuts for flow event tracks
-    AliFlowEvent         *fFlowEvent; // flow events Inclusive e
+    AliFlowEvent         *fFlowEvent; //! flow events Inclusive e
     const char           *fkCentralityMethod; // method used to determine centrality (V0 by default)
     Double_t             fCentrality; // event centrality for QA
     Double_t             fCentralityMin; // lower bound of cenrality bin
index 80da9bd483c255dc50c785d088e86ba805bc01fe..55f015ee6062fb25fcb3df7f91dc8e5c67e5346a 100644 (file)
@@ -98,7 +98,7 @@ private:
     AliHFEpidQAmanager   *fPIDqa;               //! PID QA manager
     AliFlowTrackCuts     *fCutsRP; // track cuts for reference particles
     AliFlowTrackCuts     *fNullCuts; // dummy cuts for flow event tracks
-    AliFlowEvent         *fFlowEvent; // flow events Inclusive e
+    AliFlowEvent         *fFlowEvent; //! flow events Inclusive e
     const char           *fkCentralityMethod; // method used to determine centrality (V0 by default)
     Double_t             fCentrality; // event centrality for QA
     Double_t             fCentralityMin; // lower bound of cenrality bin
index f1f823440beaadae43c98daa6ec1ffb831e81752..f1bc16b7a2c85ce1127842fde637c7d934d822c0 100644 (file)
@@ -923,7 +923,7 @@ void AliHFEpidQA::FillPIDresponse(const TObjArray * const particles, Int_t speci
        
        // time of flight QA
        // - distribution of (time - t0 - pion_time)
-       Double_t times[5];
+       Double_t times[AliPID::kSPECIESC];
        esdTrack->GetIntegratedTimes(times);
        Double_t tItrackL = esdTrack->GetIntegratedLength();
        Double_t tTOFsignal = esdTrack->GetTOFsignal();
index 0fc94aba8adb6593a3c68c26238714561c8dd31d..e16dfde950c8a2a161d2b9e58f33d74614a58d2f 100644 (file)
@@ -181,12 +181,14 @@ void AliJetModelBaseTask::UserExec(Option_t *)
   if (vert)
     vert->GetXYZ(fVertex);
 
-  if (fOutTracks)
-    fOutTracks->Delete();
-  if (fOutClusters)
-    fOutClusters->Delete();
-  if (fOutMCParticles)
-    fOutMCParticles->Delete();
+  if (fCopyArray) {
+    if (fOutTracks)
+      fOutTracks->Delete();
+    if (fOutClusters)
+      fOutClusters->Delete();
+    if (fOutMCParticles)
+      fOutMCParticles->Delete();
+  }
 
   if (fDensitySpectrum) {
     fNTracks = TMath::Nint(fDensitySpectrum->GetRandom());
index c0f71b458572c92abe70b89e1dc11c9e942816e3..c4efafe16def0b13e5d3ed374d8e8ce5a0dd0218 100644 (file)
@@ -65,6 +65,7 @@ AliAODEvent::AliAODEvent() :
   fAODObjects(0),
   fAODFolder(0),
   fConnected(kFALSE),
+  fTracksConnected(kFALSE),
   fHeader(0),
   fTracks(0),
   fVertices(0),
@@ -97,6 +98,7 @@ AliAODEvent::AliAODEvent(const AliAODEvent& aod):
   fAODObjects(new TList()),
   fAODFolder(0),
   fConnected(kFALSE),
+  fTracksConnected(kFALSE),
   fHeader(new AliAODHeader(*aod.fHeader)),
   fTracks(new TClonesArray(*aod.fTracks)),
   fVertices(new TClonesArray(*aod.fVertices)),
@@ -142,6 +144,7 @@ AliAODEvent::AliAODEvent(const AliAODEvent& aod):
   AddObject(fTOFHeader);
   AddObject(fTrdTracks);
   fConnected = aod.fConnected;
+  ConnectTracks();
   GetStdContent();
   CreateStdFolders();
 }
@@ -238,6 +241,8 @@ AliAODEvent & AliAODEvent::operator=(const AliAODEvent& aod) {
     }
   }  
   fConnected = aod.fConnected;
+  fTracksConnected = kFALSE;
+  ConnectTracks();
   return *this;
 }
 
@@ -271,6 +276,15 @@ void AliAODEvent::AddObject(TObject* obj)
   }
 }
 
+//______________________________________________________________________________
+Int_t AliAODEvent::AddTrack(const AliAODTrack* trk)
+{
+// Add new AOD track. Make sure to set the event if needed.
+  AliAODTrack *track =  new((*fTracks)[fTracks->GetEntriesFast()]) AliAODTrack(*trk);
+  track->SetAODEvent(this);
+  return fTracks->GetEntriesFast()-1;
+}  
+
 //______________________________________________________________________________
 void AliAODEvent::RemoveObject(TObject* obj) 
 {
@@ -359,6 +373,7 @@ void AliAODEvent::SetStdNames()
   }
 } 
 
+//______________________________________________________________________________
 void AliAODEvent::CreateStdFolders()
 {
     // Create the standard folder structure
@@ -409,19 +424,20 @@ void AliAODEvent::GetStdContent()
 
 //______________________________________________________________________________
 void AliAODEvent::ResetStd(Int_t trkArrSize, 
-                          Int_t vtxArrSize, 
-                          Int_t v0ArrSize,
-                          Int_t cascadeArrSize,
-                          Int_t jetSize, 
-                          Int_t caloClusSize, 
-                          Int_t fmdClusSize, 
-                          Int_t pmdClusSize,
-                           Int_t hmpidRingsSize,
-                          Int_t dimuonArrSize,
-                          Int_t nTrdTracks
+            Int_t vtxArrSize, 
+            Int_t v0ArrSize,
+            Int_t cascadeArrSize,
+            Int_t jetSize, 
+            Int_t caloClusSize, 
+            Int_t fmdClusSize, 
+            Int_t pmdClusSize,
+            Int_t hmpidRingsSize,
+            Int_t dimuonArrSize,
+            Int_t nTrdTracks
                           )
 {
   // deletes content of standard arrays and resets size 
+  fTracksConnected = kFALSE;
   if (fTracks) {
     fTracks->Delete();
     if (trkArrSize > fTracks->GetSize()) 
@@ -493,11 +509,13 @@ void AliAODEvent::ResetStd(Int_t trkArrSize,
 
 }
 
+//______________________________________________________________________________
 void AliAODEvent::ClearStd()
 {
   // clears the standard arrays
   if (fHeader)
     fHeader        ->Clear();
+  fTracksConnected = kFALSE;
   if (fTracks)
     fTracks        ->Delete();
   if (fVertices)
@@ -858,6 +876,7 @@ void AliAODEvent::Print(Option_t *) const
   return;
 }
 
+//______________________________________________________________________________
 void AliAODEvent::AssignIDtoCollection(const TCollection* col)
 {
     // Static method which assigns a ID to each object in a collection
@@ -870,6 +889,7 @@ void AliAODEvent::AssignIDtoCollection(const TCollection* col)
        TProcessID::AssignID(obj);
 }
 
+//______________________________________________________________________________
 Bool_t AliAODEvent::IsPileupFromSPDInMultBins() const {
     Int_t nTracklets=GetTracklets()->GetNumberOfTracklets();
     if(nTracklets<20) return IsPileupFromSPD(3,0.8);
@@ -877,13 +897,13 @@ Bool_t AliAODEvent::IsPileupFromSPDInMultBins() const {
     else return IsPileupFromSPD(5,0.8);
 }
 
+//______________________________________________________________________________
 void AliAODEvent::Reset()
 {
   // Handle the cases
   // Std content + Non std content
 
   ClearStd();
-
   if(fAODObjects->GetSize()>kAODListN){
     // we have non std content
     // this also covers aodfriends
@@ -995,3 +1015,14 @@ AliAODHMPIDrings *AliAODEvent::GetHMPIDring(Int_t nRings) const
 AliAODTrdTrack& AliAODEvent::AddTrdTrack(const AliVTrdTrack *track) {
   return *(new ((*fTrdTracks)[fTrdTracks->GetEntriesFast()]) AliAODTrdTrack(*track));
 }
+
+//______________________________________________________________________________
+void AliAODEvent::ConnectTracks() {
+// Connect tracks to this event
+  if (fTracksConnected || !fTracks || !fTracks->GetEntriesFast()) return;
+  AliAODTrack *track;
+  TIter next(fTracks);
+  while ((track=(AliAODTrack*)next())) track->SetAODEvent(this);
+  fTracksConnected = kTRUE;
+}
+
index 2ae56777c43c34cdc51aa844cb25be6e2032adde..2b6e39e1cdc7eb3c017b0c3305795d222e99b7aa 100644 (file)
@@ -81,6 +81,7 @@ class AliAODEvent : public AliVEvent {
   TList        *GetList()                const { return fAODObjects; }
   void          SetConnected(Bool_t conn=kTRUE) {fConnected=conn;}
   Bool_t        GetConnected() const {return fConnected;}
+  Bool_t        AreTracksConnected() const {return fTracksConnected;}
 
   // -- Header
   AliAODHeader *GetHeader()              const { return fHeader; }
@@ -139,11 +140,11 @@ class AliAODEvent : public AliVEvent {
 
   // -- Tracks
   TClonesArray *GetTracks()              const { return fTracks; }
+  void          ConnectTracks();
   Int_t         GetNTracks()             const { return fTracks? fTracks->GetEntriesFast() : 0; }
   Int_t         GetNumberOfTracks()      const { return GetNTracks(); }
-  AliAODTrack  *GetTrack(Int_t nTrack)   const { if(fTracks && fTracks->UncheckedAt(nTrack)) ((AliAODTrack*)fTracks->UncheckedAt(nTrack))->SetAODEvent(this);return fTracks ? (AliAODTrack*)fTracks->UncheckedAt(nTrack):0; }
-  Int_t         AddTrack(const AliAODTrack* trk)
-    {new((*fTracks)[fTracks->GetEntriesFast()]) AliAODTrack(*trk); return fTracks->GetEntriesFast()-1;}
+  AliAODTrack  *GetTrack(Int_t nTrack)   const { return fTracks ? (AliAODTrack*)fTracks->UncheckedAt(nTrack):0; }
+  Int_t         AddTrack(const AliAODTrack* trk);
   Int_t         GetMuonTracks(TRefArray *muonTracks) const;
   Int_t         GetNumberOfMuonTracks() const;
 
@@ -312,6 +313,7 @@ class AliAODEvent : public AliVEvent {
   TList   *fAODObjects; //  list of AODObjects
   TFolder *fAODFolder;  //  folder structure of branches
   Bool_t   fConnected;  //! flag if leaves are alreday connected 
+  Bool_t   fTracksConnected;      //! flag if tracks have already pointer to event set
   // standard content
   AliAODHeader    *fHeader;       //! event information
   TClonesArray    *fTracks;       //! charged tracks
index 62c17ef620529825947dab8d70d66413b2f3049a..915b36e7fbf9c206c53faee021020444e40bbf8c 100644 (file)
@@ -146,7 +146,10 @@ Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
       fIsSelectedResult = fEvent->GetHeader()->GetOfflineTrigger();
 
     if (fMixingHandler) fMixingHandler->BeginEvent(entry);
-    
+
+    // set transient pointer to event inside tracks
+    fEvent->ConnectTracks();
+
     return kTRUE;
 }
 
index df3524a596a5ae72e43f8518a216be599b421ecd..b2cc6b91fc535d8fd7f334f1e9f029782e84cd00 100644 (file)
@@ -333,6 +333,7 @@ class AliAODTrack : public AliVTrack {
   void      GetHMPIDpid(Double_t */*p*/) const { return; } // TODO: To be implemented properly with the new HMPID object
 
   const AliAODEvent* GetAODEvent() const {return fAODEvent;}
+  virtual const AliVEvent* GetEvent() const {return (AliVEvent*)fAODEvent;}
   void SetAODEvent(const AliAODEvent* ptr){fAODEvent = ptr;}
   const AliTOFHeader* GetTOFHeader() const;
 
@@ -471,7 +472,7 @@ class AliAODTrack : public AliVTrack {
   Double_t      fTPCsignalTuned;    //! TPC signal tuned on data when using MC
   Double_t      fTOFsignalTuned;    //! TOF signal tuned on data when using MC
 
-  const AliAODEvent* fAODEvent;     //! 
+  const AliAODEvent* fAODEvent;     //! pointer back to the event the track belongs to
 
   ClassDef(AliAODTrack, 23);
 };
index a92cc2ec43c00f892a93302949cca448f436b041..b6c9e9d21a98814f6b61a60bb6f50117e0487d81 100644 (file)
@@ -162,6 +162,7 @@ AliESDEvent::AliESDEvent():
   fESDFriendOld(0),
   fConnected(kFALSE),
   fUseOwnList(kFALSE),
+  fTracksConnected(kFALSE),
   fTOFHeader(0),
   fCentrality(0),
   fEventplane(0),
@@ -214,6 +215,7 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
   fConnected(esd.fConnected),
   fUseOwnList(esd.fUseOwnList),
+  fTracksConnected(kFALSE),
   fTOFHeader(new AliTOFHeader(*esd.fTOFHeader)),
   fCentrality(new AliCentrality(*esd.fCentrality)),
   fEventplane(new AliEventplane(*esd.fEventplane)),
@@ -261,6 +263,7 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   AddObject(fMuonClusters);
   AddObject(fMuonPads);
   GetStdContent();
+  ConnectTracks();
 }
 
 //______________________________________________________________________________
@@ -357,7 +360,7 @@ AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
 
   fConnected  = source.fConnected;
   fUseOwnList = source.fUseOwnList;
-  
+
   fDetectorStatus = source.fDetectorStatus;
   fDAQDetectorPattern = source.fDAQDetectorPattern;
   fDAQAttributes = source.fDAQAttributes;
@@ -365,7 +368,8 @@ AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
 
   *fTOFcluster = *source.fTOFcluster;
   //  fTOFcluster = new TObjArray(*(source.fTOFcluster));
-
+  fTracksConnected = kFALSE;
+  ConnectTracks();
   return *this;
 }
 
@@ -457,6 +461,7 @@ void AliESDEvent::Reset()
 
 }
 
+//______________________________________________________________________________
 Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
   //
   // funtion to reset using the already allocated space
@@ -472,6 +477,7 @@ Bool_t AliESDEvent::ResetWithPlacementNew(TObject *pObject){
   return kTRUE;
 }
 
+//______________________________________________________________________________
 void AliESDEvent::ResetStdContent()
 {
   // Reset the standard contents
@@ -534,6 +540,7 @@ void AliESDEvent::ResetStdContent()
   if(fEMCALTrigger)fEMCALTrigger->DeAllocate(); 
   if(fSPDPileupVertices)fSPDPileupVertices->Delete();
   if(fTrkPileupVertices)fTrkPileupVertices->Delete();
+  fTracksConnected = kFALSE;
   if(fTracks)fTracks->Delete();
   if(fMuonTracks)fMuonTracks->Clear("C");
   if(fMuonClusters)fMuonClusters->Clear("C");
@@ -556,6 +563,7 @@ void AliESDEvent::ResetStdContent()
 }
 
 
+//______________________________________________________________________________
 Int_t AliESDEvent::AddV0(const AliESDv0 *v) {
   //
   // Add V0
@@ -641,10 +649,12 @@ void AliESDEvent::Print(Option_t *) const
   return;
 }
 
-void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const {
-  //
-  // Attaches the complementary info to the ESD
-  //
+//______________________________________________________________________________
+void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const 
+{
+//
+// Attaches the complementary info to the ESD
+//
   if (!ev) return;
 
   // to be sure that we set the tracks also
@@ -660,23 +670,27 @@ void AliESDEvent::SetESDfriend(const AliESDfriend *ev) const {
   }
 }
 
-Bool_t  AliESDEvent::RemoveKink(Int_t rm) const {
-  // ---------------------------------------------------------
-  // Remove a kink candidate and references to it from ESD,
-  // if this candidate does not come from a reconstructed decay
-  // Not yet implemented...
-  // ---------------------------------------------------------
+//______________________________________________________________________________
+Bool_t  AliESDEvent::RemoveKink(Int_t rm) const 
+{
+// ---------------------------------------------------------
+// Remove a kink candidate and references to it from ESD,
+// if this candidate does not come from a reconstructed decay
+// Not yet implemented...
+// ---------------------------------------------------------
   Int_t last=GetNumberOfKinks()-1;
   if ((rm<0)||(rm>last)) return kFALSE;
 
   return kTRUE;
 }
 
-Bool_t  AliESDEvent::RemoveV0(Int_t rm) const {
-  // ---------------------------------------------------------
-  // Remove a V0 candidate and references to it from ESD,
-  // if this candidate does not come from a reconstructed decay
-  // ---------------------------------------------------------
+//______________________________________________________________________________
+Bool_t  AliESDEvent::RemoveV0(Int_t rm) const 
+{
+// ---------------------------------------------------------
+// Remove a V0 candidate and references to it from ESD,
+// if this candidate does not come from a reconstructed decay
+// ---------------------------------------------------------
   Int_t last=GetNumberOfV0s()-1;
   if ((rm<0)||(rm>last)) return kFALSE;
 
@@ -736,11 +750,13 @@ Bool_t  AliESDEvent::RemoveV0(Int_t rm) const {
   return kTRUE;
 }
 
-Bool_t  AliESDEvent::RemoveTrack(Int_t rm) const {
-  // ---------------------------------------------------------
-  // Remove a track and references to it from ESD,
-  // if this track does not come from a reconstructed decay
-  // ---------------------------------------------------------
+//______________________________________________________________________________
+Bool_t  AliESDEvent::RemoveTrack(Int_t rm) const 
+{
+// ---------------------------------------------------------
+// Remove a track and references to it from ESD,
+// if this track does not come from a reconstructed decay
+// ---------------------------------------------------------
   Int_t last=GetNumberOfTracks()-1;
   if ((rm<0)||(rm>last)) return kFALSE;
 
@@ -935,8 +951,9 @@ Bool_t  AliESDEvent::RemoveTrack(Int_t rm) const {
   return kTRUE;
 }
 
-
-Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
+//______________________________________________________________________________
+Bool_t AliESDEvent::Clean(Float_t *cleanPars) 
+{
   //
   // Remove the data which are not needed for the physics analysis.
   //
@@ -1000,6 +1017,7 @@ Bool_t AliESDEvent::Clean(Float_t *cleanPars) {
   return rc;
 }
 
+//______________________________________________________________________________
 Char_t  AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx) 
 {
     // Add a pileup primary vertex reconstructed with SPD
@@ -1010,6 +1028,7 @@ Char_t  AliESDEvent::AddPileupVertexSPD(const AliESDVertex *vtx)
     return n;
 }
 
+//______________________________________________________________________________
 Char_t  AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx) 
 {
     // Add a pileup primary vertex reconstructed with SPD
@@ -1020,21 +1039,25 @@ Char_t  AliESDEvent::AddPileupVertexTracks(const AliESDVertex *vtx)
     return n;
 }
 
+//______________________________________________________________________________
 Int_t  AliESDEvent::AddTrack(const AliESDtrack *t) 
 {
     // Add track
     TClonesArray &ftr = *fTracks;
     AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack(*t);
     track->SetID(fTracks->GetEntriesFast()-1);
+    track->SetESDEvent(this);
     return  track->GetID();    
 }
 
+//______________________________________________________________________________
 AliESDtrack*  AliESDEvent::NewTrack() 
 {
     // Add a new track
     TClonesArray &ftr = *fTracks;
     AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack();
     track->SetID(fTracks->GetEntriesFast()-1);
+    track->SetESDEvent(this);
     return  track;
 }
 
@@ -1212,49 +1235,57 @@ AliESDMuonPad* AliESDEvent::NewMuonPad()
   return new(fmu[fMuonPads->GetEntriesFast()]) AliESDMuonPad();
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddPmdTrack(const AliESDPmdTrack *t) 
 {
   TClonesArray &fpmd = *fPmdTracks;
   new(fpmd[fPmdTracks->GetEntriesFast()]) AliESDPmdTrack(*t);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetTrdTrigger(const AliESDTrdTrigger *t)
 {
   *fTrdTrigger = *t;
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t) 
 {
   TClonesArray &ftrd = *fTrdTracks;
   new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddTrdTracklet(const AliESDTrdTracklet *trkl)
 {
   new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(*trkl);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddTrdTracklet(UInt_t trackletWord, Short_t hcid, Int_t label)
 {
   new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(trackletWord, hcid, label);
 }
 
+//______________________________________________________________________________
 Int_t AliESDEvent::AddKink(const AliESDkink *c) 
 {
-    // Add kink
-    TClonesArray &fk = *fKinks;
-    AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
-    kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
-    return fKinks->GetEntriesFast()-1;
+  // Add kink
+  TClonesArray &fk = *fKinks;
+  AliESDkink * kink = new(fk[fKinks->GetEntriesFast()]) AliESDkink(*c);
+  kink->SetID(fKinks->GetEntriesFast()); // CKB different from the other imps..
+  return fKinks->GetEntriesFast()-1;
 }
 
 
+//______________________________________________________________________________
 void AliESDEvent::AddCascade(const AliESDcascade *c) 
 {
   TClonesArray &fc = *fCascades;
   new(fc[fCascades->GetEntriesFast()]) AliESDcascade(*c);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddCosmicTrack(const AliESDCosmicTrack *t) 
 {
   TClonesArray &ft = *fCosmicTracks;
@@ -1262,21 +1293,24 @@ void AliESDEvent::AddCosmicTrack(const AliESDCosmicTrack *t)
 } 
 
 
+//______________________________________________________________________________
 Int_t AliESDEvent::AddCaloCluster(const AliESDCaloCluster *c) 
 {
-    // Add calocluster
-    TClonesArray &fc = *fCaloClusters;
-    AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
-    clus->SetID(fCaloClusters->GetEntriesFast()-1);
-    return fCaloClusters->GetEntriesFast()-1;
-  }
+  // Add calocluster
+  TClonesArray &fc = *fCaloClusters;
+  AliESDCaloCluster *clus = new(fc[fCaloClusters->GetEntriesFast()]) AliESDCaloCluster(*c);
+  clus->SetID(fCaloClusters->GetEntriesFast()-1);
+  return fCaloClusters->GetEntriesFast()-1;
+}
 
 
+//______________________________________________________________________________
 void  AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
   TClonesArray &errlogs = *fErrorLogs;
   new(errlogs[errlogs.GetEntriesFast()])  AliRawDataErrorLog(*log);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetZDCData(const AliESDZDC * obj)
 { 
   // use already allocated space
@@ -1284,6 +1318,7 @@ void AliESDEvent::SetZDCData(const AliESDZDC * obj)
     *fESDZDC = *obj;
 }
 
+//______________________________________________________________________________
 void  AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex) 
 {
   // Set the TPC vertex
@@ -1294,6 +1329,7 @@ void  AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex)
   }
 }
 
+//______________________________________________________________________________
 void  AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex) 
 {
   // Set the SPD vertex
@@ -1304,6 +1340,7 @@ void  AliESDEvent::SetPrimaryVertexSPD(const AliESDVertex *vertex)
   }
 }
 
+//______________________________________________________________________________
 void  AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex) 
 {
   // Set the primary vertex reconstructed using he ESD tracks.
@@ -1314,6 +1351,7 @@ void  AliESDEvent::SetPrimaryVertexTracks(const AliESDVertex *vertex)
   }
 }
 
+//______________________________________________________________________________
 const AliESDVertex * AliESDEvent::GetPrimaryVertex() const 
 {
   //
@@ -1331,6 +1369,7 @@ const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
   return fSPDVertex;
 }
 
+//______________________________________________________________________________
 AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const 
 {
   //
@@ -1356,6 +1395,7 @@ AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const
   return vertex;
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul) 
 {
   // Set the SPD Multiplicity
@@ -1365,6 +1405,7 @@ void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul)
 }
 
 
+//______________________________________________________________________________
 void AliESDEvent::SetFMDData(AliESDFMD * obj) 
 { 
   // use already allocated space
@@ -1373,6 +1414,7 @@ void AliESDEvent::SetFMDData(AliESDFMD * obj)
   }
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetVZEROData(const AliESDVZERO * obj)
 { 
   // use already allocated space
@@ -1380,6 +1422,7 @@ void AliESDEvent::SetVZEROData(const AliESDVZERO * obj)
     *fESDVZERO = *obj;
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetTZEROData(const AliESDTZERO * obj)
 { 
   // use already allocated space
@@ -1388,20 +1431,21 @@ void AliESDEvent::SetTZEROData(const AliESDTZERO * obj)
 }
 
 
+//______________________________________________________________________________
 void AliESDEvent::SetACORDEData(AliESDACORDE * obj)
 {
   if(fESDACORDE)
     *fESDACORDE = *obj;
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetADData(AliESDAD * obj)
 {
   if(fESDAD)
     *fESDAD = *obj;
 }
 
-
-
+//______________________________________________________________________________
 void AliESDEvent::GetESDfriend(AliESDfriend *ev) const 
 {
   //
@@ -1425,6 +1469,7 @@ void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
   if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
 }
 
+//______________________________________________________________________________
 void AliESDEvent::AddObject(TObject* obj) 
 {
   // Add an object to the list of object.
@@ -1434,7 +1479,7 @@ void AliESDEvent::AddObject(TObject* obj)
   fESDObjects->AddLast(obj);
 }
 
-
+//______________________________________________________________________________
 void AliESDEvent::GetStdContent() 
 {
   // set pointers for standard content
@@ -1477,6 +1522,7 @@ void AliESDEvent::GetStdContent()
   fTOFcluster = new TObjArray(1);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetStdNames(){
   // Set the names of the standard contents
   // 
@@ -1496,12 +1542,13 @@ void AliESDEvent::SetStdNames(){
   }
 } 
 
-
+//______________________________________________________________________________
 void AliESDEvent::CreateStdContent(Bool_t bUseThisList){
   fUseOwnList = bUseThisList;
   CreateStdContent();
 }
 
+//______________________________________________________________________________
 void AliESDEvent::CreateStdContent() 
 {
   // create the standard AOD content and set pointers
@@ -1550,6 +1597,7 @@ void AliESDEvent::CreateStdContent()
   GetStdContent();
 }
 
+//______________________________________________________________________________
 void AliESDEvent::CompleteStdContent() 
 {
   // Create missing standard objects and add them to the TList of objects
@@ -1576,6 +1624,7 @@ void AliESDEvent::CompleteStdContent()
   }
 }
 
+//______________________________________________________________________________
 TObject* AliESDEvent::FindListObject(const char *name) const {
 //
 // Find object with name "name" in the list of branches
@@ -1586,6 +1635,7 @@ TObject* AliESDEvent::FindListObject(const char *name) const {
   return 0;
 } 
 
+//______________________________________________________________________________
 Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
 {
   // fills the provided TRefArray with all found phos clusters
@@ -1605,6 +1655,7 @@ Int_t AliESDEvent::GetPHOSClusters(TRefArray *clusters) const
   return clusters->GetEntriesFast();
 }
 
+//______________________________________________________________________________
 Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
 {
   // fills the provided TRefArray with all found emcal clusters
@@ -1624,6 +1675,7 @@ Int_t AliESDEvent::GetEMCALClusters(TRefArray *clusters) const
   return clusters->GetEntriesFast();
 }
 
+//______________________________________________________________________________
 void AliESDEvent::WriteToTree(TTree* tree) const {
   // Book the branches as in TTree::Branch(TCollection*)
   // but add a "." at the end of top level branches which are
@@ -1657,7 +1709,7 @@ void AliESDEvent::WriteToTree(TTree* tree) const {
   tree->Branch("fTOFcluster","TObjArray",(void *) &fTOFcluster);
 }
 
-
+//______________________________________________________________________________
 void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
 //
 // Connect the ESDEvent to a tree
@@ -1876,7 +1928,7 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
   }
 }
 
-
+//______________________________________________________________________________
 void AliESDEvent::CopyFromOldESD()
 {
   // Method which copies over everthing from the old esd structure to the 
@@ -1971,6 +2023,7 @@ void AliESDEvent::CopyFromOldESD()
   }// if fesdold
 }
 
+//______________________________________________________________________________
 Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
 {
   // Check if the event satisfies the trigger
@@ -2002,6 +2055,7 @@ Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
 
 }
 
+//______________________________________________________________________________
 TObject*  AliESDEvent::GetHLTTriggerDecision() const
 {
   // get the HLT trigger decission object
@@ -2024,6 +2078,7 @@ TString   AliESDEvent::GetHLTTriggerDescription() const
   return description;
 }
 
+//______________________________________________________________________________
 Bool_t    AliESDEvent::IsHLTTriggerFired(const char* name) const
 {
   // get the HLT trigger decission description
@@ -2132,6 +2187,7 @@ void AliESDEvent::EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t
   //
 }
 
+//______________________________________________________________________________
 Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
     Int_t nTracklets=GetMultiplicity()->GetNumberOfTracklets();
     if(nTracklets<20) return IsPileupFromSPD(3,0.8);
@@ -2139,6 +2195,7 @@ Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
     else return IsPileupFromSPD(5,0.8);
 }
 
+//______________________________________________________________________________
 void  AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
 {
   //
@@ -2158,18 +2215,21 @@ void  AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
 
 }
 
+//______________________________________________________________________________
 AliCentrality* AliESDEvent::GetCentrality()
 {
     if (!fCentrality) fCentrality = new AliCentrality();
     return  fCentrality;
 }
 
+//______________________________________________________________________________
 AliEventplane* AliESDEvent::GetEventplane()
 {
     if (!fEventplane) fEventplane = new AliEventplane();
     return  fEventplane;
 }
 
+//______________________________________________________________________________
 Float_t AliESDEvent::GetVZEROEqMultiplicity(Int_t i) const
 {
   // Get VZERO Multiplicity for channel i
@@ -2188,6 +2248,7 @@ Float_t AliESDEvent::GetVZEROEqMultiplicity(Int_t i) const
   return (fESDVZERO->GetMultiplicity(i)/factor);
 }
 
+//______________________________________________________________________________
 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster,Int_t *mapping){
   fNTOFclusters = 0;
 
@@ -2209,6 +2270,8 @@ void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster,Int
    
 
 }
+
+//______________________________________________________________________________
 void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster[],Int_t *mapping){
   fNTOFclusters = 0;
 
@@ -2230,3 +2293,13 @@ void AliESDEvent::SetTOFcluster(Int_t ntofclusters,AliESDTOFcluster *cluster[],I
    
 
 }
+
+//______________________________________________________________________________
+void AliESDEvent::ConnectTracks() {
+// Connect tracks to this event
+  if (fTracksConnected || !fTracks || !fTracks->GetEntriesFast()) return;
+  AliESDtrack *track;
+  TIter next(fTracks);
+  while ((track=(AliESDtrack*)next())) track->SetESDEvent(this);
+  fTracksConnected = kTRUE;
+}
index f92a027f26ee26b2550e61117b437757acb42e5f..2c7e29b46cf5dde25410513649b2a55a44b56f11 100644 (file)
@@ -330,12 +330,10 @@ public:
   
   virtual Bool_t IsPileupFromSPDInMultBins() const;
 
-  AliESDtrack *GetTrack(Int_t i) const {
-    if (!fTracks) return 0;
-    AliESDtrack* track = (AliESDtrack*) fTracks->At(i);
-    if (track) track->SetESDEvent(this);
-    return track;
-  }
+  void ConnectTracks();
+  Bool_t        AreTracksConnected() const {return fTracksConnected;}
+
+  AliESDtrack *GetTrack(Int_t i) const {return (fTracks)?(AliESDtrack*)fTracks->At(i) : 0;}
   Int_t  AddTrack(const AliESDtrack *t);
 
   /// add new track at the end of tracks array and return instance
@@ -569,6 +567,7 @@ protected:
   AliESDfriend *fESDFriendOld;     //! Old friend esd Structure
   Bool_t    fConnected;            //! flag if leaves are alreday connected
   Bool_t    fUseOwnList;           //! Do not use the list from the esdTree but use the one created by this class 
+  Bool_t    fTracksConnected;      //! flag if tracks have already pointer to event set
 
   static const char* fgkESDListName[kESDListN]; //!
 
index 8bcac36fbbd6f0f0424c55ce107e5b921780d383..28ee6eb5eccddca6cd167fe0e7d70d15ebe3c272 100644 (file)
@@ -142,6 +142,9 @@ Bool_t AliESDInputHandler::BeginEvent(Long64_t entry)
   ((AliESDEvent*)fEvent)->SetESDfriend(fFriend);
   called = kTRUE;
 
+  // set transient pointer to event inside tracks
+  fEvent->ConnectTracks();
+
   if (fMixingHandler) fMixingHandler->BeginEvent(entry);
   if (fUseTags && fRunTag) {
     fEventTag = 0;
index 87ee990a1ef218ecc52369ff5ebfb7ff22757052..e250a7076bf72dd38d313b62bdb85fca0f8d6dd4 100644 (file)
@@ -420,6 +420,7 @@ public:
   virtual void Print(Option_t * opt) const ;
   const AliESDEvent* GetESDEvent() const {return fESDEvent;}
   const AliTOFHeader* GetTOFHeader() const;
+  const AliVEvent* GetEvent() const {return (AliVEvent*)fESDEvent;}
   void         SetESDEvent(const AliESDEvent* evt) {fESDEvent = evt;}
 
   // Trasient PID object, is owned by the track
index 072095c19911ee1661b42679523dc19a23c8acca..4da69855a5ede801a2ea123faf9a6a3a8f25e407 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "AliVParticle.h"
 
+class AliVEvent;
 class AliVVertex;
 class AliExternalTrackParam;
 class AliTPCdEdxInfo;
@@ -68,6 +69,7 @@ public:
   AliVTrack(const AliVTrack& vTrack); 
   AliVTrack& operator=(const AliVTrack& vTrack);
 
+  virtual const AliVEvent* GetEvent() const {return 0;}
   virtual Int_t    GetID() const = 0;
   virtual UChar_t  GetITSClusterMap() const = 0;
   virtual void     GetITSdEdxSamples(Double_t s[4]) const {for (int i=4;i--;) s[i]=0;};