]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/ITS/tracking/AliHLTITSTrackerComponent.cxx
adding map include file to solve compilation issue (bug https://savannah.cern.ch...
[u/mrichter/AliRoot.git] / HLT / ITS / tracking / AliHLTITSTrackerComponent.cxx
index 0ce4dc5c5e30775dc81fb9071cf42d1b44698c84..4d08ddcefa29da549b184fa38f904c8931aeab89 100644 (file)
@@ -40,6 +40,7 @@ using namespace std;
 #include "TMath.h"
 #include "AliCDBEntry.h"
 #include "AliCDBManager.h"
+#include "AliGeomManager.h"
 #include "TObjString.h"
 #include "TObjArray.h"
 #include "AliITStrackerHLT.h"
@@ -48,17 +49,16 @@ using namespace std;
 #include "AliHLTDataTypes.h"
 #include "AliHLTExternalTrackParam.h"
 #include "AliHLTGlobalBarrelTrack.h"
-
-
+#include "AliGeomManager.h"
+#include "AliHLTTrackMCLabel.h"
+#include <map>
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp( AliHLTITSTrackerComponent )
 AliHLTITSTrackerComponent::AliHLTITSTrackerComponent()
     :
     fSolenoidBz( 0 ),
-    fFullTime( 0 ),
-    fRecoTime( 0 ),
-    fNEvents( 0 ),
+    fBenchmark("ITSTracker"),
     fTracker(0)
 {
   // see header file for class documentation
@@ -72,9 +72,7 @@ AliHLTITSTrackerComponent::AliHLTITSTrackerComponent( const AliHLTITSTrackerComp
     :
     AliHLTProcessor(),
     fSolenoidBz( 0 ),
-    fFullTime( 0 ),
-    fRecoTime( 0 ),
-    fNEvents( 0 ),
+    fBenchmark("ITSTracker"),
     fTracker(0)
 {
   // see header file for class documentation
@@ -110,22 +108,34 @@ void AliHLTITSTrackerComponent::GetInputDataTypes( vector<AliHLTComponentDataTyp
   // see header file for class documentation
   list.clear();
   list.push_back( kAliHLTDataTypeTrack|kAliHLTDataOriginTPC );
+  list.push_back( kAliHLTDataTypeTrackMC|kAliHLTDataOriginTPC );
   list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITSSSD );
   list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD );
   list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITSSDD );
+  list.push_back( kAliHLTDataTypeClusters|kAliHLTDataOriginITS );
 }
 
 AliHLTComponentDataType AliHLTITSTrackerComponent::GetOutputDataType()
 {
   // see header file for class documentation  
-  return kAliHLTDataTypeTrack|kAliHLTDataOriginITS;
+  return kAliHLTMultipleDataType;
+}
+
+int AliHLTITSTrackerComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
+{
+  // see header file for class documentation  
+  tgtList.clear();
+  tgtList.push_back(kAliHLTDataTypeTrack|kAliHLTDataOriginITS);
+  tgtList.push_back(kAliHLTDataTypeTrack|kAliHLTDataOriginITSOut);
+  tgtList.push_back( kAliHLTDataTypeTrackMC|kAliHLTDataOriginITS );
+  return tgtList.size();
 }
 
 void AliHLTITSTrackerComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
 {
   // define guess for the output data size
   constBase = 200;       // minimum size
-  inputMultiplier = 0.5; // size relative to input
+  inputMultiplier = 2.; // size relative to input
 }
 
 AliHLTComponent* AliHLTITSTrackerComponent::Spawn()
@@ -139,10 +149,8 @@ void AliHLTITSTrackerComponent::SetDefaultConfiguration()
   // Set default configuration for the CA tracker component
   // Some parameters can be later overwritten from the OCDB
 
-  fSolenoidBz = 5.;
-  fFullTime = 0;
-  fRecoTime = 0;
-  fNEvents = 0;
+  fSolenoidBz = -5.00668;
+  
 }
 
 int AliHLTITSTrackerComponent::ReadConfigurationString(  const char* arguments )
@@ -166,8 +174,7 @@ int AliHLTITSTrackerComponent::ReadConfigurationString(  const char* arguments )
 
     if ( argument.CompareTo( "-solenoidBz" ) == 0 ) {
       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
-      fSolenoidBz = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
-      HLTInfo( "Magnetic Field set to: %f", fSolenoidBz );
+      HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
       continue;
     }
 
@@ -242,7 +249,8 @@ int AliHLTITSTrackerComponent::Configure( const char* cdbEntry, const char* chai
 
   //* read magnetic field
 
-  int iResult2 = ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId );
+  int iResult2 = 0; //ReadCDBEntry( kAliHLTCDBSolenoidBz, chainId );
+  fSolenoidBz = GetBz();
 
   //* read the actual CDB entry if required
 
@@ -268,8 +276,12 @@ int AliHLTITSTrackerComponent::DoInit( int argc, const char** argv )
 {
   // Configure the ITS tracker component
 
-  if ( fTracker ) return EINPROGRESS;
-  fTracker = new AliITStrackerHLT(0);
+  if ( fTracker ) return -EINPROGRESS;
+
+  if(AliGeomManager::GetGeometry()==NULL){
+    AliGeomManager::LoadGeometry();
+  }
+  AliGeomManager::ApplyAlignObjsFromCDB("ITS");
 
   TString arguments = "";
   for ( int i = 0; i < argc; i++ ) {
@@ -277,7 +289,20 @@ int AliHLTITSTrackerComponent::DoInit( int argc, const char** argv )
     arguments += argv[i];
   }
 
-  return Configure( NULL, NULL, arguments.Data() );
+  int ret = Configure( NULL, NULL, arguments.Data() );
+
+  // Check field
+  if (!TGeoGlobalMagField::Instance()) {
+    HLTError("magnetic field not initialized, please set up TGeoGlobalMagField and AliMagF");
+    return -ENODEV;
+  }
+  fSolenoidBz=GetBz();
+
+  fTracker = new AliITStrackerHLT(0);
+  fBenchmark.Reset();
+  fBenchmark.SetTimer(0,"total");
+  fBenchmark.SetTimer(1,"reco");
+  return ret;
 }
 
 
@@ -313,7 +338,7 @@ int AliHLTITSTrackerComponent::DoEvent
 
   AliHLTUInt32_t maxBufferSize = size;
   size = 0; // output size
-
+  
   if (!IsDataEvent()) return 0;
 
   if ( evtData.fBlockCnt <= 0 ) {
@@ -321,8 +346,8 @@ int AliHLTITSTrackerComponent::DoEvent
     return 0;
   }
 
-
-  TStopwatch timer;
+  fBenchmark.StartNewEvent();
+  fBenchmark.Start(0);
 
   // Event reconstruction in ITS
 
@@ -332,24 +357,71 @@ int AliHLTITSTrackerComponent::DoEvent
 
   
   vector< AliExternalTrackParam > tracksTPC;
+  vector< int > tracksTPCLab;
   vector< int > tracksTPCId;
-  std::vector<AliITSRecPoint> clusters;
 
-  //int currentTrackID = 0;
+  int nClustersTotal = 0;
 
   for (int ndx=0; ndx<nBlocks && iResult>=0; ndx++) {
 
     const AliHLTComponentBlockData* iter = blocks+ndx;
  
+    if ( (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSSD) ) || 
+        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD) ) ||
+        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSDD) ) ||
+        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITS) ) 
+        ){      
+      AliHLTITSClusterData *inPtr=reinterpret_cast<AliHLTITSClusterData*>( iter->fPtr );
+      nClustersTotal+=inPtr->fSpacePointCnt;
+    }         
+  }
+
+
+  fTracker->StartLoadClusters(nClustersTotal);
+
+  // first read MC information (if present)
+  
+  std::map<int,int> mcLabels;
+
+  for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTrackMC|kAliHLTDataOriginTPC);
+       pBlock!=NULL; pBlock=GetNextInputBlock()) {
+    
+    fBenchmark.AddInput(pBlock->fSize);
+    
+    AliHLTTrackMCData* dataPtr = reinterpret_cast<AliHLTTrackMCData*>( pBlock->fPtr );
+    if (sizeof(AliHLTTrackMCData)+dataPtr->fCount*sizeof(AliHLTTrackMCLabel)==pBlock->fSize) {
+      for( unsigned int il=0; il<dataPtr->fCount; il++ ){
+       AliHLTTrackMCLabel &lab = dataPtr->fLabels[il];
+       mcLabels[lab.fTrackID] = lab.fMCLabel;
+      }
+    } else {
+      HLTWarning("data mismatch in block %s (0x%08x): count %d, size %d -> ignoring track MC information", 
+                DataType2Text(pBlock->fDataType).c_str(), pBlock->fSpecification, 
+                dataPtr->fCount, pBlock->fSize);
+    }
+  }
+  
+  
+  
+  for (int ndx=0; ndx<nBlocks && iResult>=0; ndx++) {
+
+    const AliHLTComponentBlockData* iter = blocks+ndx;
+    
     // Read TPC tracks
     
     if( iter->fDataType == ( kAliHLTDataTypeTrack|kAliHLTDataOriginTPC ) ){      
+      fBenchmark.AddInput(iter->fSize);
       AliHLTTracksData* dataPtr = ( AliHLTTracksData* ) iter->fPtr;
       int nTracks = dataPtr->fCount;
       AliHLTExternalTrackParam* currOutTrack = dataPtr->fTracklets;
       for( int itr=0; itr<nTracks; itr++ ){
        AliHLTGlobalBarrelTrack t(*currOutTrack);
+       Int_t mcLabel = -1;
+       if( mcLabels.find(currOutTrack->fTrackID)!=mcLabels.end() )
+         mcLabel = mcLabels[currOutTrack->fTrackID];
+       
        tracksTPC.push_back( t );
+       tracksTPCLab.push_back(mcLabel);
        tracksTPCId.push_back( currOutTrack->fTrackID );
        unsigned int dSize = sizeof( AliHLTExternalTrackParam ) + currOutTrack->fNPoints * sizeof( unsigned int );
        currOutTrack = ( AliHLTExternalTrackParam* )( (( Byte_t * )currOutTrack) + dSize );
@@ -361,8 +433,11 @@ int AliHLTITSTrackerComponent::DoEvent
 
     if ( (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSSD) ) || 
         (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD) ) ||
-        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSDD) ) 
+        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITSSDD) ) ||
+        (iter->fDataType == (kAliHLTDataTypeClusters|kAliHLTDataOriginITS) ) 
         ){
+      
+      fBenchmark.AddInput(iter->fSize);
 
       AliHLTITSClusterData *inPtr=reinterpret_cast<AliHLTITSClusterData*>( iter->fPtr );
       int nClusters = inPtr->fSpacePointCnt;
@@ -373,98 +448,147 @@ int AliHLTITSTrackerComponent::DoEvent
        Int_t info[3] = { d.fNy, d.fNz, d.fLayer };
        Float_t hit[6] = { d.fY, d.fZ, d.fSigmaY2, d.fSigmaZ2, d.fQ, d.fSigmaYZ };
        if( d.fLayer==4 ) hit[5] = -hit[5];
-
-       AliITSRecPoint p( lab, hit, info );
-       clusters.push_back( p );
+       fTracker->LoadCluster( AliITSRecPoint( lab, hit, info ) );
+       //cout<<"SG "<<d.fLayer<<" "<<d.fTracks[0]<<endl;
       }   
     }
     
   }// end read input blocks
   
-  // set clusters to tracker
-
-
-  fTracker->LoadClusters( clusters );
-  //timer.Stop();
   // Reconstruct the event
 
-  TStopwatch timerReco;
-  
-  fTracker->Reconstruct( tracksTPC );
+    fBenchmark.Start(1);
+    fTracker->Reconstruct( &(tracksTPC[0]), &(tracksTPCLab[0]), tracksTPC.size() );
+    fBenchmark.Stop(1);
 
-  timerReco.Stop();
   
   // Fill output tracks
   int nITSUpdated = 0;
   {
-    unsigned int mySize = 0;    
-     
-    AliHLTTracksData* outPtr = ( AliHLTTracksData* )( outputPtr );
+    
+    for( int iOut=0; iOut<=1; iOut++ ){
 
-    AliHLTExternalTrackParam* currOutTrack = outPtr->fTracklets;
+      unsigned int blockSize = 0;
 
-    mySize =   ( ( AliHLTUInt8_t * )currOutTrack ) -  ( ( AliHLTUInt8_t * )outputPtr );
+      AliHLTTracksData* outPtr = ( AliHLTTracksData* )( outputPtr + size );
+      AliHLTExternalTrackParam* currOutTrack = outPtr->fTracklets;
 
-    outPtr->fCount = 0;
-    
-    int nTracks = fTracker->Tracks().size();
+      blockSize =   ( ( AliHLTUInt8_t * )currOutTrack ) -  ( ( AliHLTUInt8_t * )outPtr );
 
-    for ( int itr = 0; itr < nTracks; itr++ ) {
+      if ( size + blockSize  > maxBufferSize ) {
+       HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), tracks are not stored", maxBufferSize, size + blockSize );
+       iResult = -ENOSPC;
+       break;
+      }
 
-      const AliExternalTrackParam &tp = fTracker->Tracks()[itr];      
-      int id =  tracksTPCId[fTracker->Tracks()[itr].TPCtrackId()];
+      outPtr->fCount = 0;
+       AliHLTITSTrack *tracks=0;
+      int nTracks = 0;
+      if( iOut==0 ){
+       tracks = fTracker->Tracks();
+       nTracks = fTracker->NTracks();
+      } else{
+       tracks = fTracker->ITSOutTracks();
+       nTracks = fTracker->NITSOutTracks();
+      }
       
-      int nClusters = 0;
-      if( fTracker->Tracks()[itr].GetNumberOfClusters()>0 ) nITSUpdated++;
-
-      unsigned int dSize = sizeof( AliHLTExternalTrackParam ) + nClusters * sizeof( unsigned int );
-
-      if ( mySize + dSize > maxBufferSize ) {
-        HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, mySize, nTracks - itr + 1 );
-        iResult = -ENOSPC;
-        break;
+      for ( int itr = 0; itr < nTracks; itr++ ) {
+       AliHLTITSTrack &t = tracks[itr];
+       int id =  tracksTPCId[t.TPCtrackId()];      
+       int nClusters = t.GetNumberOfClusters();
+       if( iOut==0 && nClusters>0 ) nITSUpdated++;
+       
+       unsigned int dSize = sizeof( AliHLTExternalTrackParam ) + nClusters * sizeof( unsigned int );
+       
+       if ( size + blockSize + dSize > maxBufferSize ) {
+         HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d tracks are not stored", maxBufferSize, size + blockSize + dSize, nTracks - itr + 1 );
+         iResult = -ENOSPC;
+         break;
+       }
+       
+       currOutTrack->fAlpha = t.GetAlpha();
+       currOutTrack->fX = t.GetX();
+       currOutTrack->fY = t.GetY();
+       currOutTrack->fZ = t.GetZ();            
+       currOutTrack->fLastX = 0;
+       currOutTrack->fLastY = 0;
+       currOutTrack->fLastZ = 0;      
+       currOutTrack->fq1Pt = t.GetSigned1Pt();
+       currOutTrack->fSinPsi = t.GetSnp();
+       currOutTrack->fTgl = t.GetTgl();
+       for( int i=0; i<15; i++ ) currOutTrack->fC[i] = t.GetCovariance()[i];
+       currOutTrack->fTrackID = id;
+       currOutTrack->fFlags = 0;
+       currOutTrack->fNPoints = nClusters;    
+       for ( int i = 0; i < nClusters; i++ ) currOutTrack->fPointIDs[i] = t.GetClusterIndex( i );
+       currOutTrack = ( AliHLTExternalTrackParam* )( (( Byte_t * )currOutTrack) + dSize );
+       blockSize += dSize;
+       outPtr->fCount++;
       }
+  
 
-      currOutTrack->fAlpha = tp.GetAlpha();
-      currOutTrack->fX = tp.GetX();
-      currOutTrack->fY = tp.GetY();
-      currOutTrack->fZ = tp.GetZ();            
-      currOutTrack->fLastX = 0;
-      currOutTrack->fLastY = 0;
-      currOutTrack->fLastZ = 0;      
-      currOutTrack->fq1Pt = tp.GetSigned1Pt();
-      currOutTrack->fSinPsi = tp.GetSnp();
-      currOutTrack->fTgl = tp.GetTgl();
-      for( int i=0; i<15; i++ ) currOutTrack->fC[i] = tp.GetCovariance()[i];
-      currOutTrack->fTrackID = id;
-      currOutTrack->fFlags = 0;
-      currOutTrack->fNPoints = nClusters;    
-      currOutTrack = ( AliHLTExternalTrackParam* )( (( Byte_t * )currOutTrack) + dSize );
-      mySize += dSize;
-      outPtr->fCount++;
+      AliHLTComponentBlockData resultData;
+      FillBlockData( resultData );
+      resultData.fOffset = size;
+      resultData.fSize = blockSize;
+      if( iOut==0 ){
+       resultData.fDataType = kAliHLTDataTypeTrack|kAliHLTDataOriginITS;
+      } else {
+       resultData.fDataType = kAliHLTDataTypeTrack|kAliHLTDataOriginITSOut;
+      }
+      fBenchmark.AddOutput(resultData.fSize);
+      outputBlocks.push_back( resultData );
+      size += resultData.fSize;       
     }
-  
+  }  
+
+  {// fill MC labels
 
+    unsigned int blockSize = 0;
+      
+    AliHLTTrackMCData* outPtr = ( AliHLTTrackMCData* )( outputPtr +size );
+    AliHLTTrackMCLabel* currOutLabel = outPtr->fLabels;
+    
+    blockSize =   ( ( AliHLTUInt8_t * )currOutLabel ) -  ( ( AliHLTUInt8_t * )outPtr );
+    
+    outPtr->fCount = 0;
+    
+    AliHLTITSTrack *tracks= fTracker->Tracks();
+    int nTracks = fTracker->NTracks();
+    
+    for ( int itr = 0; itr < nTracks; itr++ ) {
+      AliHLTITSTrack &t = tracks[itr];
+      //cout<<"SG out:"<<tracksTPCId[t.TPCtrackId()]<<" "<<t.GetLabel()<<endl;
+      if( t.GetLabel()<0 ) continue;
+      int id =  tracksTPCId[t.TPCtrackId()];
+      
+      if ( blockSize + sizeof(AliHLTTrackMCLabel) > maxBufferSize ) {
+       HLTWarning( "Output buffer size exceed (buffer size %d, current size %d), %d mc labels are not stored", maxBufferSize, blockSize, nTracks - itr + 1 );
+       iResult = -ENOSPC;
+       break;
+      }
+      currOutLabel->fTrackID = id;
+      currOutLabel->fMCLabel = t.GetLabel();
+      blockSize += sizeof(AliHLTTrackMCLabel);
+      currOutLabel++;
+      outPtr->fCount++;
+    }        
+    
     AliHLTComponentBlockData resultData;
     FillBlockData( resultData );
-    resultData.fOffset = 0;
-    resultData.fSize = mySize;
-    resultData.fDataType = kAliHLTDataTypeTrack|kAliHLTDataOriginITS;
+    resultData.fOffset = size;
+    resultData.fSize = blockSize;
+    resultData.fDataType = kAliHLTDataTypeTrackMC|kAliHLTDataOriginITS;
     outputBlocks.push_back( resultData );
-    size = resultData.fSize;  
-    
+    size+= resultData.fSize;
   }
-
-  timer.Stop();
-  fFullTime += timer.RealTime();
-  fRecoTime += timerReco.RealTime();
-  fNEvents++;
+  
+  fBenchmark.Stop(0);
 
   // Set log level to "Warning" for on-line system monitoring
-  int hz = ( int ) ( fFullTime > 1.e-10 ? fNEvents / fFullTime : 100000 );
-  int hz1 = ( int ) ( fRecoTime > 1.e-10 ? fNEvents / fRecoTime : 100000 );
-  HLTInfo( "ITS Tracker: output %d tracks;  input %d clusters, %d tracks; time: full %d / reco %d Hz",
-             nITSUpdated, clusters.size(), tracksTPC.size(), hz, hz1 );
+  HLTInfo( "ITS Tracker: output %d tracks;  input %d clusters, %d tracks",
+          nITSUpdated, nClustersTotal, tracksTPC.size() );
 
+  HLTInfo(fBenchmark.GetStatistics());
   return iResult;
 }