-// $Id: AliHLTTRDTrackerV1Component.cxx 23618 2008-01-29 13:07:38Z hristov $
-
-/**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * *
- * Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
- * Timm Steinbeck <timm@kip.uni-heidelberg.de> *
- * for The ALICE Off-line Project. *
- * *
- * Permission to use, copy, modify and distribute this software and its *
- * documentation strictly for non-commercial purposes is hereby granted *
- * without fee, provided that the above copyright notice appears in all *
- * copies and that both the copyright notice and this permission notice *
- * appear in the supporting documentation. The authors make no claims *
- * about the suitability of this software for any purpose. It is *
- * provided "as is" without express or implied warranty. *
- **************************************************************************/
+// $Id$
+
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project *
+//* ALICE Experiment at CERN, All rights reserved. *
+//* *
+//* Primary Authors: *
+//* 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 *
+//* without fee, provided that the above copyright notice appears in all *
+//* copies and that both the copyright notice and this permission notice *
+//* appear in the supporting documentation. The authors make no claims *
+//* about the suitability of this software for any purpose. It is *
+//* provided "as is" without express or implied warranty. *
+//**************************************************************************
/** @file AliHLTTRDTrackerV1Component.cxx
- @author Timm Steinbeck, Matthias Richter
+ @author Theodor Rascanu
@date
- @brief A TRDTrackerV1 processing component for the HLT. */
-
-#if __GNUC__ >= 3
-using namespace std;
-#endif
+ @brief A TRDTrackerV1 processing component for the HLT.
+*/
#include "AliHLTTRDTrackerV1Component.h"
#include "AliHLTTRDDefinitions.h"
-#include "AliHLTTRDCluster.h"
#include "AliHLTTRDTrack.h"
+#include "AliHLTTRDUtils.h"
+#include "AliHLTTRDCluster.h"
#include "TFile.h"
#include "TChain.h"
#include "AliGeomManager.h"
#include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliCDBEntry.h"
#include "AliESDEvent.h"
-#include "AliMagF.h"
#include "AliESDfriend.h"
#include "AliTRDcalibDB.h"
#include <cerrno>
#include <string>
-#ifdef HAVE_VALGRIND_CALLGRIND_H
-#include <valgrind/callgrind.h>
-#else
-#define CALLGRIND_START_INSTRUMENTATION() do { } while (0)
-#define CALLGRIND_STOP_INSTRUMENTATION() do { } while (0)
-#endif
+using namespace std;
+
+ClassImp(AliHLTTRDTrackerV1Component)
+
+void AliHLTTRDTrackerV1Component::AliHLTTRDESDEvent::CreateStdContent()
+{
+ TClonesArray* tracksArray = new TClonesArray("AliESDtrack",0);
+ tracksArray->SetName(AliESDEvent::fgkESDListName[AliESDEvent::kTracks]);
+ AddObject(tracksArray);
+ GetStdContent();
+}
+
+void AliHLTTRDTrackerV1Component::AliHLTTRDESDEvent::Streamer(TBuffer &/*R__b*/)
+{
+ AliFatal("class is for internal us only and not for streaming");
+}
-ClassImp(AliHLTTRDTrackerV1Component);
-
AliHLTTRDTrackerV1Component::AliHLTTRDTrackerV1Component():
AliHLTProcessor(),
- fOutputPercentage(100), // By default we copy to the output exactly what we got as input
- fStrorageDBpath("local://$ALICE_ROOT"),
- fCDB(NULL),
- fGeometryFileName(""),
- fUseHLTClusters(kFALSE),
- fUseHLTTracks(kFALSE),
+ fOutputPercentage(100), // By default we copy to the output exactly what we got as input
fTracker(NULL),
fRecoParam(NULL),
- fReconstructor(NULL)
+ fReconstructor(NULL),
+ fESD(NULL),
+ fClusterArray(NULL),
+ fRecoParamType(-1),
+ fNtimeBins(-1),
+ fPIDmethod(1),
+ fgeometryFileName(""),
+ fHLTflag(kTRUE),
+ fOutputV1Tracks(kTRUE),
+ fHighLevelOutput(kFALSE),
+ fEmulateHLTTracks(kFALSE),
+ fImproveTracklets(kFALSE)
{
// Default constructor
- fGeometryFileName = getenv("ALICE_ROOT");
- fGeometryFileName += "/HLT/TRD/geometry.root";
}
AliHLTTRDTrackerV1Component::~AliHLTTRDTrackerV1Component()
{
// Get the list of input data
list.clear(); // We do not have any requirements for our input data type(s).
- list.push_back( AliHLTTRDDefinitions::fgkClusterDataType );
+ list.push_back(AliHLTTRDDefinitions::fgkClusterDataType);
}
-AliHLTComponent_DataType AliHLTTRDTrackerV1Component::GetOutputDataType()
+AliHLTComponentDataType AliHLTTRDTrackerV1Component::GetOutputDataType()
{
// Get the output data type
- return AliHLTTRDDefinitions::fgkClusterDataType;
+ return kAliHLTMultipleDataType;
+}
+
+int AliHLTTRDTrackerV1Component::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
+{
+ // Get the output data types
+ tgtList.clear();
+ tgtList.push_back(kAliHLTDataTypeTrack | kAliHLTDataOriginTRD);
+ tgtList.push_back(AliHLTTRDDefinitions::fgkTracksDataType);
+ return tgtList.size();
}
void AliHLTTRDTrackerV1Component::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
{
// Get the output data size
constBase = 0;
- inputMultiplier = ((double)fOutputPercentage)/100.0;
+ inputMultiplier = fOutputV1Tracks ? 2*((double)fOutputPercentage)/100.0 : 0.5*((double)fOutputPercentage)/100.0;
+ if(sizeof(AliHLTTRDClustersArray::cluster_type) == sizeof(AliHLTTRDCluster)) inputMultiplier *= 28.0/8;
}
// Spawn function, return new instance of this class
return new AliHLTTRDTrackerV1Component;
};
-/**
- * Convert AliTRDtrackV1 to AliHLTTRDTrack
- * Add HLTTrack to the output, defined by pointer
- * Fill block desctiptors
- * Return size of the added to ouput objects
- */
-//============================================================================
-AliHLTUInt32_t AliHLTTRDTrackerV1Component::AddToOutput(TClonesArray* inTrackArray, AliHLTUInt8_t* output)
-{
- cout << "\nWriting tracks to the Memory\n ============= \n";
- AliTRDtrackV1* track = 0;
- AliHLTUInt32_t addedSize = 0;
- AliHLTUInt8_t *iterPtr = output;
- AliHLTTRDTrack * outPtr = (AliHLTTRDTrack*)iterPtr;
-
- if (inTrackArray){
- Int_t nbTracks = inTrackArray->GetEntries();
- for (Int_t iTrack = 0; iTrack<nbTracks; iTrack++){
- AliHLTUInt32_t trackSize=0;
-
- track = dynamic_cast<AliTRDtrackV1*>(inTrackArray->At(iTrack));
- //track->Print();
-
- AliHLTTRDTrack *hltTrack = new (outPtr) AliHLTTRDTrack(track);
- trackSize = hltTrack->GetSize();
- addedSize += trackSize;
- HLTDebug("addedSize %i, trackSize %i", addedSize, trackSize);
-
- iterPtr += trackSize;
- outPtr = (AliHLTTRDTrack*)iterPtr;
- }
- }
- return addedSize;
-
-}
int AliHLTTRDTrackerV1Component::DoInit( int argc, const char** argv )
{
// perform initialization. We check whether our relative output size is specified in the arguments.
- fOutputPercentage = 100;
- int i = 0;
- char* cpErr;
-
-
- Int_t iRecoParamType = -1; // default will be the low flux
- Int_t iNtimeBins = -1; // number of time bins for the tracker to use
- Int_t iMagneticField = -1; // magnetic field: 0==OFF and 1==ON
- Bool_t bHLTMode = kTRUE, bWriteClusters = kFALSE;
-
- while ( i < argc )
- {
- HLTDebug("argv[%d] == %s", i, argv[i] );
- if ( !strcmp( argv[i], "output_percentage" ) )
- {
- if ( i+1>=argc )
- {
- HLTError("Missing output_percentage parameter");
- return ENOTSUP;
- }
- HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
- fOutputPercentage = strtoul( argv[i+1], &cpErr, 0 );
- if ( *cpErr )
- {
- HLTError("Cannot convert output_percentage parameter '%s'", argv[i+1] );
- return EINVAL;
- }
- HLTInfo("Output percentage set to %lu %%", fOutputPercentage );
- i += 2;
-
- }
-
- else if ( !strcmp( argv[i], "-NTimeBins" ) )
- {
- if ( i+1>=argc )
- {
- HLTError("Missing -NTimeBins parameter");
- return ENOTSUP;
- }
- HLTDebug("Arguments", "argv[%d+1] == %s", i, argv[i+1] );
- iNtimeBins = strtoul( argv[i+1], &cpErr, 0 );
- if ( *cpErr )
- {
- HLTError("Wrong Argument. Cannot convert -NTimeBins parameter '%s'", argv[i+1] );
- return EINVAL;
- }
- i += 2;
-
- }
-
- else if ( strcmp( argv[i], "-cdb" ) == 0)
- {
- if ( i+1 >= argc )
- {
- HLTError( "Missing -cdb argument");
- return ENOTSUP;
- }
- fStrorageDBpath = argv[i+1];
- HLTInfo("DB storage is %s", fStrorageDBpath.c_str() );
- i += 2;
-
- }
-
- else if ( strcmp( argv[i], "-geometry" ) == 0)
- {
- if ( i+1 >= argc )
- {
- HLTError("Missing -geometry argument");
- return ENOTSUP;
- }
- fGeometryFileName = argv[i+1];
- HLTInfo("GeomFile storage is %s",
- fGeometryFileName.c_str() );
- i += 2;
-
- }
+ int iResult=0;
- // the flux parametrizations
- else if ( strcmp( argv[i], "-lowflux" ) == 0)
- {
- iRecoParamType = 0;
- HLTDebug("Low flux reco selected.");
- i++;
-
- }
-
- else if ( strcmp( argv[i], "-highflux" ) == 0)
- {
- iRecoParamType = 1;
- HLTDebug("Low flux reco selected.");
- i++;
- }
-
- else if ( strcmp( argv[i], "-cosmics" ) == 0)
- {
- iRecoParamType = 2;
- HLTDebug("Cosmic test reco selected.");
- i++;
- }
-
- else if ( strcmp( argv[i], "-magnetic_field_ON" ) == 0)
- {
- iMagneticField = 1;
- i++;
- }
- else if ( strcmp( argv[i], "-magnetic_field_OFF" ) == 0)
- {
- iMagneticField = 0;
- i++;
- }
- else if ( strcmp( argv[i], "-writeClusters" ) == 0)
- {
- bWriteClusters = kTRUE;
- HLTDebug("input clusters are expected to be in a TTree.");
- i++;
- }
- else if ( strcmp( argv[i], "-offlineMode" ) == 0)
- {
- bHLTMode=kFALSE;
- HLTDebug("Using standard offline tracking.");
- i++;
- }
- else if ( strcmp( argv[i], "-useHLTClusters" ) == 0)
- {
- fUseHLTClusters = kTRUE;
- i++;
- HLTInfo("expecting AliHLTCluster as input");
- }
- else if ( strcmp( argv[i], "-useHLTTracks" ) == 0)
- {
- fUseHLTTracks = kTRUE;
- i++;
- HLTInfo("Using AliHLTTrack to pass data further in the chain");
- }
- else {
- HLTError("Unknown option '%s'", argv[i] );
- return EINVAL;
- }
-
- }
-
- // THE "REAL" INIT COMES HERE
- // offline condition data base
- fCDB = AliCDBManager::Instance();
- if (!fCDB)
- {
- HLTError("Could not get CDB instance", "fCDB 0x%x", fCDB);
- return -1;
- }
- else
- {
- fCDB->SetRun(0); // THIS HAS TO BE RETRIEVED !!!
- fCDB->SetDefaultStorage(fStrorageDBpath.c_str());
- HLTDebug("CDB instance", "fCDB 0x%x", fCDB);
- }
-
- // check if the N of time bins make sense
- if (iNtimeBins <= 0)
- {
- HLTError("Sorry. Tracker needs number of time bins. At the moment you have to provide it with -NTimeBins <value>. The simulation always had 24 and the real data 30. Take your pick. Make sure the information is correct. Ask offline to implement how to propagate this information into clusters/cluster tree.");
- return -1;
- }
-
- if (iNtimeBins < 24 || iNtimeBins > 30)
- {
- HLTWarning("The number of time bins seems to be strange = %d. But okay. Let's try it...", iNtimeBins);
- }
-
- HLTDebug("The number of time bins = %d.", iNtimeBins);
- AliTRDtrackerV1::SetNTimeBins(iNtimeBins);
-
- // !!!! THIS IS IMPORTANT
- // init alifield map - temporarly via parameter - should come from a DB or DCS ?
- // !!!!
- if (iMagneticField < 0)
- {
- iMagneticField = 0;
- HLTWarning("No magnetic field switch stated. Use -magnetic_field_ON or -magnetic_field_OFF flag. Defaulting to OFF = NO MAGNETIC FIELD");
- }
-
- if (!TGeoGlobalMagField::Instance()->IsLocked()) {
- if (iMagneticField == 0)
- {
- // magnetic field OFF
- AliMagF* field = new AliMagF("Maps","Maps",2,0.,0., 10.,AliMagF::k5kGUniform);
- TGeoGlobalMagField::Instance()->SetField(field);
- HLTDebug("Magnetic field is OFF.");
- }
-
- if (iMagneticField == 1)
- {
- // magnetic field ON
- AliMagF* field = new AliMagF("Maps","Maps",2,1.,1., 10.,AliMagF::k5kG);
- TGeoGlobalMagField::Instance()->SetField(field);
- HLTDebug("Magnetic field is ON.");
- }
- }
- else {
- HLTError("Magnetic field is already set and locked, cannot redefine it." );
+ fReconstructor = new AliTRDReconstructor();
+ HLTDebug("TRDReconstructor at 0x%x", fReconstructor);
+ fESD = new AliHLTTRDESDEvent();
+ fESD->CreateStdContent();
+
+ TString configuration="";
+ TString argument="";
+ for (int i=0; i<argc && iResult>=0; i++) {
+ argument=argv[i];
+ if (!configuration.IsNull()) configuration+=" ";
+ configuration+=argument;
}
- // reconstruction parameters
- if (iRecoParamType < 0 || iRecoParamType > 2)
- {
- HLTWarning("No reco param selected. Use -lowflux -highflux -cosmics flags. Defaulting to low flux.");
- iRecoParamType = 0;
- }
-
- if (iRecoParamType == 0)
- {
- fRecoParam = AliTRDrecoParam::GetLowFluxParam();
- HLTDebug("Low flux params init.");
- }
-
- if (iRecoParamType == 1)
- {
- fRecoParam = AliTRDrecoParam::GetHighFluxParam();
- HLTDebug("High flux params init.");
- }
-
- if (iRecoParamType == 2)
- {
- fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
- HLTDebug("Cosmic Test params init.");
- }
+ if (!configuration.IsNull()) {
+ iResult=Configure(configuration.Data());
+ } else {
+ iResult=Reconfigure(NULL, NULL);
+ }
- if (fRecoParam == 0)
- {
- HLTError("No reco params initialized. Sniffing big trouble!");
- return -1;
- }
+ if(iResult<0) return iResult;
- fReconstructor = new AliTRDReconstructor();
- // fRecoParam->SetChi2Y(.1);
- // fRecoParam->SetChi2Z(5.);
- fReconstructor->SetRecoParam(fRecoParam);
- // write clusters [cw] = true
- // track seeding (stand alone tracking) [sa] = true
- // PID method in reconstruction (NN) [nn] = true
- // write online tracklets [tw] = false
- // drift gas [ar] = false
- // sl_tr_0 = StreamLevel_task_Level
- // fReconstructor->SetOption("sa,!cw,hlt,sl_tr_0");
- TString recoOptions="sa,sl_tr_0";
-
- if (bWriteClusters)
- {
- recoOptions += ",cw";
- }
- else
- {
- recoOptions += ",!cw";
- }
- if (bHLTMode)
- recoOptions += ",hlt";
-
- fReconstructor->SetOption(recoOptions.Data());
- HLTDebug("Reconstructor options are: %s",recoOptions.Data());
-
- if((AliGeomManager::GetGeometry()) == NULL){
-
- if ( TFile::Open(fGeometryFileName.c_str())) {
- AliGeomManager::LoadGeometry(fGeometryFileName.c_str());
- }
- else {
- HLTError("Cannot load geometry from file %s",fGeometryFileName.c_str());
- return EINVAL;
- }
- }
- else
- HLTInfo("Geometry Already Loaded");
-
- // create the tracker
fTracker = new AliTRDtrackerV1();
- fTracker->SetReconstructor(fReconstructor);
HLTDebug("TRDTracker at 0x%x", fTracker);
+ fTracker->SetReconstructor(fReconstructor);
- if (fTracker == 0)
- {
- HLTError("Unable to create the tracker!");
- return -1;
- }
+ fClusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
- return 0;
+ return iResult;
}
int AliHLTTRDTrackerV1Component::DoDeinit()
fTracker->SetClustersOwner(kFALSE);
delete fTracker;
- fTracker = 0x0;
+ fTracker = NULL;
+
+ fClusterArray->Delete();
+ delete fClusterArray;
+ fClusterArray = NULL;
// We need to set clusters in Reconstructor to null to prevent from
- // double deleting, since we delete TClonesArray by ourself in DoEvent.
- fReconstructor->SetClusters(0x0);
+ // double deleting, since we delete TClonesArray by ourself.
+ //fReconstructor->SetClusters(0x0);
delete fReconstructor;
- fReconstructor = 0x0;
+ fReconstructor = NULL;
+ delete fESD;
+ fESD = NULL;
AliTRDcalibDB::Terminate();
vector<AliHLTComponent_BlockData>& outputBlocks )
{
// Process an event
- Bool_t bWriteClusters = fReconstructor->IsWritingClusters();
- HLTDebug("NofBlocks %lu", evtData.fBlockCnt );
+ HLTDebug("NofBlocks %i", evtData.fBlockCnt );
AliHLTUInt32_t totalSize = 0, offset = 0;
- AliHLTUInt32_t dBlockSpecification = 0;
- vector<AliHLTComponent_DataType> expectedDataTypes;
- GetInputDataTypes(expectedDataTypes);
- if (evtData.fEventID == 1)
- CALLGRIND_START_INSTRUMENTATION();
+ AliHLTComponentDataType expectedDataType = AliHLTTRDDefinitions::fgkClusterDataType;
for ( unsigned long iBlock = 0; iBlock < evtData.fBlockCnt; iBlock++ )
{
const AliHLTComponentBlockData &block = blocks[iBlock];
- offset = totalSize;
AliHLTComponentDataType inputDataType = block.fDataType;
- Bool_t correctDataType = kFALSE;
-
- for(UInt_t i = 0; i < expectedDataTypes.size(); i++)
- if( expectedDataTypes.at(i) == inputDataType)
- correctDataType = kTRUE;
- if (!correctDataType)
+
+ if(inputDataType != expectedDataType)
{
HLTDebug( "Block # %i/%i; Event 0x%08LX (%Lu) Wrong received datatype: %s - Skipping",
iBlock, evtData.fBlockCnt-1,
DataType2Text(inputDataType).c_str());
continue;
}
- else
- HLTDebug("We get the right data type: Block # %i/%i; Event 0x%08LX (%Lu) Received datatype: %s",
- iBlock, evtData.fBlockCnt-1,
- evtData.fEventID, evtData.fEventID,
- DataType2Text(inputDataType).c_str());
-
-
- TTree *clusterTree = 0x0;
- TClonesArray* clusterArray = 0x0;
- ReadAndLoadClusters(clusterTree, clusterArray, &block);
+ else {
+ HLTDebug("We get the right data type: Block # %i/%i; Event 0x%08LX (%Lu) Received datatype: %s; Block Size: %i",
+ iBlock, evtData.fBlockCnt-1,
+ evtData.fEventID, evtData.fEventID,
+ DataType2Text(inputDataType).c_str(),
+ block.fSize);
+ }
+
+#ifndef NDEBUG
+ unsigned long constBase;
+ double inputMultiplier;
+ GetOutputDataSize(constBase,inputMultiplier);
+ if(size<(constBase+block.fSize*inputMultiplier)){
+ HLTWarning("Memory Block given might be too small: %i < %f; Event %Lu", size, constBase+block.fSize*inputMultiplier, evtData.fEventID);
+ }
+#endif
+
+ fESD->Reset();
+ //fESD->SetMagneticField(GetBz());
+
+ AliHLTTRDUtils::ReadClusters(fClusterArray, block.fPtr, block.fSize, &fNtimeBins);
+ HLTDebug("Reading number of time bins from input block. Setting number of timebins to %d", fNtimeBins);
+ AliTRDtrackerV1::SetNTimeBins(fNtimeBins);
+
+ HLTDebug("TClonesArray of clusters: nbEntries = %i", fClusterArray->GetEntriesFast());
+ fTracker->LoadClusters(fClusterArray);
+
+ fTracker->Clusters2Tracks(fESD);
+
+ Int_t nTracks = fESD->GetNumberOfTracks();
+ HLTInfo("Number of tracks == %d ==", nTracks);
+
+ TClonesArray* trdTracks;
+ trdTracks = fTracker->GetListOfTracks();
- // maybe it is not so smart to create it each event? clear is enough ?
- AliESDEvent *esd = new AliESDEvent();
- esd->CreateStdContent();
- fTracker->Clusters2Tracks(esd);
-
- //here transport the esd tracks further
- Int_t nTracks = esd->GetNumberOfTracks();
- Int_t nTRDTracks = esd->GetNumberOfTrdTracks();
- HLTInfo("Number of tracks == %d == Number of TRD tracks %d", nTracks, nTRDTracks);
-
- TClonesArray* trdTracks = fTracker->GetListOfTracks();
-
- if (trdTracks)
- totalSize += TransportTracks(trdTracks, outputPtr, outputBlocks, offset, dBlockSpecification);
- else
- HLTDebug("Bad array trdTracks = 0x%x", trdTracks);
+ if(fHighLevelOutput){
+ if(fEmulateHLTTracks && trdTracks){
+ // TClonesArray* oldArr = trdTracks;
+ trdTracks = new TClonesArray(*trdTracks);
+ AliHLTTRDUtils::EmulateHLTTracks(trdTracks);
+ // if(oldArr->At(0)){
+ // HLTInfo("Old Track:");
+ // ((AliTRDtrackV1*)oldArr->At(0))->Print("a");
+ // HLTInfo("\nNew Track:");
+ // ((AliTRDtrackV1*)trdTracks->At(0))->Print("a");
+ // }
+ }
+
+ TObjString strg;
+ strg.String() += fNtimeBins;
+ if(trdTracks)
+ PushBack(trdTracks, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+ else{
+ TClonesArray temp("AliTRDtrackV1");
+ PushBack(&temp, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+ }
+ PushBack(&strg, AliHLTTRDDefinitions::fgkHiLvlTracksDataType, block.fSpecification);
+
+ if(fEmulateHLTTracks && trdTracks){
+ trdTracks->Delete();
+ delete trdTracks;
+ }
+ }
+ else if(nTracks>0){
+ HLTDebug("We have an output ESDEvent: 0x%x with %i tracks", fESD, nTracks);
+ AliHLTUInt32_t addedSize = AliHLTTRDUtils::AddESDToOutput(fESD, outputPtr+offset);
+ totalSize += addedSize;
+
+ // Fill block
+ AliHLTComponentBlockData bd;
+ FillBlockData( bd );
+ //bd.fPtr = outputPtr;
+ bd.fOffset = offset;
+ bd.fSize = addedSize;
+ bd.fSpecification = block.fSpecification;
+ bd.fDataType = kAliHLTDataTypeTrack | kAliHLTDataOriginTRD;
+ outputBlocks.push_back( bd );
+ HLTDebug("BD ptr 0x%x, offset %i, size %i, datav1Type %s, spec 0x%x ", bd.fPtr, bd.fOffset, bd.fSize, DataType2Text(bd.fDataType).c_str(), bd.fSpecification);
+ offset = totalSize;
+
+ if (fOutputV1Tracks && trdTracks){
+ HLTDebug("We have an output array: pointer to trdTracks = 0x%x, nbEntries = %i", trdTracks, trdTracks->GetEntriesFast());
+
+ addedSize = AliHLTTRDUtils::AddTracksToOutput(trdTracks, outputPtr+offset, fNtimeBins);
+ totalSize += addedSize;
+
+ // Fill block
+ FillBlockData( bd );
+ //bd.fPtr = outputPtr;
+ bd.fOffset = offset;
+ bd.fSize = addedSize;
+ bd.fSpecification = block.fSpecification;
+ bd.fDataType = AliHLTTRDDefinitions::fgkTracksDataType;
+ outputBlocks.push_back( bd );
+ HLTDebug("BD ptr 0x%x, offset %i, size %i, dataType %s, spec 0x%x ", bd.fPtr, bd.fOffset, bd.fSize, DataType2Text(bd.fDataType).c_str(), bd.fSpecification);
+ offset = totalSize;
+ }
+ }
+
HLTDebug("totalSize: %i", totalSize);
// if ( totalSize > allocSize )
//here we are deleting clusters (but not the TClonesArray itself)
fTracker->UnloadClusters();
-
- AliTRDReconstructor::SetClusters(0x0);
- delete esd;
- if (bWriteClusters)
- delete clusterTree;
- else{
- //clusterArray->Delete();
- delete clusterArray;
- }
+ //AliTRDReconstructor::SetClusters(0x0);
+ fClusterArray->Delete();
}
+
size = totalSize;
HLTDebug("Event is done. size written to the output is %i", size);
- // CALLGRIND_STOP_INSTRUMENTATION();
return 0;
}
-
-/**
- * ReadClusters from the component input and load them to the tracker
- */
-//============================================================================
-void AliHLTTRDTrackerV1Component::ReadAndLoadClusters(TTree *inClusterTree,
- TClonesArray *inClusterArray, const AliHLTComponentBlockData *inBlock)
-{
- Bool_t bWriteClusters = fReconstructor->IsWritingClusters();
- const AliHLTComponentBlockData &block = *inBlock;
-
-
- TObject *tobjin = 0x0;
- int ibForce = 0; // almost obsolet
-
- if (bWriteClusters){
- tobjin = (TObject *)GetFirstInputObject( AliHLTTRDDefinitions::fgkClusterDataType, "TTree", ibForce);
- HLTDebug("1stBLOCK; Pointer = 0x%x", tobjin);
- inClusterTree = (TTree*)tobjin;
- if (inClusterTree)
- {
- HLTDebug("CLUSTERS; Pointer to TTree = 0x%x Name = %s", inClusterTree, inClusterTree->GetName());
- HLTDebug("TTree of clusters: nbEntries = %i", inClusterTree->GetEntriesFast());
- fTracker->LoadClusters(inClusterTree);
+int AliHLTTRDTrackerV1Component::Configure(const char* arguments){
+ int iResult=0;
+ if (!arguments) return iResult;
+
+ TString allArgs=arguments;
+ TString argument;
+ int bMissingParam=0;
+
+ TObjArray* pTokens=allArgs.Tokenize(" ");
+ if (pTokens) {
+ for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
+ argument=((TObjString*)pTokens->At(i))->GetString();
+ if (argument.IsNull()) continue;
+
+ if (argument.CompareTo("output_percentage")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("Setting output percentage to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fOutputPercentage=((TObjString*)pTokens->At(i))->GetString().Atoi();
+ continue;
+ }
+ else if (argument.CompareTo("-solenoidBz")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTWarning("argument -solenoidBz is deprecated, magnetic field set up globally (%f)", GetBz());
+ continue;
+ }
+ else if (argument.CompareTo("-geometry")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ HLTInfo("Setting geometry to: %s", ((TObjString*)pTokens->At(i))->GetString().Data());
+ fgeometryFileName=((TObjString*)pTokens->At(i))->GetString();
+ continue;
+ }
+ else if (argument.CompareTo("-lowflux")==0) {
+ fRecoParamType = 0;
+ HLTInfo("Low flux reconstruction selected");
+ continue;
}
- else
- {
- HLTError("First Input Block is not a TTree 0x%x", tobjin);
+ else if (argument.CompareTo("-highflux")==0) {
+ fRecoParamType = 1;
+ HLTInfo("High flux reconstruction selected");
+ continue;
}
+ else if (argument.CompareTo("-cosmics")==0) {
+ fRecoParamType = 2;
+ HLTInfo("Cosmics reconstruction selected");
+ continue;
+ }
+ else if (argument.CompareTo("-HLTflag")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+ if (toCompareTo.CompareTo("yes")==0){
+ HLTInfo("Setting HLTflag to: %s", toCompareTo.Data());
+ fHLTflag=kTRUE;
+ }
+ else if (toCompareTo.CompareTo("no")==0){
+ HLTInfo("Setting HLTflag to: %s", toCompareTo.Data());
+ fHLTflag=kFALSE;
+ }
+ else {
+ HLTError("unknown argument for HLTflag: %s", toCompareTo.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ continue;
+ }
+ else if (argument.CompareTo("-outputV1Tracks")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+ if (toCompareTo.CompareTo("yes")==0){
+ HLTInfo("Setting OutputV1Tracks to: %s", toCompareTo.Data());
+ fOutputV1Tracks=kTRUE;
+ }
+ else if (toCompareTo.CompareTo("no")==0){
+ HLTInfo("Setting OutputV1Tracks to: %s", toCompareTo.Data());
+ fOutputV1Tracks=kFALSE;
+ }
+ else {
+ HLTError("unknown argument for OutputV1Tracks: %s", toCompareTo.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ continue;
+ }
+ else if (argument.CompareTo("-highLevelOutput")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+ if (toCompareTo.CompareTo("yes")==0){
+ HLTWarning("Setting highLevelOutput to: %s", toCompareTo.Data());
+ fHighLevelOutput=kTRUE;
+ }
+ else if (toCompareTo.CompareTo("no")==0){
+ HLTInfo("Setting highLevelOutput to: %s", toCompareTo.Data());
+ fHighLevelOutput=kFALSE;
+ }
+ else {
+ HLTError("unknown argument for highLevelOutput: %s", toCompareTo.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ continue;
+ }
+ else if (argument.CompareTo("-emulateHLToutput")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+ if (toCompareTo.CompareTo("yes")==0){
+ HLTWarning("Setting emulateHLToutput to: %s", toCompareTo.Data());
+ fEmulateHLTTracks=kTRUE;
+ }
+ else if (toCompareTo.CompareTo("no")==0){
+ HLTInfo("Setting emulateHLToutput to: %s", toCompareTo.Data());
+ fEmulateHLTTracks=kFALSE;
+ }
+ else {
+ HLTError("unknown argument for emulateHLToutput: %s", toCompareTo.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ continue;
+ }
+ else if (argument.CompareTo("-PIDmethod")==0) {
+ if ((bMissingParam=(++i>=pTokens->GetEntries()))) break;
+ TString toCompareTo=((TObjString*)pTokens->At(i))->GetString();
+ if (toCompareTo.CompareTo("LH")==0){
+ HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+ fPIDmethod=0;
+ }
+ else if (toCompareTo.CompareTo("NN")==0){
+ HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+ fPIDmethod=1;
+ }
+ else if (toCompareTo.CompareTo("TM")==0){
+ HLTInfo("Setting PID method to: %s", toCompareTo.Data());
+ fPIDmethod=2;
+ }
+ else {
+ HLTError("unknown argument for PID method: %s", toCompareTo.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ continue;
+ }
+
+ else {
+ HLTError("unknown argument: %s", argument.Data());
+ iResult=-EINVAL;
+ break;
+ }
+ }
+ delete pTokens;
}
- else if (fUseHLTClusters)
- {
- inClusterArray = new TClonesArray("AliTRDcluster"); // would be nice to allocate memory for all clusters here.
- ReadClusters(inClusterArray, block.fPtr, block.fSize);
- HLTDebug("TClonesArray of clusters: nbEntries = %i", inClusterArray->GetEntriesFast());
- fTracker->LoadClusters(inClusterArray);
+ if (bMissingParam) {
+ HLTError("missing parameter for argument %s", argument.Data());
+ iResult=-EINVAL;
+ }
+ if(iResult>=0){
+ iResult=SetParams();
+ }
+ return iResult;
+}
+
+int AliHLTTRDTrackerV1Component::SetParams()
+{
+ Int_t iResult=0;
+ if(!AliCDBManager::Instance()->IsDefaultStorageSet()){
+ HLTError("DefaultStorage is not set in CDBManager");
+ return -EINVAL;
+ }
+ if(AliCDBManager::Instance()->GetRun()<0){
+ HLTError("Run Number is not set in CDBManager");
+ return -EINVAL;
+ }
+ HLTInfo("CDB default storage: %s; RunNo: %i", (AliCDBManager::Instance()->GetDefaultStorage()->GetBaseFolder()).Data(), AliCDBManager::Instance()->GetRun());
+
+ if(!AliGeomManager::GetGeometry()){
+ if(fgeometryFileName.CompareTo("")==0 || !TFile::Open(fgeometryFileName.Data())){
+ HLTInfo("Loading standard geometry file");
+ AliGeomManager::LoadGeometry();
+ }else{
+ HLTWarning("Loading NON-standard geometry file");
+ AliGeomManager::LoadGeometry(fgeometryFileName.Data());
}
- else
- {
- tobjin = (TObject *)GetFirstInputObject( AliHLTTRDDefinitions::fgkClusterDataType, "TClonesArray", ibForce);
- HLTDebug("1stBLOCK; Pointer = 0x%x", tobjin);
- inClusterArray = (TClonesArray*)tobjin;
- if (inClusterArray)
+ if(!AliGeomManager::GetGeometry()){
+ HLTError("Could not load geometry");
+ return -EINVAL;
+ }
+ HLTInfo("Applying Alignment from CDB object");
+ AliGeomManager::ApplyAlignObjsFromCDB("TRD");
+ }
+ else{
+ HLTInfo("Geometry Already Loaded!");
+ }
+
+ if(fReconstructor->GetRecoParam()){
+ fRecoParam = new AliTRDrecoParam(*fReconstructor->GetRecoParam());
+ HLTInfo("RecoParam already set!");
+ }else{
+ if(fRecoParamType == 0){
+#ifndef HAVE_NOT_ALITRD_RECOPARAM_r41621
+ if(fHLTflag){
+ HLTInfo("Low flux HLT params init.");
+ fRecoParam = AliTRDrecoParam::GetLowFluxHLTParam();
+ }else
+#endif
{
- HLTDebug("CLUSTERS; Pointer to TClonesArray = 0x%x Name = %s", inClusterArray, inClusterArray->GetName());
- HLTDebug("TClonesArray of clusters: nbEntries = %i", inClusterArray->GetEntriesFast());
- fTracker->LoadClusters(inClusterArray);
+ HLTInfo("Low flux params init.");
+ fRecoParam = AliTRDrecoParam::GetLowFluxParam();
}
- else
+ }
+ if(fRecoParamType == 1){
+#ifndef HAVE_NOT_ALITRD_RECOPARAM_r41621
+ if(fHLTflag){
+ HLTInfo("High flux HLT params init.");
+ fRecoParam = AliTRDrecoParam::GetHighFluxHLTParam();
+ }else
+#endif
{
- HLTError("First Input Block not a TClonesArray 0x%x", tobjin);
+ HLTInfo("High flux params init.");
+ fRecoParam = AliTRDrecoParam::GetHighFluxParam();
}
}
-}
+ if(fRecoParamType == 2){
+ HLTInfo("Cosmic Test params init.");
+ fRecoParam = AliTRDrecoParam::GetCosmicTestParam();
+ }
+ }
-/**
- * Read cluster to the TClonesArray from the memory
- */
-//============================================================================
-Int_t AliHLTTRDTrackerV1Component::ReadClusters(TClonesArray *outArray, void* inputPtr, AliHLTUInt32_t size)
-{
- //HLTDebug("\nReading clusters from the Memory\n ============= \n");
- AliHLTTRDCluster * curCluster;
- UInt_t clusterSize = sizeof(AliHLTTRDCluster), curSize = 0;
- Int_t i=0;
-
- curCluster = (AliHLTTRDCluster*) inputPtr;
- while (curSize + clusterSize <= size)
+ if(!fRecoParam)
{
- // HLTDebug(" fX = %f; fY = %f; fZ = %f", curCluster->fX, curCluster->fY, curCluster->fZ);
-
- AliTRDcluster* curTRDCluster = new((*outArray)[i]) AliTRDcluster();
- curCluster->ExportTRDCluster(curTRDCluster);
- // HLTDebug(" fX = %f; fY = %f; fZ = %f", curTRDCluster->GetX(), curTRDCluster->GetY(), curTRDCluster->GetZ());
- curSize += clusterSize;
- i++;
- curCluster++;
- //cout << " current readed size is " << curSize << "/" << size << endl;
+ HLTError("No reco params initialized. Sniffing big trouble!");
+ return -EINVAL;
}
+
+ switch(fPIDmethod){
+ case 0: fRecoParam->SetPIDNeuralNetwork(kFALSE); break;
+ case 1: fRecoParam->SetPIDNeuralNetwork(kTRUE); break;
+ case 2: fRecoParam->SetPIDNeuralNetwork(kFALSE); break;
+ }
+
+ fRecoParam->SetImproveTracklets(fImproveTracklets);
+
+ fRecoParam->SetStreamLevel(AliTRDrecoParam::kTracker, 0);
+ fReconstructor->SetRecoParam(fRecoParam);
+
+ TString recoOptions="sa,!cw";
- return i;
+ if(fHLTflag)
+ recoOptions += ",hlt";
+
+ HLTDebug("Reconstructor options are: %s",recoOptions.Data());
+ fReconstructor->SetOption(recoOptions.Data());
+
+ return iResult;
}
-/**
- * Transport tracks to the next component
- * Return Numbers of bytes written to the output
- */
-//============================================================================
-AliHLTUInt32_t AliHLTTRDTrackerV1Component::TransportTracks(TClonesArray *inTracksArray, AliHLTUInt8_t* output,
- vector<AliHLTComponent_BlockData>& outputBlocks, AliHLTUInt32_t inOffset, AliHLTUInt32_t inSpec)
-{
- Int_t nbTracks=inTracksArray->GetEntriesFast();
- if (nbTracks>0)
- {
- HLTDebug("We have an output array: pointer to inTracksArray = 0x%x, nbEntries = %i", inTracksArray, nbTracks);
- if (fUseHLTTracks){
- // Using low-level interface
- // with interface classes
- AliHLTUInt32_t addedSize = AddToOutput(inTracksArray, output);
-
- // Fill block
- AliHLTComponentBlockData bd;
- FillBlockData( bd );
- bd.fPtr = output;
- bd.fOffset = inOffset;
- bd.fSize = addedSize;
- bd.fSpecification = inSpec;
- bd.fDataType = AliHLTTRDDefinitions::fgkTRDSATracksDataType;
- outputBlocks.push_back( bd );
- HLTDebug("BD fPtr 0x%x, fOffset %i, fSize %i, fSpec 0x%x", bd.fPtr, bd.fOffset, bd.fSize, bd.fSpecification);
-
- return addedSize;
- }
- else{
- inTracksArray->BypassStreamer(kFALSE);
- PushBack(inTracksArray, AliHLTTRDDefinitions::fgkTRDSATracksDataType);
- return 0;
+int AliHLTTRDTrackerV1Component::Reconfigure(const char* cdbEntry, const char* chainId)
+{
+ // see header file for class documentation
+
+ int iResult=0;
+ const char* path="HLT/ConfigTRD/TrackerV1Component";
+ const char* defaultNotify="";
+ if (cdbEntry) {
+ path=cdbEntry;
+ defaultNotify=" (default)";
+ }
+ if (path) {
+ HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
+ AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
+ 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());
+ } else {
+ HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
}
-
+ } else {
+ HLTError("cannot fetch object \"%s\" from CDB", path);
}
- return 0;
+ }
+
+ return iResult;
+
+}
+
+int AliHLTTRDTrackerV1Component::ReadPreprocessorValues(const char* modules)
+{
+ // see header file for class documentation
+ int iResult = 0;
+ TString str(modules);
+ if(str.Contains("HLT") || str.Contains("TRD") || str.Contains("GRP")){
+
+ }
+ return iResult;
+}
+
+void AliHLTTRDTrackerV1Component::GetOCDBObjectDescription(TMap* const targetMap){
+ // Get a list of OCDB object description needed for the particular component
+ if (!targetMap) return;
+ targetMap->Add(new TObjString("HLT/ConfigTRD/TrackerV1Component"), new TObjString("component arguments"));
+ targetMap->Add(new TObjString("TRD/Calib/ChamberGainFactor"), new TObjString("gain factor of chambers"));
+ targetMap->Add(new TObjString("TRD/Calib/ChamberT0"), new TObjString("T0 of chambers"));
+ targetMap->Add(new TObjString("TRD/Calib/ChamberVdrift"), new TObjString("drift velocity of chambers"));
+ targetMap->Add(new TObjString("TRD/Calib/DetNoise"), new TObjString("noise of chambers"));
+ targetMap->Add(new TObjString("TRD/Calib/LocalGainFactor"), new TObjString("per pad gain factor"));
+ targetMap->Add(new TObjString("TRD/Calib/LocalT0"), new TObjString("per pad T0"));
+ targetMap->Add(new TObjString("TRD/Calib/LocalVdrift"), new TObjString("per pad drift velocity"));
+ targetMap->Add(new TObjString("TRD/Calib/PadNoise"), new TObjString("per pad noise"));
+ targetMap->Add(new TObjString("TRD/Calib/PadStatus"), new TObjString("pad status"));
+ targetMap->Add(new TObjString("TRD/Calib/PRFWidth"), new TObjString("pad response function"));
+ targetMap->Add(new TObjString("TRD/Calib/ChamberStatus"), new TObjString("status of chambers"));
+ targetMap->Add(new TObjString("TRD/Calib/PIDLQ"), new TObjString("likelyhood PID"));
+ targetMap->Add(new TObjString("TRD/Calib/PIDNN"), new TObjString("neuronal network PID"));
+ targetMap->Add(new TObjString("TRD/Calib/PIDThresholds"), new TObjString("threshold for PID"));
}