]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliTriggerConfiguration.cxx
Typo fixed, and removing unused variable.
[u/mrichter/AliRoot.git] / STEER / AliTriggerConfiguration.cxx
index b758805dee003a74dfe46deb0d3d575da86ac7bc..2c3cbb2efe1d25dc60bac71bd076f14687e98e7c 100755 (executable)
 //
 ///////////////////////////////////////////////////////////////////////////////
 #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 <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)
 
@@ -97,7 +99,8 @@ AliTriggerConfiguration::AliTriggerConfiguration():
   fMasks(),
   fDescriptors(),
   fClusters(),
-  fClasses()
+  fClasses(),
+  fVersion(0)
 {
   // Default constructor
 }
@@ -112,7 +115,8 @@ AliTriggerConfiguration::AliTriggerConfiguration( TString & name, TString & desc
   fMasks(),
   fDescriptors(),
   fClusters(),
-  fClasses()
+  fClasses(),
+  fVersion(0)
 {
   // Constructor
 }
@@ -149,7 +153,7 @@ Bool_t AliTriggerConfiguration::AddInput( AliTriggerInput* 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;
   }
 }
@@ -274,7 +278,7 @@ Bool_t AliTriggerConfiguration::AddMask( AliTriggerBCMask* mask )
 {
   // Add a trigger bunch-crossing mask object to
   // the list of the trigger bunch-crossing masks
-  if (fMasks.GetEntries() < kNMaxMasks) {
+  if (fMasks.GetEntries() < (kNMaxMasks+1)) {  //+1 to account for NONE
       fMasks.AddLast( mask );
       return kTRUE;
   }
@@ -330,14 +334,14 @@ TString AliTriggerConfiguration::GetActiveDetectors() const
    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;
@@ -501,118 +505,124 @@ AliTriggerClass *AliTriggerConfiguration::AddClass( TString &name, UChar_t index
 }
 
 //_____________________________________________________________________________
-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
+    // processes one line of configuration
 
-   // 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();
+     TString strLine(line);
 
-   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);
        }
@@ -620,10 +630,15 @@ AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration( TString & c
      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(),
@@ -635,37 +650,130 @@ AliTriggerConfiguration* AliTriggerConfiguration::LoadConfiguration( TString & c
           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;
 }
 
 //_____________________________________________________________________________
@@ -760,11 +868,36 @@ Bool_t AliTriggerConfiguration::CheckConfiguration( TString& configfile )
 
    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() ) );
@@ -783,7 +916,7 @@ Bool_t AliTriggerConfiguration::CheckConfiguration( TString& configfile )
       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() ) );
@@ -839,6 +972,7 @@ 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;