BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
//____________________________________________________________________
//
// A module to select events with specific triggers.  The module looks
// at the triggers _after_ downscaling, that is, the upper byte (8
// bits) of the first triggerword in the event header.   The trigger
// mask is inclusive. 
// 

//
// $Id: BrTriggerFilter.cxx,v 1.2 2001/12/14 15:38:54 cholm Exp $
// $Author: cholm $
// $Date: 2001/12/14 15:38:54 $
// $Copyright: (C) 2001 BRAHMS Collaboration <brahmlib@rhic.bnl.gov>
//

#ifndef ROOT_TDirectory
#include "TDirectory.h"
#endif
#include "BrTriggerFilter.h"
#include "BrEvent.h"
#include "BrEventHeader.h"
#include <iostream.h>
//____________________________________________________________________
ClassImp(BrTriggerFilter);


//____________________________________________________________________
 BrTriggerFilter::BrTriggerFilter() 
{
  // Default constructor 
  fTriggerMask       = 0;
  fAllTriggersHisto  = 0;
  fAccTriggersHisto  = 0;
  fProcessedEvents   = 0;
  fAcceptedEvents    = 0;  
  SetState(kSetup);
}

//____________________________________________________________________
 BrTriggerFilter::BrTriggerFilter(const Char_t* name, 
				 const Char_t* title) 
  : BrModule(name, title)
{
  // Default constructor 
  fTriggerMask       = 0;
  fAllTriggersHisto  = 0;
  fAccTriggersHisto  = 0;
  fProcessedEvents   = 0;
  fAcceptedEvents    = 0;  
  SetState(kSetup);
}

//_______________________________________________________
 void BrTriggerFilter::AddTrigger(UInt_t triggerBit)
{
  // Accept events with triggerBit set 
  if (GetState() != kSetup) {
    Warning("AddTrigger", "must be called before Init");
    return;
  }

  SetTrigger(triggerBit, kTRUE);
}
 
//_______________________________________________________
 void BrTriggerFilter::RemoveTrigger(UInt_t triggerBit)
{
  // Reject events with triggerBit set 
  if (GetState() != kSetup) {
    Warning("RemoveTrigger", "must be called before Init");
    return;
  }
  SetTrigger(triggerBit, kFALSE);
}

//_______________________________________________________
 void BrTriggerFilter::SetTrigger(UInt_t triggerBit, Bool_t on)
{
  // Accept/Reject events with triggerBit set 
  if (GetState() != kSetup) {
    Warning("SetTrigger", "must be called before Init");
    return;
  }
  if (on)
    SETBIT(fTriggerMask,triggerBit-1);
  else 
    CLRBIT(fTriggerMask,triggerBit-1);
}

//_______________________________________________________
 Bool_t BrTriggerFilter::GetTrigger(UInt_t triggerBit) const
{
  // Is events with triggerBit Accepted/Rejected 
  return TESTBIT(fTriggerMask,triggerBit-1);
}

//_______________________________________________________
 void BrTriggerFilter::DefineHistograms()
{
  // Define histograms 

  // if (GetState() != kInit) {
  //  Failure("Define Histograms", "must be called after Init");
  //  return;
  // }

  // remember current directory
  TDirectory* savdir = gDirectory;   
  // Make directory for this module 
  TDirectory* hdir = savdir->mkdir("trigger");
  
  if (!hdir) {
    Warning("DefineHistograms","could not create histogram subdirectory");
    return;
  }

  // Change directory to histogram directory 
  hdir->cd();
  
  // Make histograms
  fAllTriggersHisto = new TH1F("allTrigger", "All Triggers", 8, .5, 8.5);
  fAccTriggersHisto = new TH1F("accTrigger", "Accepted Triggers", 8, .5, 8.5);

  // Restore directory
  gDirectory = savdir;
}

//_______________________________________________________
 void BrTriggerFilter::Init()
{
  // Noting to be done here 
  SetState(kInit);
}

//_______________________________________________________
 void BrTriggerFilter::Begin()
{
  // Nothing to be done here 
  SetState(kBegin);
}

//_______________________________________________________
 void BrTriggerFilter::Event(BrEventNode* input, BrEventNode*)
{
  // Return with status set to kDisaster if the input was note a
  // BrEvent object, or the trigger mask doesn't fit with the selected
  // triggers. 
  SetState(kEvent);

  if (input->IsA() != BrEvent::Class()) {
    Failure("Event", "input node not an event");
    return;
  }
  
  // Cout this event
  fProcessedEvents++;

  // Reinterpret as a BrEvent
  BrEvent* e = (BrEvent*)input;
  BrEventHeader* header = e->GetEventHeader();
  Int_t trigger = header->TriggerWord(1);

  // Select the upper 8 bits of the trigger word 
  Int_t uppTrigger = trigger >> 8;

  // Set the status of this module, so that the container may react. 
  if (uppTrigger & fTriggerMask) {
    if (Verbose() > 10)
      cout << "Accepting trigger " << uppTrigger << " & " <<
	fTriggerMask << " == " << (uppTrigger & fTriggerMask) << endl;
    SetStatus(kOk);
  }  
  else 
    Stop("Event", "not a the right trigger: %d", uppTrigger);
  
  if (fStatus == kOk) 
    fAcceptedEvents++;  

  uppTrigger &= fTriggerMask;
  trigger    = trigger >> 8;

  // Update histograms 
  if (HistOn()) {
    for (Int_t i = 0; i < 8; i++) {
      if (TESTBIT(trigger, i)) 
	fAllTriggersHisto->Fill(Float_t(i+1));
      if (TESTBIT(uppTrigger, i)) 
	fAccTriggersHisto->Fill(Float_t(i+1));
    }
  }
}
 
//_______________________________________________________
 void BrTriggerFilter::End()
{
  // Nothing to be done here 
  SetState(kEnd);
}

//_______________________________________________________
 void BrTriggerFilter::Finish()
{
  // Nothing to be done here 
  SetState(kFinish);
  Print("s");
}

//_______________________________________________________
 void BrTriggerFilter::Print(Option_t* option) const
{
  // Print info on module
  //   S       Print statistics
  //   P       Print parameters
  // See also BrModule::Print();
  BrModule::Print(option);
  TString opt(option);
  opt.ToLower();

  if (opt.Contains("s"))
    cout << "BrTriggerFilter statistics summary: " << endl
	 << " Processed events: " << fProcessedEvents << endl
	 << " Accepted events:  " << fAcceptedEvents << endl;
  if (opt.Contains("p")) {
    cout << "  Triggers looked for: " << flush;
    for (Int_t i = 0; i < 8; i++) 
      if (TESTBIT(fTriggerMask, i)) 
	cout << i+1 << " " << flush;
    cout << endl;
  }
  if (opt.Contains("d")) {
    Print("p");
    cout << endl
	 << "  Original author: Christian Holm" << endl
         << "  Revisted by:     $Author: cholm $" << endl
         << "  Revision date:   $Date: 2001/12/14 15:38:54 $"   << endl
         << "  Revision number: $Revision: 1.2 $ " << endl
         << endl
         << "*************************************************" <<
      endl;
  }
  
}

//
// $Log: BrTriggerFilter.cxx,v $
// Revision 1.2  2001/12/14 15:38:54  cholm
// Added some statistics output to finish, and some extra doc.
//
// Revision 1.1.1.1  2001/06/21 14:55:14  hagel
// Initial revision of brat2
//
// Revision 1.5  2001/03/07 12:13:22  cholm
// Changed Info to Print.
//
//

This page automatically generated by script docBrat by Christian Holm

Copyright ; 2002 BRAHMS Collaboration <brahmlib@rcf.rhic.bnl.gov>
Last Update on by

Validate HTML
Validate CSS