added new PhosClusterEnergy trigger component (Svein)
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 Aug 2009 14:37:16 +0000 (14:37 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 Aug 2009 14:37:16 +0000 (14:37 +0000)
HLT/CMake_libAliHLTTrigger.txt
HLT/libAliHLTTrigger.pkg
HLT/trigger/AliHLTTriggerAgent.cxx
HLT/trigger/AliHLTTriggerLinkDef.h
HLT/trigger/AliHLTTriggerPhosClusterEnergy.cxx [new file with mode: 0644]
HLT/trigger/AliHLTTriggerPhosClusterEnergy.h [new file with mode: 0644]
HLT/trigger/test/testPhosClusterEnergyTrigger.C [new file with mode: 0644]

index 07618c6..732e2a6 100644 (file)
@@ -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
index 447c25e..3f67b70 100644 (file)
@@ -21,7 +21,8 @@ CLASS_HDRS:= \
                 AliHLTRunSummary.h                          \
                 AliHLTRunSummaryProducerComponent.h         \
                 AliHLTTriggerSelectiveReadoutComponent.h    \
-                AliHLTTriggerMonitoringComponent.h
+                AliHLTTriggerMonitoringComponent.h          \
+               AliHLTTriggerPhosClusterEnergy.h            
 
 
 # library sources
index 4a168f9..c359720 100644 (file)
@@ -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;
 }
 
index 9429774..0fc9a35 100644 (file)
@@ -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 (file)
index 0000000..856df68
--- /dev/null
@@ -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 <svein.lindal@gmail.com>                 *
+//*                  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 <slindal@fys.uio.no>
+/// @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<AliESDEvent*>(const_cast<TObject*>(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 (file)
index 0000000..0237d37
--- /dev/null
@@ -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
+ *
+ * <h2>General properties:</h2>
+ *
+ * Component ID: \b PhosClusterEnergyTrigger                             <br>
+ * Library: \b libAliHLTTrigger.so                                        <br>
+ * Input Data Types:  kAliHLTDataTypeESDObject, kAliHLTDataTypeESDTree    <br>
+ * Output Data Types: ::kAliHLTAnyDataType                                <br>
+ *
+ * <h2>Mandatory arguments:</h2>
+ * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
+ *
+ * <h2>Optional arguments:</h2>
+ * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
+ *
+ * <h2>Configuration:</h2>
+ * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
+ * \li -energy     <i> e   </i> <br>
+ *      required energy of the cluster
+ *
+ * By default, configuration is loaded from OCDB, can be overridden by
+ * component arguments.
+ *
+ * <h2>Default CDB entries:</h2>
+ * HLT/ConfigHLT/PhosClusterEnergyTrigger: TObjString storing the arguments
+ *
+ * <h2>Performance:</h2>
+ * 
+ *
+ * <h2>Memory consumption:</h2>
+ * 
+ *
+ * <h2>Output size:</h2>
+ * 
+ *
+ * \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 (file)
index 0000000..37e6510
--- /dev/null
@@ -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<AliHLTTriggerDecision*>(file.Get("PhosClusterEnergyTrigger;1"));
+  AliHLTTriggerDecision* decision2 = dynamic_cast<AliHLTTriggerDecision*>(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__