From 765d85f8a1031486e318dde484ceaac182118d56 Mon Sep 17 00:00:00 2001 From: richterm Date: Mon, 17 Aug 2009 14:37:16 +0000 Subject: [PATCH 1/1] added new PhosClusterEnergy trigger component (Svein) --- HLT/CMake_libAliHLTTrigger.txt | 3 + HLT/libAliHLTTrigger.pkg | 3 +- HLT/trigger/AliHLTTriggerAgent.cxx | 2 + HLT/trigger/AliHLTTriggerLinkDef.h | 1 + .../AliHLTTriggerPhosClusterEnergy.cxx | 171 ++++++++++++++++++ HLT/trigger/AliHLTTriggerPhosClusterEnergy.h | 106 +++++++++++ .../test/testPhosClusterEnergyTrigger.C | 100 ++++++++++ 7 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 HLT/trigger/AliHLTTriggerPhosClusterEnergy.cxx create mode 100644 HLT/trigger/AliHLTTriggerPhosClusterEnergy.h create mode 100644 HLT/trigger/test/testPhosClusterEnergyTrigger.C diff --git a/HLT/CMake_libAliHLTTrigger.txt b/HLT/CMake_libAliHLTTrigger.txt index 07618c6bd49..732e2a6b6d6 100644 --- a/HLT/CMake_libAliHLTTrigger.txt +++ b/HLT/CMake_libAliHLTTrigger.txt @@ -5,6 +5,8 @@ trigger/AliHLTTrigger.cxx trigger/AliHLTGlobalTrigger.cxx trigger/AliHLTGlobalTriggerConfig.cxx trigger/AliHLTGlobalTriggerComponent.cxx +trigger/AliHLTTriggerBarrelMultiplicity.cxx +trigger/AliHLTTriggerBarrelCosmic.cxx trigger/AliHLTTriggerAgent.cxx trigger/AliHLTEventSummary.cxx trigger/AliHLTEventSummaryProducerComponent.cxx @@ -12,6 +14,7 @@ trigger/AliHLTRunSummary.cxx trigger/AliHLTRunSummaryProducerComponent.cxx trigger/AliHLTTriggerSelectiveReadoutComponent.cxx trigger/AliHLTTriggerMonitoringComponent.cxx +trigger/AliHLTTriggerPhosClusterEnergy.cxx ) # fill list of header files from list of source files diff --git a/HLT/libAliHLTTrigger.pkg b/HLT/libAliHLTTrigger.pkg index 447c25e9367..3f67b703da9 100644 --- a/HLT/libAliHLTTrigger.pkg +++ b/HLT/libAliHLTTrigger.pkg @@ -21,7 +21,8 @@ CLASS_HDRS:= \ AliHLTRunSummary.h \ AliHLTRunSummaryProducerComponent.h \ AliHLTTriggerSelectiveReadoutComponent.h \ - AliHLTTriggerMonitoringComponent.h + AliHLTTriggerMonitoringComponent.h \ + AliHLTTriggerPhosClusterEnergy.h # library sources diff --git a/HLT/trigger/AliHLTTriggerAgent.cxx b/HLT/trigger/AliHLTTriggerAgent.cxx index 4a168f96596..c35972025bf 100644 --- a/HLT/trigger/AliHLTTriggerAgent.cxx +++ b/HLT/trigger/AliHLTTriggerAgent.cxx @@ -38,6 +38,7 @@ #include "AliHLTTriggerBarrelMultiplicity.h" #include "AliHLTTriggerBarrelCosmic.h" #include "AliHLTGlobalTriggerComponent.h" +#include "AliHLTTriggerPhosClusterEnergy.h" /** global instance for agent registration */ AliHLTTriggerAgent gAliHLTTriggerAgent; @@ -69,6 +70,7 @@ int AliHLTTriggerAgent::RegisterComponents(AliHLTComponentHandler* pHandler) con pHandler->AddComponent(new AliHLTGlobalTriggerComponent); pHandler->AddComponent(new AliHLTTriggerBarrelMultiplicity); pHandler->AddComponent(new AliHLTTriggerBarrelCosmic); + pHandler->AddComponent(new AliHLTTriggerPhosClusterEnergy); return 0; } diff --git a/HLT/trigger/AliHLTTriggerLinkDef.h b/HLT/trigger/AliHLTTriggerLinkDef.h index 94297742344..0fc9a35d12a 100644 --- a/HLT/trigger/AliHLTTriggerLinkDef.h +++ b/HLT/trigger/AliHLTTriggerLinkDef.h @@ -16,4 +16,5 @@ #pragma link C++ class AliHLTRunSummaryProducerComponent+; #pragma link C++ class AliHLTTriggerSelectiveReadoutComponent+; #pragma link C++ class AliHLTTriggerMonitoringComponent+; +#pragma link C++ class AliHLTTriggerPhosClusterEnergy+; #endif diff --git a/HLT/trigger/AliHLTTriggerPhosClusterEnergy.cxx b/HLT/trigger/AliHLTTriggerPhosClusterEnergy.cxx new file mode 100644 index 00000000000..856df682a91 --- /dev/null +++ b/HLT/trigger/AliHLTTriggerPhosClusterEnergy.cxx @@ -0,0 +1,171 @@ +// $Id$ +//************************************************************************** +//* This file is property of and copyright by the ALICE HLT Project * +//* ALICE Experiment at CERN, All rights reserved. * +//* * +//* Primary Authors: Svein Lindal * +//* 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 AliHLTTriggerPhosClusterEnergy.cxx +/// @author Svein Lindal +/// @date 2009-08-17 +/// @brief HLT energy threshold trigger for PHOS +/// + +// see header file for class documentation +// or +// refer to README to build package +// or +// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt + + +#include "AliHLTTriggerPhosClusterEnergy.h" +#include "AliESDEvent.h" +#include "AliESDCaloCluster.h" +#include "AliHLTTriggerDecision.h" +#include "AliHLTDomainEntry.h" + +/** ROOT macro for the implementation of ROOT specific class methods */ +ClassImp(AliHLTTriggerPhosClusterEnergy) + +AliHLTTriggerPhosClusterEnergy::AliHLTTriggerPhosClusterEnergy() + : AliHLTTrigger() + , fEThreshold(0.0) +{ + // see header file for class documentation + // or + // refer to README to build package + // or + // visit http://web.ift.uib.no/~kjeks/doc/alice-hlts +} + +const char* AliHLTTriggerPhosClusterEnergy::fgkOCDBEntry="HLT/ConfigHLT/PhosClusterEnergyTrigger"; + +AliHLTTriggerPhosClusterEnergy::~AliHLTTriggerPhosClusterEnergy() +{ + // see header file for class documentation +} + +const char* AliHLTTriggerPhosClusterEnergy::GetTriggerName() const +{ + // see header file for class documentation + return "PhosClusterEnergyTrigger"; +} + +AliHLTComponent* AliHLTTriggerPhosClusterEnergy::Spawn() +{ + // see header file for class documentation + return new AliHLTTriggerPhosClusterEnergy; +} + +int AliHLTTriggerPhosClusterEnergy::DoTrigger() +{ + // see header file for class documentation + + TString description; + + const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent"); + AliESDEvent* esd = dynamic_cast(const_cast(obj)); + + if (esd != NULL) { + esd->GetStdContent(); + + //Loop over Calorimeter clusters + Int_t ncc = esd->GetNumberOfCaloClusters(); + for (Int_t i = 0; i < ncc ; i++) { + AliESDCaloCluster * cluster = esd->GetCaloCluster(i); + + // Trigger condition: PHOS clusters with energy > fEThreshold + if (cluster->IsPHOS() && cluster->E() > fEThreshold) { + description.Form("Event contains at least one PHOS cluster with energy > %.02f GeV.", fEThreshold); + SetDescription(description.Data()); + + // Enable the detectors for readout. + GetReadoutList().Enable( AliHLTReadoutList::kPHOS ); + + // Add the available HLT information for readout too. + GetTriggerDomain().Add(kAliHLTAnyDataTypeID, "PHOS"); + + //Set trigger decision + TriggerEvent(true); + + return 0; + } + } + } + + // If we got to this point then we did not find any tracks with E > fEThreshold + // generate negative trigger decision + description.Form("No PHOS clusters containing energy > %.02f GeV found.", fEThreshold); + SetDescription(description.Data()); + TriggerEvent(false); + return 0; +} + +int AliHLTTriggerPhosClusterEnergy::DoInit(int argc, const char** argv) { + // see header file for class documentation + + // first configure the default + int iResult=ConfigureFromCDBTObjString(fgkOCDBEntry); + + // configure from the command line parameters if specified + if (iResult>=0 && argc>0) { + iResult=ConfigureFromArgumentString(argc, argv); + HLTImportant("Trigger threshold set from argument string: %.02f GeV:", fEThreshold ); + } else if ( iResult >=0 ) { + HLTImportant("Trigger threshold set from OCDB database entry: %.02f GeV:", fEThreshold ); + } + return iResult; +} + +int AliHLTTriggerPhosClusterEnergy::DoDeinit() +{ + // see header file for class documentation + return 0; +} + +int AliHLTTriggerPhosClusterEnergy::Reconfigure(const char* cdbEntry, const char* /*chainId*/) +{ + // see header file for class documentation + + // configure from the specified antry or the default one + const char* entry=cdbEntry; + if (!entry || entry[0]==0) entry=fgkOCDBEntry; + + return ConfigureFromCDBTObjString(entry); +} + +int AliHLTTriggerPhosClusterEnergy::ScanConfigurationArgument(int argc, const char** argv) +{ + // see header file for class documentation + if (argc<=0) return 0; + int i=0; + TString argument=argv[i]; + + // -maxpt + if (argument.CompareTo("-energy")==0) { + if (++i>=argc) return -EPROTO; + argument=argv[i]; + fEThreshold=argument.Atof(); + return 2; + } + + // unknown argument + return -EINVAL; +} + +void AliHLTTriggerPhosClusterEnergy::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier) +{ + // see header file for class documentation + constBase = sizeof(AliHLTTriggerDecision) + sizeof(AliHLTDomainEntry)*14; + inputMultiplier = 1; +} diff --git a/HLT/trigger/AliHLTTriggerPhosClusterEnergy.h b/HLT/trigger/AliHLTTriggerPhosClusterEnergy.h new file mode 100644 index 00000000000..0237d3760a9 --- /dev/null +++ b/HLT/trigger/AliHLTTriggerPhosClusterEnergy.h @@ -0,0 +1,106 @@ +//-*- Mode: C++ -*- +// $Id$ +#ifndef ALIHLTTRIGGERPHOSCLUSTERENERGY_H +#define ALIHLTTRIGGERPHOSCLUSTERENERGY_H +//* This file is property of and copyright by the ALICE HLT Project * +//* ALICE Experiment at CERN, All rights reserved. * +//* See cxx source for full Copyright notice * + +/// @file AliHLTTriggerPhosClusterEnergy.h +/// @author Svein Lindal +/// @date 2009-08-17 +/// @brief HLT energy threshold trigger for PHOS + +#include "AliHLTTrigger.h" + + +class AliESDtrack; + +/** + * @class AliHLTTriggerPhosClusterEnergy + * HLT trigger component for high energy clusters in PHOS + * + * Triggers on PHOS clusters containing energy > threshold value. + * Configurable through database entry or from command line using "-energy" option + * + *

General properties:

+ * + * Component ID: \b PhosClusterEnergyTrigger
+ * Library: \b libAliHLTTrigger.so
+ * Input Data Types: kAliHLTDataTypeESDObject, kAliHLTDataTypeESDTree
+ * Output Data Types: ::kAliHLTAnyDataType
+ * + *

Mandatory arguments:

+ * + * + *

Optional arguments:

+ * + * + *

Configuration:

+ * + * \li -energy e
+ * required energy of the cluster + * + * By default, configuration is loaded from OCDB, can be overridden by + * component arguments. + * + *

Default CDB entries:

+ * HLT/ConfigHLT/PhosClusterEnergyTrigger: TObjString storing the arguments + * + *

Performance:

+ * + * + *

Memory consumption:

+ * + * + *

Output size:

+ * + * + * \ingroup alihlt_trigger_components + */ + +class AliHLTTriggerPhosClusterEnergy : public AliHLTTrigger +{ +public: + AliHLTTriggerPhosClusterEnergy(); + ~AliHLTTriggerPhosClusterEnergy(); + + + /// inherited from AliHLTTrigger: name of this trigger + virtual const char* GetTriggerName() const; + /// inherited from AliHLTComponent: create an instance + virtual AliHLTComponent* Spawn(); + + protected: + /// inherited from AliHLTComponent: handle the initialization + int DoInit(int argc, const char** argv); + + /// inherited from AliHLTComponent: handle cleanup + int DoDeinit(); + + /// inherited from AliHLTComponent: handle re-configuration event + int Reconfigure(const char* cdbEntry, const char* chainId); + + /// inherited from AliHLTComponent, scan one argument and + /// its parameters + int ScanConfigurationArgument(int argc, const char** argv); + + /// inherited from AliHLTComponent + // Get a ratio by how much the data volume is shrunken or enhanced. + virtual void GetOutputDataSize(unsigned long& constBase, double& inputMultiplier); + +private: + + /// inherited from AliHLTTrigger: calculate the trigger + virtual int DoTrigger(); + + /// Threshold cluster energy to trigger on + float fEThreshold; + + /// the default configuration entry for this component + static const char* fgkOCDBEntry; //!transient + + ClassDef(AliHLTTriggerPhosClusterEnergy, 0) +}; + +#endif //ALIHLTTRIGGERPHOSCLUSTERENERGY_H diff --git a/HLT/trigger/test/testPhosClusterEnergyTrigger.C b/HLT/trigger/test/testPhosClusterEnergyTrigger.C new file mode 100644 index 00000000000..37e6510f9be --- /dev/null +++ b/HLT/trigger/test/testPhosClusterEnergyTrigger.C @@ -0,0 +1,100 @@ +#if !defined(__CINT__) || defined(__MAKECINT__) +#include "Riostream.h" +#include "TFile.h" +#include "TSystem.h" +#include "TRandom3.h" +#include "TMath.h" +#include "TParticle.h" +#include "AliESDEvent.h" +#include "AliESDtrack.h" +#include "AliHLTSystem.h" +#include "AliHLTConfiguration.h" +#include "AliHLTTriggerDecision.h" + +#include "AliESDCaloCluster.h" +#endif + +void CreateInput(const char* filename, Int_t numOfTracks, Double_t minPt, Double_t maxPt) +{ + gRandom->SetSeed(123); + TFile* file = new TFile(filename, "RECREATE"); + AliESDEvent event; + event.CreateStdContent(); + + AliESDCaloCluster cluster; + cluster = new AliESDCaloCluster(); + + Double_t et = gRandom->Rndm() * (maxPt - minPt) + minPt; + + cluster.SetE(et); + cluster.SetClusterType(AliESDCaloCluster::kPHOSCluster); + //cluster.SetClusterType(nuOfmTracks); + + event.AddCaloCluster(&cluster); + event.SetFirstPHOSCluster(0); + + event.Write(); + delete file; +} + +bool CheckIfOutputIsOk() +{ + const char* filename = "PhosClusterEnergyTriggerTestOutput.root"; + TFile file(filename, "READ"); + AliHLTTriggerDecision* decision1 = dynamic_cast(file.Get("PhosClusterEnergyTrigger;1")); + AliHLTTriggerDecision* decision2 = dynamic_cast(file.Get("PhosClusterEnergyTrigger;2")); + if (decision1 == NULL) + { + cerr << "ERROR: 'PhosClusterEnergyTrigger;1' AliHLTTriggerDecision object not found in file " << filename << endl; + return false; + } + if (decision2 == NULL) + { + cerr << "ERROR: 'PhosClusterEnergyTrigger;2' AliHLTTriggerDecision object not found in file " << filename << endl; + return false; + } + cout << "============================== Decision 1 ==============================" << endl; + decision1->Print(); + if (decision1->Result() != 0) + { + cout << "FAILED result check. Expected a result of 0 for trigger decision 1 but received: " << decision1->Result() << endl; + return false; + } + cout << "============================== Decision 2 ==============================" << endl; + decision2->Print(); + if (decision2->Result() != 1) + { + cout << "FAILED result check. Expected a result of 1 for trigger decision 2 but received: " << decision2->Result() << endl; + return false; + } + + return true; +} + +bool testPhosClusterEnergyTrigger() +{ + AliCDBManager * man = AliCDBManager::Instance(); + man->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); + man->SetRun(0); + gSystem->Load("libAliHLTTrigger.so"); + CreateInput("PhosClusterEnergyTriggerTestInput1.root", -2, 0.1, 1.99); + CreateInput("PhosClusterEnergyTriggerTestInput2.root", 0, 2.1, 4.0); + AliHLTSystem sys; + sys.LoadComponentLibraries("libAliHLTUtil.so"); + sys.LoadComponentLibraries("libAliHLTTrigger.so"); + const char* cmdline = " -datatype ROOTTOBJ 'HLT ' -datafile PhosClusterEnergyTriggerTestInput1.root -nextevent -datafile PhosClusterEnergyTriggerTestInput2.root"; + AliHLTConfiguration pub("pub", "ROOTFilePublisher", NULL, cmdline); + AliHLTConfiguration proc("proc", "PhosClusterEnergyTrigger", "pub", "-energy 2"); + AliHLTConfiguration sink("sink", "ROOTFileWriter", "proc", "-datafile PhosClusterEnergyTriggerTestOutput.root -concatenate-events"); + sys.BuildTaskList("sink"); + sys.Run(2); + return CheckIfOutputIsOk(); +} +#ifndef __MAKECINT__ +int main(int /*argc*/, const char** /*argv*/) +{ + bool resultOk = testPhosClusterEnergyTrigger(); + if (not resultOk) return 1; + return 0; +} +#endif // __MAKECINT__ -- 2.39.3