]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/ITS/AliHLTITSClusterFinderComponent.cxx
adding map include file to solve compilation issue (bug https://savannah.cern.ch...
[u/mrichter/AliRoot.git] / HLT / ITS / AliHLTITSClusterFinderComponent.cxx
index f55edf1c8c8209b8a5aba462a158d4cc1314ab1a..30813a50159692ae18406ccb2781c05983a3794d 100644 (file)
@@ -29,7 +29,7 @@ using namespace std;
 
 #include "AliCDBEntry.h"
 #include "AliCDBManager.h"
-#include "AliHLTDataTypes.h"
+#include "AliCDBStorage.h"
 #include "AliITSgeomTGeo.h"
 #include "AliITSRecPoint.h"
 #include "AliHLTITSSpacePointData.h"
@@ -40,9 +40,11 @@ using namespace std;
 #include "AliITSReconstructor.h"
 #include "AliHLTITSClusterFinderSPD.h"
 #include "AliHLTITSClusterFinderSSD.h"
+#include "TMap.h"
 
 #include <cstdlib>
 #include <cerrno>
+#include "TFile.h"
 #include "TString.h"
 #include "TObjString.h"
 #include <sys/time.h>
@@ -65,7 +67,11 @@ AliHLTITSClusterFinderComponent::AliHLTITSClusterFinderComponent(int mode)
   fgeom(NULL),
   fgeomInit(NULL),
   fSPD(NULL),
-  fSSD(NULL)
+  fSSD(NULL),
+  tD(NULL),
+  tR(NULL),
+  fclusters(),
+  fBenchmark(GetComponentID())
 { 
   // see header file for class documentation
   // or
@@ -86,6 +92,10 @@ AliHLTITSClusterFinderComponent::AliHLTITSClusterFinderComponent(int mode)
     fInputDataType  = kAliHLTDataTypeDDLRaw | kAliHLTDataOriginITSSSD;
     fOutputDataType = kAliHLTDataTypeClusters|kAliHLTDataOriginITSSSD;
     break;
+  case kClusterFinderDigits:
+    fInputDataType  = kAliHLTDataTypeAliTreeD|kAliHLTDataOriginITS;
+    fOutputDataType = kAliHLTDataTypeClusters|kAliHLTDataOriginITS;
+    break;
   default:
     HLTFatal("unknown cluster finder");
   }
@@ -117,6 +127,9 @@ const char* AliHLTITSClusterFinderComponent::GetComponentID()
   case kClusterFinderSSD:
     return "ITSClusterFinderSSD";
     break;
+  case kClusterFinderDigits:
+    return "ITSClusterFinderDigits";
+    break;
   }
   return "";
 }
@@ -145,8 +158,12 @@ AliHLTComponent* AliHLTITSClusterFinderComponent::Spawn() {
   return new AliHLTITSClusterFinderComponent(fModeSwitch);
 }
        
-Int_t AliHLTITSClusterFinderComponent::DoInit( int /*argc*/, const char** /*argv*/ ) {
+Int_t AliHLTITSClusterFinderComponent::DoInit( int argc, const char** argv ) {
   // see header file for class documentation
+  fBenchmark.Reset();
+  fBenchmark.SetTimer(0,"total");
+  fBenchmark.SetTimer(1,"reco");
+
   /*
   fStatTime = 0;
   fStatTimeAll = 0;
@@ -154,6 +171,71 @@ Int_t AliHLTITSClusterFinderComponent::DoInit( int /*argc*/, const char** /*argv
   fStatTimeAllC = 0;
   fStatNEv = 0;
   */
+  
+  Int_t runNo = GetRunNo();
+  AliCDBStorage* store = AliCDBManager::Instance()->GetDefaultStorage();
+  if (!store) {
+    return NULL;
+  }
+
+  bool cdbOK = true;
+  //OCDB for SPD
+  if(store->GetLatestVersion("ITS/Calib/SPDNoisy", runNo)<0){
+    HLTError("SPDNoisy is not found in SPD/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/SPDDead", runNo)<0){
+    HLTError("SPDDead is not found in SPD/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("TRIGGER/SPD/PITConditions", runNo)<0){
+    HLTError("PITConditions is not found in TRIGGER/SPD");
+    cdbOK = false;
+  }
+  
+  //OCDB for SDD
+  if(store->GetLatestVersion("ITS/Calib/CalibSDD", runNo)<0){
+    HLTError("CalibSDD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/RespSDD", runNo)<0){
+    HLTError("RespSDD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/DriftSpeedSDD", runNo)<0){
+    HLTError("DriftSpeedSDD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/DDLMapSDD", runNo)<0){
+    HLTError("DDLMapSDD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/MapsTimeSDD", runNo)<0){
+    HLTError("MapsTimeSDD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+
+  //OCDB for SSD
+  if(store->GetLatestVersion("ITS/Calib/NoiseSSD", runNo)<0){
+    HLTError("NoiseSSD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/GainSSD", runNo)<0){
+    HLTError("GainSSD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  if(store->GetLatestVersion("ITS/Calib/BadChannelsSSD", runNo)<0){
+    HLTError("BadChannelsSSD is not found in ITS/Calib");
+    cdbOK = false;
+  }
+  
+  //General reconstruction
+  if(store->GetLatestVersion("GRP/CTP/Scalers", runNo)<0){
+    HLTError("Scalers is not found in GRP/CTP/");
+    cdbOK = false;
+  }
+  if(!cdbOK){return NULL;}
+
   if(fModeSwitch==kClusterFinderSPD) {
     HLTDebug("using ClusterFinder for SPD");
     //fNModules=AliITSgeomTGeo::GetNDetectors(1)*AliITSgeomTGeo::GetNLadders(1) + AliITSgeomTGeo::GetNDetectors(2)*AliITSgeomTGeo::GetNLadders(2);
@@ -172,6 +254,9 @@ Int_t AliHLTITSClusterFinderComponent::DoInit( int /*argc*/, const char** /*argv
     fId=AliHLTDAQ::DdlIDOffset("ITSSSD");
     fNddl=AliHLTDAQ::NumberOfDdls("ITSSSD");
   }
+  else if(fModeSwitch==kClusterFinderDigits) {
+    //tR = new TTree();
+  }
   else{
      HLTFatal("No mode set for clusterfindercomponent");
   }
@@ -216,7 +301,16 @@ Int_t AliHLTITSClusterFinderComponent::DoInit( int /*argc*/, const char** /*argv
   fSPD = new AliHLTITSClusterFinderSPD( fDettype );
   fSSD = new AliHLTITSClusterFinderSSD( fDettype, fRawReader );
 
-  return 0;
+  TString arguments = "";
+  for ( int i = 0; i < argc; i++ ) {
+    if ( !arguments.IsNull() ) arguments += " ";
+    arguments += argv[i];
+  }
+
+  tD = NULL;
+  tR = NULL;
+
+  return Configure( arguments.Data() );
 }
 
 Int_t AliHLTITSClusterFinderComponent::DoDeinit() {
@@ -253,12 +347,10 @@ Int_t AliHLTITSClusterFinderComponent::DoDeinit() {
   return 0;
 }
 
-// #include "TStopwatch.h"
-
 int AliHLTITSClusterFinderComponent::DoEvent
 (
  const AliHLTComponentEventData& evtData,
- const AliHLTComponentBlockData* blocks,
+ const AliHLTComponentBlockData* /*blocks*/,
  AliHLTComponentTriggerData& /*trigData*/,
  AliHLTUInt8_t* outputPtr,
  AliHLTUInt32_t& size,
@@ -276,124 +368,186 @@ int AliHLTITSClusterFinderComponent::DoEvent
       HLTDebug("no blocks in event" );
       return 0;
     }
-  
-  // TStopwatch timer;
+
+  fBenchmark.StartNewEvent();
+  fBenchmark.Start(0);
+  for( const AliHLTComponentBlockData *i= GetFirstInputBlock(fInputDataType); i!=NULL; i=GetNextInputBlock() ){
+    fBenchmark.AddInput(i->fSize);
+  }
 
   Int_t ret = 0;
 
-  // -- Loop over blocks
-  for( const AliHLTComponentBlockData* iter = GetFirstInputBlock(fInputDataType); iter != NULL; iter = GetNextInputBlock() ) {
-  
-    // -- Debug output of datatype --
-    HLTDebug("Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
-              evtData.fEventID, evtData.fEventID, 
-              DataType2Text(iter->fDataType).c_str(), 
-              DataType2Text(datatype).c_str());
-    
-    // -- Check for the correct data type
-    if ( iter->fDataType != (fInputDataType) )  
-      continue;
-    
-    // -- Get equipment ID out of specification
-    AliHLTUInt32_t spec = iter->fSpecification;
-  
-    Int_t id = fId;
-    for ( Int_t ii = 0; ii < fNddl ; ii++ ) {   //number of ddl's
-      if ( spec & 0x00000001 ) {
-       id += ii;
-       break;
+  if(fModeSwitch==kClusterFinderDigits) {
+
+    for ( const TObject *iter = GetFirstInputObject(fInputDataType); iter != NULL; iter = GetNextInputObject() ) {  
+      tD = dynamic_cast<TTree*>(const_cast<TObject*>( iter ) );
+      if(!tD){
+       HLTFatal("No Digit Tree found");
+       return -1;
+      }
+      // 2010-04-17 very crude workaround: TTree objects are difficult to send
+      // The actual case: Running ITS and TPC reconstruction fails at the second event
+      // to read the ITS digits from the TreeD
+      //
+      // Reason: reading fails in TBranch::GetBasket, there a new basket is opened from
+      // a TFile object. The function TBranch::GetFile returns the file object from
+      // an internal fDirectory (TDirectory) object. This file is at the second event
+      // set to the TPC.Digits.root. The internal mismatch creates a seg fault
+      //
+      // Investigation: TBranch::Streamer uses a crude assignment after creating the
+      // TBranch object
+      //    fDirectory = gDirectory;
+      // gDirectory is obviously not set correctly. Setting the directory to a TFile
+      // object for the ITS digits helps to fix the internal mess. Tried also to set
+      // the Directory for the TreeD to NULL (This has only effect if ones sets it 
+      // to something not NULL first, and then to NULL). But then no content, i.e.
+      // ITS clusters could be retrieved.
+      //
+      // Conclusion: TTree objects are hardly to be sent via TMessage, there are direct
+      // links to the file required anyhow.
+      TFile* dummy=new TFile("ITS.Digits.root");
+      tD->SetDirectory(dummy);
+      tR = new TTree();
+      tR->SetDirectory(0);
+      fDettype->SetTreeAddressD(tD);
+      fDettype->MakeBranch(tR,"R");
+      fDettype->SetTreeAddressR(tR);
+      Option_t *opt="All";
+      fBenchmark.Start(1);
+      fDettype->DigitsToRecPoints(tD,tR,0,opt,kTRUE);
+      fBenchmark.Stop(1);
+      TClonesArray * fRecPoints = NULL;
+      tR->SetBranchAddress("ITSRecPoints",&fRecPoints);
+      for(Int_t treeEntry=0;treeEntry<tR->GetEntries();treeEntry++){
+       tR->GetEntry(treeEntry);
+       for(Int_t tCloneEntry=0;tCloneEntry<fRecPoints->GetEntries();tCloneEntry++){
+         AliITSRecPoint *recpoint=(AliITSRecPoint*)fRecPoints->At(tCloneEntry);
+         fclusters.push_back(*recpoint);
+       }
+      }
+      
+      if(tR){
+       tR->Delete();
       }
-      spec = spec >> 1 ;
-    }
-    
-    // -- Set equipment ID to the raw reader
 
-    if(!fRawReader->AddBuffer((UChar_t*) iter->fPtr, iter->fSize, id)){
-      HLTWarning("Could not add buffer");
+      tD->SetDirectory(0);
+      delete dummy;
+      UInt_t nClusters=fclusters.size();
+      
+      UInt_t bufferSize = nClusters * sizeof(AliHLTITSSpacePointData) + sizeof(AliHLTITSClusterData);
+      if( size + bufferSize > maxBufferSize ){
+       HLTWarning( "Output buffer size exceed (buffer size %d, current size %d)", maxBufferSize, size+bufferSize);
+       ret = -ENOSPC;      
+       break;          
+      }
+      if( nClusters>0 ){
+       fBenchmark.Start(1);
+       RecPointToSpacePoint(outputPtr,size);
+       fBenchmark.Stop(1);
+       AliHLTComponentBlockData bd;
+       FillBlockData( bd );
+       bd.fOffset = size;
+       bd.fSize = bufferSize;
+       bd.fSpecification = 0x00000000;
+       bd.fDataType = GetOutputDataType();
+       outputBlocks.push_back( bd );
+       size += bufferSize;
+       fBenchmark.AddOutput(bd.fSize);
+       fclusters.clear();      
+      }
     }
-    // TStopwatch timer1;
-    
-    std::vector<AliITSRecPoint> vclusters;
-    
-    if(fModeSwitch==kClusterFinderSPD && !fUseOfflineFinder){ fSPD->RawdataToClusters( fRawReader, vclusters ); }
-    else if(fModeSwitch==kClusterFinderSSD && !fUseOfflineFinder){ fSSD->RawdataToClusters( vclusters ); }
-    else{
-      if(fModeSwitch==kClusterFinderSPD && fUseOfflineFinder) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SPD");}
-      if(fModeSwitch==kClusterFinderSSD && fUseOfflineFinder) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SSD");}
-      if(fModeSwitch==kClusterFinderSDD) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SDD");}
-      for(int i=0;i<fNModules;i++){
-       if(fClusters[i] != NULL){
-         for(int j=0;j<fClusters[i]->GetEntriesFast();j++){
-           AliITSRecPoint *recpoint = (AliITSRecPoint*) (fClusters[i]->At(j));
-           vclusters.push_back(*recpoint);
-         }
-         fClusters[i]->Delete();
-         delete fClusters[i];
+  }
+  else{
+      
+    // -- Loop over blocks
+    for( const AliHLTComponentBlockData* iter = GetFirstInputBlock(fInputDataType); iter != NULL; iter = GetNextInputBlock() ) {
+      
+      // -- Debug output of datatype --
+      HLTDebug("Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
+              evtData.fEventID, evtData.fEventID, 
+              DataType2Text(iter->fDataType).c_str(), 
+              DataType2Text(fInputDataType).c_str());
+      
+      // -- Check for the correct data type
+      if ( iter->fDataType != (fInputDataType) )  
+       continue;
+      
+      // -- Get equipment ID out of specification
+      AliHLTUInt32_t spec = iter->fSpecification;
+      
+      Int_t id = fId;
+      for ( Int_t ii = 0; ii < fNddl ; ii++ ) {   //number of ddl's
+       if ( spec & 0x00000001 ) {
+         id += ii;
+         break;
        }
-       fClusters[i] = NULL;
-      }     
-    }
-    
-    // timer1.Stop();
-    // fStatTime+=timer1.RealTime();
-    // fStatTimeC+=timer1.CpuTime();
-    
-    fRawReader->ClearBuffers();    
-
-    UInt_t nClusters=vclusters.size();
-    
-    UInt_t bufferSize = nClusters * sizeof(AliHLTITSSpacePointData) + sizeof(AliHLTITSClusterData);
-    if( size + bufferSize > maxBufferSize ){
-      HLTWarning( "Output buffer size exceed (buffer size %d, current size %d)", maxBufferSize, size+bufferSize);
-      ret = -ENOSPC;      
-      break;           
-    }
-    //cout<<"event "<<fStatNEv<<", nclu="<<nClusters<<":"<<endl;
-    if( nClusters>0 ){
-      AliHLTITSClusterData *outputClusters = reinterpret_cast<AliHLTITSClusterData*>(outputPtr + size);
-      outputClusters->fSpacePointCnt=nClusters;    
-      int clustIdx=0;
-      for(int i=0;i<vclusters.size();i++){
-       AliITSRecPoint *recpoint = (AliITSRecPoint*) &(vclusters[i]);
-       //cout<<recpoint->GetDetectorIndex()<<" "<<recpoint->GetY()<<" "<<recpoint->GetZ()<<endl;
-       outputClusters->fSpacePoints[clustIdx].fY=recpoint->GetY();
-       outputClusters->fSpacePoints[clustIdx].fZ=recpoint->GetZ();
-       outputClusters->fSpacePoints[clustIdx].fSigmaY2=recpoint->GetSigmaY2();
-       outputClusters->fSpacePoints[clustIdx].fSigmaZ2=recpoint->GetSigmaZ2();
-       outputClusters->fSpacePoints[clustIdx].fSigmaYZ=recpoint->GetSigmaYZ();
-       outputClusters->fSpacePoints[clustIdx].fQ=recpoint->GetQ();
-       outputClusters->fSpacePoints[clustIdx].fNy=recpoint->GetNy();
-       outputClusters->fSpacePoints[clustIdx].fNz=recpoint->GetNz();
-       outputClusters->fSpacePoints[clustIdx].fLayer=recpoint->GetLayer();
-       outputClusters->fSpacePoints[clustIdx].fIndex=recpoint->GetDetectorIndex() | recpoint->GetPindex() | recpoint->GetNindex();
-       outputClusters->fSpacePoints[clustIdx].fTracks[0]=recpoint->GetLabel(0);
-       outputClusters->fSpacePoints[clustIdx].fTracks[1]=recpoint->GetLabel(1);
-       outputClusters->fSpacePoints[clustIdx].fTracks[2]=recpoint->GetLabel(2);      
-       clustIdx++;
+       spec = spec >> 1 ;
+      }
+      
+      // -- Set equipment ID to the raw reader
+      
+      if(!fRawReader){
+       HLTWarning("The fRawReader pointer is NULL");
+       continue;
       }
-      AliHLTComponentBlockData bd;
-      FillBlockData( bd );
-      bd.fOffset = size;
-      bd.fSize = bufferSize;
-      bd.fSpecification = iter->fSpecification;
-      bd.fDataType = GetOutputDataType();
-      outputBlocks.push_back( bd );
-      size += bufferSize;
-    }
 
-  } // input blocks
+      if(!fRawReader->AddBuffer((UChar_t*) iter->fPtr, iter->fSize, id)){
+       HLTWarning("Could not add buffer");
+      }
 
-  /*
-  timer.Stop();
-  
-  fStatTimeAll+=timer.RealTime();
-  fStatTimeAllC+=timer.CpuTime();
-  fStatNEv++;
-  if( fStatNEv%1000==0 && fStatTimeAll>0.0 && fStatTime>0.0 && fStatTimeAllC>0.0 && fStatTimeC>0.0)
-    cout<<fStatTimeAll/fStatNEv*1.e3<<" "<<fStatTime/fStatNEv*1.e3<<" "
-       <<fStatTimeAllC/fStatNEv*1.e3<<" "<<fStatTimeC/fStatNEv*1.e3<<" ms"<<endl;
-  */
+      fBenchmark.Start(1);
+
+      if(fModeSwitch==kClusterFinderSPD && !fUseOfflineFinder){ fSPD->RawdataToClusters( fRawReader, fclusters ); }
+      else if(fModeSwitch==kClusterFinderSSD && !fUseOfflineFinder){ fSSD->RawdataToClusters( fclusters ); }
+      else{
+       if(fModeSwitch==kClusterFinderSPD && fUseOfflineFinder) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SPD");}
+       if(fModeSwitch==kClusterFinderSSD && fUseOfflineFinder) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SSD");}
+       if(fModeSwitch==kClusterFinderSDD) {fDettype->DigitsToRecPoints(fRawReader,fClusters,"SDD");}
+       for(int i=0;i<fNModules;i++){
+         if(fClusters[i] != NULL){
+           for(int j=0;j<fClusters[i]->GetEntriesFast();j++){
+             AliITSRecPoint *recpoint = (AliITSRecPoint*) (fClusters[i]->At(j));
+             fclusters.push_back(*recpoint);
+           }
+           fClusters[i]->Delete();
+           delete fClusters[i];
+         }
+         fClusters[i] = NULL;
+       }     
+      }
+      fBenchmark.Stop(1);
+      
+      fRawReader->ClearBuffers();    
+         
+      UInt_t nClusters=fclusters.size();
+      
+      UInt_t bufferSize = nClusters * sizeof(AliHLTITSSpacePointData) + sizeof(AliHLTITSClusterData);
+      if( size + bufferSize > maxBufferSize ){
+       HLTWarning( "Output buffer size exceed (buffer size %d, current size %d)", maxBufferSize, size+bufferSize);
+       ret = -ENOSPC;      
+       break;          
+      }
+      if( nClusters>0 ){
+
+       RecPointToSpacePoint(outputPtr,size);
+
+       AliHLTComponentBlockData bd;
+       FillBlockData( bd );
+       bd.fOffset = size;
+       bd.fSize = bufferSize;
+       bd.fSpecification = iter->fSpecification;
+       bd.fDataType = GetOutputDataType();
+       outputBlocks.push_back( bd );
+       size += bufferSize;
+       fBenchmark.AddOutput(bd.fSize);
+       fclusters.clear();      
+      }
+      
+    } // input blocks
+  }
 
+  fBenchmark.Stop(0);
+  HLTInfo(fBenchmark.GetStatistics());
   return ret;
 }
 
@@ -465,4 +619,48 @@ int AliHLTITSClusterFinderComponent::Reconfigure(const char* cdbEntry, const cha
   
   return iResult;
 }
+void AliHLTITSClusterFinderComponent::GetOCDBObjectDescription( TMap* const targetMap)
+{
+  // Get a list of OCDB object description.
+  if (!targetMap) return;
+  //SPD
+  targetMap->Add(new TObjString("ITS/Calib/SPDNoisy"),new TObjString("Calibration object for SPD" ));
+  targetMap->Add(new TObjString("ITS/Calib/SPDDead"),new TObjString("Calibration object for SPD" ));
+  targetMap->Add(new TObjString("TRIGGER/SPD/PITConditions"),new TObjString("Calibration object for SPD" ));
+  //SDD
+  targetMap->Add(new TObjString("ITS/Calib/CalibSDD"),new TObjString("Calibration object for SDD" ));
+  targetMap->Add(new TObjString("ITS/Calib/RespSDD"),new TObjString("Calibration object for SDD" ));
+  targetMap->Add(new TObjString("ITS/Calib/DriftSpeedSDD"),new TObjString("Calibration object for SDD" ));
+  targetMap->Add(new TObjString("ITS/Calib/DDLMapSDD"),new TObjString("Calibration object for SDD" ));
+  targetMap->Add(new TObjString("ITS/Calib/MapsTimeSDD"),new TObjString("Calibration object for SDD" ));
+  //SSD
+  targetMap->Add(new TObjString("ITS/Calib/NoiseSSD"),new TObjString("Calibration object for SSD" ));
+  targetMap->Add(new TObjString("ITS/Calib/GainSSD"),new TObjString("Calibration object for SSD" ));
+  targetMap->Add(new TObjString("ITS/Calib/BadChannelsSSD"),new TObjString("Calibration object for SSD" ));
+  //General reconstruction
+  targetMap->Add(new TObjString("GRP/CTP/Scalers"),new TObjString("General reconstruction object" ));
+}
+
 
+void AliHLTITSClusterFinderComponent::RecPointToSpacePoint(AliHLTUInt8_t* outputPtr,AliHLTUInt32_t& size){
+  AliHLTITSClusterData *outputClusters = reinterpret_cast<AliHLTITSClusterData*>(outputPtr + size);
+  outputClusters->fSpacePointCnt=fclusters.size();    
+  int clustIdx=0;
+  for(UInt_t i=0;i<fclusters.size();i++){
+    AliITSRecPoint *recpoint = (AliITSRecPoint*) &(fclusters[i]);
+    outputClusters->fSpacePoints[clustIdx].fY=recpoint->GetY();
+    outputClusters->fSpacePoints[clustIdx].fZ=recpoint->GetZ();
+    outputClusters->fSpacePoints[clustIdx].fSigmaY2=recpoint->GetSigmaY2();
+    outputClusters->fSpacePoints[clustIdx].fSigmaZ2=recpoint->GetSigmaZ2();
+    outputClusters->fSpacePoints[clustIdx].fSigmaYZ=recpoint->GetSigmaYZ();
+    outputClusters->fSpacePoints[clustIdx].fQ=recpoint->GetQ();
+    outputClusters->fSpacePoints[clustIdx].fNy=recpoint->GetNy();
+    outputClusters->fSpacePoints[clustIdx].fNz=recpoint->GetNz();
+    outputClusters->fSpacePoints[clustIdx].fLayer=recpoint->GetLayer();
+    outputClusters->fSpacePoints[clustIdx].fIndex=recpoint->GetDetectorIndex() | recpoint->GetPindex() | recpoint->GetNindex();
+    outputClusters->fSpacePoints[clustIdx].fTracks[0]=recpoint->GetLabel(0);
+    outputClusters->fSpacePoints[clustIdx].fTracks[1]=recpoint->GetLabel(1);
+    outputClusters->fSpacePoints[clustIdx].fTracks[2]=recpoint->GetLabel(2);      
+    clustIdx++;
+  }
+}