]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/global/AliHLTGlobalTrackMatcherComponent.cxx
adding helper component for the automatic generation of compressed TPC cluster data...
[u/mrichter/AliRoot.git] / HLT / global / AliHLTGlobalTrackMatcherComponent.cxx
index 3c940395a2634d5d103a83faf6524d7a0d37c0a9..fae28e9283572c08fe904aa687bea89085fc7bcf 100644 (file)
@@ -32,7 +32,12 @@ using namespace std;
 #include "AliHLTGlobalBarrelTrack.h"
 #include "AliHLTCaloClusterDataStruct.h"
 #include "AliHLTCaloClusterReader.h"
-
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include "TGeoManager.h"
+#include "TRefArray.h"
+#include "TString.h"
+#include "TMap.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 AliHLTGlobalTrackMatcherComponent gAliHLTGlobalTrackMatcherComponent;
@@ -40,10 +45,13 @@ AliHLTGlobalTrackMatcherComponent gAliHLTGlobalTrackMatcherComponent;
 ClassImp(AliHLTGlobalTrackMatcherComponent);
 
 AliHLTGlobalTrackMatcherComponent::AliHLTGlobalTrackMatcherComponent() :
+  fOCDBEntry("HLT/ConfigHLT/GlobalTrackMatcher"), //TODO
+  fMethod(1), //Method 1(PbPb) 2(pp)
   fTrackMatcher(NULL),
   fNEvents(0),
   fBz(-9999999),
-  fClusterReader(NULL)
+  fClusterReader(NULL),
+  fTrackArray(NULL)
 {
   // see header file for class documentation
   // or
@@ -94,7 +102,7 @@ void AliHLTGlobalTrackMatcherComponent::GetOutputDataSize( unsigned long& constB
   // see header file for class documentation
   // XXX TODO: Find more realistic values.
   constBase = 80000;
-  inputMultiplier = 0;
+  inputMultiplier = 1;
 }
 
 AliHLTComponent* AliHLTGlobalTrackMatcherComponent::Spawn()
@@ -105,26 +113,57 @@ AliHLTComponent* AliHLTGlobalTrackMatcherComponent::Spawn()
 
 int AliHLTGlobalTrackMatcherComponent::DoInit( int argc, const char** argv ) 
 {
+  Int_t iResult=ConfigureFromCDBTObjString(fOCDBEntry); //MARCEL
+    // configure from the command line parameters if specified
+  if (iResult>=0 && argc>0) {
+    iResult=ConfigureFromArgumentString(argc, argv);
+    HLTImportant("Extrapolation Method from argument string:  %d", fMethod);   
+  } else if ( iResult >=0 ) {
+    HLTImportant("Extrapolation Method from OCDB database entry:  %d", fMethod);   
+  } 
+  
+  
   //BALLE TODO, use command line values to initialise matching vaules
  // init
-  Int_t iResult = argc;
+//   Int_t iResult = argc;
+//   iResult = argc;
   
   if(argc > 0){
     HLTWarning("Ignoring all configuration args, starting with: argv %s", argv[0]);
   }
 
-  fClusterReader = new AliHLTCaloClusterReader();
+  if(!fClusterReader)
+    fClusterReader = new AliHLTCaloClusterReader();
 
   fBz = GetBz();
   if(fBz == -999999) {
     HLTError("Magnetic field not properly set, current value: %d", fBz);
   }
 
-  fTrackMatcher = new AliHLTGlobalTrackMatcher();
+  if(!fTrackMatcher)
+    fTrackMatcher = new AliHLTGlobalTrackMatcher();
 
   fNEvents = 0;
 
+  if(!fTrackArray){
+    fTrackArray = new TObjArray();
+    fTrackArray->SetOwner(kFALSE);
+  }
+
+  //*** GeoManager ***
+   AliCDBPath path("GRP","Geometry","Data");
+   AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path);
+   if (pEntry) {
+      if(!gGeoManager) {
+      gGeoManager = (TGeoManager*)pEntry->GetObject();
+      }
+   }
+   else {
+      HLTError("can not fetch object \"%s\" from CDB",path.GetPath().Data());
+   }
+   // ****
+
+
   return iResult; 
 }
   
@@ -155,63 +194,99 @@ int AliHLTGlobalTrackMatcherComponent::DoEvent(const AliHLTComponentEventData& /
   
   if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) )
     return 0;
-
+  
+  if(!IsDataEvent()){//marcel test
+    return 0;//marcel test
+  }//marcel test
 
   fNEvents++;
-  
+
+  //Loop over TPC blocks
   //BALLE TODO check that the tracks in the TObjArray are fine over several blocks
-  TObjArray * trackArray = new TObjArray();
-  trackArray->SetOwner(kFALSE);
-  vector<AliHLTGlobalBarrelTrack> tracks;
   
-  for (const AliHLTComponentBlockData* pBlock = GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC); pBlock!=NULL; pBlock=GetNextInputBlock()) {
+   fTrackArray->Clear();
+   vector<AliHLTGlobalBarrelTrack> tracks;
+   
+   for (const AliHLTComponentBlockData* pBlock = GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC); pBlock!=NULL; pBlock=GetNextInputBlock()) {
+
+     if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>=0) {
+       for(UInt_t it = 0; it < tracks.size(); it++) {
+        AliHLTGlobalBarrelTrack track = tracks.at(it);
+       fTrackArray->AddLast(dynamic_cast<TObject*>(&(tracks.at(it))));
+              }
+     } else {
+             HLTWarning("Converting tracks to vector failed");
+     }
     
-    if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>=0) {
-
-      for(UInt_t it = 0; it < tracks.size(); it++) {
-       AliHLTGlobalBarrelTrack track = tracks.at(it);
-       HLTInfo("track ID %d", track.TrackID());
-       trackArray->AddLast(dynamic_cast<TObject*>(&(tracks.at(it))));
-      }
-    } else {
-      HLTWarning("Converting tracks to vector failed");
-    }
-    
-    //Push the TPC block on, without any changes
-    PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification);
-
-  }
+     //     //Push the TPC block on, without any changes
+     //PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification);
 
-  //Vector to contain the phos clusters
-  vector<AliHLTCaloClusterDataStruct *> phosClustersVector;
-  AliHLTCaloClusterDataStruct * caloClusterStructPtr;
-  
-  for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginAny); pBlock!=NULL; pBlock=GetNextInputBlock()) {
-    AliHLTCaloClusterHeaderStruct *caloClusterHeaderPtr = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr);
-    fClusterReader->SetMemory(caloClusterHeaderPtr);
-    
-    //BALLE, TODO, make it able to do EMCAL as well!!!
-    phosClustersVector.resize((Int_t) (caloClusterHeaderPtr->fNClusters));
+   }
     
-    Int_t nClusters = 0;
-    while((caloClusterStructPtr = fClusterReader->NextCluster()) != 0) {
-      //BALLE stil just phos
-      phosClustersVector[nClusters++] = caloClusterStructPtr;  
-    }
-    
-    iResult = fTrackMatcher->Match(trackArray, phosClustersVector, fBz);
-    if(iResult <0) {
-      HLTWarning("Error in track matcher");
+   AliHLTCaloClusterDataStruct * caloClusterStruct;
+   //Get the PHOS Clusters
+   vector<AliHLTCaloClusterDataStruct*> phosClustersVector;
+   
+   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginPHOS); pBlock!=NULL; pBlock=GetNextInputBlock()) {
+     AliHLTCaloClusterHeaderStruct *caloClusterHeader = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr);
+     fClusterReader->SetMemory(caloClusterHeader);
+     if ( (caloClusterHeader->fNClusters) < 0) {
+       HLTWarning("Event has negative number of clusters: %d! Very bad for vector resizing", (Int_t) (caloClusterHeader->fNClusters));
+       continue;
+     } else {    
+       phosClustersVector.reserve( (int) (caloClusterHeader->fNClusters) + phosClustersVector.size() ); 
+       while( (caloClusterStruct = fClusterReader->NextCluster()) != 0) {
+        phosClustersVector.push_back(caloClusterStruct);  
+       }
+     }
+   }
+
+    //Get the EMCAL Clusters
+   vector<AliHLTCaloClusterDataStruct*> emcalClustersVector;
+   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginEMCAL); pBlock!=NULL; pBlock=GetNextInputBlock()) {
+     AliHLTCaloClusterHeaderStruct *caloClusterHeader = reinterpret_cast<AliHLTCaloClusterHeaderStruct*>(pBlock->fPtr);
+     fClusterReader->SetMemory(caloClusterHeader);
+//           HLTInfo("\n EMCAL: estou aqui");//marcel
+     if ( (caloClusterHeader->fNClusters) < 0) {
+       HLTWarning("Event has negative number of clusters: %d! Very bad for vector resizing", (Int_t) (caloClusterHeader->fNClusters));
+       continue;
+     } else {    
+       emcalClustersVector.reserve( (int) (caloClusterHeader->fNClusters) + emcalClustersVector.size() ); 
+       while( (caloClusterStruct = fClusterReader->NextCluster()) != 0) {
+        emcalClustersVector.push_back(caloClusterStruct);  
+       }
+     }
+   }
+
+      iResult = fTrackMatcher->Match(fTrackArray, phosClustersVector, emcalClustersVector, fBz,fMethod); //With Method String
+
+
+   //Push the blocks on
+   for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeCaloCluster | kAliHLTDataOriginAny); pBlock!=NULL; pBlock=GetNextInputBlock()) {
+     PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification);
     }
+   
+   fTrackArray->Clear();
 
-    PushBack(pBlock->fPtr, pBlock->fSize, pBlock->fDataType, pBlock->fSpecification);
-  }
-
-  //BALLE TODO phos only !!!!
-  
-  delete trackArray;
-  return iResult;
+   return iResult;
+}
 
+int AliHLTGlobalTrackMatcherComponent::ScanConfigurationArgument(int argc, const char** argv) {
+  // see header file for class documentation
+  if (argc<=0) return 0;
+  int i=0;
+  TString argument=argv[i];
+
+  // -maxpt
+  if (argument.CompareTo("-method")==0) {
+    if (++i>=argc) return -EPROTO;
+    argument=argv[i];
+    fMethod=argument.Atoi(); // 
+    return 2;
+  }    
+
+// unknown argument
+  return -EINVAL;
 }
 
 // int AliHLTGlobalTrackMatcherComponent::Configure(const char* arguments)
@@ -225,3 +300,22 @@ int AliHLTGlobalTrackMatcherComponent::DoEvent(const AliHLTComponentEventData& /
 //   Int_t iResult = 1;
 //   return iResult;
 // }
+
+int AliHLTGlobalTrackMatcherComponent::Reconfigure(const char* cdbEntry, const char* /*chainId*/) {
+  // configure from the specified antry or the default one
+  const char* entry=cdbEntry;
+  if (!entry || entry[0]==0) entry=fOCDBEntry;
+
+  return ConfigureFromCDBTObjString(entry);
+}
+
+void AliHLTGlobalTrackMatcherComponent::GetOCDBObjectDescription( TMap* const targetMap) {
+  
+  // Get a list of OCDB object description.
+  if (!targetMap) return;
+  targetMap->Add(new TObjString(fOCDBEntry),
+                new TObjString(Form("Track-Matcher Method OCDB object") ) 
+                );
+}
+
+