#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)
// 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()
if (fESD) {
AliESDEvent* pESD=fESD;
+ pESD->Reset();
+ pESD->SetMagneticField(GetBz());
iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt);
} else {
int* pMaxSlice)
{
// see header file for class documentation
+
int iResult=0;
int iAddedDataBlocks=0;
+
if (pESD && blocks) {
- pESD->Reset();
-
- 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);
"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);
if ((iResult=tracks.FillTracksChecked(inPtr->fTracklets, inPtr->fTrackletCnt, iter->fSize, minslice, 0/*don't rotate*/))>=0) {
- if ((iResult=Tracks2ESD(&tracks, pESD))>=0) {
+ if ((iResult=Tracks2ESD(&tracks, pESD ))>=0) {
iAddedDataBlocks++;
}
}
HLTError("invalid sector number");
iResult=-EBADF;
}
- }
+ }
}
+
if (iAddedDataBlocks>0 && pTree) {
pTree->Fill();
}
-
+
} else {
iResult=-EINVAL;
}
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;
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;
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());
{
// see header file for class documentation
int iResult=0;
- const char* path=kAliHLTCDBSolenoidBz;
+ const char* path=NULL;
const char* defaultNotify="";
if (cdbEntry) {
path=cdbEntry;
:
fESD(NULL),
fBase(new AliHLTTPCEsdWriterComponent),
- fWriteTree(1)
+ fWriteTree(0)
{
// see header file for class documentation
// or
// 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()
} 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;
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);
if (!fESD) {
fESD = new AliESDEvent;
}
AliESDEvent* pESD = fESD;
+
if (pESD && fBase) {
+
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);
}
+ pESD->Reset();
+ pESD->SetMagneticField(GetBz());
if ((iResult=fBase->ProcessBlocks(pTree, pESD, blocks, (int)evtData.fBlockCnt))>0) {
- // TODO: set the specification correctly
+ // 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);