* Added Component "AliHLTMCGeneratorComponent" -> Creates Pthyias events in HLT aliro...
authorjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 30 May 2009 16:50:55 +0000 (16:50 +0000)
committerjthaeder <jthaeder@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 30 May 2009 16:50:55 +0000 (16:50 +0000)
* Updated Agent with new component
* Added Container Class AliHLTJets -> Holding a TClonesArray of AliAODJets
* Updated AliHLTMCEvent to hold Generated Jets in form of a TClonesArray of AliAODJets, tbc in next revsion

HLT/BASE/util/AliHLTAgentUtil.cxx
HLT/BASE/util/AliHLTESDMCEventPublisherComponent.cxx
HLT/BASE/util/AliHLTJets.cxx [new file with mode: 0644]
HLT/BASE/util/AliHLTJets.h [new file with mode: 0644]
HLT/BASE/util/AliHLTMCEvent.cxx
HLT/BASE/util/AliHLTMCEvent.h
HLT/BASE/util/AliHLTMCGeneratorComponent.cxx [new file with mode: 0644]
HLT/BASE/util/AliHLTMCGeneratorComponent.h [new file with mode: 0644]
HLT/libAliHLTUtil.pkg

index 0c4ef4d..f81dbb5 100644 (file)
@@ -34,6 +34,7 @@
 #include "AliHLTRootFileStreamerComponent.h"
 #include "AliHLTRootFileWriterComponent.h"
 #include "AliHLTRootFilePublisherComponent.h"
+#include "AliHLTMCGeneratorComponent.h"
 #include "AliHLTESDMCEventPublisherComponent.h"
 #include "AliHLTFileWriter.h"
 #include "AliHLTFilePublisher.h"
@@ -113,6 +114,7 @@ int AliHLTAgentUtil::RegisterComponents(AliHLTComponentHandler* pHandler) const
   pHandler->AddComponent(new AliHLTRootFileStreamerComponent);
   pHandler->AddComponent(new AliHLTRootFileWriterComponent);
   pHandler->AddComponent(new AliHLTRootFilePublisherComponent);
+  pHandler->AddComponent(new AliHLTMCGeneratorComponent);
   pHandler->AddComponent(new AliHLTESDMCEventPublisherComponent);
   pHandler->AddComponent(new AliHLTFileWriter);
   pHandler->AddComponent(new AliHLTFilePublisher);
index 794e9e9..b63b1e3 100644 (file)
@@ -216,7 +216,7 @@ Int_t AliHLTESDMCEventPublisherComponent::DoInit(int argc, const char** argv) {
   if ( fPublishHLTESD )
     fMaxSize += sizeof(AliESDEvent);
   if ( fPublishMC )
-    fMaxSize += sizeof(AliMCEvent) + 15000;
+    fMaxSize += sizeof(AliMCEvent) + 20000;
   
   if ( fEvents.GetSize() == 0) {
     HLTError("No Files have been added.");
@@ -471,9 +471,9 @@ Int_t AliHLTESDMCEventPublisherComponent::GetEvent( const AliHLTComponentEventDa
       if ( iResult>=0 && fpMC ) {
        PushBack( fpMC, kAliHLTDataTypeMCObject|kAliHLTDataOriginOffline , fSpecification ); 
 
-       fpHLTMC = new AliHLTMCEvent(fpMC);
+       fpHLTMC = new AliHLTMCEvent();
        
-       if ( fpHLTMC )
+       if ( !(iResult=fpHLTMC->FillMCEvent(fpMC)) )
          PushBack( fpHLTMC, kAliHLTDataTypeMCObject|kAliHLTDataOriginHLT , fSpecification ); 
       }
 
diff --git a/HLT/BASE/util/AliHLTJets.cxx b/HLT/BASE/util/AliHLTJets.cxx
new file mode 100644 (file)
index 0000000..fb1ae40
--- /dev/null
@@ -0,0 +1,166 @@
+//-*- Mode: C++ -*-
+// $Id: AliHLTJets.cxx  $
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//*                                                                        *
+//* Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
+//*                  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   AliHLTJets.h
+    @author Jochen Thaeder
+    @date   
+    @brief  Container holding produced Jets
+*/
+
+// see header file for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#if __GNUC__>= 3
+   using namespace std;
+#endif
+
+#include "TLorentzVector.h"
+
+#include "AliHLTJets.h"
+
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp(AliHLTJets)
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                            Constructor / Destructor
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+AliHLTJets::AliHLTJets() :
+  fComment(""),
+  fCurrentJetIndex(-1),
+  fNAODJets(0),
+  fAODJets(new TClonesArray( "AliAODJet", 50 )) {
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+  
+}
+
+//##################################################################################
+AliHLTJets::~AliHLTJets() {
+  // see header file for class documentation
+
+  if ( fAODJets ){
+    fAODJets->Clear();
+    delete fAODJets;
+  }
+  fAODJets = NULL;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                                   Initialize / Reset
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+void AliHLTJets::Reset() {
+  // see header file for class documentation  
+
+  fAODJets->Clear();
+  fNAODJets = 0;
+
+  return;
+}
+
+// #################################################################################
+void AliHLTJets::ResetEvent() {
+  // see header file for class documentation
+
+  fCurrentJetIndex = -1; 
+  
+  return;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                                     Getter
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+AliAODJet* AliHLTJets::GetJet( Int_t iter ) const { 
+  // see header file for class documentation
+  
+  if ( iter > fNAODJets )
+    return NULL;
+  else
+    return reinterpret_cast<AliAODJet*>((*fAODJets)[iter]); 
+}
+
+//##################################################################################
+AliAODJet* AliHLTJets::NextJet() { 
+  // see header file for class documentation
+  
+  fCurrentJetIndex++;
+  return GetJet( fCurrentJetIndex );
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                                     Setter
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+void AliHLTJets::AddJet( Float_t eta, Float_t phi, Float_t pt, Float_t et ) {
+  // see header file for class documentation
+  
+  if ( pt == 0. ) {
+    HLTError("Jet Pt=0, eta=%f, phi=%f", eta, phi);
+    return;
+  }
+
+  // -- create TLorentzVector
+  TLorentzVector v;
+  v.SetPtEtaPhiE( pt, eta, phi, et );
+
+  // -- add AliAODJet
+  new ((*fAODJets)[fNAODJets]) AliAODJet(v);
+  fNAODJets++;
+
+  return;
+}
+
+//##################################################################################
+void AliHLTJets::AddJet( AliAODJet* jet ) {
+  // see header file for class documentation
+
+  if ( jet->Pt() == 0. ) {
+    HLTError("Jet Pt=0, eta=%f, phi=%f", jet->Eta(), jet->Phi());
+    return;
+  }
+
+  // -- create TLorentzVector
+  TLorentzVector v;
+  v.SetPtEtaPhiE( jet->Pt(), jet->Eta(), jet->Phi(), jet->E() );
+
+  // -- add AliAODJet
+  new ((*fAODJets)[fNAODJets]) AliAODJet(v);
+  fNAODJets++;
+
+  return;
+}
diff --git a/HLT/BASE/util/AliHLTJets.h b/HLT/BASE/util/AliHLTJets.h
new file mode 100644 (file)
index 0000000..6caf6b2
--- /dev/null
@@ -0,0 +1,156 @@
+//-*- Mode: C++ -*-
+
+// $Id: AliHLTJets.h  $
+
+#ifndef ALIHLTJETS_H
+#define ALIHLTJETS_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   AliHLTJets.h
+    @author Jochen Thaeder
+    @date   
+    @brief  Container holding produced Jets
+*/
+
+// see below for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#include "TClonesArray.h"
+#include "TString.h"
+
+#include "AliAODJet.h"
+
+#include "AliHLTLogging.h"
+
+/**
+ * @class AliHLTJets
+ * This class contains AliAODJets and comments
+ *
+ * @ingroup alihlt_jet
+ */
+
+class AliHLTJets : public TObject, public AliHLTLogging {
+public:
+  
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Constructor / Destructor
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Constructor */
+  AliHLTJets();
+  
+  /** Destructor */
+  ~AliHLTJets();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                                   Initialize / Reset
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Reset output array */
+  void Reset();
+
+  /** Reset output array */
+  void ResetEvent();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                                     Getter
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Get Comment */
+  TString       GetComment()          const { return fComment; }
+  
+  /** Get number of AliAODJets */
+  Int_t         GetNAODJets()         const { return fNAODJets; }
+
+  /** Get ptr to TClonesArray of AliAODJets */
+  TClonesArray* GetAODJets()          const { return fAODJets; }
+
+  /** Get AliAODJet with idx iter */
+  AliAODJet*    GetJet( Int_t iter )  const;
+
+  /** Get next AliAODJet 
+   *  @return Ptr to Jet, NULL if no next jet is present
+   */  
+  AliAODJet*    NextJet();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                                     Setter
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Set Comment
+   * @param   comment  arguments of jet finder
+   */
+  void SetComment( const Char_t* comment ) { fComment = TString(comment); }
+
+  /** Set Comment
+   * @param   comment  arguments of jet finder
+   */
+  void SetComment( TString comment ) { fComment = TString(comment); }
+
+  /** Add Jet to Container 
+   *  @param  eta     Jet eta
+   *  @param  phi     Jet phi
+   *  @param  pt      Jet pt
+   *  @param  et      Jet et
+   */
+  void AddJet( Float_t eta, Float_t phi, Float_t pt, Float_t et );
+
+  /** Add Jet to Container 
+   *  @param  jet     Ptr to AliAODJet
+   */
+  void AddJet( AliAODJet* jet );
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                                     Helper
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Sort Jets with decreasing Et */
+  void Sort();
+
+  ///////////////////////////////////////////////////////////////////////////////////
+  
+ private:
+  /** copy constructor prohibited */
+  AliHLTJets(const AliHLTJets&);
+  
+  /** assignment operator prohibited */
+  AliHLTJets& operator=(const AliHLTJets&);
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                             Members - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** String containing comment */
+  TString          fComment;           // see above 
+
+  /** Current Jet index */
+  Int_t            fCurrentJetIndex;   //! transient
+
+  /** Number of AOD jets */
+  Int_t            fNAODJets;          // see above
+
+  /** Array of AOD jets */
+  TClonesArray    *fAODJets;           // see above
+  
+  ClassDef(AliHLTJets, 1)
+};
+#endif
index 2c3db5e..8b9f700 100644 (file)
 using namespace std;
 #endif
 
+#include "TList.h"
+#include "TParticlePDG.h"
+#include "TDatabasePDG.h"
 
+#include "AliGenCocktailEventHeader.h"
 
 #include "AliHLTMCEvent.h"
-#include "AliStack.h"
-
-#include "TParticlePDG.h"
-#include "TDatabasePDG.h"
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTMCEvent)
@@ -50,52 +50,95 @@ ClassImp(AliHLTMCEvent)
  */
   
 // #################################################################################
-AliHLTMCEvent::AliHLTMCEvent()
-  : 
-  fNParticles(0),
+AliHLTMCEvent::AliHLTMCEvent() : 
   fCurrentParticleIndex(-1),
-  fCurrentParticle(NULL),
-  fStack( new TClonesArray("TParticle", 1000) ) {
+  fNParticles(0),
+  fStack( NULL ),
+  fCurrentGenJetIndex(-1),
+  fNGenJets(0),
+  fGenJets(NULL) {
   // see header file for class documentation
   // or
   // refer to README to build package
   // or
   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
-
 }
 
 // #################################################################################
-AliHLTMCEvent::AliHLTMCEvent( Int_t iNumberTracks)
-  :
-  fNParticles(0),
-  fCurrentParticleIndex(-1),
-  fCurrentParticle(NULL),
-  fStack( new TClonesArray("TParticle", iNumberTracks) ) {
+AliHLTMCEvent::~AliHLTMCEvent() {
   // see header file for class documentation
 
+  if ( fStack ) {
+    fStack->Delete();
+    delete fStack;
+  }
+  fStack = NULL;
+
+  if ( fGenJets ) {
+    fGenJets->Delete();
+    delete fGenJets;
+  }
+  fGenJets = NULL;
 }
 
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                               Setter - public
+ * ---------------------------------------------------------------------------------
+ */
+
 // #################################################################################
-AliHLTMCEvent::AliHLTMCEvent( AliMCEvent *pMCEvent )
-  :
-  fNParticles(0),
-  fCurrentParticleIndex(-1),
-  fCurrentParticle(NULL),
-  fStack(NULL) {
+Int_t AliHLTMCEvent::FillMCEvent( AliStack *stack, AliHeader *header ) {
   // see header file for class documentation
 
-  FillMCEvent( pMCEvent );
+  Int_t iResult = 0;
+
+  if ( stack ) {
+    if ( (iResult = FillMCTracks(stack)) )
+      HLTError("Error filling particles" );
+  }
+  else {
+    HLTError("Error reading stack" );
+    iResult = -2;
+  }
+
+  if ( header ) {
+    AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*> (header->GenEventHeader());
+    if ( pythiaGenHeader ) {
+      if ( (iResult = FillMCJets(pythiaGenHeader)) )
+       HLTError("Error filling jets" );
+    }
+    else {
+      HLTError("Error reading gen header" );
+      iResult = -2;
+    }
+  }
+  else {
+    HLTError("Error reading header" );
+    iResult = -2;
+  }
+    
+  Compress();
+
+  return iResult;;
 }
 
 // #################################################################################
-AliHLTMCEvent::~AliHLTMCEvent() {
+Int_t AliHLTMCEvent::FillMCEvent( AliMCEvent *pMCEvent ) {
   // see header file for class documentation
+  
+  Int_t iResult = 0;
+  
+  if ( (iResult = FillMCTracks(pMCEvent->Stack())) )
+    HLTError("Error filling particles" );
 
-  if ( fStack ) {
-    fStack->Delete();
-    delete fStack;
-  }
-  fStack = NULL;
+  if ( (iResult = FillMCJets(GetPythiaEventHeader(pMCEvent))) )
+    HLTError("Error filling jets" );
+  
+  Compress();
+
+  return iResult;
 }
 
 /*
@@ -122,41 +165,75 @@ TParticle* AliHLTMCEvent::NextParticle() {
   return Particle( fCurrentParticleIndex );
 }
 
+// #################################################################################
+AliAODJet* AliHLTMCEvent::GenJet( Int_t iJet ) const {
+  // see header file for class documentation
+  if ( iJet >= fNGenJets || !fGenJets  )
+    return NULL;
+  return reinterpret_cast<AliAODJet*> ((*fGenJets)[iJet]);
+}
+
+// #################################################################################
+AliAODJet* AliHLTMCEvent:: NextGenJet() {
+  // see header file for class documentation
+
+  fCurrentGenJetIndex++;
+  return GenJet( fCurrentGenJetIndex );
+}
+
 /*
  * ---------------------------------------------------------------------------------
- *                                     Setter
+ *                                    Helper
  * ---------------------------------------------------------------------------------
  */
 
 // #################################################################################
-void AliHLTMCEvent::AddParticle( const TParticle* particle ) {
+void AliHLTMCEvent::Compress() {
   // see header file for class documentation
-  
-  new( (*fStack) [fNParticles] ) TParticle( *particle );
-  fNParticles++;
 
-  return;
+  if (fStack)
+    fStack->Compress();
+  if (fGenJets)
+    fGenJets->Compress();
+}
+
+// #################################################################################
+void AliHLTMCEvent::Reset() {
+  // see header file for class documentation
+
+  fCurrentParticleIndex = -1; 
+  fCurrentGenJetIndex = -1; 
 }
 
+/*
+ * ---------------------------------------------------------------------------------
+ *                               Setter - private
+ * ---------------------------------------------------------------------------------
+ */
+
 // #################################################################################
-void AliHLTMCEvent::FillMCEvent( AliMCEvent *pMCEvent ) {
+Int_t AliHLTMCEvent::FillMCTracks( AliStack* stack ) {
   // see header file for class documentation
   
-  AliStack *stack = pMCEvent->Stack();
+  Int_t iResult = 0;
 
   // -- Create local stack
   if ( stack && stack->GetNtrack() > 0 )
     fStack = new TClonesArray("TParticle", stack->GetNtrack() );
-  else
-    return;
-  
+  else {
+    HLTError( "Error creating local stack" );
+    iResult = -EINPROGRESS;
+  }
+
   // -- Loop over off-line stack and fill local stack
-  for (Int_t iterStack = 0; iterStack < stack->GetNtrack(); iterStack++) {
+  for (Int_t iterStack = 0; iterStack < stack->GetNtrack() && !iResult; iterStack++) {
 
     TParticle *particle = stack->Particle(iterStack);
     if ( !particle) {
-      printf( "Error reading particle %i out of %i \n", iterStack,stack->GetNtrack() );
-      HLTError( "Error reading particle %i out of %i \n", iterStack,stack->GetNtrack() );
+      HLTError( "Error reading particle %i out of %i", iterStack, stack->GetNtrack() );
+      iResult = -EINPROGRESS;
       continue;
     }
 
@@ -167,7 +244,7 @@ void AliHLTMCEvent::FillMCEvent( AliMCEvent *pMCEvent ) {
     // -- primary
     if ( !(stack->IsPhysicalPrimary(iterStack)) )
       continue;
-      
+    
     // -- final state
     if ( particle->GetNDaughters() != 0 )
       continue;
@@ -179,40 +256,113 @@ void AliHLTMCEvent::FillMCEvent( AliMCEvent *pMCEvent ) {
 
       if ( ! particlePDG ) {
        HLTError("Particle %i not in PDG database", particle->GetPdgCode() );
+       iResult = -EINPROGRESS;
        continue;
       }
     }
-  
-    // -- only charged particles
-    //  if ( !(particle->GetPDG()->Charge()) )
-    //continue;
-
+    
     // -- Add particle after cuts
     AddParticle ( particle );
   }
 
-  Compress();
+  return iResult;
+}
+
+// #################################################################################
+void AliHLTMCEvent::AddParticle( const TParticle* particle ) {
+  // see header file for class documentation
+  
+  new( (*fStack) [fNParticles] ) TParticle( *particle );
+  fNParticles++;
 
   return;
 }
 
+// #################################################################################
+Int_t AliHLTMCEvent::FillMCJets( AliGenPythiaEventHeader* header ) {
+  // see header file for class documentation
+
+  Int_t iResult = 0;
+
+  // -- Create jet array
+  if ( header && header->NTriggerJets() > 0 )
+    fGenJets = new TClonesArray("AliAODJet", header->NTriggerJets());
+  else {
+    HLTError( "Error creating trigger array" );
+    iResult = -EINPROGRESS;
+  }
+
+  // -- Loop over jets in header and fill local array
+  for (Int_t iterJet = 0; iterJet < header->NTriggerJets() && !iResult; iterJet++) {
+
+    // -- Add jet
+    AddGenJet(header, iterJet);
+
+  } // for (Int_t iterJet = 0; iterJet < header->NTriggerJets() && !iResult; iterJet++) {
+
+  HLTDebug("Pythia Jets found: %d", fNGenJets );
+  
+  return iResult;
+}
+
 /*
  * ---------------------------------------------------------------------------------
- *                                    Helper
+ *                           Pythia jets - private
  * ---------------------------------------------------------------------------------
  */
 
-// #################################################################################
-void AliHLTMCEvent::Compress() {
+//##################################################################################
+AliGenPythiaEventHeader* AliHLTMCEvent::GetPythiaEventHeader(AliMCEvent *mcEvent) {
   // see header file for class documentation
 
-  fStack->Compress();
+  Int_t iResult = 0;
+
+  AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*> (mcEvent->GenEventHeader());
+
+  if ( !pythiaGenHeader ) {
+
+    // -- is cocktail header
+    AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(mcEvent->GenEventHeader());
+    if ( !genCocktailHeader ) {
+      HLTError("Error: Unknown header type (not Pythia or Cocktail)");
+      iResult = -1;
+    }
+
+    if ( !iResult ) {
+      // -- Get Header
+      TList* headerList = genCocktailHeader->GetHeaders();
+
+      for (Int_t iter = 0; iter < headerList->GetEntries(); iter++ ) {
+       pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(iter));
+       if ( pythiaGenHeader )
+         break;
+      }
+    }  
+  }
+  
+  if ( pythiaGenHeader && !iResult ) 
+    return pythiaGenHeader;
+  else {
+    HLTError("PythiaHeader not found!");
+    return NULL;
+  }
 }
 
-// #################################################################################
-void AliHLTMCEvent::Reset() {
+//##################################################################################
+void AliHLTMCEvent::AddGenJet( AliGenPythiaEventHeader* header, Int_t iterJet ) {
   // see header file for class documentation
 
-  fCurrentParticleIndex = -1; 
-  fCurrentParticle      = NULL;
+  Float_t pJet[] = {0., 0., 0., 0.};          // jet 4-vector ( x y z )
+
+  // -- Get jet
+  header->TriggerJet(iterJet, pJet);
+
+  // -- Create TLorentzVector
+  TLorentzVector v(pJet);
+  
+  // -- Add AliAODJet
+  new( (*fGenJets) [fNGenJets] ) AliAODJet(v);
+  fNGenJets++;
+
+  return;
 }
index 4fcf64f..8a8ef2b 100644 (file)
 #include "TParticle.h"
 #include "TClonesArray.h"
 
-#include "AliHLTLogging.h"
+#include "AliGenPythiaEventHeader.h"
 #include "AliMCEvent.h"
+#include "AliAODJet.h"
+#include "AliStack.h"
+#include "AliHeader.h"
+
+#include "AliHLTLogging.h"
 
 /**
  * @class  AliHLTMCEvent
- * Container class for off-line AliMCEvent, as this class is coupled to 
- * TTrees an can not be easily copied and send via the HLT chain.
+ * Container class for off-line AliMCEvent, as the class AliMCEvent 
+ * is coupled to TTrees and can not be easily copied and send via 
+ * the HLT chain.
  *
  * This class as the complete functionality as the off-line class,
  * only the ones needed so far.
@@ -44,22 +50,31 @@ public:
    *                            Constructor / Destructor
    * ---------------------------------------------------------------------------------
    */
-  
+
   /** standard constructor */
   AliHLTMCEvent();
+  
+  /** destructor */
+  virtual ~AliHLTMCEvent();
 
-  /** constructor 
-   *  @param iNumberTracks number of initial tracks
+  /*
+   * ---------------------------------------------------------------------------------
+   *                               Setter - public
+   * ---------------------------------------------------------------------------------
    */
-  AliHLTMCEvent( Int_t iNumberTracks );
-  /** constructor 
-   *  @param pMCEvent ptr to off-line AliMCEvent
+
+  /** Fill the off-line MC event in to this class
+   *  @param stack  ptr to AliStack
+   *  @param header ptr to AliHeader
+   *  @return 0 on sucess, <0 on error
    */
-  AliHLTMCEvent( AliMCEvent *pMCEvent );
+  Int_t FillMCEvent( AliStack *stack, AliHeader *header );
 
-  /** destructor */
-  virtual ~AliHLTMCEvent();
+  /** Fill the off-line MC event in to this class
+   *  @param pMCEvent ptr to off-line AliMCEvent
+   *  @return 0 on sucess, <0 on error
+   */
+  Int_t FillMCEvent( AliMCEvent *pMCEvent );
 
   /*
    * ---------------------------------------------------------------------------------
@@ -67,6 +82,9 @@ public:
    * ---------------------------------------------------------------------------------
    */
 
+  // -- Particles
+  // --------------
+
   /** Get number of particles
    *  @return number of particles
    */
@@ -88,22 +106,25 @@ public:
    */
   Int_t GetIndex() { return fCurrentParticleIndex; }
 
-  /*
-   * ---------------------------------------------------------------------------------
-   *                                     Setter
-   * ---------------------------------------------------------------------------------
+  // -- Generated jets
+  // -------------------
+
+  /** Get number of generated jets
+   *  @return number of generated jets
    */
-  
-  /** Add a prticle to this container
-   *  @param particle ptr to TParticle classs
+  Int_t GetNumberOfGenJets() const { return fNGenJets; }
+
+  /** Return generated jets at index iJet
+   *  @param iJet Generated jet index in local array
+   *  @return ptr on success, NULL on failure
    */
-  void AddParticle( const TParticle* particle);
+  AliAODJet* GenJet( Int_t iJet ) const;
   
-  /** Fill the off-line MC event in to this class
-   *  @param pMCEvent ptr to off-line AliMCEvent
+  /** Return next generated jet
+   *  @return ptr on success, NULL on failure
    */
-  void FillMCEvent( AliMCEvent *pMCEvent );
-  
+  AliAODJet* NextGenJet() ;
+
   /*
    * ---------------------------------------------------------------------------------
    *                                    Helper
@@ -126,24 +147,83 @@ private:
   /** assignment operator prohibited */
   AliHLTMCEvent& operator= (const AliHLTMCEvent&);
 
+  /*
+   * ---------------------------------------------------------------------------------
+   *                               Setter - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  // -- Particles
+  // --------------
+  /** Fill the particles in into the local stack
+   *  @param stack ptr to off-line AliStack
+   *  @return         0 on sucess, <0 on error
+   */
+  Int_t FillMCTracks( AliStack *stack );
+  
+  /** Add a particle to this container
+   *  @param particle ptr to TParticle classs
+   */
+  void AddParticle( const TParticle* particle);
+  
+  // -- Generated jets
+  // -------------------
+  
+  /** Fill the jets into local array
+   *  @param stack ptr to off-line AliGenPythiaEventHeader
+   *  @return         0 on sucess, <0 on error
+   */
+  Int_t FillMCJets( AliGenPythiaEventHeader* header );
+
+  /** Add a jet to his container 
+   *  @param stack    ptr to off-line AliGenPythiaEventHeader
+   *  @param iterJet  idx of jet in event
+   */
+  void AddGenJet( AliGenPythiaEventHeader* header, Int_t iterJet );
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                           Pythia jets - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** Retrieve pythia event header out of an AliMCEvent 
+   *  @param mcEvent   ptr to AliMCEvent
+   *  @return          ptr on sucess, NULL on error   
+   */
+  AliGenPythiaEventHeader* GetPythiaEventHeader(AliMCEvent *mcEvent);
+
   /*
    * ---------------------------------------------------------------------------------
    *                             Members - private
    * ---------------------------------------------------------------------------------
    */
 
-  /** Number of particles */
-  Int_t           fNParticles;                   // see above
+  // -- Particles
+  // --------------
 
   /** Current particle */
   Int_t           fCurrentParticleIndex;         // see above
 
-  /** Ptr to current particle */
-  TParticle      *fCurrentParticle;              // see above
+  /** Number of particles */
+  Int_t           fNParticles;                   // see above
 
-  /** Stack of particles */
+  /** Stack of particles [TParticle]*/
   TClonesArray   *fStack;                        // see above
 
+  // -- Generated jets
+  // -------------------
+
+  /** Current generated jet */
+  Int_t           fCurrentGenJetIndex;           // see above
+
+  /** Number of generated jets */
+  Int_t           fNGenJets;                     // see above
+  
+  /** Array of generated jets [AliAODJet]*/
+  TClonesArray   *fGenJets;                      // see above
+
   ClassDef(AliHLTMCEvent, 1)
 
 };
diff --git a/HLT/BASE/util/AliHLTMCGeneratorComponent.cxx b/HLT/BASE/util/AliHLTMCGeneratorComponent.cxx
new file mode 100644 (file)
index 0000000..0fd0942
--- /dev/null
@@ -0,0 +1,547 @@
+// -*- Mode: C++ -*-
+// $Id: AliHLTMCGeneratorComponent.cxx  $
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
+ *                                                                        *
+ * Primary Authors: Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
+ *                  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   AliHLTMCGeneratorComponent.cxx
+    @author Jochen Thaeder
+    @date   
+    @brief  Component for generating MC events
+    @note   The class is used in Offline (AliRoot) context
+*/
+
+#include "AliHLTMCGeneratorComponent.h"
+
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <Riostream.h>
+#include <TH1F.h>
+#include <TStopwatch.h>
+#include <TDatime.h>
+#include <TRandom.h>
+#include <TDatabasePDG.h>
+#include <TParticle.h>
+#include <TArrayI.h>
+
+#include "AliGenerator.h"
+#include "AliPDG.h"
+#include "AliRunLoader.h"
+#include "AliRun.h"
+#include "AliStack.h"
+#include "AliHeader.h"
+#include "AliGenPythia.h"
+#include "AliPythia.h"
+#endif
+
+#include "TPythia6Calls.h"
+#include "TPythia6.h"
+
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp(AliHLTMCGeneratorComponent)
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                            Constructor / Destructor
+ * ---------------------------------------------------------------------------------
+ */
+
+// #################################################################################
+AliHLTMCGeneratorComponent::AliHLTMCGeneratorComponent() :  
+  AliHLTDataSource(),
+  fpMC(NULL),
+  fpHLTMC(NULL),
+  fNEvents(0),
+  fCurrentEvent(0),
+  fEventNumber(0),
+  fRunNumber(0),
+  fRunLoader(NULL),
+  fGenerator(NULL),
+  fComment(""),
+  fSeed(0),
+  fRunType(kPythia6Jets104_125),
+  fEcms(14000.),
+  fJetEtaMax(0.2), 
+  fJetEtaMin(-0.2),
+  fJetEtMax(1000.),
+  fJetEtMin(10.0),
+  fJetConeRadius(0.4),
+  fPtHardMin(10.0),
+  fPtHardMax(-1.0),
+  fQuenching(0),                   
+  fQhat(20.) {
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+}
+
+// #################################################################################
+AliHLTMCGeneratorComponent::~AliHLTMCGeneratorComponent() {
+  // see header file for class documentation
+
+  // file list and file name list are owner of their objects and
+  // delete all the objects
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ *                              Initialize static const
+ * ---------------------------------------------------------------------------------
+ */
+
+//##################################################################################
+const Char_t *AliHLTMCGeneratorComponent::fgkPprRunName[] = {
+  "kPythia6Jets20_24",   "kPythia6Jets24_29",   "kPythia6Jets29_35",
+  "kPythia6Jets35_42",   "kPythia6Jets42_50",   "kPythia6Jets50_60",
+  "kPythia6Jets60_72",   "kPythia6Jets72_86",   "kPythia6Jets86_104",
+  "kPythia6Jets104_125", "kPythia6Jets125_150", "kPythia6Jets150_180",
+  "kPyJetJet", "kPyGammaJetPHOS"
+};
+
+/*
+ * ---------------------------------------------------------------------------------
+ * Public functions to implement AliHLTComponent's interface.
+ * These functions are required for the registration process
+ * ---------------------------------------------------------------------------------
+ */
+
+// #################################################################################
+const Char_t* AliHLTMCGeneratorComponent::GetComponentID() {
+  // see header file for class documentation
+  return "MCGenerator";
+}
+
+// #################################################################################
+AliHLTComponentDataType AliHLTMCGeneratorComponent::GetOutputDataType() {
+  // see header file for class documentation
+
+  return kAliHLTDataTypeMCObject|kAliHLTDataOriginHLT;
+}
+
+// #################################################################################
+void AliHLTMCGeneratorComponent::GetOutputDataSize( ULong_t& constBase, Double_t& inputMultiplier ) {
+  // see header file for class documentation
+
+  constBase = 20000;
+  inputMultiplier = 1.0;
+}
+
+// #################################################################################
+AliHLTComponent* AliHLTMCGeneratorComponent::Spawn() {
+  // see header file for class documentation
+  return new AliHLTMCGeneratorComponent;
+}
+
+/*
+ * ---------------------------------------------------------------------------------
+ * Protected functions to implement AliHLTComponent's interface.
+ * These functions provide initialization as well as the actual processing
+ * capabilities of the component. 
+ * ---------------------------------------------------------------------------------
+ */
+
+// #################################################################################
+Int_t AliHLTMCGeneratorComponent::DoInit(int argc, const char** argv) {
+  // see header file for class documentation
+
+  Int_t iResult = 0;
+  Int_t bMissingParam=0;
+  
+  TString argument="";
+
+  // -- Loop over all arguments
+  for ( Int_t iter = 0; iter<argc && iResult>=0; iter++) {
+    argument=argv[iter];
+    if (argument.IsNull()) continue;
+    
+    // -- seed
+    if ( !argument.CompareTo("-seed") ) {
+      if ((bMissingParam=(++iter>=argc))) break;
+      
+      TString parameter(argv[iter]);
+      parameter.Remove(TString::kLeading, ' ');
+
+      if ( parameter.IsDigit() ) {
+       fSeed = parameter.Atoi();
+      }
+      
+      else {
+       HLTError("Wrong parameter %s for argument %s.", parameter.Data(), argument.Data());
+       iResult=-EINVAL;
+      }
+    } 
+
+    // -- runtype
+    else if ( !argument.CompareTo("-runtype") ) {
+      if ((bMissingParam=(++iter>=argc))) break;
+      
+      TString parameter(argv[iter]);
+      parameter.Remove(TString::kLeading, ' ');
+
+      Bool_t found = kFALSE;
+
+      if ( parameter.IsDigit() ) {
+       Int_t idx = parameter.Atoi();
+       if ( idx < kRunMax ) {
+         fRunType = (PprRun_t) idx;
+         found = kTRUE;
+       }
+      }
+      else {
+       for ( Int_t iRun = 0; iRun < kRunMax && !found; iRun++ ) {
+         if ( ! parameter.CompareTo(fgkPprRunName[iRun]) ) {
+           fRunType = (PprRun_t) iRun;  
+           found = kTRUE;
+         }
+       }      
+      }
+      if ( !found ) {
+       HLTError("Wrong parameter %s for argument %s.", parameter.Data(), argument.Data());
+       iResult=-EINVAL;
+      }
+    }
+
+    // -- nevents
+    else if ( !argument.CompareTo("-nevents") ) {
+      if ((bMissingParam=(++iter>=argc))) break;
+      
+      TString parameter(argv[iter]);
+      parameter.Remove(TString::kLeading, ' ');
+
+      if ( parameter.IsDigit() ) {
+       fNEvents = parameter.Atoi();
+      }
+      
+      else {
+       HLTError("Wrong parameter %s for argument %s.", parameter.Data(), argument.Data());
+       iResult=-EINVAL;
+      }
+    } 
+
+    // -- coneRadius
+    else if ( !argument.CompareTo("-coneRadius") ) {
+      if ((bMissingParam=(++iter>=argc))) break;
+      
+      TString parameter(argv[iter]);
+      parameter.Remove(TString::kLeading, ' ');
+      
+      if ( parameter.IsFloat() ) {
+       fJetConeRadius = parameter.Atof();
+      }
+      else {
+       HLTError("Wrong parameter %s for argument %s.", parameter.Data(), argument.Data());
+       iResult=-EINVAL;
+      }
+    } 
+
+    // -- jetCutMinEt
+    else if ( !argument.CompareTo("-jetCutMinEt") ) {
+      if ((bMissingParam=(++iter>=argc))) break;
+      
+      TString parameter(argv[iter]);
+      parameter.Remove(TString::kLeading, ' ');
+      
+      if ( parameter.IsFloat() ) {
+       fJetEtMin = parameter.Atof();
+      }
+      else {
+       HLTError("Wrong parameter %s for argument %s.", parameter.Data(), argument.Data());
+       iResult=-EINVAL;
+      }
+    } 
+
+    // -- Argument not known
+    else {
+      HLTError("Unknown argument %s.", argument.Data());
+      iResult = -EINVAL;
+    }
+    
+  } // for ( Int iter = 0; iter<argc && iResult>=0; iter++) {
+  
+  // -- Check if parameter is missing
+  if ( bMissingParam ) {
+    HLTError("Missing parameter for argument %s.", argument.Data());
+     iResult=-EINVAL;
+  }
+
+  //  -- Check if seed and nevents has been specified
+  if ( !fSeed || !fNEvents ) {
+    HLTError("-seed and -nevents need to be specified.");
+    iResult=-EINVAL;
+  }
+
+  // -- Set Random Number seed
+  gRandom->SetSeed( fSeed );
+
+  // -- Run loader 
+  // ---------------
+  AliPDG::AddParticlesToPdgDataBase();
+
+  fRunLoader = AliRunLoader::Open("galice.root","FASTRUN","recreate");
+  if (fRunLoader == NULL ) {
+    //    gAlice->Fatal("AliHLTMCGeneratorComponent","Can not instatiate the Run Loader");
+    HLTFatal("Can not instatiate the Run Loader");
+    return -EINPROGRESS;
+  }
+
+  fRunLoader->SetCompressionLevel(2);
+  fRunLoader->SetNumberOfEventsPerFile(fNEvents);
+  fRunLoader->LoadKinematics("RECREATE");
+  fRunLoader->MakeTree("E");
+  gAlice->SetRunLoader(fRunLoader); 
+
+  // -- Create stack
+  fRunLoader->MakeStack();
+  // -- Create and Initialize Generator
+  fGenerator = GeneratorFactory();
+  fGenerator->SetStack(fRunLoader->Stack());
+  fGenerator->Init();
+
+  HLTInfo("MC Generator setup with : %s", fComment.Data() );
+
+  return iResult;
+}
+
+// #################################################################################
+Int_t AliHLTMCGeneratorComponent::DoDeinit() {
+  // see header file for class documentation
+
+  if ( fpMC ) 
+    delete fpMC;
+  fpMC = NULL;
+
+  if ( fpHLTMC ) 
+    delete fpHLTMC;
+  fpHLTMC = NULL;
+
+  return 0;
+}
+
+// #################################################################################
+Int_t AliHLTMCGeneratorComponent::GetEvent( const AliHLTComponentEventData& /*evtData*/,
+                                               AliHLTComponentTriggerData& /*trigData*/,
+                                               AliHLTUInt8_t* /*outputPtr*/, 
+                                               AliHLTUInt32_t& size,
+                                               vector<AliHLTComponentBlockData>& /*outputBlocks*/ ) {
+  // see header file for class documentation
+
+  if ( !IsDataEvent() ) 
+    return 0;
+
+  Int_t iResult=0;
+  size=0;
+
+  AliStack*  stack  = fRunLoader->Stack();
+  AliHeader* header = fRunLoader->GetHeader();
+  
+  // -- Initialize event
+  header->Reset(0,fCurrentEvent);
+
+  // -- Reset stack 
+  stack->Reset();
+
+  // -- Generate event
+  fGenerator->Generate();
+    
+  // -- Finish event
+  header->SetNprimary(stack->GetNprimary());
+  header->SetNtrack(stack->GetNtrack());  
+
+  // -- Finish Event   
+  stack->FinishEvent();
+  header->SetStack(stack);
+
+  // -- Create HLT MC Event
+  if ( fpHLTMC ) 
+    delete fpHLTMC;
+  fpHLTMC = new AliHLTMCEvent();
+
+  // -- Fill HLT MC event
+  iResult = fpHLTMC->FillMCEvent( stack, header );
+
+  // -- Send HLT MC event
+  if ( fpHLTMC && !iResult )
+    PushBack( fpHLTMC, kAliHLTDataTypeMCObject|kAliHLTDataOriginHLT, 0 ); 
+
+  fCurrentEvent++;
+
+  return iResult;
+}
+
+// #################################################################################
+AliGenerator* AliHLTMCGeneratorComponent::GeneratorFactory() {
+  
+  // -- Configuration for hard QCD processes generation with PYTHIA 
+  // ----------------------------------------------------------------
+  AliGenPythia * gener = new AliGenPythia(-1);
+
+  gener->SetEnergyCMS(fEcms); // Centre of mass energy
+  gener->SetGluonRadiation(1,1);
+  gener->SetForceDecay(kAll); //  Decay type
+
+  // -- Final state kinematic cuts
+  gener->SetJetEtaRange(fJetEtaMin, fJetEtaMax);
+  gener->SetJetPhiRange(0., 360.);
+  gener->SetJetEtRange(fJetEtMin, fJetEtMax);
+  // gener->SetMomentumRange(0,99999999);
+
+  // -- Structure function
+  gener->SetStrucFunc(kCTEQ4L);
+
+  /************************************************************************
+   * void AliGenPythia::SetPycellParameters()
+   *  Float_t etamax   -- fPycellEtaMax     -- PARU(51) -- +/- eta max of detector
+   *  Int_t neta       -- fPycellNEta       -- MSTU(51) -- N cells in eta
+   *  Int_t nphi       -- fPycellNPhi       -- MSTU(52) -- N cells in phi
+   *  Float_t thresh   -- fPycellThreshold  -- PARU(58) -- cells with Et below treshold are discared
+   *  Float_t etseed   -- fPycellEtSeed     -- PARU(52) -- Et threshold for seed cells
+   *  Float_t minet    -- fPycellMinEtJet   -- PARU(53) -- Min Et for jets
+   *  Float_t r        -- fPycellMaxRadius  -- PARU(54) -- cone radius
+   ************************************************************************/ 
+  gener->SetPycellParameters(fJetEtaMax, 274, 432, 0., 4., fJetEtMin, fJetConeRadius);
+
+  // gener->SetPtKick(5.);      // set the intrinsic kt to 5 GeV/c
+  
+  // -- Jet Quenching
+  gener->SetQuench(fQuenching);
+  if( fQuenching == 1){
+    Float_t k = 6e5*(fQhat/1.7) ; // qhat=1.7, k = 6e5, default  value 
+    AliPythia::Instance()->InitQuenching(0.,0.1,k,0,0.95,6);
+  }
+
+  switch (fRunType) {
+  case kPythia6Jets20_24:
+    {
+      fComment = fComment.Append(":Pythia jets 20-24 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(20., 24.);// Pt transfer of the hard scattering
+      fPtHardMin=20.;
+    }
+    break;
+  case kPythia6Jets24_29:
+    {
+      fComment = fComment.Append(":Pythia jets 24-29 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(24., 29.);// Pt transfer of the hard scattering
+      fPtHardMin=24.;
+    }
+    break;
+  case kPythia6Jets29_35:
+    {
+      fComment = fComment.Append(":Pythia jets 29-35 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(29., 35.);// Pt transfer of the hard scattering
+      fPtHardMin=29.;
+    }
+    break;
+  case kPythia6Jets35_42:
+    {
+      fComment = fComment.Append(":Pythia jets 35-42 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(35., 42.);// Pt transfer of the hard scattering
+      fPtHardMin=35.;
+    }
+    break;
+  case kPythia6Jets42_50:
+    {
+      fComment = fComment.Append(":Pythia jets 42-50 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(42., 50.);// Pt transfer of the hard scattering
+      fPtHardMin=42.;
+    }
+    break;
+  case kPythia6Jets50_60:
+    {
+      fComment = fComment.Append(":Pythia jets 50-60 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(50., 60.);// Pt transfer of the hard scattering
+      fPtHardMin=50.;
+    }
+    break;
+  case kPythia6Jets60_72:
+    {
+      fComment = fComment.Append(":Pythia jets 60-72 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(60., 72.);// Pt transfer of the hard scattering
+      fPtHardMin=60.;
+    }
+    break;
+  case kPythia6Jets72_86:
+    {
+      fComment = fComment.Append(":Pythia jets 72-86 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(72., 86.);// Pt transfer of the hard scattering
+      fPtHardMin=72.;
+    }
+    break;
+  case kPythia6Jets86_104:
+    {
+      fComment = fComment.Append(":Pythia jets 86-104 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(86., 104.);// Pt transfer of the hard scattering
+      fPtHardMin=86.;
+    }
+    break;
+  case kPythia6Jets104_125:
+    {
+      fComment = fComment.Append(":Pythia jets 104-125 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(104., 125.);// Pt transfer of the hard scattering
+      fPtHardMin=104.;
+    }
+    break;
+  case kPythia6Jets125_150:
+    {
+      fComment = fComment.Append(":Pythia jets 125-150 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(125., 150.);// Pt transfer of the hard scattering
+      fPtHardMin=125.;
+    }
+    break;
+  case kPythia6Jets150_180:
+    {
+      fComment = fComment.Append(":Pythia jets 150-180 GeV @ 14 TeV");
+      gener->SetProcess(kPyJets);//        Process type
+      gener->SetPtHard(150., 180.);// Pt transfer of the hard scattering
+      fPtHardMin=150.;
+    }
+    break;
+  case kPyJetJet:
+    {
+      fComment = fComment.Append(" Jet-jet @ 14 TeV");
+      gener->SetProcess(kPyJets); 
+      gener->SetPtHard(fPtHardMin,fPtHardMax);
+      gener->SetEventListRange(0,1);  // XXXX
+    }
+    break;
+  case kPyGammaJetPHOS:
+    {
+      fComment = fComment.Append(" pp->jet + Gamma over PHOS @ 14 TeV");
+      gener->SetProcess(kPyDirectGamma);
+      gener->SetPtHard(fPtHardMin,fPtHardMax);
+      //gener->SetYHard(-1.0,1.0);
+      gener->SetGammaEtaRange(-0.13,0.13);
+      gener->SetGammaPhiRange(218.,322.); //Over 5 modules +-2 deg  
+      gener->SetEventListRange(0,1); // XXXX
+    }
+    break;
+    
+  default: break;
+  }
+  
+  return gener;
+}
diff --git a/HLT/BASE/util/AliHLTMCGeneratorComponent.h b/HLT/BASE/util/AliHLTMCGeneratorComponent.h
new file mode 100644 (file)
index 0000000..c9155e2
--- /dev/null
@@ -0,0 +1,287 @@
+// -*- Mode: C++ -*-
+
+// $Id: AliHLTMCGeneratorComponent.h  $
+
+#ifndef ALIHLTMCGENERATORCOMPONENT_H
+#define ALIHLTMCGENERATORCOMPONENT_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   AliHLTMCGeneratorComponent.h
+    @author Jochen Thaeder <thaeder@kip.uni-heidelberg.de>
+    @date   
+    @brief  Component for generating MC events
+    @note   The class is used in Offline (AliRoot) context
+*/
+
+// see below for class documentation
+// or
+// refer to README to build package
+// or
+// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+
+#include "AliGenerator.h"
+#include "AliRunLoader.h"
+#include "AliMCEvent.h"
+
+#include "AliHLTDataSource.h"
+#include "AliHLTMCEvent.h"
+
+/**
+ * @class AliHLTMCGeneratorComponent
+ * An HLT data source component which simulates PYTHIA events
+ * right now set up for Jet Production, this can be extended by
+ * a person in need.
+ *
+ * The events are pulished in form of AliHLTMCEvent.
+ *
+ * <h2>General properties:</h2>
+ *
+ * Component ID: \b MCGenerator <br>
+ * Library:      \b libAliHLTUtil.so<br>
+ * Input Data Types: none <br>
+ * Output Data Types: kAliHLTDataTypeMCObject|kAliHLTDataOriginHLT<br>
+ *                    <i>AliHLTMCEvent</i><br>
+ *
+ * <h2>Mandatory arguments:</h2>
+ * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
+ * \li -seed         <i> Seed for generation </i> <br>
+ *
+ * \li -runtype      <i> Run type as a string </i> <br>
+ *
+ * \li -nevents      <i> Number of events to generate </i> <br>
+ *
+ * \li -coneRadius   <i> Cone radius for PyCell </i> <br>
+ *
+ * \li -jetCutMinEt  <i> Final state min Et cut for PyCell </i> <br>
+ * 
+ * <h2>Optional arguments:</h2>
+ *
+ * <h2>Configuration:</h2>
+ * <!-- NOTE: ignore the \li. <i> and </i>: it's just doxygen formatting -->
+ * Configuration by component arguments.
+ *
+ * <h2>Default CDB entries:</h2>
+ * The component loads no CDB entries.
+ *
+ * <h2>Performance:</h2>
+ * The component does not process any event data.
+ *
+ * <h2>Memory consumption:</h2>
+ * The component does not process any event data.
+ *
+ * <h2>Output size:</h2>
+ * According to the available data. The component is an AliHLTDataSource
+ * and inteded to be used in the AliHLTSystem framework only. The component
+ * implements the standard AliHLTSystem adaptive buffer allocation. 
+ *
+ * @ingroup alihlt_util_components
+ */
+
+class AliHLTMCGeneratorComponent : public AliHLTDataSource  {
+  
+ public:
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                            Constructor / Destructor
+   * ---------------------------------------------------------------------------------
+   */
+  
+  /** standard constructor */
+  AliHLTMCGeneratorComponent();
+
+  /** destructor */
+  virtual ~AliHLTMCGeneratorComponent();
+  
+  /*
+   * ---------------------------------------------------------------------------------
+   * Public functions to implement AliHLTComponent's interface.
+   * These functions are required for the registration process
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** interface function, see @ref AliHLTComponent for description */
+  const Char_t* GetComponentID();
+
+  /** interface function, see @ref AliHLTComponent for description */
+  AliHLTComponentDataType GetOutputDataType();
+
+  /** interface function, see @ref AliHLTComponent for description */
+  virtual void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
+
+  /** interface function, see @ref AliHLTComponent for description */
+  AliHLTComponent* Spawn();
+
+ protected:
+  /*
+   * ---------------------------------------------------------------------------------
+   * Protected functions to implement AliHLTComponent's interface.
+   * These functions provide initialization as well as the actual processing
+   * capabilities of the component. 
+   * ---------------------------------------------------------------------------------
+   */
+
+  /**
+   * Init method. 
+   * Overwrites the AliHLTFilePublisher::DoInit() method.  
+   * @param argc           size of the argument array
+   * @param argv           agument array for component initialization
+   * @return number of processed members of the argv <br>
+   *         -EINVAL unknown argument <br>
+   *         -EPROTO parameter for argument missing <br>
+   */
+  Int_t DoInit( int argc, const char** argv );
+
+  /**
+   * Deinit method. Calls also the one of AliHLTFilePublisher.
+   */
+  Int_t DoDeinit();
+
+  /**
+   * Data processing method for the component.
+   * The component uses the @ref alihltcomponent-high-level-interface
+   * to put serialized Root object into the output stream. Despite of that it
+   * implements the low-level DumpEvent method in order to allow child classes
+   * to use the low-level method.
+   * @param evtData       event data structure
+   * @param trigData     trigger data structure
+   * @param outputPtr     not used
+   * @param size          not used
+   * @param outputBlocks  not used
+   * @return
+   */
+  Int_t GetEvent( const AliHLTComponentEventData& evtData,
+               AliHLTComponentTriggerData& trigData,
+               AliHLTUInt8_t* outputPtr, 
+               AliHLTUInt32_t& size,
+               vector<AliHLTComponentBlockData>& outputBlocks);
+
+  using AliHLTDataSource::GetEvent;
+
+ private:
+
+  /*
+   * ---------------------------------------------------------------------------------
+   * Private functions to implement AliHLTComponent's interface.
+   * These functions provide initialization as well as the actual processing
+   * capabilities of the component. 
+   * ---------------------------------------------------------------------------------
+   */
+
+  /** copy constructor prohibited */
+  AliHLTMCGeneratorComponent(const AliHLTMCGeneratorComponent&);
+
+  /** assignment operator prohibited */
+  AliHLTMCGeneratorComponent& operator=(const AliHLTMCGeneratorComponent&);
+
+  /** Create Generator Factory
+   *  @return          Ptr to generator
+   */
+  AliGenerator* GeneratorFactory();
+
+  /*
+   * ---------------------------------------------------------------------------------
+   *                             Members - private
+   * ---------------------------------------------------------------------------------
+   */
+
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  // ++ Enum / static const
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+  /** Run Type */
+  enum PprRun_t {
+    kPythia6Jets20_24,   kPythia6Jets24_29,   kPythia6Jets29_35,
+    kPythia6Jets35_42,   kPythia6Jets42_50,   kPythia6Jets50_60,
+    kPythia6Jets60_72,   kPythia6Jets72_86,   kPythia6Jets86_104,
+    kPythia6Jets104_125, kPythia6Jets125_150, kPythia6Jets150_180,
+    kPyJetJet, kPyGammaJetPHOS, kRunMax
+  };
+  
+  /** Run type name */
+  static const Char_t *fgkPprRunName[];            //! transient
+
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  // ++ Data Members 
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+  /* Ptr to current AliMCEvent, to be shipped out*/
+  AliMCEvent          *fpMC;                       //! transient
+  
+  /* Ptr to current AliHLTMCEvent, to be shipped out*/
+  AliHLTMCEvent       *fpHLTMC;                    //! transient
+  
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  // ++ Event Handling
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+  /** Number of events */
+  Int_t                fNEvents;                   // see above
+
+  /** Current event */
+  Int_t                fCurrentEvent;              // see above
+
+  /** Event number */
+  Int_t                fEventNumber;               // see above
+
+  /** Run number */
+  Int_t                fRunNumber;                 // see above
+
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  // ++ MC Generation
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+  /** RunLoader */
+  AliRunLoader        *fRunLoader;                 //! transient
+
+  /** Event venerator base class */
+  AliGenerator        *fGenerator;                 //! transient
+
+  /** Comment line */
+  TString              fComment;                   // see above
+
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  // ++ MC Generation
+  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+  /** Seed for random generation - default 0 */
+  UInt_t               fSeed;                      // see above
+  
+  /** Run type - default kPythia6Jets104*/
+  PprRun_t             fRunType;                   // see above
+
+  /** Center of mass energy - default 14 TeV*/
+  Float_t              fEcms;                      // see above
+  
+  /** Max Eta - Final state kinematic cut for PyCell - default 0.2 */
+  Float_t              fJetEtaMax;                 // see above
+
+  /** Min Eta - Final state kinematic cut for PyCell - default -0.2 */
+  Float_t              fJetEtaMin;                 // see above
+
+  /** Max Et - Final state kinematic cut for PyCell - default 1000 GeV*/ 
+  Float_t              fJetEtMax;                  // see above
+
+  /** Min Et - Final state kinematic cut for PyCell - default 10 GeV */  
+  Float_t              fJetEtMin;                  // see above
+
+  /** Cone radius for PyCell - default 0.4 */
+  Float_t              fJetConeRadius;             // see above
+  
+  /** Min Pt transfer of the hard scattering - default 10 GeV */
+  Double_t             fPtHardMin;                 // see above
+
+  /** Min Pt transfer of the hard scattering - default infinity */
+  Double_t             fPtHardMax;                 // see above
+  
+  /** Quench mode 0 = no, 1 = AM, 2 = IL - default 0*/
+  Int_t                fQuenching ;                // see above
+
+  /** Q Hat - default 20 */
+  Float_t              fQhat;                      // see above
+  ClassDef(AliHLTMCGeneratorComponent, 0)
+};
+#endif
index 7a9f26b..272f720 100644 (file)
@@ -4,7 +4,9 @@
 CLASS_HDRS:=   AliHLTFilePublisher.h \
                AliHLTFileWriter.h \
                AliHLTMCEvent.h \
+               AliHLTJets.h \
                AliHLTRootFilePublisherComponent.h \
+               AliHLTMCGeneratorComponent.h \
                AliHLTESDMCEventPublisherComponent.h \
                AliHLTRootFileWriterComponent.h \
                AliHLTRootFileStreamerComponent.h \
@@ -23,9 +25,9 @@ MODULE_HDRS:=         $(CLASS_HDRS)
 
 MODULE_DHDR:=          
 
-EINCLUDE := HLT/BASE HLT/BASE/util STEER RAW
+EINCLUDE := HLT/BASE HLT/BASE/util STEER RAW PYTHIA6
 
-LIBRARY_DEP := -lHLTbase -lSTEER -lSTEERBase -lRAWDatabase
+LIBRARY_DEP := -lHLTbase -lSTEER -lSTEERBase -lRAWDatabase -llhapdf -lEGPythia6 -lpythia6 -lAliPythia6
 
 include $(MODDIR)/hlt.conf