]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCentralTrigger.cxx
Modifications to the trigger classes to have I/O. I
[u/mrichter/AliRoot.git] / STEER / AliCentralTrigger.cxx
index 5ad12eb63550821b0fac576a5f532a3c2640eebc..3b15190fa9f69251a9c884ffd00bde817fff6718 100644 (file)
@@ -36,6 +36,8 @@
 #include <TObjString.h>
 #include <TObjArray.h>
 #include <TStopwatch.h>
+#include <TFile.h>
+#include <TTree.h>
 
 #include "AliLog.h"
 #include "AliRun.h"
@@ -47,6 +49,9 @@
 #include "AliTriggerCondition.h"
 #include "AliTriggerDescriptor.h"
 #include "AliCentralTrigger.h"
+#include "AliDetectorEventHeader.h"
+#include "AliHeader.h"
+
 
 ClassImp( AliCentralTrigger )
 
@@ -68,14 +73,76 @@ AliCentralTrigger::AliCentralTrigger( TString & descriptor ) :
    LoadDescriptor( descriptor );
 }
 
+//_____________________________________________________________________________
+AliCentralTrigger::AliCentralTrigger( const AliCentralTrigger& ctp ):
+   TObject( ctp ),
+   fClassMask( ctp.fClassMask )
+{
+   // Copy constructor
+
+   Int_t ndes = ctp.fDescriptors.GetEntriesFast();
+   for( Int_t j=0; j<ndes; j++ ) {
+      fDescriptors.AddLast( new AliTriggerDescriptor( *(AliTriggerDescriptor*)(ctp.fDescriptors.At( j )) ) );
+   }
+
+   Int_t nInp = ctp.fInputs.GetEntriesFast();
+   for( Int_t j=0; j<nInp; j++ ) {
+      fInputs.AddLast( new AliTriggerInput( *(AliTriggerInput*)(ctp.fInputs.At( j )) ) );
+   }
+}
+
 //_____________________________________________________________________________
 AliCentralTrigger::~AliCentralTrigger()
 {
    // Destructor
+   DeleteDescriptors();
+}
+
+//_____________________________________________________________________________
+void AliCentralTrigger::DeleteDescriptors()
+{
+   // Reset Descriptors
+   fClassMask = 0;
    fDescriptors.SetOwner();
    fDescriptors.Delete();
 }
 
+//_____________________________________________________________________________
+void AliCentralTrigger::Reset()
+{
+   // Reset Class Mask and conditions
+   fClassMask = 0;
+   Int_t ndes = fDescriptors.GetEntriesFast();
+   for( Int_t i=0; i<ndes; i++ ) {
+      TObjArray* condArray = ((AliTriggerDescriptor*)fDescriptors.At( i ))->GetTriggerConditions();
+      Int_t ncond = condArray->GetEntriesFast();
+      for( Int_t j=0; j<ncond; j++ ) {
+         AliTriggerCondition* cond = (AliTriggerCondition*)condArray->At( j );
+         cond->Reset();
+      }
+   }
+}
+
+//_____________________________________________________________________________
+void AliCentralTrigger::MakeBranch( TString name, TTree * tree )
+{
+   // Make a branch to store only trigger class mask event by event
+
+   if( tree )  {
+      AliDebug( 1, "Got Tree from folder." );
+      TBranch* branch = tree->GetBranch( name );
+      if( branch == 0x0 ) {
+         AliDebug( 1, "Creating new branch" );
+         branch = tree->Branch( name, &(this->fClassMask), "fClassMask/l" );
+         branch->SetAutoDelete( kFALSE );
+      }
+      else {
+         AliDebug( 1, "Got Branch from Tree" );
+         branch->SetAddress( &(this->fClassMask) );
+      }
+   }
+}
+
 //_____________________________________________________________________________
 Bool_t AliCentralTrigger::LoadDescriptor( TString & descriptor )
 {
@@ -84,7 +151,7 @@ Bool_t AliCentralTrigger::LoadDescriptor( TString & descriptor )
    // Ej: "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
 
    // Delete any descriptor
-   fDescriptors.Delete();
+   Reset();
 
    // Load the selected descriptors
    TObjArray* desArray = descriptor.Tokenize( " " );
@@ -132,51 +199,80 @@ TString AliCentralTrigger::GetDetectors()
 Bool_t AliCentralTrigger::RunTrigger( AliRunLoader* runLoader )
 {
    // run the trigger
-   
+
    if( fDescriptors.GetEntriesFast() == 0 ) {
-      AliError("not trigger descriptor loaded, skipping trigger");
+      AliError( "not trigger descriptor loaded, skipping trigger" );
+      return kFALSE;
+   }
+
+   TTree *tree = runLoader->TreeCT();
+   if( !tree ) {
+      AliError( "not folder with trigger loaded, skipping trigger" );
       return kFALSE;
    }
 
    TStopwatch stopwatch;
    stopwatch.Start();
-   
+
    // Process each event
    for( Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++ ) {
-      AliInfo( Form("\n ***** Processing event %d *****\n", iEvent) );
-      runLoader->GetEvent( iEvent );       
+      AliInfo( Form("  ***** Processing event %d *****\n", iEvent) );
+      runLoader->GetEvent( iEvent );
       // Get detectors involve
       TString detStr = GetDetectors();
+      AliInfo( Form(" Cluster Detectors %s \n", detStr.Data() ) );
       TObjArray* detArray = runLoader->GetAliRun()->Detectors();
       // Reset Mask
       fClassMask = 0;
-      TObjArray trgdetArray;
+      TObjArray trgdetArray; // use as garbage collector
       for( Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++ ) {
          AliModule* det = (AliModule*) detArray->At( iDet );
          if( !det || !det->IsActive() ) continue;
          if( IsSelected(det->GetName(), detStr) ) {
-            AliInfo( Form("triggering from digits for %s", det->GetName() ) );
+
+            AliInfo( Form("Triggering from digits for %s", det->GetName() ) );
             AliTriggerDetector* trgdet = det->CreateTriggerDetector();
             trgdet->CreateInputs();
-            trgdetArray.AddLast( trgdet );
             TStopwatch stopwatchDet;
             stopwatchDet.Start();
             trgdet->Trigger();
             AliInfo( Form("Execution time for %s: R:%.2fs C:%.2fs",
                      det->GetName(), stopwatchDet.RealTime(), stopwatchDet.CpuTime() ) );
+
             // Get the inputs
             TObjArray* detInp = trgdet->GetInputs();
             for( Int_t i=0; i<detInp->GetEntriesFast(); i++ ) {
                fInputs.AddLast( detInp->At(i) );
             }
+            trgdetArray.AddLast( trgdet );
+
+            // Write trigger detector in Event folder in Digits file
+            TString loadername = det->GetName();
+            loadername.Append( "Loader" );
+            AliLoader * loader = runLoader->GetLoader( loadername );
+            if( loader ) {
+               AliDataLoader * dataLoader = loader->GetDigitsDataLoader();
+               if( !dataLoader->IsFileOpen() ) {
+                  if( dataLoader->OpenFile( "UPDATE" ) ) {
+                     AliWarning( Form( "\n\nCan't write trigger for %s\n", det->GetName() ) );
+                  }
+               }
+               dataLoader->Cd();
+               if( gFile && !gFile->IsWritable() ) {
+                  gFile->ReOpen( "UPDATE" );
+                  dataLoader->Cd();
+               }
+               trgdet->Write( "Trigger", TObject::kOverwrite );
+               dataLoader->CloseFile();
+            }
+            else  AliWarning( Form( "Not loader found for %s", det->GetName() ) );
          }
       }
 
       // Check trigger conditions and create the trigger class mask
       CheckConditions();
-
       fInputs.Clear();
-      
+
       // Clear trigger detectors
       trgdetArray.SetOwner();
       trgdetArray.Delete();
@@ -187,15 +283,20 @@ Bool_t AliCentralTrigger::RunTrigger( AliRunLoader* runLoader )
          return kFALSE;
       }
 
-      // Write trigger ???? -> Event Header
-      // Write();
-      Print();
-
+      // Save trigger mask
+      tree->Fill();
+      AliInfo( Form("**************** Central Trigger Class Mask:0x%X", fClassMask ) );
    } // end event loop
-   return kTRUE;
-}
 
+   Reset();
+//   cout << endl <<  " Print " << endl;
+//   Print();
+
+   // Write
+   runLoader->WriteTrigger( "OVERWRITE" );
 
+   return kTRUE;
+}
 
 //_____________________________________________________________________________
 Long_t AliCentralTrigger::CheckConditions()
@@ -236,7 +337,6 @@ TObjArray* AliCentralTrigger::GetResultConditions()
    return result;
 }
 
-
 //_____________________________________________________________________________
 void AliCentralTrigger::Print( const Option_t*  ) const
 {