]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCEsdWriterComponent.cxx
- adjusting binning of pad histograms to make single pad cluster contribution and...
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCEsdWriterComponent.cxx
index f6ce5d109bc21388e742fc666cf2099d579387a9..f28f4c49c1ea8b160df5b182f80dc7239c2d7977 100644 (file)
 #include "AliHLTTPCTrackletDataFormat.h"
 #include "AliHLTTPCDefinitions.h"
 #include "AliHLTTPCTransform.h"
+#include "AliHLTExternalTrackParam.h"
+#include "AliHLTGlobalBarrelTrack.h"
+#include "AliHLTTrackMCLabel.h"
+#include "TGeoGlobalMagField.h"
+
+#include <vector>
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTTPCEsdWriterComponent)
@@ -87,6 +93,7 @@ void AliHLTTPCEsdWriterComponent::AliWriter::GetInputDataTypes(AliHLTComponentDa
   // see header file for class documentation
   list.push_back(AliHLTTPCDefinitions::fgkTrackSegmentsDataType);
   list.push_back(AliHLTTPCDefinitions::fgkTracksDataType);
+  list.push_back( kAliHLTDataTypeTrack|kAliHLTDataOriginTPC );
 }
 
 int AliHLTTPCEsdWriterComponent::AliWriter::InitWriter()
@@ -149,6 +156,8 @@ int AliHLTTPCEsdWriterComponent::AliWriter::DumpEvent( const AliHLTComponentEven
     if (fESD) {
       AliESDEvent* pESD=fESD;
 
+      pESD->Reset(); 
+      pESD->SetMagneticField(GetBz());
       iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt);
 
     } else {
@@ -171,15 +180,61 @@ int AliHLTTPCEsdWriterComponent::ProcessBlocks(TTree* pTree, AliESDEvent* pESD,
                                               int* pMaxSlice)
 {
   // see header file for class documentation
+
   int iResult=0;
+  int iAddedDataBlocks=0;
+  
   if (pESD && blocks) {
-      pESD->SetMagneticField(fSolenoidBz);
       const AliHLTComponentBlockData* iter = NULL;
-      AliHLTTPCTrackletData* inPtr=NULL;
       int bIsTrackSegs=0;
+
+      // first read MC information (if present)
+
+      std::map<int,int> mcLabels;
+
       for (int ndx=0; ndx<nBlocks && iResult>=0; ndx++) {
        iter = blocks+ndx;
+       if(iter->fDataType == (kAliHLTDataTypeTrackMC|kAliHLTDataOriginTPC) ) {
+         AliHLTTrackMCData* dataPtr = ( AliHLTTrackMCData* )( iter->fPtr );
+         for( unsigned int il=0; il<dataPtr->fCount; il++ ){
+           AliHLTTrackMCLabel &lab = dataPtr->fLabels[il];
+           mcLabels[lab.fTrackID] = lab.fMCLabel;
+         }
+       }
+      }
+
+
+      // do the conversion of tracks
+
+      for (int ndx=0; ndx<nBlocks && iResult>=0; ndx++) {
+       iter = blocks+ndx;
+       
+       if( iter->fDataType == ( kAliHLTDataTypeTrack|kAliHLTDataOriginTPC ) ){   
+         AliHLTTracksData* dataPtr = ( AliHLTTracksData* ) iter->fPtr;
+         int nTracks = dataPtr->fCount;
+         AliHLTExternalTrackParam* currOutTrack = dataPtr->fTracklets;
+
+         for( int itr=0; itr<nTracks; itr++ ){
+           AliHLTGlobalBarrelTrack t(*currOutTrack);
+           Float_t points[4] = {currOutTrack->fX, currOutTrack->fY, currOutTrack->fLastX, currOutTrack->fLastY };
+           
+           Int_t mcLabel = -1;
+           if( mcLabels.find(currOutTrack->fTrackID)!=mcLabels.end() )
+             mcLabel = mcLabels[currOutTrack->fTrackID];
+           
+           t.SetLabel( mcLabel );
+           
+           AliESDtrack iotrack;
+           iotrack.UpdateTrackParams( &t,AliESDtrack::kTPCin);
+           iotrack.SetTPCPoints(points);
+           pESD->AddTrack(&iotrack);
+           unsigned int dSize = sizeof( AliHLTExternalTrackParam ) + currOutTrack->fNPoints * sizeof( unsigned int );
+           currOutTrack = ( AliHLTExternalTrackParam* )( (( Byte_t * )currOutTrack) + dSize );
+         }
+         iAddedDataBlocks++;
+       }
+
+       
        if ( (bIsTrackSegs=(iter->fDataType == AliHLTTPCDefinitions::fgkTrackSegmentsDataType))==1 ||
             iter->fDataType == AliHLTTPCDefinitions::fgkTracksDataType ) {
          Int_t minslice=AliHLTTPCDefinitions::GetMinSliceNr(iter->fSpecification);
@@ -201,49 +256,64 @@ int AliHLTTPCEsdWriterComponent::ProcessBlocks(TTree* pTree, AliESDEvent* pESD,
                         "possible mismatch in treatment of local coordinate system");
            }
            AliHLTTPCTrackArray tracks;
-           inPtr=(AliHLTTPCTrackletData*)iter->fPtr;
+           AliHLTTPCTrackletData* inPtr = (AliHLTTPCTrackletData*) iter->fPtr;     
            HLTDebug("reading block %d (slice %d): %d tracklets", ndx, minslice, inPtr->fTrackletCnt);
-           tracks.FillTracks(inPtr->fTrackletCnt, inPtr->fTracklets, minslice, 0/*don't rotate*/);
-           if ((iResult=Tracks2ESD(&tracks, pESD))>=0) {
+           if ((iResult=tracks.FillTracksChecked(inPtr->fTracklets, inPtr->fTrackletCnt, iter->fSize, minslice, 0/*don't rotate*/))>=0) {
+             if ((iResult=Tracks2ESD(&tracks, pESD ))>=0) {
+               iAddedDataBlocks++;
+             }
            }
          } else {
            HLTError("invalid sector number");
            iResult=-EBADF;
          }
-       }
+       }      
       }
-      if (iResult>=0 && pTree) {
+
+      if (iAddedDataBlocks>0 && pTree) {
        pTree->Fill();
       }
-
-      pESD->Reset();
-    
+  
   } else {
     iResult=-EINVAL;
   }
+  if (iResult>=0) iResult=iAddedDataBlocks;
   return iResult;
 }
 
-int AliHLTTPCEsdWriterComponent::Tracks2ESD(AliHLTTPCTrackArray* pTracks, AliESDEvent* pESD)
+
+int AliHLTTPCEsdWriterComponent::Tracks2ESD(AliHLTTPCTrackArray* pTracks, AliESDEvent* pESD )
 {
   // see header file for class documentation
   int iResult=0;
-  if (pTracks && pESD) {
-    HLTDebug("converting %d tracks from track array", pTracks->GetNTracks());
+
+  if (pTracks && pESD) {    
     for (int i=0; i<pTracks->GetNTracks() && iResult>=0; i++) {
       AliHLTTPCTrack* pTrack=(*pTracks)[i];
       if (pTrack) {
-       //HLTDebug("convert track %d", i);
-       //pTrack->Print();
-       int iLocal=pTrack->Convert2AliKalmanTrack();
-       if (iLocal>=0) {
+       
+       if( pTrack->Convert2AliKalmanTrack() ){   
+         HLTError("conversion to AliKalmanTrack failed for track %d of %d", i, pTracks->GetNTracks()); 
+         continue;
+       }
+
+       Float_t points[4] = {pTrack->GetFirstPointX(), pTrack->GetFirstPointY(), pTrack->GetLastPointX(), pTrack->GetLastPointY() };
+
+       if(pTrack->GetSector() == -1){ // Set first and last points for global tracks
+         Double_t s = TMath::Sin( pTrack->GetAlpha() );
+         Double_t c = TMath::Cos( pTrack->GetAlpha() );
+         points[0] =  pTrack->GetFirstPointX()*c + pTrack->GetFirstPointY()*s;
+         points[1] = -pTrack->GetFirstPointX()*s + pTrack->GetFirstPointY()*c;   
+         points[2] =  pTrack->GetLastPointX() *c + pTrack->GetLastPointY() *s;
+         points[3] = -pTrack->GetLastPointX() *s + pTrack->GetLastPointY() *c;   
+       }
+
        AliESDtrack iotrack;
        iotrack.UpdateTrackParams(pTrack,AliESDtrack::kTPCin);
-       iotrack.SetTPCPoints(pTrack->GetPoints());
+       iotrack.SetTPCPoints(points);
+
        pESD->AddTrack(&iotrack);
-       } else {
-         HLTError("conversion to AliKalmanTrack failed for track %d of %d", i, pTracks->GetNTracks());
-       }
       } else {
        HLTError("internal mismatch in array");
        iResult=-EFAULT;
@@ -262,6 +332,12 @@ int AliHLTTPCEsdWriterComponent::Configure(const char* arguments)
   int iResult=0;
   if (!arguments) return iResult;
 
+  // Check field
+  if (!TGeoGlobalMagField::Instance()) {
+    HLTError("magnetic field not initialized, please set up TGeoGlobalMagField and AliMagF");
+    return -ENODEV;
+  }
+
   TString allArgs=arguments;
   TString argument;
   int bMissingParam=0;
@@ -274,8 +350,7 @@ int AliHLTTPCEsdWriterComponent::Configure(const char* arguments)
       
       if (argument.CompareTo("-solenoidBz")==0) {
        if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
-       HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
-       fSolenoidBz=((TObjString*)pTokens->At(i))->GetString().Atof();
+       HLTWarning("parameter -solenoidBz deprecated, magnetic field handled by global AliMagF object and TGeoGlobalMagField");
        continue;
       } else {
        HLTError("unknown argument %s", argument.Data());
@@ -297,7 +372,7 @@ int AliHLTTPCEsdWriterComponent::Reconfigure(const char* cdbEntry, const char* c
 {
   // see header file for class documentation
   int iResult=0;
-  const char* path=kAliHLTCDBSolenoidBz;
+  const char* path=NULL;
   const char* defaultNotify="";
   if (cdbEntry) {
     path=cdbEntry;
@@ -324,8 +399,9 @@ int AliHLTTPCEsdWriterComponent::Reconfigure(const char* cdbEntry, const char* c
 
 AliHLTTPCEsdWriterComponent::AliConverter::AliConverter()
   :
+  fESD(NULL),
   fBase(new AliHLTTPCEsdWriterComponent),
-  fWriteTree(1)
+  fWriteTree(0)
 {
   // see header file for class documentation
   // or
@@ -339,6 +415,9 @@ AliHLTTPCEsdWriterComponent::AliConverter::~AliConverter()
   // see header file for class documentation
   if (fBase) delete fBase;
   fBase=NULL;
+
+  if (fESD) delete fESD;
+  fESD=NULL;
 }
 
 void AliHLTTPCEsdWriterComponent::AliConverter::GetInputDataTypes(AliHLTComponentDataTypeList& list)
@@ -346,6 +425,7 @@ void AliHLTTPCEsdWriterComponent::AliConverter::GetInputDataTypes(AliHLTComponen
   // see header file for class documentation
   list.push_back(AliHLTTPCDefinitions::fgkTrackSegmentsDataType);
   list.push_back(AliHLTTPCDefinitions::fgkTracksDataType);
+  list.push_back( kAliHLTDataTypeTrack|kAliHLTDataOriginTPC );
 }
 
 AliHLTComponentDataType AliHLTTPCEsdWriterComponent::AliConverter::GetOutputDataType()
@@ -379,6 +459,9 @@ int AliHLTTPCEsdWriterComponent::AliConverter::DoInit(int argc, const char** arg
     } else if (argument.CompareTo("-tree")==0) {
       fWriteTree=1;
 
+      // -solenoidBz
+    } else if (argument.CompareTo("-solenoidBz")==0) {
+      HLTWarning("parameter -solenoidBz deprecated, magnetic field handled by global AliMagF object and TGeoGlobalMagField");
     } else {
       HLTError("unknown argument %s", argument.Data());
       break;
@@ -406,32 +489,49 @@ int AliHLTTPCEsdWriterComponent::AliConverter::DoEvent(const AliHLTComponentEven
                                                       const AliHLTComponentBlockData* blocks, 
                                                       AliHLTComponentTriggerData& /*trigData*/,
                                                       AliHLTUInt8_t* /*outputPtr*/, 
-                                                      AliHLTUInt32_t& /*size*/,
+                                                      AliHLTUInt32_t& size,
                                                       AliHLTComponentBlockDataList& /*outputBlocks*/ )
 {
   // see header file for class documentation
   int iResult=0;
+  // no direct writing to the output buffer
+  size=0;
+
   assert(fBase);
-  AliESDEvent* pESD = new AliESDEvent;
+  if (!fESD) {
+    fESD = new AliESDEvent;
+    if (fESD) {
+      fESD->CreateStdContent();
+    } else {
+      iResult=-ENOMEM;
+    }
+  }
+
+  AliESDEvent* pESD = fESD;
+
   if (pESD && fBase) {
-    pESD->CreateStdContent();
+  
     TTree* pTree = NULL;
     // TODO: Matthias 06.12.2007
     // Tried to write the ESD directly instead to a tree, but this did not work
     // out. Information in the ESD is different, needs investigation.
+    
     if (fWriteTree)
       pTree = new TTree("esdTree", "Tree with HLT ESD objects");
     if (pTree) {
       pTree->SetDirectory(0);
-      pESD->WriteToTree(pTree);
     }
 
-    if ((iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt))>=0) {
-       // TODO: set the specification correctly
+    pESD->Reset(); 
+    pESD->SetMagneticField(GetBz());
+    if ((iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt))>0) {
+      // TODO: set the specification correctly
       if (pTree) {
        // the esd structure is written to the user info and is
        // needed in te ReadFromTree method to read all objects correctly
        pTree->GetUserInfo()->Add(pESD);
+       pESD->WriteToTree(pTree);
        iResult=PushBack(pTree, kAliHLTDataTypeESDTree|kAliHLTDataOriginTPC, 0);
       } else {
        iResult=PushBack(pESD, kAliHLTDataTypeESDObject|kAliHLTDataOriginTPC, 0);
@@ -442,8 +542,6 @@ int AliHLTTPCEsdWriterComponent::AliConverter::DoEvent(const AliHLTComponentEven
       pTree->GetUserInfo()->Clear();
       delete pTree;
     }
-
-    delete pESD;
   }
   return iResult;
 }