]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Merge branch 'flatdev' of https://git.cern.ch/reps/AliRoot into flatdev
authorsgorbuno <Sergey.Gorbunov@cern.ch>
Mon, 22 Sep 2014 19:13:42 +0000 (21:13 +0200)
committersgorbuno <Sergey.Gorbunov@cern.ch>
Mon, 22 Sep 2014 19:13:42 +0000 (21:13 +0200)
47 files changed:
HLT/BASE/AliHLTDataTypes.cxx
HLT/BASE/AliHLTDataTypes.h
HLT/CMakelibAliHLTITS.pkg
HLT/ITS/AliHLTITSAgent.cxx
HLT/ITS/AliHLTITSVertexerSPDComponent.cxx
HLT/ITS/AliHLTSAPTrackerData.h [new file with mode: 0644]
HLT/ITS/trackingSAP/AliHLTITSSAPTrackerComponent.cxx
HLT/ITS/trackingSAP/AliITSSAPLayer.cxx
HLT/ITS/trackingSAP/AliITSSAPLayer.h
HLT/ITS/trackingSAP/AliITSSAPTracker.cxx
HLT/ITS/trackingSAP/AliITSSAPTracker.h
HLT/ITS/trackingSAP/Process.C
HLT/ITS/trackingSAP/README
HLT/ITS/trackingSAP/TestHLTITSSAP.C [new file with mode: 0644]
HLT/global/AliFlatESDEvent.cxx
HLT/global/AliFlatESDEvent.h
HLT/global/AliFlatESDTrack.h
HLT/global/physics/AliHLTAnaManagerComponent.cxx
HLT/global/physics/macros/README_AliHLTAnaManagerComponent
HLT/global/physics/macros/runTaskOffline.C [new file with mode: 0644]
ITS/AliITStrackV2.h
STEER/AOD/AliAODEvent.cxx
STEER/AOD/AliAODEvent.h
STEER/AOD/AliAODTrack.h
STEER/CMakelibSTEERBase.pkg
STEER/ESD/AliESDEvent.cxx
STEER/ESD/AliESDEvent.h
STEER/ESD/AliESDInputHandler.cxx
STEER/ESD/AliESDInputHandler.h
STEER/ESD/AliESDtrack.h
STEER/STEER/AliHLTTestInputHandler.cxx
STEER/STEER/AliHLTTestInputHandler.h
STEER/STEERBase/AliExternalTrackParam.h
STEER/STEERBase/AliMCEvent.cxx
STEER/STEERBase/AliMCEvent.h
STEER/STEERBase/AliMixedEvent.cxx
STEER/STEERBase/AliMixedEvent.h
STEER/STEERBase/AliVEvent.cxx
STEER/STEERBase/AliVEvent.h
STEER/STEERBase/AliVEventHandler.h
STEER/STEERBase/AliVMisc.cxx [new file with mode: 0644]
STEER/STEERBase/AliVTPCseed.cxx [new file with mode: 0644]
STEER/STEERBase/AliVTrack.h
STEER/STEERBase/AliVfriendEvent.cxx [new file with mode: 0644]
STEER/STEERBase/AliVfriendTrack.cxx [new file with mode: 0644]
TPC/Calib/AliAnalysisTaskPt.cxx
TPC/Rec/AliTPCseed.cxx

index 79e7906fe3be5d5161c5c68e0b912922d8bedb1f..fdd92071f8fe6effd6f1f1bee5a53f8896bc16d6 100644 (file)
@@ -229,6 +229,9 @@ const AliHLTComponentDataType kAliHLTDataTypeJet = AliHLTComponentDataTypeInitia
 /** Container of HLT ITS tracks */
 const AliHLTComponentDataType fgkITSTracksDataType = AliHLTComponentDataTypeInitializer( "ITSTRACK", kAliHLTDataOriginITS );
 
+/** Container of HLT ITS SAP tracker data */
+const AliHLTComponentDataType kAliHLTDataTypeITSSAPData = AliHLTComponentDataTypeInitializer( "SAPTRACK", kAliHLTDataOriginITS );
+
 /** Container of HLT calorimeter clusters */
 const AliHLTComponentDataType kAliHLTDataTypeCaloCluster = AliHLTComponentDataTypeInitializer( "CALOCLUS", kAliHLTDataOriginAny );
 
index e7a70fb318ea4db259a0d9d6c83f8c9f277e9219..69f8820715df3b22267fddec945feb54d5c033c3 100644 (file)
@@ -1294,6 +1294,11 @@ extern "C" {
    */  
   extern const AliHLTComponentDataType fgkITSTracksDataType;
 
+  /** Container of ITS SAP tracker data
+   * @ingroup alihlt_component_datatypes
+   */  
+  extern const AliHLTComponentDataType kAliHLTDataTypeITSSAPData;
+
   /** Container of calorimeter clusters
    * @ingroup alihlt_component_datatypes
    */  
index 47f42f57c64c89467c44b85eaef718ebecc7119f..a8febf33500606e22d7fe361c6394d9dbbca6c70 100644 (file)
@@ -59,7 +59,7 @@ set ( MODULE_HDRS     ${CLASS_HDRS} AliHLTITSSpacePointData.h AliHLTITSClusterData
 
 set ( MODULE_DHDR )
 
-set ( EINCLUDE  HLT/BASE HLT/BASE/util HLT/ITS HLT/TPCLib HLT/ITS/tracking HLT/ITS/clusterfinders ITS RAW STEER/STEER STEER/ESD STEER/STEERBase)
+set ( EINCLUDE  HLT/BASE HLT/BASE/util HLT/ITS HLT/TPCLib HLT/ITS/tracking HLT/ITS/trackingSAP HLT/ITS/clusterfinders ITS RAW STEER/STEER STEER/ESD STEER/STEERBase)
 
 set ( ELIBS  "HLTbase AliHLTUtil RAWDatarec RAWDatabase ITSrec ITSbase ESD STEER STEERBase -lEG")
 
index edf67d31513d4f97053c48d648d9fc9eb203a9fa..ff648d169bb7b9eb56ab25defe3dda48bf41d99d 100644 (file)
@@ -34,6 +34,7 @@
 #include "AliHLTITSClusterFinderComponent.h"
 #include "AliHLTITSClusterHistoComponent.h"
 #include "AliHLTITSTrackerComponent.h"
+#include "AliHLTITSSAPTrackerComponent.h"
 #include "AliHLTITSVertexerSPDComponent.h"
 #include "AliHLTITSDigitPublisherComponent.h"
 
@@ -78,6 +79,7 @@ int AliHLTITSAgent::CreateConfigurations(AliHLTConfigurationHandler* handler,
   // to run on digits, a digit publisher needs to be implemented
 
   TString trackerInput="";
+  TString trackerSAPInput="";
   TString vertexerSPDInput="";
   if (rawReader || !runloader) {
     // AliSimulation: use the AliRawReaderPublisher if the raw reader is available
@@ -113,6 +115,7 @@ int AliHLTITSAgent::CreateConfigurations(AliHLTConfigurationHandler* handler,
     // define the ITS tracker input
     //
     trackerInput="ITS-SPD-CF ITS-SDD-CF ITS-SSD-CF";
+    trackerSAPInput="ITS-SPD-CF ITS-SDD-CF ITS-SSD-CF";
   }
   else if (runloader && !rawReader) {
     // indicates AliSimulation with no RawReader available -> run on digits
@@ -140,6 +143,8 @@ int AliHLTITSAgent::CreateConfigurations(AliHLTConfigurationHandler* handler,
     // Currently there is a seg fault in the TTree access from the DigitClusterFinder
     // needs first to be investigated
     trackerInput="DigitClusterFinder";
+    trackerSAPInput="DigitClusterFinder";
+    vertexerSPDInput="DigitClusterFinder";
   }
 
   ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -165,6 +170,11 @@ int AliHLTITSAgent::CreateConfigurations(AliHLTConfigurationHandler* handler,
     }
     handler->CreateConfiguration("ITS-tracker","ITSTracker",trackerInput.Data(),"");
   }
+  
+  if( !trackerSAPInput.IsNull() ) trackerSAPInput+=" ";
+  trackerSAPInput+="ITS-SPD-vertexer";
+
+  handler->CreateConfiguration("ITS-SAPtracker","ITSSAPTracker",trackerSAPInput.Data(),"");
 
   return iResult;
 }
@@ -206,6 +216,7 @@ int AliHLTITSAgent::RegisterComponents(AliHLTComponentHandler* pHandler) const
   pHandler->AddComponent(new AliHLTITSClusterFinderComponent(AliHLTITSClusterFinderComponent::kClusterFinderDigits));
   pHandler->AddComponent(new AliHLTITSClusterHistoComponent);
   pHandler->AddComponent(new AliHLTITSTrackerComponent);
+  pHandler->AddComponent(new AliHLTITSSAPTrackerComponent);
   pHandler->AddComponent(new AliHLTITSVertexerSPDComponent);
   pHandler->AddComponent(new AliHLTITSDigitPublisherComponent);
 
index 9f3a52a83b544bdb06c27cdc31dadfab4da51e50..3cac629c5ee19be336305861b6fef425e43d1ff8 100644 (file)
@@ -135,6 +135,7 @@ void AliHLTITSVertexerSPDComponent::GetInputDataTypes( vector<AliHLTComponentDat
   // see header file for class documentation
   list.clear();
   list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD );
+  list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITS );
 }
 
 AliHLTComponentDataType AliHLTITSVertexerSPDComponent::GetOutputDataType()
@@ -413,7 +414,8 @@ int AliHLTITSVertexerSPDComponent::DoEvent
  
     // Read ITS SPD clusters
 
-    if ( iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD) ){
+    if ( ( iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD) ) ||
+        ( iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITS) ) ) {
 
       AliHLTITSClusterData *inPtr=reinterpret_cast<AliHLTITSClusterData*>( iter->fPtr );
       int nClusters = inPtr->fSpacePointCnt;
@@ -664,7 +666,7 @@ int AliHLTITSVertexerSPDComponent::DoEvent
     double s = 400.E-4;
     double cov[6] = {s*s,0,s*s,0,0,s*s};
     AliESDVertex v(pos, cov, 0, fSumN[bestBin]);
-    PushBack( (TObject*) &v, kAliHLTDataTypeESDVertex|kAliHLTDataOriginITS,0 );
+    PushBack( (TObject*) &v, kAliHLTDataTypeESDVertex|kAliHLTDataOriginITSSPD,0 );
 
     //cout<<"ITSVertexerSPD: vtx found "<<vtxX<<" "<<vtxY<<" "<<vtxZ<<endl;
   }
diff --git a/HLT/ITS/AliHLTSAPTrackerData.h b/HLT/ITS/AliHLTSAPTrackerData.h
new file mode 100644 (file)
index 0000000..3a328f2
--- /dev/null
@@ -0,0 +1,35 @@
+// $Id$
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//* See cxx source for full Copyright notice                               *
+
+#ifndef ALIHLTITSSAPTRACKERDATA_H
+#define ALIHLTITSSAPTRACKERDATA_H
+
+#include "AliHLTDataTypes.h"
+#include "AliFlatExternalTrackParam.h"
+#include "AliHLTStdIncludes.h"
+
+struct AliHLTITSSAPTrackerData
+{ 
+  AliFlatExternalTrackParam paramOut;
+  AliFlatExternalTrackParam paramInw;
+  float chi2;
+  short ncl;
+  int   label;
+};
+
+typedef struct AliHLTITSSAPTrackerData AliHLTITSSAPTrackerData;
+
+struct AliHLTITSSAPTrackerDataContainer {
+  AliHLTUInt32_t fCount; // number of tracklets
+#if defined(__HP_aCC) || defined(__DECCXX) || defined(__SUNPRO_CC)
+  AliHLTITSSAPTrackerData fTracks[1]; // array of tracklets
+#else
+  AliHLTITSSAPTrackerData fTracks[0]; // array of tracklets
+#endif
+};
+
+typedef struct AliHLTITSSAPTrackerDataContainer AliHLTITSSAPTrackerDataContainer;
+
+#endif
index ec29438c8a2e0cb03a4c62cd078d1185988532b9..faa56a435f0ad41219d6cf0636bedce18c0c466e 100644 (file)
@@ -47,6 +47,7 @@
 #include "AliGeomManager.h"
 #include "AliHLTTrackMCLabel.h"
 #include "AliITSRecPoint.h"
+#include "AliHLTSAPTrackerData.h"
 #include <map>
 
 using namespace std;
@@ -100,7 +101,7 @@ AliHLTITSSAPTrackerComponent::~AliHLTITSSAPTrackerComponent()
 const char* AliHLTITSSAPTrackerComponent::GetComponentID()
 {
   // see header file for class documentation
-  return "ITSTracker";
+  return "ITSSAPTracker";
 }
 
 void AliHLTITSSAPTrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list )
@@ -323,13 +324,13 @@ int AliHLTITSSAPTrackerComponent::DoEvent
   const AliHLTComponentEventData& evtData,
   const AliHLTComponentBlockData* blocks,
   AliHLTComponentTriggerData& /*trigData*/,
-  AliHLTUInt8_t* /*outputPtr*/,
+  AliHLTUInt8_t* outputPtr,
   AliHLTUInt32_t& size,
-  vector<AliHLTComponentBlockData>& /*outputBlocks*/ )
+  vector<AliHLTComponentBlockData>& outputBlocks )
 {
   //* process event
 
-  //  AliHLTUInt32_t maxBufferSize = size;
+  AliHLTUInt32_t maxBufferSize = size;
   size = 0; // output size
   
   if (!IsDataEvent()) return 0;
@@ -351,7 +352,7 @@ int AliHLTITSSAPTrackerComponent::DoEvent
   const AliESDVertex *vertexSPD = 0;
 
   {
-    const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDVertex|kAliHLTDataOriginITS);
+    const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDVertex|kAliHLTDataOriginITSSPD);
     if( iter != NULL  ) {
       if( !( vertexSPD = dynamic_cast<AliESDVertex*>(const_cast<TObject*>( iter ) ) ) ){    
        HLTError("ITS SPD vertex object is corrupted");
@@ -407,36 +408,55 @@ int AliHLTITSSAPTrackerComponent::DoEvent
 
   
   // Fill output tracks
-  
-  // RS??: HERE I AM NOT SURE WHAT TO DO
-  int nFoundTracks = fTracker->GetNTracks();
   int nAddedTracks = 0;
-  for (int itr=0;itr<nFoundTracks;itr++) {
-    const AliITSSAPTracker::ITStrack_t& track = fTracker->GetTrack(itr);
-    // the track is just a struct of 2 AliExternalTrackParams (params at vertex and at the outer ITS layer)
-    // + some extra info, see "struct ITStrack" in the AliITSSAPTracker.h
-    if ( track.paramOut.TestBit(AliITSSAPTracker::kInvalidBit) || 
-        track.paramInw.TestBit(AliITSSAPTracker::kInvalidBit)) continue;
-    // use only those tracks whose both inward and outward params are OK.
-    
-    nAddedTracks++;
-    // RS??: 
-
-    // I don't know if it should be passes as it is or converted to ESDtrack?
+  {  
+    int nFoundTracks = fTracker->GetNTracks();
+    AliHLTUInt32_t blockSize = sizeof(AliHLTITSSAPTrackerDataContainer) + nFoundTracks*sizeof(AliHLTITSSAPTrackerData);
+    if( size + blockSize > maxBufferSize ){            
+      HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", 
+                 maxBufferSize, size + blockSize, nFoundTracks);
+      iResult = -ENOSPC;
+    }    
+    if( iResult>=0 ){
+      blockSize = sizeof(AliHLTITSSAPTrackerDataContainer);
+      AliHLTITSSAPTrackerDataContainer *data = reinterpret_cast<AliHLTITSSAPTrackerDataContainer*>(outputPtr);
+      data->fCount=0;
+      for (int itr=0;itr<nFoundTracks;itr++) {
+       const AliITSSAPTracker::ITStrack_t& track = fTracker->GetTrack(itr);
+       // the track is just a struct of 2 AliExternalTrackParams (params at vertex and at the outer ITS layer)
+       // + some extra info, see "struct ITStrack" in the AliITSSAPTracker.h
+       if ( track.paramOut.TestBit(AliITSSAPTracker::kInvalidBit) || 
+            track.paramInw.TestBit(AliITSSAPTracker::kInvalidBit)) continue;
+       // use only those tracks whose both inward and outward params are OK.
+       AliHLTITSSAPTrackerData &trcHLT = data->fTracks[data->fCount];
+       trcHLT.paramOut.SetExternalTrackParam(&track.paramOut);
+       trcHLT.paramInw.SetExternalTrackParam(&track.paramInw);
+       trcHLT.chi2 = track.chi2;
+       trcHLT.ncl  = track.ncl;
+       trcHLT.label = track.label;
+       data->fCount++;
+       blockSize += sizeof(AliHLTITSSAPTrackerData);
+       nAddedTracks++;
+      }
+      
+      AliHLTComponentBlockData resultData;
+      FillBlockData( resultData );
+      resultData.fOffset = size;
+      resultData.fSize = blockSize;      
+      resultData.fDataType = kAliHLTDataTypeITSSAPData|kAliHLTDataOriginITS;
+      fBenchmark.AddOutput(resultData.fSize);
+      outputBlocks.push_back( resultData );
+      size += resultData.fSize;
+    }
   }
 
-  // Fill output vertexTracks
-  
-  // RS: HERE I AM NOT SURE WHAT TO DO
-
   Bool_t vtxOK = kFALSE;
-  AliESDVertex& vtxTracks = fTracker->GetTrackVertex();
-  if (vtxTracks.GetStatus()==1) {
-    // here we should add the vertex to the output
-
-    // RS??: ADD TO THE OUTPUT
-    PushBack( (TObject*) &vtxTracks, kAliHLTDataTypeESDVertex|kAliHLTDataOriginOut,0 );
-    vtxOK = kTRUE;
+  { // Fill output vertexTracks  
+    AliESDVertex& vtxTracks = fTracker->GetTrackVertex();
+    if (vtxTracks.GetStatus()==1) {
+      PushBack( (TObject*) &vtxTracks, kAliHLTDataTypeESDVertex|kAliHLTDataOriginITS,0 );
+      vtxOK = kTRUE;
+    }
   }
   //
   fTracker->Clear();
index a3eb91589b55ce0d5d38dae5fef618cdf03ddaee..cde288f54f7a1d064e4ee67e56a0b92959bb0953 100644 (file)
@@ -33,8 +33,9 @@ AliITSSAPLayer::AliITSSAPLayer() :
   ,fNFoundClusters(0)
   ,fFoundClusterIterator(0)
   ,fFoundBinIterator(0)
-  ,fFoundBins(0)
-  ,fSortedClInfo(0)
+  ,fFoundBins()
+  ,fSortedClInfo()
+  ,fDetectors()
 {
   // def. c-tor
 }
@@ -61,8 +62,9 @@ AliITSSAPLayer::AliITSSAPLayer(int id, float zspan,int nzbins,int nphibins, int
   ,fNFoundClusters(0)
   ,fFoundClusterIterator(0)
   ,fFoundBinIterator(0)
-  ,fFoundBins(0)
-  ,fSortedClInfo(0)
+  ,fFoundBins()
+  ,fSortedClInfo()
+  ,fDetectors()
 {
   // c-tor
   Init(buffer);
index 58199a7943a0616282da5d877a4f9c2ea1ff05b1..f40988936127742ddd94bd190b1cdc514bf9e789 100644 (file)
@@ -85,6 +85,10 @@ class AliITSSAPLayer
   virtual void Clear(Option_t *opt="");
   virtual void Print(Option_t *opt="")  const;
 
+ private:
+  AliITSSAPLayer(const AliITSSAPLayer&);
+  AliITSSAPLayer& operator=(const AliITSSAPLayer&);
+  //
  protected:
   TObjArray* fClusters;       // externally supplied clusters
   int   fLrID;                // layer id
index 243ddacd2731c275aa665f3ca7e0a961b66b5b02..9853a220f7bd6a5d5120f6eb7882b8b6fcf7915c 100644 (file)
@@ -68,7 +68,10 @@ const char* AliITSSAPTracker::fgkSWNames[AliITSSAPTracker::kNSW] = {
 
 //______________________________________________
 AliITSSAPTracker::AliITSSAPTracker() :
-  fBlacklist(0)
+  fSPD2Discard()
+  ,fTracklets()
+  ,fSPD1Tracklet()
+  ,fBlacklist(0)
   ,fPhiShift(0.0045)
   ,fSigThetaTracklet(0.025)
   ,fSigPhiTracklet(0.08)
@@ -92,6 +95,8 @@ AliITSSAPTracker::AliITSSAPTracker() :
   ,fMissChi2Penalty(3)
   ,fMaxMissedLayers(1)
   ,fNTracks(0)
+  ,fTracks()
+  ,fTrackVertex()
   ,fFitVertex(kTRUE)
   //
   ,fSPDVertex(0)
@@ -211,6 +216,12 @@ void AliITSSAPTracker::ProcessEvent()
 #ifdef _CONTROLH_
   FillRecoStat();
 #endif
+  /*
+  PrintTracklets();
+  PrintTracks();  
+  if (fSPDVertex) {printf("SPDvtx: "); fSPDVertex->Print();}
+  printf("TRKVtx: "); fTrackVertex.Print();
+  */
 }
 
 
@@ -322,11 +333,15 @@ Int_t AliITSSAPTracker::AssociateClusterOfL2(int icl2)
     //
     float dPhi = cli1->phi - cli2->phi;                       // fast check on phi
     if (dPhi>TMath::Pi()) dPhi = TMath::TwoPi()-dPhi;
+    else if (dPhi<-TMath::Pi()) dPhi += TMath::TwoPi();
     double dPhiS = TMath::Abs(dPhi)-fPhiShiftSc;
     if (TMath::Abs(dPhiS)>fDPhiTrackletSc) continue;
     //
     float chi2 = dTheta*dTheta*fDThSig2Inv + dPhiS*dPhiS*fDPhSig2Inv; // check final chi2
-    if (chi2>1.) continue;
+    if (chi2>1.) {
+      Blacklist(icl1,icl2);
+      continue;
+    }
     nCand++;
     if (chi2>chiBest) continue;
     // check if cl1 is already associated with better 
@@ -342,15 +357,19 @@ Int_t AliITSSAPTracker::AssociateClusterOfL2(int icl2)
     if (!oldId) { // store new tracklet
       fTracklets.push_back(trk);
       fSPD1Tracklet[trk.id1] = fTracklets.size(); // refer from clusters to tracklet (id+1)
+      fSPD2Discard[icl2] = true; // mark as used
       Blacklist(trk.id1,trk.id2);
       return 1;
     }
-    SPDtracklet_t& oldTrk = (SPDtracklet_t&)fSPD1Tracklet[--oldId];
+    SPDtracklet_t& oldTrk = (SPDtracklet_t&)fTracklets[--oldId];
     if (oldTrk.chi2 < trk.chi2) { // previous is better 
       Blacklist(trk.id1,trk.id2);  // shall we blacklist new combination?
       if (nCand==1)  fSPD2Discard[icl2] = true; // there was just 1 candidate and it is discarded
       return 0;
     }
+    // new combination is better, overwrite the old one with new one, marking old L2 cluster free
+    fSPD2Discard[oldTrk.id2] = false; // mark as free
+    fSPD2Discard[icl2] = true; // mark as used
     oldTrk = trk;         // new combination is better, overwrite it with new one
     Blacklist(trk.id1,trk.id2);
     return 1;
@@ -423,7 +442,7 @@ void AliITSSAPTracker::Tracklets2Tracks()
 }
 
 //______________________________________________
-Bool_t AliITSSAPTracker::IsAcceptableTrack(const AliITSSAPTracker::ITStrack_t& track) const
+Bool_t AliITSSAPTracker::IsAcceptableTrack(const AliITSSAPTracker::ITStrack_t& /*track*/) const
 {
   // check if the track is acceptable
   return kTRUE;
index cbb781d835bfe2a581d3150e67c0b21830587437..19e1935b88e8b5eb8265473bea5d2585ddd49d4e 100644 (file)
@@ -40,6 +40,7 @@ class AliITSSAPTracker : public TObject
   typedef struct SPDtracklet SPDtracklet_t;
   //
   struct ITStrack {
+  ITStrack() : paramOut(),paramInw(),chi2(0),ncl(0),nmiss(0),label(0),trackletID(0) {}
     AliExternalTrackParam paramOut;
     AliExternalTrackParam paramInw;
     float chi2;
@@ -61,6 +62,7 @@ class AliITSSAPTracker : public TObject
   void ClearTracks()                               {fTracks.clear();}
   //
   void SetSPDVertex(const AliESDVertex* v)         {fSPDVertex = v;}
+  const AliESDVertex* GetSPDVertex()  const        {return fSPDVertex;}
   void AddCluster(AliITSRecPoint* cl);
   void SetBz(float v)                              {fBz = v;}
   //
@@ -82,6 +84,7 @@ class AliITSSAPTracker : public TObject
   int  GetNTracks()                    const        {return fNTracks;}
   void PrintTracklets()                const;
   void PrintTracklet(Int_t itr)        const;
+  const AliITSSAPTracker::SPDtracklet_t& GetTracklet(int i) const {return fTracklets[i];}
   // methods for trackleting ----------------<<<
   //
   // methods for track reconstruction ------->>>
@@ -105,6 +108,8 @@ class AliITSSAPTracker : public TObject
   Int_t   GetTrackletMCTruth(AliITSSAPTracker::SPDtracklet_t& trlet) const;
   void    RefitInward();
   Bool_t  RefitInward(int itr);
+  void    SetMaxMissedLayers(int n=0)  { fMaxMissedLayers = n;}
+  Int_t   GetMaxMissedLayers()    const  { return fMaxMissedLayers;}
   AliITSSAPTracker::ITStrack_t& GetTrack(int i) const {return (ITStrack_t &)fTracks[i];}
   // methods for track reconstruction -------<<<
   //
index d9d94119f64e0582e76685c85d59f4c3613a4c9d..f9023db6da6b6a1caabd43c9b8ef5132f0d55fc1 100644 (file)
@@ -44,6 +44,33 @@ AliITSSAPTracker* tracker=0;
 TTree* treeInp = 0;
 AliRunLoader* runLoader = 0;
 AliESDEvent* esd=0;
+typedef struct {
+  Bool_t  validSPD;
+  Bool_t  validTrc;
+  Bool_t  isPrim;
+  Char_t  ntlC;
+  Char_t  ntlF;
+  Char_t  mtlC;
+  Char_t  mtlF;
+  Char_t  ntrC;
+  Char_t  ntrF;
+  Int_t   pdg;
+  Int_t   evID;
+  Int_t   mult;
+  Float_t pt;
+  Float_t eta;
+  Float_t phi;
+  Float_t zv;
+  //
+  Float_t spdDPhi;
+  Float_t spdDTht;
+  Float_t spdChi2;
+} tres_t;
+
+tres_t tres;
+TFile* flOut = 0;
+TTree* trOut = 0;
+
 
 void ProcessEvent(int iev);
 void Process(const char* path);
@@ -51,8 +78,13 @@ void ProcChunk(const char* path);
 void TestTracker(TTree* tRP, const AliESDVertex* vtx);
 void LoadClusters(TTree* tRP);
 Double_t* DefLogAx(double xMn,double xMx, int nbin);
+void CheckRecStatus();
+void InitOutTree(const char* fname="rcInfo.root");
+void SaveOutTree();
 void InitTracker(int runNumber);
 
+
+
 #ifdef _TIMING_
 TProfile* hTiming[AliITSSAPTracker::kNSW];
 #endif
@@ -60,6 +92,7 @@ TProfile* hTiming[AliITSSAPTracker::kNSW];
 void Process(const char* inpData)
 {
   //
+  InitOutTree();
   TString inpDtStr = inpData;
   if (inpDtStr.EndsWith(".root") || inpDtStr.EndsWith(".zip#")) {
     ProcChunk(inpDtStr.Data());
@@ -84,6 +117,7 @@ void Process(const char* inpData)
 #ifdef _CONTROLH_
   tracker->SaveHistos();
 #endif
+  SaveOutTree();
 }
 
 void ProcChunk(const char* path)
@@ -183,6 +217,7 @@ void ProcessEvent(int iEv)
   }
 #endif
   //
+  CheckRecStatus();
   //esd->Reset();
   //
 }
@@ -217,16 +252,27 @@ void TestTracker(TTree* tRP, const AliESDVertex* vtx)
 //_________________________________________________
 void LoadClusters(TTree* tRP)
 {
-  AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
-  TClonesArray* itsClusters = rpcont->FetchClusters(0,tRP);
-  if(!rpcont->IsSPDActive()){
-    printf("No SPD rec points found, multiplicity not calculated\n");
-    tRP->Print();
-    return;
+  //  AliITSRecPointContainer* rpcont = AliITSRecPointContainer::Instance();
+  //  TClonesArray* itsClusters = rpcont->FetchClusters(0,tRP);
+  //  if(!rpcont->IsSPDActive()){
+  //    printf("No SPD rec points found, multiplicity not calculated\n");
+  //    tRP->Print();
+  //    return;
+  //  }
+  //  else printf("NSP0: %d\n",itsClusters->GetEntriesFast());
+  static TClonesArray* itsModAdd[2198] = {0};
+  static Bool_t first = kTRUE;
+  if (first) {
+    first = 0;
+    for (int i=0;i<2198;i++) itsModAdd[i] = new TClonesArray("AliITSRecPoint");
   }
   int nMod = AliITSgeomTGeo::GetNModules();
   for (int imd=0;imd<nMod;imd++) {
-    itsClusters = rpcont->UncheckedGetClusters(imd);
+    TClonesArray* itsClusters = itsModAdd[imd];
+    tRP->SetBranchAddress("ITSRecPoints",&itsClusters);    
+    tRP->GetEntry(imd);
+    //    itsClusters = rpcont->UncheckedGetClusters(imd);
+    
     int nClusters = itsClusters->GetEntriesFast();
     if (!nClusters) continue;
     while(nClusters--) {
@@ -251,6 +297,190 @@ Double_t* DefLogAx(double xMn,double xMx, int nbin)
   for (int i=0;i<=nbin;i++) xax[i]= xMn*exp(dx*i);
   return xax;
 }
+//______________________________________________
+void CheckRecStatus()
+{
+  //
+  static int nev = -1;
+  static TBits patternMC;
+  static vector<char> ntrCorr;
+  static vector<char> ntrFake;
+  static vector<char> mtlCorr;
+  static vector<char> mtlFake;
+  static vector<char> ntlCorr;
+  static vector<char> ntlFake;
+  static vector<float> spdDPhi;
+  static vector<float> spdDTht;
+  static vector<float> spdChi2;
+  //
+  AliStack* stack = 0;
+  AliRunLoader* rl = AliRunLoader::Instance();
+  if (!rl || !(stack=rl->Stack())) return;
+  nev++;
+  //
+  enum {kIsPrim=AliITSSAPTracker::kNLrActive,kValidTracklet,kValidTrack,kRecDone,kBitPerTrack};
+  int nTrkMC = stack->GetNtrack();
+  patternMC.SetBitNumber(nTrkMC*kBitPerTrack,0);
+  patternMC.ResetAllBits();
+  //
+  ntrCorr.clear();
+  ntrFake.clear();
+  ntlCorr.clear();
+  ntlFake.clear();
+  mtlCorr.clear();
+  mtlFake.clear();
+  //
+  spdDPhi.clear();
+  spdDTht.clear();
+  spdChi2.clear();
+  //  
+  ntrCorr.resize(nTrkMC,0);
+  ntrFake.resize(nTrkMC,0);
+  ntlCorr.resize(nTrkMC,0);
+  ntlFake.resize(nTrkMC,0);
+  mtlCorr.resize(nTrkMC,0);
+  mtlFake.resize(nTrkMC,0);
+  spdDPhi.resize(nTrkMC,0);
+  spdDTht.resize(nTrkMC,0);
+  spdChi2.resize(nTrkMC,0);
+  
+  //
+  // fill MC track patterns
+  for (int ilr=6;ilr--;) {
+    AliITSSAPLayer *lr = tracker->GetLayer(ilr);
+    int ncl = lr->GetNClusters();
+    for (int icl=ncl;icl--;) {
+      AliITSRecPoint* cl = lr->GetClusterUnSorted(icl);
+      for (int j=0;j<3;j++) {
+       int lb = cl->GetLabel(j);
+       if (lb<0 || lb>=nTrkMC) break;
+       patternMC.SetBitNumber(lb*kBitPerTrack+ilr,kTRUE);
+      }
+    }
+  }
+  //
+  int nTrk = tracker->GetNTracklets();
+  if (!nTrk) return;
+  for (int itr=0;itr<nTrk;itr++) {
+    const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
+    //    PrintTracklet(itr);
+    //
+    int lbl = trlet.label;
+    if (lbl==-3141593) continue;
+    int lblA = TMath::Abs(lbl);
+    if (lblA==lbl) ntlCorr[lblA]++;
+    else           ntlFake[lblA]++;
+    //
+    if (spdChi2[lblA]==0 || spdChi2[lblA]<trlet.chi2) {
+      spdChi2[lblA] = trlet.chi2;
+      spdDPhi[lblA] = trlet.dphi;
+      spdDTht[lblA] = trlet.dtht;
+    }
+  }
+  //
+  AliITSSAPLayer* lr0 = tracker->GetLayer(0);
+  AliITSSAPLayer* lr1 = tracker->GetLayer(1);
+  for (int itrm=0;itrm<nTrkMC;itrm++) {
+    if (ntlCorr[itrm]+ntlFake[itrm]<2) continue;
+    printf("\nExtra for tr %d nC:%d nF:%d\n",itrm,ntlCorr[itrm],ntlFake[itrm]);
+    //
+    int cnt = 0;
+    for (int itr=0;itr<nTrk;itr++) {
+      const AliITSSAPTracker::SPDtracklet_t& trlet = tracker->GetTracklet(itr);
+      if (TMath::Abs(trlet.label)!=itrm) continue;
+      AliITSSAPLayer::ClsInfo_t* clinf0 = lr0->GetClusterInfo(trlet.id1);
+      AliITSSAPLayer::ClsInfo_t* clinf1 = lr1->GetClusterInfo(trlet.id2);
+      printf("#%2d%s%4d chi:%.2f [%4d/%3d] [%4d/%3d]\n",cnt++,trlet.label<0 ? "-":"+",itr,trlet.chi2,
+             trlet.id1,clinf0->detid,
+             trlet.id2,clinf1->detid);
+    }
+  }
+  //
+  const AliMultiplicity* mltESD = esd->GetMultiplicity();
+  nTrk = mltESD->GetNumberOfTracklets();
+  for (int itr=0;itr<nTrk;itr++) {
+    int lb0 = mltESD->GetLabel(itr,0);
+    int lb1 = mltESD->GetLabel(itr,1);    
+    if (lb0==lb1) mtlCorr[lb1]++;
+    else          mtlFake[lb1]++;
+  }
+  //
+  nTrk = tracker->GetNTracks();
+  for (int itr=0;itr<nTrk;itr++) {
+    const AliITSSAPTracker::ITStrack_t &track = tracker->GetTrack(itr);
+    //
+    int lbl = track.label;
+    if (lbl==-3141593) continue;
+    int lblA = TMath::Abs(lbl);
+    if (lblA==lbl) ntrCorr[lblA]++;
+    else           ntrFake[lblA]++;
+  }
+  //
+  // set reconstructability
+  for (int itr=nTrkMC;itr--;) {
+    int bitoffs = itr*kBitPerTrack;
+    //
+    tres.validSPD = patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD1) && 
+      patternMC.TestBitNumber(bitoffs+AliITSSAPTracker::kALrSPD2);
+    int nmiss = 0;
+    for (int il=AliITSSAPTracker::kALrSDD1;il<=AliITSSAPTracker::kALrSSD2;il++) 
+      if (tracker->IsObligatoryLayer(il) && !patternMC.TestBitNumber(bitoffs+il)) nmiss++;
+    tres.validTrc = tres.validSPD && (nmiss<=tracker->GetMaxMissedLayers());
+    //
+    if ( !tres.validSPD && !tres.validTrc && 
+        (ntlCorr[itr]+ntlFake[itr])==0 && 
+        (ntrCorr[itr]+ntrFake[itr])==0 &&
+        (mtlCorr[itr]+mtlFake[itr])==0 ) continue;
+    //
+    TParticle* mctr = stack->Particle(itr);
+    tres.isPrim = stack->IsPhysicalPrimary(itr);
+    tres.pdg = mctr->GetPdgCode();
+    tres.pt =  mctr->Pt();
+    tres.eta = mctr->Eta();
+    tres.phi = mctr->Phi();
+    //
+    tres.ntlC = ntlCorr[itr];
+    tres.ntlF = ntlFake[itr];
+    tres.ntrC = ntrCorr[itr];
+    tres.ntrF = ntrFake[itr];
+    //
+    tres.mtlC = mtlCorr[itr];
+    tres.mtlF = mtlFake[itr];
+    //
+    tres.evID = nev;
+    tres.mult = tracker->GetNTracklets();
+    tres.zv = tracker->GetSPDVertex()->GetZ();
+    //
+    tres.spdDPhi = spdDPhi[itr];
+    tres.spdDTht = spdDTht[itr];
+    tres.spdChi2 = spdChi2[itr];
+    //
+    trOut->Fill();
+  }
+  //
+}
+
+//___________________________________________________
+void InitOutTree(const char* fname)
+{
+  // output tree
+  flOut = TFile::Open(fname,"recreate");
+  trOut = new TTree("rcinfo","rcinfo");
+  trOut->Branch("res",&tres);
+}
+
+//___________________________________________________
+void SaveOutTree()
+{
+  if (!trOut) return;
+  flOut->cd();
+  trOut->Write();
+  delete trOut;
+  flOut->Close();
+  delete flOut;
+  trOut = 0;
+  flOut = 0;
+}
 
 
 //______________________________________________
index 7373a5f3d032b7b3216c9b634c88bb63f61c69a5..35235d65345e2e33a49eb0b68e1c407b40fa7820 100644 (file)
@@ -3,3 +3,8 @@ macro as
 aliroot 'TestITSSAP.C(<path>)'
 where the <path> is the directory cotaining the output of the standard
 reconstruction, including the ITS.RecPoints.root file
+
+
+To test tracker in the HLT simulation, generate some MC (e.g. ppbench),
+copy the macro TestHLTITSSAP.C to the generation directory and run
+aliroot TestHLTITSSAP.C
diff --git a/HLT/ITS/trackingSAP/TestHLTITSSAP.C b/HLT/ITS/trackingSAP/TestHLTITSSAP.C
new file mode 100644 (file)
index 0000000..e8070c9
--- /dev/null
@@ -0,0 +1,44 @@
+void TestHLTITSSAP() {
+
+  gSystem->Load("liblhapdf");
+  gSystem->Load("libEGPythia6");
+  gSystem->Load("libpythia6");
+  gSystem->Load("libAliPythia6");
+  gSystem->Load("libhijing");
+  gSystem->Load("libTHijing");
+  gSystem->Load("libgeant321");
+
+  if (gSystem->Getenv("EVENT"))
+   nev = atoi(gSystem->Getenv("EVENT")) ;   
+  
+  AliSimulation simulator;
+  simulator.SetRunGeneration(0);
+  simulator.SetRunSimulation(0);
+  simulator.SetMakeDigits("");
+  simulator.SetMakeSDigits("");
+  simulator.SetMakeDigitsFromHits("");
+  //simulator.SetWriteRawData("ALL","raw.root",kTRUE);
+
+  simulator.SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+  simulator.SetSpecificStorage("GRP/GRP/Data",
+                              Form("local://%s",gSystem->pwd()));
+  simulator.SetSpecificStorage("ITS/Align/Data",
+                              "alien://folder=/alice/simulation/2008/v4-15-Release/Ideal");
+  
+  simulator.SetRunQA(":") ; 
+
+  AliHLTConfigurationHandler::CreateHandler();
+  AliHLTConfigurationHandler *handler = AliHLTConfigurationHandler::Instance();
+
+  handler->CreateConfiguration("ITS-SAPtracker1","ITSSAPTracker","DigitClusterFinder ITS-SPD-vertexer",
+                              "");
+
+
+  simulator.SetRunHLT("chains=ITS-SAPtracker1");
+  
+  TStopwatch timer;
+  timer.Start();
+  simulator.Run();
+  timer.Stop();
+  timer.Print();
+}
index a6bd777a6a0428cc047de9d66028547999e36daa..da01b9330a0d721b16809b8c520db2cdf41365b0 100644 (file)
@@ -345,3 +345,9 @@ AliVParticle* AliFlatESDEvent::GetTrack(Int_t i) const
 {
   return const_cast<AliFlatESDTrack*>(GetFlatTrack(i));
 }
+  
+AliVEvent::EDataLayoutType AliFlatESDEvent::GetDataLayoutType() const 
+{
+  return AliVEvent::kFlat;
+}
+
index f897ab8b79c35d25aecb5f87afc9bb8a3d7647a5..bf4f962a2b04f5943c2850a74934ee0032501e06 100644 (file)
@@ -55,9 +55,13 @@ class AliFlatESDEvent :public AliVEvent {
   UInt_t GetEventSpecie()   const { return fEventSpecie; }
   Int_t  GetNumberOfKinks() const { return 0; }  
 
-  AliVTrack  *GetVTrack( Int_t i ) { return GetFlatTrackNonConst(i); }
+  AliVTrack  *GetVTrack( Int_t i ) const { return GetFlatTrackNonConst(i); }
   AliESDkink *GetKink(Int_t /*i*/) const { return NULL;}
 
+  using AliVEvent::GetPrimaryVertex;
+  using AliVEvent::GetPrimaryVertexTPC;
+  using AliVEvent::GetPrimaryVertexSPD;
+  using AliVEvent::GetPrimaryVertexTracks;
   Int_t GetPrimaryVertex( AliESDVertex &v ) const ;
   Int_t GetPrimaryVertexTPC( AliESDVertex &v ) const ;
   Int_t GetPrimaryVertexSPD( AliESDVertex &v ) const ;
@@ -109,7 +113,7 @@ class AliFlatESDEvent :public AliVEvent {
   const AliFlatESDV0      *GetV0s() const { return reinterpret_cast<const AliFlatESDV0*>( fContent + fV0Pointer ); }
 
   const AliFlatESDTrack  *GetFlatTrack( Int_t i ) const ;
-  AliFlatESDTrack  *GetFlatTrackNonConst( Int_t i );
+  AliFlatESDTrack  *GetFlatTrackNonConst( Int_t i ) const;
 
   // --------------------------------------------------------------------------------
   // -- Size methods
@@ -150,6 +154,7 @@ class AliFlatESDEvent :public AliVEvent {
   virtual Int_t EventIndexForEMCALCell(Int_t) const {return 0;}
   virtual AliVVZERO* GetVZEROData() const {return NULL;}
   virtual AliVZDC   *GetZDCData() const {return NULL;}
+  virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;
 
  private:
 
@@ -200,11 +205,11 @@ class AliFlatESDEvent :public AliVEvent {
 
 // Inline implementations 
 
-inline AliFlatESDTrack  *AliFlatESDEvent::GetFlatTrackNonConst( Int_t i )  
+inline AliFlatESDTrack  *AliFlatESDEvent::GetFlatTrackNonConst( Int_t i ) const 
 { 
   const Long64_t *table = reinterpret_cast<const Long64_t*> (fContent + fTrackTablePointer);
   if( i<0 || i>(int) fNTracks || table[i]<0 ) return NULL;
-  return reinterpret_cast<AliFlatESDTrack*>( fContent + table[i] );
+  return reinterpret_cast<AliFlatESDTrack*>( const_cast<Byte_t*>(fContent + table[i]) );
 }
 
 inline const AliFlatESDTrack  *AliFlatESDEvent::GetFlatTrack( Int_t i ) const 
index 985b480cacdb5fb113d6380fb0a46634a137500e..98c2316752546bd8a464caa75a76e7aa2b567901 100644 (file)
@@ -105,6 +105,9 @@ class AliFlatESDTrack :public AliVTrack {
   // ---------------------------------------------------------------------------------
   // AliVParticle interface
   virtual Double_t Pt() const {const AliFlatExternalTrackParam* p=GetFlatTrackParam(); return (p)?p->GetPt():kVeryBig;}
+  virtual Double_t GetTgl()  const {const AliFlatExternalTrackParam* p=GetFlatTrackParam(); return (p)?p->GetTgl():kVeryBig;}
+  using AliVTrack::GetImpactParameters;
+  virtual void GetImpactParameters(Float_t &xy,Float_t &z) const {xy=0.; z=0.;}
   virtual Double_t Px() const {return 0.;}
   virtual Double_t Py() const {return 0.;}
   virtual Double_t Pz() const {return 0.;}
index 99151982bd700ab5e4dd3f409829f7727b34a008..00d62995e441815f8bde234cfb8a6ae441606043 100644 (file)
@@ -148,6 +148,7 @@ Int_t AliHLTAnaManagerComponent::DoInit( Int_t /*argc*/, const Char_t** /*argv*/
   fAnalysisManager->SetExternalLoop(kTRUE); 
 
   AliAnalysisTaskPt *task = new AliAnalysisTaskPt("TaskPt");
+  printf("-----> AliHLTAnaManagerComponent: here we set the usage of the friends to %d\n", (Int_t)task->GetUseFriends());
   task->SetUseFriends(kTRUE);
   fAnalysisManager->AddTask(task);
   AliAnalysisDataContainer *cinput  = fAnalysisManager->GetCommonInputContainer();
index 830744244748f3e541184afe8301cd0953a9e939..383aa974ab7e035825a061f0b225c381885f47e2 100644 (file)
@@ -12,3 +12,11 @@ To run an example using the AliHLTFlatAnaManagerComponent, please, run:
 rm galice.root; aliroot -b -q -l testconfigFlat.C'("GLOBAL-flat-esd-converter")' $ALICE_ROOT/HLT/exa/recraw-local.C'("raw.root","local://$ALICE_ROOT/OCDB", 0, 10, "HLT", "chains=RootWriter ignore-hltout")' 2>&1| tee recHLT.log
 
 Note that you need to have a raw.root file in your folder.
+
+
+*******************************************************************************
+
+To run the same AliAnalysisPtTask but on Offline ESDs (that you need locally, optionally with the 
+friends) run:
+
+aliroot -b -q runTaskOffline.C
diff --git a/HLT/global/physics/macros/runTaskOffline.C b/HLT/global/physics/macros/runTaskOffline.C
new file mode 100644 (file)
index 0000000..a247a08
--- /dev/null
@@ -0,0 +1,54 @@
+void runTaskOffline()
+{
+  // load analysis framework
+  gSystem->Load("libANALYSISalice");
+
+  gROOT->LoadMacro("$ALICE_ROOT/PWGUD/macros/CreateESDChain.C");
+
+  // for includes use either global setting in $HOME/.rootrc
+  // ACLiC.IncludePaths: -I$(ALICE_ROOT)/include
+  // or in each macro
+  gSystem->AddIncludePath("-I$ALICE_ROOT/include");
+  gROOT->Macro("$ALICE_ROOT/PWGPP/CalibMacros/CPass0/LoadLibraries.C");
+
+  // Create the analysis manager
+  AliAnalysisManager *mgr = new AliAnalysisManager("testAnalysis");
+
+  // Add ESD input handler
+  AliESDInputHandler* esdH = new AliESDInputHandler();
+  esdH->SetReadFriends(kTRUE);
+  esdH->SetActiveBranches("ESDfriend");
+
+  // Register input handler to manager
+  mgr->SetInputEventHandler(esdH);
+
+  // Create task
+
+  //gROOT->LoadMacro("AliAnalysisTaskPt.cxx+g");
+  AliAnalysisTaskPt *task = new AliAnalysisTaskPt("TaskPt");
+  task->SetUseFriends(kTRUE);
+  
+  // Add task
+  mgr->AddTask(task);
+
+  // Create containers for input/output
+  AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer();
+  AliAnalysisDataContainer *coutput = mgr->CreateContainer("chist", TList::Class(),    AliAnalysisManager::kOutputContainer, "Pt.ESD.1.root");
+
+  // Connect input/output
+  mgr->ConnectInput(task, 0, cinput);
+  mgr->ConnectOutput(task, 0, coutput);
+
+  // Enable debug printouts
+  mgr->SetDebugLevel(2);
+
+  if (!mgr->InitAnalysis())
+    return;
+
+  mgr->PrintStatus();
+
+  TChain *chain1 = new TChain("esdTree");
+  chain1->Add("AliESDs.root");
+
+  mgr->StartAnalysis("local", chain1);
+}
index f3c8501269c1e61df6f9ecb72fda32c68130cee1..3cfd2cf2a0aa7026dd188647f741aed707b7cc9e 100644 (file)
@@ -72,6 +72,7 @@ public:
   Double_t GetD(Double_t x, Double_t y) const {
     return AliExternalTrackParam::GetD(x,y,GetBz());
   }
+  using AliExternalTrackParam::GetDZ;
   void GetDZ(Double_t xv, Double_t yv, Double_t zv, Float_t dz[2]) const {
     return AliExternalTrackParam::GetDZ(xv,yv,zv,GetBz(),dz);
   }
index 910093597de163ef12ba9aa47179228b6132a0f1..c946e29717bd53f3d66638e52753668276eda6c3 100644 (file)
@@ -1072,3 +1072,5 @@ void AliAODEvent::ConnectTracks() {
   fTracksConnected = kTRUE;
 }
 
+AliVEvent::EDataLayoutType AliAODEvent::GetDataLayoutType() const {return AliVEvent::kAOD;}
+
index 20ae27daca730110e032c3e702780692bc13f020..5f3e3afa29a84315d40659cae420a1937d16f8f9 100644 (file)
@@ -158,6 +158,8 @@ class AliAODEvent : public AliVEvent {
   {new((*fVertices)[fVertices->GetEntriesFast()]) AliAODVertex(*vtx); return fVertices->GetEntriesFast()-1;}
   
   // primary vertex
+  using AliVEvent::GetPrimaryVertex;
+  using AliVEvent::GetPrimaryVertexSPD;
   virtual AliAODVertex *GetPrimaryVertex() const { return GetVertex(0); }
   virtual AliAODVertex *GetPrimaryVertexSPD() const;
 
@@ -173,6 +175,7 @@ class AliAODEvent : public AliVEvent {
   // V0
   TClonesArray *GetV0s()                 const { return fV0s; }
   Int_t         GetNumberOfV0s()         const { return fV0s->GetEntriesFast(); }
+  using AliVEvent::GetV0;
   AliAODv0     *GetV0(Int_t nV0)         const { return (AliAODv0*)fV0s->UncheckedAt(nV0); }
   Int_t         AddV0(const AliAODv0* v0)
   {new((*fV0s)[fV0s->GetEntriesFast()]) AliAODv0(*v0); return fV0s->GetEntriesFast()-1;}
@@ -309,6 +312,7 @@ class AliAODEvent : public AliVEvent {
   //ZDC
   AliAODZDC   *GetZDCData() const { return fAODZDC; }
 
+  virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;
 
   private :
 
index 7e2a92f604c6e35ab602619aba3e1dae60081d47..4233423ce7c55fd89e983ebad5788491e34bde02 100644 (file)
@@ -201,6 +201,7 @@ class AliAODTrack : public AliVTrack {
   //
   Int_t   GetTOFBunchCrossing(Double_t b=0, Bool_t tpcPIDonly=kFALSE) const;
   //
+  using AliVTrack::GetP;
   template <typename T> void GetP(T *p) const {
     p[0]=fMomentum[0]; p[1]=fMomentum[1]; p[2]=fMomentum[2];}
 
index f1980f88c98cd8ddf40ccf2c3ab0026cfebbf5f5..acbb0c0f4f0dcc67d2176e3066585bd83f49fe00 100644 (file)
@@ -96,6 +96,9 @@ set ( SRCS
     STEERBase/AliVTOFHit.cxx
     STEERBase/AliVTOFMatch.cxx
     STEERBase/AliVTOFcluster.cxx
+    STEERBase/AliVMisc.cxx
+    STEERBase/AliVfriendTrack.cxx
+    STEERBase/AliVfriendEvent.cxx
   )
 
 string(REPLACE ".cxx" ".h" HDRS  "${SRCS}")
index f1d8bd842032a787ca3184c063254aad5c8dcdd5..76a4631831ae105a63d3894c0b64bd128fbd05a7 100644 (file)
@@ -1467,7 +1467,7 @@ void AliESDEvent::GetESDfriend(AliESDfriend *ev) const
 
   }
 
-  AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindListObject("AliESDfriend"));
+  AliESDfriend *fr = (AliESDfriend*)(const_cast<AliESDEvent*>(this)->FindFriend());
   if (fr) ev->SetVZEROfriend(fr->GetVZEROfriend());
 }
 
@@ -2429,3 +2429,11 @@ void AliESDEvent::ConnectTracks() {
   //
 }
 
+//______________________________________________________________________________
+AliESDfriend* AliESDEvent::FindFriend() const 
+{ 
+  return static_cast<AliESDfriend*>(FindListObject("AliESDfriend")); 
+}
+
+AliVEvent::EDataLayoutType AliESDEvent::GetDataLayoutType() const {return AliVEvent::kESD;}
+
index 0dea219b765771ee25b29ab6b683ec8b4c2b93db..db0bcae1f37d1dad705f7218e982ad84d3e0d825 100644 (file)
@@ -274,7 +274,7 @@ public:
 
   void SetESDfriend(const AliESDfriend *f) const;
   void GetESDfriend(AliESDfriend *f) const;
-  AliESDfriend* FindFriend() const { return static_cast<AliESDfriend*>(FindListObject("AliESDfriend")); }
+  virtual AliESDfriend* FindFriend() const;
 
   void SetPrimaryVertexTPC(const AliESDVertex *vertex); 
   const AliESDVertex *GetPrimaryVertexTPC() const {return fTPCVertex;}
@@ -554,6 +554,8 @@ public:
   UInt_t GetDAQDetectorPattern() const {return fDAQDetectorPattern;}
   UInt_t GetDAQAttributes() const {return fDAQAttributes;}
 
+  virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;
+
 protected:
   AliESDEvent(const AliESDEvent&);
   static Bool_t ResetWithPlacementNew(TObject *pObject);
@@ -624,5 +626,6 @@ protected:
 
   ClassDef(AliESDEvent,23)  //ESDEvent class 
 };
+  
 #endif 
 
index f97039940a261b2dac41114b367a2061a38f8d21..76ed08e5f216547a37ac4af50c6caffa6c3b93a5 100644 (file)
@@ -188,7 +188,7 @@ void AliESDInputHandler::ConnectFriends()
 
     cTree->AddFriend("esdFriendTree", esdFriendTreeFName.Data());
     cTree->SetBranchStatus("ESDfriend.", 1);
-    fFriend = (AliESDfriend*)(fEvent->FindListObject("AliESDfriend"));
+    fFriend = fEvent->FindFriend();
     if (fFriend) cTree->SetBranchAddress("ESDfriend.", &fFriend);
   }
 }
index 3b7706b15de11d8cf8dec5663832b6d8bc9352aa..5b2f648ca09d20fb3aed5ae4d890b0d403813923 100644 (file)
@@ -67,6 +67,9 @@ class AliESDInputHandler : public AliInputEventHandler {
     virtual void CreatePIDResponse(Bool_t isMC=kFALSE);
     AliESDpid           *GetESDpid()       const {return fESDpid;}
     void                 SetESDpid(AliESDpid* pid)     {Changed(); fESDpid = pid;}
+
+    //HLT
+    virtual AliVfriendEvent*   GetVfriendEvent() const {return fFriend;};
   
  private:
     AliESDInputHandler(const AliESDInputHandler& handler);             
index 409cf2ecd1a54ea54a84e3282ecf6abad2825b5f..c027dcf5a16ca2b39322ee7e6f61e1f78ba162c9 100644 (file)
@@ -421,7 +421,7 @@ public:
   Bool_t 
   RelateToVertexBxByBz(const AliESDVertex *vtx, Double_t b[3], Double_t maxd,
                         AliExternalTrackParam *cParam=0);
-  void GetImpactParameters(Float_t &xy,Float_t &z) const {xy=fD; z=fZ;}
+  virtual void GetImpactParameters(Float_t &xy,Float_t &z) const {xy=fD; z=fZ;}
   void GetImpactParameters(Float_t p[2], Float_t cov[3]) const {
     p[0]=fD; p[1]=fZ; cov[0]=fCdd; cov[1]=fCdz; cov[2]=fCzz;
   }
index e340f8bf311f445f42bab165fe101cf4dad8932c..95263bae2b87d7269c54f04d616dc045920230ef 100644 (file)
@@ -84,7 +84,7 @@ Bool_t AliHLTTestInputHandler::InitTaskInputData(AliVEvent* esdEvent, AliVfriend
   SetVFriendEvent(friendEvent);
   // set transient pointer to event inside tracks
   fEvent->ConnectTracks();
-  Printf("----> AliHLTTestInputHandler::InitTaskInpuData: ...Event set: fEvent = %p", fEvent);
+  Printf("----> AliHLTTestInputHandler::InitTaskInpuData: ...Event set: fEvent = %p; friend = %p", fEvent, friendEvent);
   for (Int_t i = 0; i < arrTasks->GetEntries(); i++){
     AliAnalysisTask* t = (AliAnalysisTask*)(arrTasks->At(i));
     t->ConnectInputData("");
index d4477ca4c8241fdafbffaa602e25b8bdb8e8e3d7..3ce7a59c94bdde6a38cf27c593e85007b30d6d11 100644 (file)
@@ -46,7 +46,7 @@ class AliHLTTestInputHandler : public AliVEventHandler {
     //AliVEvent* GetEvent() const {return NULL;}
     void  SetEvent(AliVEvent *event) {fEvent = event;}
 
-    AliVfriendEvent* GetVFriendEvent() const {return fFriendEvent;}
+    AliVfriendEvent* GetVfriendEvent() const {return fFriendEvent;}
     void  SetVFriendEvent(AliVfriendEvent *friendEvent) {fFriendEvent = friendEvent;}
       
  private:
index b38f97f66693c52d07c624207fac1c6f8d32daa3..4efe032f14fe7d7e0b911c6b3f917b42f8eb0a51 100644 (file)
@@ -89,7 +89,9 @@ class AliExternalTrackParam: public AliVTrack {
   Double_t GetY()    const {return fP[0];}
   Double_t GetZ()    const {return fP[1];}
   Double_t GetSnp()  const {return fP[2];}
-  Double_t GetTgl()  const {return fP[3];}
+  virtual Double_t GetTgl()  const {return fP[3];}
+  using AliVTrack::GetImpactParameters;
+  virtual void GetImpactParameters(Float_t& ,Float_t&) const {}
   Double_t GetSigned1Pt()  const {return fP[4];}
 
   Double_t GetSigmaY2() const {return fC[0];}
index 3c59ae6c8ff93769e696a9894b2bd5b3e2a1487f..be23a424aafc39f6d3caf1a29ca4542cf9144975 100644 (file)
@@ -855,7 +855,6 @@ Bool_t  AliMCEvent::GetCocktailGenerator(Int_t index,TString &nameGen){
    return 1;
 }
 
-
-
+AliVEvent::EDataLayoutType AliMCEvent::GetDataLayoutType() const {return AliVEvent::kMC;}
 
 ClassImp(AliMCEvent)
index 3e6cc1993b70f087fd2769257e0306f65414f3cf..94f3867e2899f6a2edf51815ae46cf38d7dc61e7 100644 (file)
@@ -99,6 +99,7 @@ public:
     virtual Int_t     GetNumberOfV0s()       const {return -1;}
     virtual Int_t     GetNumberOfCascades()  const {return -1;}
     // Vertex
+    using AliVEvent::GetPrimaryVertex;
     virtual const AliVVertex *GetPrimaryVertex() const;
     
     //
@@ -148,7 +149,8 @@ public:
 
   virtual AliVVZERO    *GetVZEROData() const {return 0;}
   virtual AliVZDC      *GetZDCData()   const {return 0;}
-    
+
+  virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;
 
 private:
     virtual void      ReorderAndExpandTreeTR();
@@ -179,6 +181,5 @@ private:
     ClassDef(AliMCEvent, 2)              // AliVEvent realisation for MC data
 };
 
-
 #endif 
 
index 39257885126095097eb2985439358e7c37042f74..db0eb63d4025951fbcb1e414f5df9eaf3d5433be 100644 (file)
@@ -355,3 +355,8 @@ Double_t AliMixedEvent::GetMagneticField() const
     AliVEvent* evt = (AliVEvent*) (fEventList.At(0));
     return evt->GetMagneticField();
 }
+
+AliVEvent::EDataLayoutType AliMixedEvent::GetDataLayoutType() const
+{
+  return AliVEvent::kMixed;
+}
index 2abee7c4b68ab94267e528660fbd0beecc69395f..1ed37e055290bcd381a59db45bce5fd99573f9b0 100644 (file)
@@ -114,11 +114,13 @@ public:
   virtual AliCentrality* GetCentrality() {return 0;}
   virtual AliEventplane* GetEventplane() {return 0;}
   // Primary vertex
+    using AliVEvent::GetPrimaryVertex;
     virtual const AliVVertex   *GetPrimaryVertex() const {return fMeanVertex;}
     virtual Bool_t ComputeVtx(const TObjArray *vertices, Double_t *pos,Double_t *sig,Int_t *nContributors);
   // VZERO
   virtual AliVVZERO *GetVZEROData() const {return 0;}
   virtual AliVZDC     *GetZDCData() const {return 0;}
+  virtual EDataLayoutType GetDataLayoutType() const;
 private:
   TList   fEventList;            //! List of Events
   Int_t   fNEvents;              //! Number of Events 
index 5d78ffead5badfce30db8abb549fe85f9fee4555..948b55372f9bc98e2b00f7ffe90751de67e70e66 100644 (file)
@@ -34,5 +34,23 @@ AliVEvent& AliVEvent::operator=(const AliVEvent& vEvnt)
   return *this; 
 }
 
+const char* AliVEvent::Whoami()
+{
+  switch (GetDataLayoutType())
+  {
+    case AliVEvent::kESD :
+      return "ESD";
+    case AliVEvent::kFlat :
+      return "Flat";
+    case AliVEvent::kAOD :
+      return "AOD";
+    case AliVEvent::kMC :
+      return "MC";
+    case AliVEvent::kMixed :
+      return "Mixed";
+    default:
+      return "unknown";
+  }
+}
 
 ClassImp(AliVEvent)
index 99fd31b347d2602171bc95330aec5841793a8f63..0795d5b00e6a9d90378832e0ed0b8fa62d4409e3 100644 (file)
@@ -44,6 +44,7 @@ class AliVEvent : public TObject {
   ULong64_t GetTriggerMaskNext50() const { return 0; }
 
 public:
+  enum EDataLayoutType { kESD, kMC, kAOD, kMixed, kFlat };
   enum EOfflineTriggerTypes { 
       kMB           = BIT(0), // Minimum bias trigger, i.e. interaction trigger, offline SPD or V0 selection
       kINT7         = BIT(1), // V0AND trigger, offline V0 selection
@@ -153,6 +154,7 @@ public:
   // Tracks
   virtual AliVParticle *GetTrack(Int_t i) const = 0;
   virtual AliVTrack    *GetVTrack(Int_t /*i*/) const {return NULL;}
+  //virtual AliVTrack    *GetVTrack(Int_t /*i*/) {return NULL;}
   //virtual Int_t        AddTrack(const AliVParticle *t) = 0;
   virtual Int_t        GetNumberOfTracks() const = 0;
   virtual Int_t        GetNumberOfV0s() const = 0;
@@ -228,6 +230,8 @@ public:
   virtual Int_t GetPrimaryVertexTracks( AliESDVertex & ) const {return 0;}
 
   virtual void ConnectTracks() {}
+  virtual EDataLayoutType GetDataLayoutType() const = 0;
+  const char* Whoami();
 
   ClassDef(AliVEvent, 3)  // base class for AliEvent data
 };
index 59516eda7311a1eea9423c6fd4d28ca4311716a1..068e83f133102b525f0714c8148252bd9badedf7 100644 (file)
@@ -65,7 +65,7 @@ enum EEventHandlerFlags {
     // HLT
     virtual Bool_t              InitTaskInputData(AliVEvent* /*event*/, AliVfriendEvent* /*esdFriend*/, TObjArray* /*arrTasks*/) {return kTRUE;};
     virtual AliVEvent*          GetEvent() const {return 0x0;};
-    virtual AliVfriendEvent*   GetVFriendEvent() const {return 0x0;};
+    virtual AliVfriendEvent*   GetVfriendEvent() const {return 0x0;};
 
  private :
   ClassDef(AliVEventHandler, 1);
diff --git a/STEER/STEERBase/AliVMisc.cxx b/STEER/STEERBase/AliVMisc.cxx
new file mode 100644 (file)
index 0000000..42d42f4
--- /dev/null
@@ -0,0 +1 @@
+//dummy implementation file
diff --git a/STEER/STEERBase/AliVTPCseed.cxx b/STEER/STEERBase/AliVTPCseed.cxx
new file mode 100644 (file)
index 0000000..82200f8
--- /dev/null
@@ -0,0 +1 @@
+//implementation file
index c0fc5c3f2f8529ef85ae62d2aa1786fadc8ea955..20893311e2aa6186b7ace7ebac8c9d3598a0486e 100644 (file)
@@ -127,6 +127,7 @@ public:
   virtual UShort_t  GetTPCsignalN()      const {return 0 ;}
   virtual Double_t  GetTPCmomentum()     const {return 0.;}
   virtual Double_t  GetTPCTgl()          const {return 0.;}
+  virtual Double_t  GetTgl()             const {return 0.;}
   virtual Double_t  GetTOFsignal()       const {return 0.;}
   virtual Double_t  GetTOFsignalTunedOnData() const {return 0.;}
   virtual Double_t  GetHMPIDsignal()     const {return 0.;}
@@ -193,7 +194,6 @@ public:
   virtual void              GetDirection(Double_t []) const {;}
   virtual Double_t          GetLinearD(Double_t /*xv*/, Double_t /*yv*/) const {return 0;}
   virtual void              GetDZ(Double_t /*x*/,Double_t /*y*/,Double_t /*z*/,Double_t /*b*/,Float_t [] /*dz[2]*/) const {;}
-  virtual Double_t          GetTgl()  const {return 0;}
   virtual Char_t            GetITSclusters(Int_t */**idx*/) const {return 0;}
   virtual UChar_t           GetTRDclusters(Int_t */**idx*/) const {return 0;}
 
diff --git a/STEER/STEERBase/AliVfriendEvent.cxx b/STEER/STEERBase/AliVfriendEvent.cxx
new file mode 100644 (file)
index 0000000..82200f8
--- /dev/null
@@ -0,0 +1 @@
+//implementation file
diff --git a/STEER/STEERBase/AliVfriendTrack.cxx b/STEER/STEERBase/AliVfriendTrack.cxx
new file mode 100644 (file)
index 0000000..82200f8
--- /dev/null
@@ -0,0 +1 @@
+//implementation file
index 3f51dc770bb18de604b33bc3913ca27952b86d69..8e81dd8c758bbb8b5d5700330a3a0e18f5156b13 100644 (file)
@@ -8,13 +8,13 @@
 #include "AliAnalysisManager.h"
 
 #include "AliESDEvent.h"
-//#include "AliFlatESDEvent.h"
 #include "AliESDtrackCuts.h"
 #include "AliVEventHandler.h"
 #include "AliTPCseed.h"
 #include "AliTPCclusterMI.h"
 #include "AliVfriendEvent.h"
 #include "AliVfriendTrack.h"
+#include "AliESDInputHandler.h"
 
 #include "AliAnalysisTaskPt.h"
 
@@ -47,7 +47,8 @@ void AliAnalysisTaskPt::ConnectInputData(Option_t *)
   TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
   if (!tree) {
     Printf("ERROR: Could not read chain from input slot 0");
-  } else {
+  } 
+  else {
     // Disable all branches and enable only the needed ones
     // The next two lines are different when data produced as AliESDEvent is read
     /*
@@ -62,12 +63,31 @@ void AliAnalysisTaskPt::ConnectInputData(Option_t *)
 
     if (!esdH) {
       Printf("ERROR: Could not get ESDInputHandler");
-    } else {
+    } 
+    else {
       Printf("----> AliAnalysisTaskPt::ConnectInputData Getting the event from handler %p", esdH);
-      //fESD = dynamic_cast<AliFlatESDEvent*>(esdH->GetEvent());
       fESD = esdH->GetEvent();
-      if (fUseFriends){        
-       fESDfriend = esdH->GetVFriendEvent();
+      if (fUseFriends){
+       Printf("...We have to use the friends...");
+       if (classInputHandler.Contains("HLT")) { // we are running in HLT
+         fESDfriend = esdH->GetVfriendEvent();
+       }
+       else { /// we are running offline
+         if (esdH && esdH->GetTree()) {
+           Printf("...We got the tree...");
+           if (esdH->GetTree()->GetBranch("ESDfriend.")){
+             Printf("Yu-huuuu!!! friend branch found");
+             fESDfriend = ((AliESDInputHandler*)esdH)->GetESDfriend();
+           }
+           else {
+             Printf("No friend branch found");
+           }
+         }
+       }       
+       Printf("and the result is: fESDfriend = %p", fESDfriend);
+      }
+      else {
+       Printf("The friends are not requested");
       }
     }
     if (!fESD) {
@@ -138,11 +158,26 @@ void AliAnalysisTaskPt::Exec(Option_t *)
     Printf("ERROR: fESD not available");
     return;
   }
-  if (!fESDfriend) {
-    Printf("ERROR: fESDfriend not available");
-      if (fUseFriends){
+
+  /*
+  if (fUseFriends){
+    Printf("In Exec: ...We have to use the friends...");
+    fESDfriend = fESD->FindFriend();
+    Printf("...and we got friends = %p", fESDfriend);
+    if (!fESDfriend) {
+      Printf("ERROR: fESDfriend not available");
        return;
-      }
+    }
+  }
+  */
+
+  if (fUseFriends){
+    Printf("In Exec: ...We have to use the friends...");
+    Printf("...and we got friends = %p", fESDfriend);
+    if (!fESDfriend) {
+      Printf("ERROR: fESDfriend not available");
+       return;
+    }
   }
 
   Int_t nESDtracks = fESD->GetNumberOfTracks();
@@ -156,7 +191,7 @@ void AliAnalysisTaskPt::Exec(Option_t *)
 
   // Track loop to fill a pT spectrum
   for (Int_t iTracks = 0; iTracks < nESDtracks; iTracks++) {
-    Printf("Checking track %d: Note that with Flat, the GetTrack is not yet implemented!!!", iTracks);
+    Printf("Checking track %d", iTracks);
     const AliVTrack* track = dynamic_cast<AliVTrack*>(fESD->GetTrack(iTracks));
     if (!track) {
       Printf("ERROR: Could not receive track %d", iTracks);
@@ -169,17 +204,22 @@ void AliAnalysisTaskPt::Exec(Option_t *)
 
 
   if (fUseFriends){
+    Printf("In the loop over the friends");
     // Friend Track loop
     for (Int_t iFriend = 0; iFriend < nESDfriendtracks; iFriend++) {
-      //Printf("Getting friend %d", iFriend);
+      Printf("Getting friend %d", iFriend);
       const AliVfriendTrack* friendTrack = fESDfriend->GetTrack(iFriend);
       if (!friendTrack) {
        Printf("ERROR: Could not receive track %d", iFriend);
        continue;
       }
+      else {
+       Printf("friend track = %p", friendTrack);
+      }
       
       AliTPCseed seed;
       Int_t err = friendTrack->GetTPCseed( seed );
+      Printf("err = %d", err);
       if( err==0 ){
        Printf("Found TPC seed" );
        for (Int_t irow = 0; irow < 160; irow++){
index 0c87dd04753dbb13c6e514b16be0c087681ccc64..94526874f702e16d27a517cfed103d49afa7be39 100644 (file)
@@ -274,7 +274,12 @@ AliTPCseed & AliTPCseed::operator=(const AliTPCseed &param)
     if (!fClusterOwner) for(Int_t i = 0;i<160;++i)fClusterPointer[i] = param.fClusterPointer[i];
     else                for(Int_t i = 0;i<160;++i) {
        delete fClusterPointer[i];
-       fClusterPointer[i] = new AliTPCclusterMI(*(param.fClusterPointer[i]));
+       if (param.fClusterPointer[i]) { 
+         fClusterPointer[i] = new AliTPCclusterMI(*(param.fClusterPointer[i]));
+       }
+       else {
+         fClusterPointer[i] = 0x0;
+       }
       }
     // leave out fPoint, they are also not copied in the copy ctor...
     // but deleted in the dtor... strange...