// $Id$
//**************************************************************************
-//* This file is property of and copyright by the ALICE HLT Project *
+//* This file is property of and copyright by the *
//* ALICE Experiment at CERN, All rights reserved. *
//* *
//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
-//* for The ALICE HLT Project. *
//* *
//* Permission to use, copy, modify and distribute this software and its *
//* documentation strictly for non-commercial purposes is hereby granted *
#include "AliHLTTPCdEdxComponent.h"
#include "AliHLTTPCdEdxMonitoringComponent.h"
#include "AliHLTTPCClusterFinderComponent.h"
-#include "AliHLTTPCRawDataUnpackerComponent.h"
#include "AliHLTTPCDigitPublisherComponent.h"
#include "AliHLTTPCDigitDumpComponent.h"
#include "AliHLTTPCClusterDumpComponent.h"
-#include "AliHLTTPCEsdWriterComponent.h"
-#include "AliHLTTPCOfflineClustererComponent.h"
-#include "AliHLTTPCOfflineTrackerComponent.h"
-#include "AliHLTTPCOfflineTrackerCalibComponent.h"
-#include "AliHLTTPCOfflineCalibrationComponent.h" // to be added to the calibration library agent
#include "AliHLTTPCClusterHistoComponent.h"
#include "AliHLTTPCHistogramHandlerComponent.h"
#include "AliHLTTPCTrackHistoComponent.h"
#include "AliHLTTPCDataCompressionComponent.h"
#include "AliHLTTPCDataCompressionMonitorComponent.h"
#include "AliHLTTPCDataCompressionFilterComponent.h"
+#include "AliHLTTPCDataPublisherComponent.h"
+#include "AliHLTTPCHWClusterDecoderComponent.h"
+#include "AliHLTTPCClusterTransformationComponent.h"
/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTTPCAgent)
{
// see header file for class documentation
if (handler) {
+ // AliSimulation: use the AliRawReaderPublisher if the raw reader is available
+ // AliReconstruction: indicated by runloader==NULL, run always on raw data
+ bool bPublishRaw=rawReader!=NULL || runloader==NULL;
// This the tracking configuration for the full TPC
// - 216 clusterfinders (1 per partition)
TString arg;
TString mergerInput;
TString sinkRawData;
- TString sinkClusterInput;
TString sinkHWClusterInput;
TString dEdXInput;
+ TString hwclustOutput;
TString compressorInput;
+ TString trackerInput;
+
+
+ arg.Form("-publish-raw filtered");
+ handler->CreateConfiguration("TPC-DP", "TPCDataPublisher", NULL , arg.Data());
+
for (int slice=iMinSlice; slice<=iMaxSlice; slice++) {
- TString trackerInput;
for (int part=iMinPart; part<=iMaxPart; part++) {
- TString publisher, cf;
+ TString publisher;
// digit publisher components
publisher.Form("TPC-DP_%02d_%d", slice, part);
- if (rawReader || !runloader) {
+ if (bPublishRaw) {
// AliSimulation: use the AliRawReaderPublisher if the raw reader is available
- // Alireconstruction: indicated by runloader==NULL, run always on raw data
+ // AliReconstruction: indicated by runloader==NULL, run always on raw data
int ddlno=768;
if (part>1) ddlno+=72+4*slice+(part-2);
else ddlno+=2*slice+part;
- arg.Form("-minid %d -datatype 'DDL_RAW ' 'TPC ' -dataspec 0x%02x%02x%02x%02x -silent", ddlno, slice, slice, part, part);
- handler->CreateConfiguration(publisher.Data(), "AliRawReaderPublisher", NULL , arg.Data());
+ arg.Form("-datatype 'DDL_RAW ' 'TPC ' -dataspec 0x%02x%02x%02x%02x", slice, slice, part, part);
+ handler->CreateConfiguration(publisher.Data(), "BlockFilter", "TPC-DP" , arg.Data());
+ if (sinkRawData.Length()>0) sinkRawData+=" ";
+ sinkRawData+=publisher;
} else {
arg.Form("-slice %d -partition %d", slice, part);
handler->CreateConfiguration(publisher.Data(), "TPCDigitPublisher", NULL , arg.Data());
}
- if (sinkRawData.Length()>0) sinkRawData+=" ";
- sinkRawData+=publisher;
-
- // cluster finder components
- cf.Form("TPC-CF_%02d_%d", slice, part);
- arg="-release-memory -publish-raw";
- if (!rawReader && runloader) {
- arg+=" -do-mc";
- handler->CreateConfiguration(cf.Data(), "TPCClusterFinderUnpacked", publisher.Data(), arg.Data());
- } else {
- handler->CreateConfiguration(cf.Data(), "TPCClusterFinder32Bit", publisher.Data(),arg.Data());
- }
-
// Hardware CF emulator
- // soon going to replace the software clusterfinder
TString hwcfemu;
hwcfemu.Form("TPC-HWCFEmu_%02d_%d", slice, part);
- handler->CreateConfiguration(hwcfemu.Data(), "TPCHWClusterFinderEmulator", publisher.Data(), "-do-mc 1");
- if (compressorInput.Length()>0) compressorInput+=" ";
- compressorInput+=hwcfemu;
-
+ arg="";
+ if (!bPublishRaw) arg+=" -do-mc 1";
+ handler->CreateConfiguration(hwcfemu.Data(), "TPCHWClusterFinderEmulator", publisher.Data(), arg.Data());
+ if (hwclustOutput.Length()>0) hwclustOutput+=" ";
+ hwclustOutput+=hwcfemu;
+
TString hwcf;
hwcf.Form("TPC-HWCF_%02d_%d", slice, part);
handler->CreateConfiguration(hwcf.Data(), "TPCHWClusterTransform",hwcfemu.Data(), "-publish-raw");
- if (trackerInput.Length()>0) trackerInput+=" ";
- trackerInput+=hwcf;
- if (dEdXInput.Length()>0) dEdXInput+=" ";
- dEdXInput+=hwcf;
- if (sinkClusterInput.Length()>0) sinkClusterInput+=" ";
- sinkClusterInput+=cf;
- if (sinkHWClusterInput.Length()>0) sinkHWClusterInput+=" ";
- sinkHWClusterInput+=hwcf;
+ //if (trackerInput.Length()>0) trackerInput+=" ";
+ //trackerInput+=hwcf;
+ //if (dEdXInput.Length()>0) dEdXInput+=" ";
+ //dEdXInput+=hwcf;
+ //if (sinkHWClusterInput.Length()>0) sinkHWClusterInput+=" ";
+ //sinkHWClusterInput+=hwcf;
}
- TString tracker;
- // tracker finder components
- tracker.Form("TPC-TR_%02d", slice);
- handler->CreateConfiguration(tracker.Data(), "TPCCATracker", trackerInput.Data(), "");
+ }
+
+ TString hwcfDecoder = "TPC-HWCFDecoder";
+ handler->CreateConfiguration(hwcfDecoder.Data(), "TPCHWClusterDecoder",hwclustOutput.Data(), "");
- if (mergerInput.Length()>0) mergerInput+=" ";
- mergerInput+=tracker;
+ TString clusterTransformation = "TPC-ClusterTransformation";
+ handler->CreateConfiguration(clusterTransformation.Data(), "TPCClusterTransformation",hwcfDecoder.Data(), "");
- }
+ if (trackerInput.Length()>0) trackerInput+=" ";
+ trackerInput+=clusterTransformation;
+ if (dEdXInput.Length()>0) dEdXInput+=" ";
+ dEdXInput+=clusterTransformation;
+ if (sinkHWClusterInput.Length()>0) sinkHWClusterInput+=" ";
+ sinkHWClusterInput+=clusterTransformation;
+
+ // tracker finder component
+ // 2012-01-05 changing the configuration according to online setup
+ // the tracking strategy has been changed in the online system in Sep 2011
+ // the tracker now processes all clusters, and several of this 'global' trackers
+ // run in parallel. The GlobalMerger is still in the chain as it produces the final
+ // fit.
+ TString tracker;
+ tracker.Form("TPC-TR");
+ handler->CreateConfiguration(tracker.Data(), "TPCCATracker", trackerInput.Data(), "-GlobalTracking");
+
+ if (mergerInput.Length()>0) mergerInput+=" ";
+ mergerInput+=tracker;
// GlobalMerger component
handler->CreateConfiguration("TPC-globalmerger","TPCCAGlobalMerger",mergerInput.Data(),"");
// compression component
if (compressorInput.Length()>0) compressorInput+=" ";
- compressorInput+="TPC-globalmerger";
- handler->CreateConfiguration("TPC-compression", "TPCDataCompressor", compressorInput.Data(), "");
- handler->CreateConfiguration("TPC-compression-huffman-trainer", "TPCDataCompressor", compressorInput.Data(),"-deflater-mode 3");
- handler->CreateConfiguration("TPC-compression-monitoring-component", "TPCDataCompressorMonitor", "TPC-compression TPC-hwcfdata","-pushback-period=30");
- handler->CreateConfiguration("TPC-compression-monitoring", "ROOTFileWriter", "TPC-compression-monitoring-component","-concatenate-events -overwrite -datafile HLT.TPCDataCompression-statistics.root");
+ //compressorInput+=hwclustOutput;
+ compressorInput+=hwcfDecoder;
// special configuration to run the emulation automatically if the compressed clusters
// of a particular partition is missing. This configuration is announced for reconstruction
// clusters), 2 (track model compression), or 4. The emulation can not be in mode 2 or 4,
// since the track model block can not be identified with a partition. Have to duplicate the
// configuration of the compression component
- handler->CreateConfiguration("TPC-auto-compression-component", "TPCDataCompressor", compressorInput.Data(), "-mode 1");
- handler->CreateConfiguration("TPC-auto-compression", "TPCDataCompressorFilter", "TPC-auto-compression-component","");
+ handler->CreateConfiguration("TPC-compression-emulation", "TPCDataCompressor", compressorInput.Data(), "-mode 1");
+
+ if (compressorInput.Length()>0) compressorInput+=" ";
+ compressorInput+="TPC-globalmerger";
+ handler->CreateConfiguration("TPC-compression", "TPCDataCompressor", compressorInput.Data(), "");
+ handler->CreateConfiguration("TPC-compression-huffman-trainer", "TPCDataCompressor", compressorInput.Data(),"-deflater-mode 3");
+ handler->CreateConfiguration("TPC-compression-monitoring-component", "TPCDataCompressorMonitor", "TPC-compression TPC-hwcfdata","-pushback-period=30");
+ handler->CreateConfiguration("TPC-compression-monitoring", "ROOTFileWriter", "TPC-compression-monitoring-component","-concatenate-events -overwrite -datafile HLT.TPCDataCompression-statistics.root");
// the esd converter configuration
TString converterInput="TPC-globalmerger";
- if (!rawReader && runloader) {
+ if (!bPublishRaw) {
// propagate cluster info to the esd converter in order to fill the MC information
handler->CreateConfiguration("TPC-clustermc-info", "BlockFilter" , sinkHWClusterInput.Data(), "-datatype 'CLMCINFO' 'TPC '");
handler->CreateConfiguration("TPC-mcTrackMarker","TPCTrackMCMarker","TPC-globalmerger TPC-clustermc-info","" );
handler->CreateConfiguration("TPC-esd-converter", "TPCEsdConverter" , converterInput.Data(), "");
// cluster dump collection
- handler->CreateConfiguration("TPC-clusters", "BlockFilter" , sinkClusterInput.Data(), "-datatype 'CLUSTERS' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
- handler->CreateConfiguration("TPC-raw-clusters", "BlockFilter" , sinkClusterInput.Data(), "-datatype 'CLUSTRAW' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
+ handler->CreateConfiguration("TPC-clusters", "BlockFilter" , sinkHWClusterInput.Data(), "-datatype 'CLUSTERS' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
+ handler->CreateConfiguration("TPC-raw-clusters", "BlockFilter" , sinkHWClusterInput.Data(), "-datatype 'CLUSTRAW' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
handler->CreateConfiguration("TPC-hwclusters", "BlockFilter" , sinkHWClusterInput.Data(), "-datatype 'CLUSTERS' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
handler->CreateConfiguration("TPC-raw-hwclusters", "BlockFilter" , sinkHWClusterInput.Data(), "-datatype 'CLUSTRAW' 'TPC ' -datatype 'CLMCINFO' 'TPC '");
// raw data
handler->CreateConfiguration("TPC-raw-data", "BlockFilter" , sinkRawData.Data(), "");
- handler->CreateConfiguration("TPC-hwcfdata", "BlockFilter" , compressorInput.Data(), "-datatype 'HWCLUST1' 'TPC '");
+ handler->CreateConfiguration("TPC-hwcfdata", "BlockFilter" , hwclustOutput.Data(), "-datatype 'HWCLUST1' 'TPC '");
/////////////////////////////////////////////////////////////////////////////////////
//
// 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
- //if (runloader->GetLoader("TPCLoader") != NULL)
- //return "TPC-esd-converter TPC-clusters";
-
- // 2010-10-26 TPC clusters not written to HLTOUT in order to make the simulation
- // closer to the real data
- //return "TPC-clusters";
+ return "TPC-compression";
} else {
- bool bAddEmulation=true; // add by default
-
- // FIXME:
- // tried to make the configuration optional depending on whether the
- // TPC requires HLT clusters or not, bu the RecoParam OCDB object is a TObjArray
- // and the event specie is not yet defined. Maybe it can be derived from
- // the GRP. On the other hand, HLT data compression is expected to be the
- // default mode from now on, so this block might be safely deleted after some
- // time (today is 2011-11-18)
- //
- // AliTPCRecoParam* param=NULL;
- // TObject* pObject=AliHLTMisc::Instance().ExtractObject(AliHLTMisc::Instance().LoadOCDBEntry("TPC/Calib/RecoParam"));
- // if (pObject && (param=dynamic_cast<AliTPCRecoParam*>(pObject))!=NULL) {
- // bAddEmulation=param->GetUseHLTClusters()==3 || param->GetUseHLTClusters()==4;
- // HLTInfo("%s auto-compression for not existing TPC partitions, TPCRecoParam::GetUseHLTClusters %d",
- // bAddEmulation?"adding":"skipping",
- // param->GetUseHLTClusters());
- // }
- if (bAddEmulation) {
- // 2011-11-23: not yet enabled
- // testing required, furthermore a component publishing only the raw data for
- // the missing links, to big impact to performance otherwise
- //return "TPC-auto-compression";
- }
+ return "TPC-compression-emulation";
}
return NULL;
}
pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinderUnpacked));
pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinderDecoder));
pHandler->AddComponent(new AliHLTTPCClusterFinderComponent(AliHLTTPCClusterFinderComponent::kClusterFinder32Bit));
- pHandler->AddComponent(new AliHLTTPCRawDataUnpackerComponent);
pHandler->AddComponent(new AliHLTTPCDigitPublisherComponent);
pHandler->AddComponent(new AliHLTTPCDigitDumpComponent);
pHandler->AddComponent(new AliHLTTPCClusterDumpComponent);
- pHandler->AddComponent(new AliHLTTPCEsdWriterComponent::AliWriter);
- pHandler->AddComponent(new AliHLTTPCEsdWriterComponent::AliConverter);
- pHandler->AddComponent(new AliHLTTPCOfflineClustererComponent);
- pHandler->AddComponent(new AliHLTTPCOfflineTrackerComponent);
- pHandler->AddComponent(new AliHLTTPCOfflineTrackerCalibComponent);
- pHandler->AddComponent(new AliHLTTPCOfflineCalibrationComponent);
pHandler->AddComponent(new AliHLTTPCClusterHistoComponent);
pHandler->AddComponent(new AliHLTTPCHistogramHandlerComponent);
pHandler->AddComponent(new AliHLTTPCTrackHistoComponent);
pHandler->AddComponent(new AliHLTTPCDataCompressionComponent);
pHandler->AddComponent(new AliHLTTPCDataCompressionMonitorComponent);
pHandler->AddComponent(new AliHLTTPCDataCompressionFilterComponent);
+ pHandler->AddComponent(new AliHLTTPCDataPublisherComponent);
+ pHandler->AddComponent(new AliHLTTPCHWClusterDecoderComponent);
+ pHandler->AddComponent(new AliHLTTPCClusterTransformationComponent);
return 0;
}