#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliESDMuonTrack.h"
+#include "AliESDMuonCluster.h"
#include "AliCDBEntry.h"
#include "AliCDBManager.h"
#include "AliPID.h"
#include "AliESDCaloCluster.h"
#include "AliESDVZERO.h"
#include "AliHLTGlobalVertexerComponent.h"
+#include "AliHLTVertexFinderBase.h"
/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTGlobalEsdConverterComponent)
TObjArray* pTokens=allArgs.Tokenize(" ");
if (pTokens) {
for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
- argument=((TObjString*)pTokens->At(i))->GetString();
+ argument=((TObjString*)pTokens->At(i))->String();
if (argument.IsNull()) continue;
if (argument.CompareTo("-solenoidBz")==0) {
if (pEntry) {
TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
if (pString) {
- HLTInfo("received configuration object string: \'%s\'", pString->GetString().Data());
- iResult=Configure(pString->GetString().Data());
+ HLTInfo("received configuration object string: \'%s\'", pString->String().Data());
+ iResult=Configure(pString->String().Data());
} else {
HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
}
list.push_back(kAliHLTDataTypeESDObject);
list.push_back(kAliHLTDataTypeTObject);
list.push_back(kAliHLTDataTypeGlobalVertexer);
+ list.push_back(kAliHLTDataTypeV0Finder); // array of track ids for V0s
+ list.push_back(kAliHLTDataTypeKFVertex); // KFVertex object from vertexer
+ list.push_back(kAliHLTDataTypePrimaryFinder); // array of track ids for prim vertex
list.push_back(kAliHLTDataTypeESDContent);
}
TObjArray* pTokens=allArgs.Tokenize(" ");
if (pTokens) {
for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
- argument=((TObjString*)pTokens->At(i))->GetString();
+ argument=((TObjString*)pTokens->At(i))->String();
if (argument.IsNull()) continue;
// -notree
fWriteTree=1;
} else if (argument.CompareTo("-solenoidBz")==0) {
if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
- HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ HLTInfo("Magnetic Field set to: %s", ((TObjString*)pTokens->At(i))->String().Data());
HLTWarning("argument '-solenoidBz' is deprecated, solenoid field initiaized from CDB settings");
continue;
} else if (argument.Contains("-skipobject=")) {
TIter next(pTokens);
TObject* pObject=NULL;
while ((pObject=next())!=NULL) {
- id=((TObjString*)pObject)->GetString().Data();
+ id=((TObjString*)pObject)->String().Data();
TObject* pObj=fESD->GetList()->FindObject(id);
if (pObj) {
HLTDebug("removing object %s", id);
int iResult=0;
int iAddedDataBlocks=0;
+ // check if there is an ESD block in the input and copy its content first to the
+ // ESD
+ const TObject* pEsdObj = GetFirstInputObject(kAliHLTDataTypeESDObject, "AliESDEvent");
+ AliESDEvent* pInputESD=NULL;
+ if (pEsdObj) pInputESD=dynamic_cast<AliESDEvent*>(const_cast<TObject*>(pEsdObj));
+ if (pInputESD) {
+ pInputESD->GetStdContent();
+ *pESD=*pInputESD;
+ }
+ if (GetNextInputObject()!=NULL) {
+ HLTWarning("handling of multiple ESD input objects not implemented, skipping input");
+ }
+
// Barrel tracking
// tracks are based on the TPC tracks, and only updated from the ITS information
// Sequence:
AliHLTFloat32_t *dEdxTPC = 0;
Int_t ndEdxTPC = 0;
for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypedEdx|kAliHLTDataOriginTPC);
- pBlock!=NULL; pBlock=GetNextInputBlock()) {
+ pBlock!=NULL; pBlock=NULL/*GetNextInputBlock() there is only one block*/) {
fBenchmark.AddInput(pBlock->fSize);
dEdxTPC = reinterpret_cast<AliHLTFloat32_t*>( pBlock->fPtr );
ndEdxTPC = pBlock->fSize / (3*sizeof(AliHLTFloat32_t));
- break;
}
// 2) convert the TPC tracks to ESD tracks
for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeTrack|kAliHLTDataOriginTPC);
pBlock!=NULL; pBlock=GetNextInputBlock()) {
+ if (pInputESD && pInputESD->GetNumberOfTracks()>0) {
+ HLTWarning("Tracks array already filled from the input esd block, additional filling from TPC tracks block might cause inconsistent content");
+ }
fBenchmark.AddInput(pBlock->fSize);
vector<AliHLTGlobalBarrelTrack> tracks;
if ((iResult=AliHLTGlobalBarrelTrack::ConvertTrackDataArray(reinterpret_cast<const AliHLTTracksData*>(pBlock->fPtr), pBlock->fSize, tracks))>=0) {
}
// update with vertices and vertex-fitted tracks
-
+ // output of the GlobalVertexerComponent
for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(kAliHLTDataTypeGlobalVertexer);
pBlock!=NULL; pBlock=GetNextInputBlock()) {
fBenchmark.AddInput(pBlock->fSize);
AliHLTGlobalVertexerComponent::FillESD( pESD, reinterpret_cast<AliHLTGlobalVertexerComponent::AliHLTGlobalVertexerData* >(pBlock->fPtr) );
}
+ // update with vertices and vertex-fitted tracks
+ // output of PrimaryVertexer and V0Finder components
+ TObject* pBase = (TObject*)GetFirstInputObject(kAliHLTDataTypeKFVertex | kAliHLTDataOriginOut);
+ if (pBase) {
+ AliKFVertex* kfVertex = dynamic_cast<AliKFVertex *>(pBase);
+ if (kfVertex) {
+ const AliHLTComponentBlockData* pP = GetFirstInputBlock(kAliHLTDataTypePrimaryFinder | kAliHLTDataOriginOut);
+ if (pP && pP->fSize && pP->fPtr) {
+ const AliHLTComponentBlockData* pV0 = GetFirstInputBlock(kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut);
+ if (pV0 && pV0->fPtr && pInputESD && pInputESD->GetNumberOfV0s()>0) {
+ const int* v0s = static_cast<const int*>(pV0->fPtr);
+ HLTWarning("V0 array already filled from the input esd block, additional filling from V0 block of %d entries might cause inconsistent content", v0s[0]);
+ }
+ AliHLTVertexFinderBase::FillESD(pESD, kfVertex, pP->fPtr, pV0?pV0->fPtr:NULL);
+ } else
+ HLTWarning("Problem with primary finder's data block");
+ } else {
+ HLTWarning("primary vertex block of wrong type, expecting AliKFVertex instead of %s", pBase->GetName());
+ }
+ } else {
+ // throw an error if there is a V0 data block which can not be handled without
+ // the AliKFVertex object
+ if (GetFirstInputBlock(kAliHLTDataTypeV0Finder | kAliHLTDataOriginOut)!=NULL) {
+ ALIHLTERRORGUARD(1, "missing AliKFVertex object ignoring V0 data block of type %s",
+ DataType2Text(kAliHLTDataTypeV0Finder|kAliHLTDataOriginOut).c_str());
+ }
+ }
+
// Fill DCA parameters for TPC tracks
// TODO 2010-07-12 this propagates also the TPC inner param to beamline
// sounds not very reasonable
}
}
- // Add tracks from MUON.
+ // Add tracks and clusters from MUON.
for( const AliHLTComponentBlockData *i= GetFirstInputBlock(kAliHLTAnyDataType | kAliHLTDataOriginMUON); i!=NULL; i=GetNextInputBlock() ){
fBenchmark.AddInput(i->fSize);
}
)
{
const TClonesArray* tracklist = NULL;
+ const TClonesArray* clusterlist = NULL;
if (obj->IsA() == AliESDEvent::Class())
{
const AliESDEvent* event = static_cast<const AliESDEvent*>(obj);
if (event->GetList() == NULL) continue;
tracklist = dynamic_cast<const TClonesArray*>(event->GetList()->FindObject("MuonTracks"));
if (tracklist == NULL) continue;
+ clusterlist = dynamic_cast<const TClonesArray*>(event->GetList()->FindObject("MuonClusters"));
+ if (clusterlist == NULL) continue;
}
else if (obj->IsA() == TClonesArray::Class())
{
- tracklist = static_cast<const TClonesArray*>(obj);
- HLTDebug("Received a MUON TClonesArray of tracks with specification: 0x%X", GetSpecification(obj));
+ if (!strcmp(obj->GetName(), "MuonTracks")) {
+ tracklist = static_cast<const TClonesArray*>(obj);
+ HLTDebug("Received a MUON TClonesArray of tracks with specification: 0x%X", GetSpecification(obj));
+ } else {
+ clusterlist = static_cast<const TClonesArray*>(obj);
+ HLTDebug("Received a MUON TClonesArray of clusters with specification: 0x%X", GetSpecification(obj));
+ }
}
else
{
// Cannot handle this object type.
continue;
}
- HLTDebug("Received %d MUON tracks.", tracklist->GetEntriesFast());
- if (tracklist->GetEntriesFast() > 0)
- {
- const AliESDMuonTrack* track = dynamic_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(0));
- if (track == NULL)
+ // copy tracks
+ if (tracklist) {
+ HLTDebug("Received %d MUON tracks.", tracklist->GetEntriesFast());
+ if (tracklist->GetEntriesFast() > 0)
{
- HLTError(Form("%s from MUON does not contain AliESDMuonTrack objects.", obj->ClassName()));
- continue;
+ const AliESDMuonTrack* track = dynamic_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(0));
+ if (track == NULL)
+ {
+ HLTError(Form("%s from MUON does not contain AliESDMuonTrack objects.", obj->ClassName()));
+ continue;
+ }
+ }
+ for (Int_t i = 0; i < tracklist->GetEntriesFast(); ++i)
+ {
+ AliESDMuonTrack* track = pESD->NewMuonTrack();
+ *track = *(static_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(i)));
}
}
- for (Int_t i = 0; i < tracklist->GetEntriesFast(); ++i)
- {
- const AliESDMuonTrack* track = static_cast<const AliESDMuonTrack*>(tracklist->UncheckedAt(i));
- pESD->AddMuonTrack(track);
+ // copy clusters
+ if (clusterlist) {
+ HLTDebug("Received %d MUON clusters.", clusterlist->GetEntriesFast());
+ if (clusterlist->GetEntriesFast() > 0)
+ {
+ const AliESDMuonCluster* cluster = dynamic_cast<const AliESDMuonCluster*>(clusterlist->UncheckedAt(0));
+ if (cluster == NULL)
+ {
+ HLTError(Form("%s from MUON does not contain AliESDMuonCluster objects.", obj->ClassName()));
+ continue;
+ }
+ }
+ for (Int_t i = 0; i < clusterlist->GetEntriesFast(); ++i)
+ {
+ AliESDMuonCluster* cluster = pESD->NewMuonCluster();
+ *cluster = *(static_cast<const AliESDMuonCluster*>(clusterlist->UncheckedAt(i)));
+ }
}
}