#include "AliHLTTPCAgent.h"
#include "AliHLTConfiguration.h"
+#include "AliHLTTPCDefinitions.h"
+#include "AliHLTOUT.h"
/** global instance for agent registration */
AliHLTTPCAgent gAliHLTTPCAgent;
+// component headers
+#include "AliHLTTPCRunStatisticsProducerComponent.h"
+#include "AliHLTTPCEventStatisticsProducerComponent.h"
+#include "AliHLTTPCCompModelInflaterComponent.h"
+#include "AliHLTTPCCompModelDeflaterComponent.h"
+#include "AliHLTTPCCompModelDeconverterComponent.h"
+#include "AliHLTTPCCompModelConverterComponent.h"
+#include "AliHLTTPCCompDumpComponent.h"
+#include "AliHLTTPCCalibCEComponent.h"
+#include "AliHLTTPCCalibPulserComponent.h"
+#include "AliHLTTPCCalibPedestalComponent.h"
+#include "AliHLTTPCCATrackerComponent.h"
+#include "AliHLTTPCGlobalMergerComponent.h"
+#include "AliHLTTPCSliceTrackerComponent.h"
+#include "AliHLTTPCVertexFinderComponent.h"
+#include "AliHLTTPCClusterFinderComponent.h"
+#include "AliHLTTPCRawDataUnpackerComponent.h"
+#include "AliHLTTPCDigitPublisherComponent.h"
+#include "AliHLTTPCZeroSuppressionComponent.h"
+#include "AliHLTTPCDigitDumpComponent.h"
+#include "AliHLTTPCEsdWriterComponent.h"
+#include "AliHLTTPCOfflineClustererComponent.h"
+#include "AliHLTTPCOfflineTrackerComponent.h"
+
/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTTPCAgent)
AliHLTTPCAgent::AliHLTTPCAgent()
+ :
+ AliHLTModuleAgent("TPC"),
+ fRawDataHandler(NULL),
+ fNofRawDataHandler(0)
{
// see header file for class documentation
// or
{
// see header file for class documentation
if (handler) {
+
+ // This the tracking configuration for the full TPC
+ // - 216 clusterfinders (1 per partition)
+ // - 36 slice trackers
+ // - one global merger
+ // - the esd converter
+ // The ESD is shipped embedded into a TTree
int iMinSlice=0;
- int iMaxSlice=1;
+ int iMaxSlice=35;
int iMinPart=0;
- int iMaxPart=1;
- TString fileWriterInput;
- TString esdWriterInput;
+ int iMaxPart=5;
+ TString mergerInput;
for (int slice=iMinSlice; slice<=iMaxSlice; slice++) {
TString trackerInput;
for (int part=iMinPart; part<=iMaxPart; part++) {
// digit publisher components
arg.Form("-slice %d -partition %d", slice, part);
- publisher.Form("DP_%02d_%d", slice, part);
+ publisher.Form("TPC-DP_%02d_%d", slice, part);
handler->CreateConfiguration(publisher.Data(), "TPCDigitPublisher", NULL , arg.Data());
// cluster finder components
- cf.Form("CF_%02d_%d", slice, part);
+ cf.Form("TPC-CF_%02d_%d", slice, part);
handler->CreateConfiguration(cf.Data(), "TPCClusterFinderUnpacked", publisher.Data(), "pp-run timebins 446");
if (trackerInput.Length()>0) trackerInput+=" ";
trackerInput+=cf;
}
TString tracker;
// tracker finder components
- tracker.Form("TR_%02d", slice);
- handler->CreateConfiguration(tracker.Data(), "TPCSliceTracker", trackerInput.Data(), "pp-run bfield 0.5");
+ tracker.Form("TPC-TR_%02d", slice);
+ handler->CreateConfiguration(tracker.Data(), "TPCSliceTracker", trackerInput.Data(), "-pp-run -bfield 0.5");
- // input for the global file writer
- if (fileWriterInput.Length()>0) fileWriterInput+=" ";
- fileWriterInput+=trackerInput;
+ if (mergerInput.Length()>0) mergerInput+=" ";
+ mergerInput+=tracker;
- // input for the esd writer
- if (esdWriterInput.Length()>0) esdWriterInput+=" ";
- esdWriterInput+=tracker;
}
- // the writer configuration
- handler->CreateConfiguration("sink1", "FileWriter" , fileWriterInput.Data(), "-specfmt -subdir=test_%d -blcknofmt=_0x%x -idfmt=_0x%08x");
- // the esd writer configuration
- handler->CreateConfiguration("esd-writer", "TPCEsdWriter" , esdWriterInput.Data(), "-datafile AliESDs.root");
+ // GlobalMerger component
+ handler->CreateConfiguration("TPC-globalmerger","TPCGlobalMerger",mergerInput.Data(),"");
+
+ // the esd converter configuration
+ handler->CreateConfiguration("TPC-esd-converter", "TPCEsdConverter" , "TPC-globalmerger", "-tree");
}
return 0;
}
const char* AliHLTTPCAgent::GetReconstructionChains(AliRawReader* /*rawReader*/,
- AliRunLoader* /*runloader*/) const
+ AliRunLoader* runloader) const
{
// see header file for class documentation
+ if (runloader) {
+ // reconstruction chains for AliRoot simulation
+ // Note: run loader is only available while running embedded into
+ // AliRoot simulation
+ return "TPC-esd-converter";
+ }
return NULL;
- //return "sink1";
- //return "esd-writer";
}
const char* AliHLTTPCAgent::GetRequiredComponentLibraries() const
{
// see header file for class documentation
+
+ // actually, the TPC library has dependencies to Util and RCU
+ // so the two has to be loaded anyhow before we get here
+ //return "libAliHLTUtil.so libAliHLTRCU.so";
+ return NULL;
+}
+
+int AliHLTTPCAgent::RegisterComponents(AliHLTComponentHandler* pHandler) const
+{
+ // see header file for class documentation
+ if (!pHandler) return -EINVAL;
+
+ pHandler->AddComponent(new AliHLTTPCRunStatisticsProducerComponent);
+ pHandler->AddComponent(new AliHLTTPCEventStatisticsProducerComponent);
+ pHandler->AddComponent(new AliHLTTPCCalibCEComponent);
+ pHandler->AddComponent(new AliHLTTPCCalibPulserComponent);
+ pHandler->AddComponent(new AliHLTTPCCalibPedestalComponent);
+ pHandler->AddComponent(new AliHLTTPCCompModelInflaterComponent);
+ pHandler->AddComponent(new AliHLTTPCCompModelDeflaterComponent);
+ pHandler->AddComponent(new AliHLTTPCCompModelDeconverterComponent);
+ pHandler->AddComponent(new AliHLTTPCCompModelConverterComponent);
+ pHandler->AddComponent(new AliHLTTPCCompDumpComponent);
+ pHandler->AddComponent(new AliHLTTPCCATrackerComponent);
+ pHandler->AddComponent(new AliHLTTPCGlobalMergerComponent);
+ pHandler->AddComponent(new AliHLTTPCSliceTrackerComponent);
+ pHandler->AddComponent(new AliHLTTPCVertexFinderComponent);
+ pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinderPacked));
+ pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinderUnpacked));
+ pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinderDecoder));
+ pHandler->AddComponent(new AliHLTTPCRawDataUnpackerComponent);
+ pHandler->AddComponent(new AliHLTTPCDigitPublisherComponent);
+ pHandler->AddComponent(new AliHLTTPCZeroSuppressionComponent);
+ pHandler->AddComponent(new AliHLTTPCDigitDumpComponent);
+ pHandler->AddComponent(new AliHLTTPCEsdWriterComponent::AliWriter);
+ pHandler->AddComponent(new AliHLTTPCEsdWriterComponent::AliConverter);
+ pHandler->AddComponent(new AliHLTTPCOfflineClustererComponent);
+ pHandler->AddComponent(new AliHLTTPCOfflineTrackerComponent);
+
+ return 0;
+}
+
+int AliHLTTPCAgent::GetHandlerDescription(AliHLTComponentDataType dt,
+ AliHLTUInt32_t spec,
+ AliHLTOUTHandlerDesc& desc) const
+{
+ // see header file for class documentation
+ if (dt==(kAliHLTDataTypeDDLRaw|kAliHLTDataOriginTPC)) {
+ int slice=AliHLTTPCDefinitions::GetMinSliceNr(spec);
+ int part=AliHLTTPCDefinitions::GetMinPatchNr(spec);
+ if (slice==AliHLTTPCDefinitions::GetMaxSliceNr(spec) &&
+ part==AliHLTTPCDefinitions::GetMaxPatchNr(spec)) {
+ desc=AliHLTOUTHandlerDesc(kRawReader, dt, GetModuleId());
+ return 1;
+ } else {
+ HLTWarning("handler can not process merged data from multiple ddls:"
+ " min slice %d, max slice %d, min part %d, max part %d",
+ slice, AliHLTTPCDefinitions::GetMaxSliceNr(spec),
+ part, AliHLTTPCDefinitions::GetMaxPatchNr(spec));
+ return 0;
+ }
+ }
+ return 0;
+}
+
+AliHLTOUTHandler* AliHLTTPCAgent::GetOutputHandler(AliHLTComponentDataType dt,
+ AliHLTUInt32_t /*spec*/)
+{
+ // see header file for class documentation
+ if (dt==(kAliHLTDataTypeDDLRaw|kAliHLTDataOriginTPC)) {
+ if (!fRawDataHandler) {
+ fRawDataHandler=new AliHLTTPCAgent::AliHLTTPCRawDataHandler;
+ }
+ fNofRawDataHandler++;
+ return fRawDataHandler;
+ }
return NULL;
}
-int AliHLTTPCAgent::RegisterComponents(AliHLTComponentHandler* /*pHandler*/) const
+int AliHLTTPCAgent::DeleteOutputHandler(AliHLTOUTHandler* pInstance)
{
+ // see header file for class documentation
+ if (pInstance==NULL) return -EINVAL;
+
+ if (pInstance==fRawDataHandler) {
+ if (--fNofRawDataHandler<=0) {
+ delete fRawDataHandler;
+ fRawDataHandler=NULL;
+ }
+ }
return 0;
}
+
+AliHLTTPCAgent::AliHLTTPCRawDataHandler::AliHLTTPCRawDataHandler()
+{
+ // see header file for class documentation
+}
+
+AliHLTTPCAgent::AliHLTTPCRawDataHandler::~AliHLTTPCRawDataHandler()
+{
+ // see header file for class documentation
+}
+
+int AliHLTTPCAgent::AliHLTTPCRawDataHandler::ProcessData(AliHLTOUT* pData)
+{
+ // see header file for class documentation
+ if (!pData) return -EINVAL;
+ AliHLTComponentDataType dt=kAliHLTVoidDataType;
+ AliHLTUInt32_t spec=kAliHLTVoidDataSpec;
+ int iResult=pData->GetDataBlockDescription(dt, spec);
+ if (iResult>=0) {
+ int slice=AliHLTTPCDefinitions::GetMinSliceNr(spec);
+ int part=AliHLTTPCDefinitions::GetMinPatchNr(spec);
+ if (slice==AliHLTTPCDefinitions::GetMaxSliceNr(spec) &&
+ part==AliHLTTPCDefinitions::GetMaxPatchNr(spec)) {
+ iResult=768;
+ if (part>1) iResult+=72+4*slice+(part-2);
+ else iResult+=2*slice+part;
+ } else {
+ HLTError("handler can not process merged data from multiple ddls:"
+ " min slice %d, max slice %d, min part %d, max part %d",
+ slice, AliHLTTPCDefinitions::GetMaxSliceNr(spec),
+ part, AliHLTTPCDefinitions::GetMaxPatchNr(spec));
+ iResult=-EBADMSG;
+ }
+ }
+ return iResult;
+}