//
///////////////////////////////////////////////////////////////////////////////
#include <Riostream.h>
-#include <cstdlib>
+#include <TCint.h>
+#include <TFile.h>
+#include <TKey.h>
+#include <TObjArray.h>
+#include <TObjString.h>
#include <TObject.h>
+#include <TROOT.h>
#include <TString.h>
-#include <TObjString.h>
-#include <TObjArray.h>
#include <TSystem.h>
-#include <TKey.h>
-#include <TList.h>
-#include <TMap.h>
-#include <TFile.h>
+#include "AliCDBManager.h"
#include "AliLog.h"
+#include "AliMC.h"
+#include "AliModule.h"
+#include "AliPDG.h"
#include "AliRun.h"
#include "AliRunLoader.h"
-#include "AliModule.h"
-
-#include "AliTriggerInput.h"
-//#include "AliTriggerDetector.h"
-#include "AliTriggerInteraction.h"
#include "AliTriggerBCMask.h"
-#include "AliTriggerCluster.h"
-#include "AliTriggerPFProtection.h"
-#include "AliTriggerDescriptor.h"
#include "AliTriggerClass.h"
+#include "AliTriggerCluster.h"
#include "AliTriggerConfiguration.h"
+#include "AliTriggerDescriptor.h"
+#include "AliTriggerInput.h"
+#include "AliTriggerInteraction.h"
+#include "AliTriggerPFProtection.h"
ClassImp(AliTriggerConfiguration)
fMasks(),
fDescriptors(),
fClusters(),
- fClasses()
+ fClasses(),
+ fVersion(0)
{
// Default constructor
}
fMasks(),
fDescriptors(),
fClusters(),
- fClasses()
+ fClasses(),
+ fVersion(0)
{
// Constructor
}
//_____________________________________________________________________________
AliTriggerConfiguration::~AliTriggerConfiguration()
{
+ // Destructor
fInputs.SetOwner();
fInputs.Delete();
fInteractions.SetOwner();
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddInput( AliTriggerInput* input )
{
+ // Add a trigger input to
+ // the list of the trigger inputs
if (fInputs.GetEntries() < kNMaxInputs) {
fInputs.AddLast( input );
return kTRUE;
}
else {
- AliError("CTP can handle up to 50 inputs ! Impossible to add the required input !");
+ AliError("CTP can handle up to 60 inputs ! Impossible to add the required input !");
return kFALSE;
}
}
UChar_t level, UInt_t signature,
UChar_t number )
{
+ // Add a trigger input to
+ // the list of the trigger inputs
AliTriggerInput *input = new AliTriggerInput(name,det,level,signature,number);
if (!AddInput(input)) {
delete input;
//_____________________________________________________________________________
AliTriggerInteraction* AliTriggerConfiguration::AddInteraction(TString &name, TString &logic)
{
+ // Add a trigger interaction object to
+ // the list of the trigger interactions
AliTriggerInteraction *interact = new AliTriggerInteraction(name,logic);
if (!AddInteraction(interact)) {
delete interact;
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddInteraction(AliTriggerInteraction *interact)
{
+ // Add a trigger interaction object to
+ // the list of the trigger interactions
if (fInteractions.GetEntries() < kNMaxInteractions) {
if (interact->CheckInputs(fInputs)) {
fInteractions.AddLast( interact );
//_____________________________________________________________________________
AliTriggerInteraction* AliTriggerConfiguration::AddFunction(TString &name, TString &logic)
{
+ // Add a trigger function object to
+ // the list of the trigger functions
AliTriggerInteraction *func = new AliTriggerInteraction(name,logic);
if (!AddFunction(func)) {
delete func;
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddFunction(AliTriggerInteraction *func)
{
+ // Add a trigger function object to
+ // the list of the trigger functions
if (fFunctions.GetEntries() < kNMaxFunctions) {
if (func->CheckInputs(fInputs)) {
fFunctions.AddLast( func );
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddPFProtection( AliTriggerPFProtection* pfp )
{
+ // Add a trigger past-future protection object to
+ // the list of the trigger past-future protections
if (fPFProtections.GetEntries() < kNMaxPFProtections) {
if (pfp->CheckInteractions(fInteractions)) {
fPFProtections.AddLast( pfp );
//_____________________________________________________________________________
AliTriggerBCMask* AliTriggerConfiguration::AddMask( TString &name, TString &mask )
{
+ // Add a trigger bunch-crossing mask object to
+ // the list of the trigger bunch-crossing masks
AliTriggerBCMask *bcmask = new AliTriggerBCMask(name,mask);
if (!AddMask(bcmask)) {
delete bcmask;
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddMask( AliTriggerBCMask* mask )
{
- if (fMasks.GetEntries() < kNMaxMasks) {
+ // Add a trigger bunch-crossing mask object to
+ // the list of the trigger bunch-crossing masks
+ if (fMasks.GetEntries() < (kNMaxMasks+1)) { //+1 to account for NONE
fMasks.AddLast( mask );
return kTRUE;
}
//_____________________________________________________________________________
AliTriggerCluster* AliTriggerConfiguration::AddCluster( TString &name, UChar_t index, TString &detectors)
{
+ // Add a trigger detector readout cluster to
+ // the list of the trigger clusters
AliTriggerCluster *clust = new AliTriggerCluster(name,index,detectors);
if (!AddCluster(clust)) {
delete clust;
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddCluster( AliTriggerCluster* cluster )
{
+ // Add a trigger detector readout cluster to
+ // the list of the trigger clusters
if (fClusters.GetEntries() < kNMaxClusters) {
TString dets(cluster->GetDetectorsInCluster());
if (!(dets.IsNull())) {
//_____________________________________________________________________________
TString AliTriggerConfiguration::GetActiveDetectors() const
{
- // Return an string with all active detector from each cluster
+ // Return an string with all active detector
+ // from each cluster
TString activeDet = "";
Int_t nclus = fClusters.GetEntriesFast();
if( !nclus ) return activeDet;
- for( Int_t j=0; j<nclus; j++ ) {
+ for( Int_t j=0; j<nclus; ++j ) {
TString detStr = ((AliTriggerCluster*)fClusters.At(j))->GetDetectorsInCluster();
TObjArray* det = detStr.Tokenize(" ");
Int_t ndet = det->GetEntriesFast();
- for( Int_t j=0; j<ndet; j++ ) {
- if( activeDet.Contains( ((TObjString*)det->At(j))->String() ) )continue;
+ for( Int_t k=0; k<ndet; ++k ) {
+ if( activeDet.Contains( ((TObjString*)det->At(k))->String() ) )continue;
activeDet.Append( " " );
- activeDet.Append( ((TObjString*)det->At(j))->String() );
+ activeDet.Append( ((TObjString*)det->At(k))->String() );
}
}
return activeDet;
//_____________________________________________________________________________
TString AliTriggerConfiguration::GetTriggeringDetectors() const
{
- // Return an string with all detectors used for triggering
+ // Return an string with all detectors
+ // used for triggering
TString trDet = "";
//_____________________________________________________________________________
AliTriggerDescriptor* AliTriggerConfiguration::AddDescriptor( TString &name, TString &cond )
{
+ // Add a trigger descriptor to
+ // the list of the trigger descriptors
AliTriggerDescriptor *desc = new AliTriggerDescriptor(name,cond);
if (!AddDescriptor(desc)) {
delete desc;
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddDescriptor( AliTriggerDescriptor *desc )
{
+ // Add a trigger descriptor to
+ // the list of the trigger descriptors
if (fDescriptors.GetEntries() < kNMaxClasses) {
if (desc->CheckInputsAndFunctions(fInputs,fFunctions)) {
fDescriptors.AddLast( desc );
//_____________________________________________________________________________
Bool_t AliTriggerConfiguration::AddClass( AliTriggerClass *trclass )
{
+ // Add a trigger class to
+ // the list of the trigger classes
if (fClasses.GetEntries() < kNMaxClasses) {
if (trclass->CheckClass(this)) {
fClasses.AddLast( trclass );
AliTriggerPFProtection *pfp, AliTriggerBCMask *mask,
UInt_t prescaler, Bool_t allrare)
{
- // Add a new trigger class
+ // Add a trigger class to
+ // the list of the trigger classes
if (!fDescriptors.FindObject(desc)) {
AliError("Invalid descriptor ! Impossible to add the class !");
return NULL;
}
//_____________________________________________________________________________
-AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration( TString & configuration)
+Bool_t AliTriggerConfiguration::ProcessConfigurationLine(const char* line, Int_t& level)
{
- // Load one pre-created Configurations from database/file that match
- // with the input string 'configuration'
- // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
- // By default the files are stored in GRP/CTP folder.
- // The filename is constructed as: GRP/CTP/<configuration>.cfg
-
- // Load the selected configuration
- TString filename = gSystem->Getenv("ALICE_ROOT");
- filename += "/GRP/CTP/";
- filename += configuration;
- filename += ".cfg";
-
- if( gSystem->AccessPathName( filename.Data() ) ) {
- AliErrorClass( Form( "file (%s) not found", filename.Data() ) );
- return NULL;
- }
+ // processes one line of configuration
+ TString strLine(line);
- ifstream *file = new ifstream ( filename.Data() );
- if (!*file) {
- AliErrorClass(Form("Error opening file (%s) !",filename.Data()));
- file->close();
- delete file;
- return NULL;
- }
-
- AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
-
- Int_t level = 0;
- TString strLine;
- while (strLine.ReadLine(*file)) {
- if (strLine.BeginsWith("#")) continue;
+ if (strLine.BeginsWith("#")) return kTRUE;
+ if (strLine.BeginsWith("PARTITION:")) {
+ strLine.ReplaceAll("PARTITION:","");
+ SetName(strLine.Data());
+ return kTRUE;
+ }
+ if (strLine.BeginsWith("VERSION:")) {
+ strLine.ReplaceAll("VERSION:","");
+ fVersion = strLine.Atoi();
+ return kTRUE;
+ }
if (strLine.BeginsWith("INPUTS:")) {
level = 1;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("INTERACTIONS:")) {
level = 2;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("DESCRIPTORS:")) {
level = 3;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("CLUSTERS:")) {
level = 4;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("PFS:")) {
level = 5;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("BCMASKS:")) {
level = 6;
- continue;
+ return kTRUE;
}
if (strLine.BeginsWith("CLASSES:")) {
level = 7;
- continue;
+ return kTRUE;
}
+
strLine.ReplaceAll("*",'!');
+ strLine.ReplaceAll("~",'!');
TObjArray *tokens = strLine.Tokenize(" \t");
Int_t ntokens = tokens->GetEntriesFast();
+ if (ntokens == 0)
+ {
+ delete tokens;
+ return kTRUE;
+ }
switch (level) {
case 1:
// Read inputs
if (ntokens != 5) {
- AliErrorClass(Form("Invalid trigger input syntax (%s)!",strLine.Data()));
- file->close();
- delete file;
- return NULL;
+ AliError(Form("Invalid trigger input syntax (%s)!",strLine.Data()));
+ return kFALSE;
}
- cfg->AddInput(((TObjString*)tokens->At(0))->String(),
+ AddInput(((TObjString*)tokens->At(0))->String(),
((TObjString*)tokens->At(1))->String(),
((TObjString*)tokens->At(2))->String().Atoi(),
((TObjString*)tokens->At(3))->String().Atoi(),
((TObjString*)tokens->At(4))->String().Atoi());
break;
case 2:
- // Read intreractions
- cfg->AddInteraction(((TObjString*)tokens->At(0))->String(),
+ // Read interaction
+ if (ntokens != 2) {
+ AliError(Form("Invalid trigger interaction syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
+ AddInteraction(((TObjString*)tokens->At(0))->String(),
((TObjString*)tokens->At(1))->String());
break;
case 3:
// Read logical functions and descriptors
+ if (ntokens < 2) {
+ if ((((TObjString*)tokens->At(0))->String().CompareTo("EMPTY") == 0) ||
+ (((TObjString*)tokens->At(0))->String().CompareTo("DTRUE") == 0) ||
+ (((TObjString*)tokens->At(0))->String().CompareTo("DEMPTY") == 0)) {
+ AddDescriptor(((TObjString*)tokens->At(0))->String(),
+ strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
+ break;
+ }
+ else {
+ AliError(Form("Invalid trigger descriptor syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
+ }
if (((TObjString*)tokens->At(0))->String().BeginsWith("l0f")) {
// function
- cfg->AddFunction(((TObjString*)tokens->At(0))->String(),
+ AddFunction(((TObjString*)tokens->At(0))->String(),
strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
}
else {
- cfg->AddDescriptor(((TObjString*)tokens->At(0))->String(),
+ AddDescriptor(((TObjString*)tokens->At(0))->String(),
strLine.ReplaceAll(((TObjString*)tokens->At(0))->String(),""));
}
break;
case 4:
{
+ if (ntokens < 2) {
+ AliError(Form("Invalid trigger cluster syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
+ if (((TObjString*)tokens->At(1))->String().Atoi() <= 0) {
+ AliError(Form("Invalid trigger cluster syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
TString strTemp;
for(Int_t i = 2; i < ntokens; i++) {
strTemp += ((TObjString*)tokens->At(i))->String();
strTemp += " ";
}
- cfg->AddCluster(((TObjString*)tokens->At(0))->String(),
+ AddCluster(((TObjString*)tokens->At(0))->String(),
((TObjString*)tokens->At(1))->String().Atoi(),
strTemp);
}
case 5:
{
AliTriggerPFProtection *pfp = NULL;
- if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0) {
+ if ((((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0) ||
+ (((TObjString*)tokens->At(0))->String().CompareTo("NOPF") == 0)) {
pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String());
}
else {
+ if (ntokens != 10) {
+ AliError(Form("Invalid trigger pfs syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
pfp = new AliTriggerPFProtection(((TObjString*)tokens->At(0))->String(),
((TObjString*)tokens->At(1))->String(),
((TObjString*)tokens->At(2))->String(),
pfp->SetTa(((TObjString*)tokens->At(8))->String().Atoi());
pfp->SetTb(((TObjString*)tokens->At(9))->String().Atoi());
}
- cfg->AddPFProtection(pfp);
+ AddPFProtection(pfp);
}
break;
case 6:
+ if (ntokens > 2) {
+ AliError(Form("Invalid trigger bcmasks syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
if (((TObjString*)tokens->At(0))->String().CompareTo("NONE") == 0)
- cfg->AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
+ {
+ AddMask(new AliTriggerBCMask(((TObjString*)tokens->At(0))->String()));
+ }
else {
- cfg->AddMask(((TObjString*)tokens->At(0))->String(),
+ AddMask(((TObjString*)tokens->At(0))->String(),
((TObjString*)tokens->At(1))->String());
}
break;
case 7:
{
- AliTriggerClass *trclass = new AliTriggerClass(cfg,
+ if ((ntokens < 8) || (ntokens >10)) {
+ AliError(Form("Invalid trigger class syntax (%s)!",strLine.Data()));
+ return kFALSE;
+ }
+ AliTriggerClass *trclass = new AliTriggerClass(this,
((TObjString*)tokens->At(0))->String(),((TObjString*)tokens->At(1))->String().Atoi(),
((TObjString*)tokens->At(2))->String(),((TObjString*)tokens->At(3))->String(),
((TObjString*)tokens->At(4))->String(),((TObjString*)tokens->At(5))->String(),
- ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(0))->String().Atoi()));
- cfg->AddClass(trclass);
+ ((TObjString*)tokens->At(6))->String().Atoi(),(Bool_t)(((TObjString*)tokens->At(7))->String().Atoi()));
+ AddClass(trclass);
}
default:
break;
}
delete tokens;
+
+ return kTRUE;
+}
+
+//_____________________________________________________________________________
+AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration(TString & configuration)
+{
+ // Load one pre-created Configurations from database/file that match
+ // with the input string 'configuration'
+ // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
+ // By default the files are stored in GRP/CTP folder.
+ // The filename is constructed as: GRP/CTP/<configuration>.cfg
+
+ // Load the selected configuration
+ TString filename;
+ if (configuration.EndsWith(".cfg") ||
+ configuration.EndsWith(".shuttle")) {
+ filename = configuration;
+ }
+ else {
+ filename = gSystem->Getenv("ALICE_ROOT");
+ filename += "/GRP/CTP/";
+ filename += configuration;
+ filename += ".cfg";
+ }
+
+ if( gSystem->AccessPathName( filename.Data() ) ) {
+ AliErrorClass( Form( "file (%s) not found", filename.Data() ) );
+ return NULL;
+ }
+
+
+ ifstream *file = new ifstream ( filename.Data() );
+ if (!*file) {
+ AliErrorClass(Form("Error opening file (%s) !",filename.Data()));
+ file->close();
+ delete file;
+ return NULL;
+ }
+
+ AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
+
+ Int_t level = 0;
+
+ TString strLine;
+ while (strLine.ReadLine(*file)) {
+ if (cfg->ProcessConfigurationLine(strLine, level) == kFALSE)
+ {
+ delete cfg;
+ cfg = 0;
+ break;
+ }
}
file->close();
delete file;
return cfg;
+}
+
+//_____________________________________________________________________________
+AliTriggerConfiguration* AliTriggerConfiguration::LoadConfigurationFromString(const char* configuration)
+{
+ // Loads configuration given as parameter <configuration>
+
+ if (!configuration)
+ return 0;
+
+ AliTriggerConfiguration *cfg = new AliTriggerConfiguration();
+
+ Int_t level = 0;
+
+ TObjArray* tokens = TString(configuration).Tokenize("\n");
+ for (Int_t i=0; i<tokens->GetEntries(); i++)
+ {
+ TObjString* str = dynamic_cast<TObjString*>(tokens->At(i));
+ if (!str)
+ continue;
+
+ if (cfg->ProcessConfigurationLine(str->String(), level) == kFALSE)
+ {
+ delete cfg;
+ cfg = 0;
+ break;
+ }
+ }
+ delete tokens;
+
+ return cfg;
}
//_____________________________________________________________________________
AliInfo( Form( "initializing gAlice with config file %s",
configfile.Data() ) );
- StdoutToAliInfo( StderrToAliError(
- gAlice->Init( configfile.Data() );
- ););
+//_______________________________________________________________________
+ gAlice->Announce();
+
+ gROOT->LoadMacro(configfile.Data());
+ gInterpreter->ProcessLine(gAlice->GetConfigFunction());
+
+ if(AliCDBManager::Instance()->GetRun() >= 0) {
+ AliRunLoader::Instance()->SetRunNumber(AliCDBManager::Instance()->GetRun());
+ } else {
+ AliWarning("Run number not initialized!!");
+ }
+
+ AliRunLoader::Instance()->CdGAFile();
+
+ AliPDG::AddParticlesToPdgDataBase();
+
+ gAlice->GetMCApp()->Init();
+
+ //Must be here because some MCs (G4) adds detectors here and not in Config.C
+ gAlice->InitLoaders();
+ AliRunLoader::Instance()->MakeTree("E");
+ AliRunLoader::Instance()->LoadKinematics("RECREATE");
+ AliRunLoader::Instance()->LoadTrackRefs("RECREATE");
+ AliRunLoader::Instance()->LoadHits("all","RECREATE");
+ //
+ // Save stuff at the beginning of the file to avoid file corruption
+ AliRunLoader::Instance()->CdGAFile();
+ gAlice->Write();
- AliRunLoader* runLoader = gAlice->GetRunLoader();
+ AliRunLoader* runLoader = AliRunLoader::Instance();
if( !runLoader ) {
AliError( Form( "gAlice has no run loader object. "
"Check your config file: %s", configfile.Data() ) );
if( IsSelected( det->GetName(), detStr ) ) {
AliInfo( Form( "Creating inputs for %s", det->GetName() ) );
AliTriggerDetector* dtrg = det->CreateTriggerDetector();
- dtrg->CreateInputs(GetInputs());
+ dtrg->AssignInputs(GetInputs());
TObjArray* detInp = dtrg->GetInputs();
for( Int_t i=0; i<detInp->GetEntriesFast(); i++ ) {
AliInfo( Form( "Adding input %s", ((AliTriggerInput*)detInp->At(i))->GetName() ) );
return check;
}
+//_____________________________________________________________________________
+void AliTriggerConfiguration::Reset()
+{
+ for( Int_t j=0; j<fInputs.GetEntriesFast(); j++ )
+ ((AliTriggerInput*)fInputs.At(j))->Reset();
+
+ for( Int_t j=0; j<fClasses.GetEntriesFast(); j++ )
+ ((AliTriggerClass*)fClasses.At(j))->Reset();
+}
//_____________________________________________________________________________
void AliTriggerConfiguration::Print( const Option_t* ) const
cout << "Trigger Configuration:" << endl;
cout << " Name: " << GetName() << endl;
cout << " Description: " << GetTitle() << endl;
+ cout << " Version: " << GetVersion() << endl;
cout << " Active Detectors: " << GetActiveDetectors() << endl;
cout << " Trigger Detectors: " << GetTriggeringDetectors() << endl;