TObject(),
fClassMask(0),
fClusterMask(0),
+ fL0TriggerInputs(0),
+ fL1TriggerInputs(0),
+ fL2TriggerInputs(0),
fConfiguration(NULL)
{
// Default constructor
+ SetOwner();
}
//_____________________________________________________________________________
TObject(),
fClassMask(0),
fClusterMask(0),
+ fL0TriggerInputs(0),
+ fL1TriggerInputs(0),
+ fL2TriggerInputs(0),
fConfiguration(NULL)
{
// Default constructor
// Delete the active configuration
fClassMask = 0;
fClusterMask = 0;
- if (fConfiguration) delete fConfiguration;
+ fL0TriggerInputs = 0;
+ fL1TriggerInputs = 0;
+ fL2TriggerInputs = 0;
+ if (fConfiguration) {
+ if (IsOwner()) delete fConfiguration;
+ fConfiguration = 0x0;
+ }
}
//_____________________________________________________________________________
// Reset Class Mask and classes
fClassMask = 0;
fClusterMask = 0;
+ fL0TriggerInputs = 0;
+ fL1TriggerInputs = 0;
+ fL2TriggerInputs = 0;
if (fConfiguration) {
const TObjArray& classesArray = fConfiguration->GetClasses();
TBranch* branch = tree->GetBranch( name );
if( branch == 0x0 ) {
AliDebug( 1, "Creating new branch" );
- branch = tree->Branch( name, &(this->fClassMask), "fClassMask/l" );
+ branch = tree->Branch( name, &(this->fClassMask), "fClassMask/l:fClusterMask/i:fL0TriggerInputs/i:fL1TriggerInputs/i:fL2TriggerInputs/s" );
branch->SetAutoDelete( kFALSE );
}
else {
// Load the selected configuration
if (!config.IsNull()) {
fConfiguration = AliTriggerConfiguration::LoadConfiguration( config );
+ SetOwner();
if(fConfiguration)
return kTRUE;
else {
}
else {
// Load one and only one trigger descriptor from CDB
- AliInfo( "GETTING TRIGGER DESCRIPTORS FROM CDB!!!" );
+ AliInfo( "Getting trigger configuration from OCDB!" );
AliCDBPath path( "GRP", "CTP", "Config" );
AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
+ SetOwner(kFALSE);
if( !entry ) AliFatal( "Couldn't load trigger description data from CDB!" );
fConfiguration = (AliTriggerConfiguration *)entry->GetObject();
TStopwatch stopwatch;
stopwatch.Start();
+ AliInfo( Form(" Triggering Detectors: %s \n", GetDetectors().Data() ) );
+ AliInfo( Form(" Detectors with digits: %s \n", detectors ) );
+
// Process each event
for( Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++ ) {
- AliInfo( Form(" ***** Processing event %d *****\n", iEvent) );
runLoader->GetEvent( iEvent );
// Get detectors involve
TString detStr = GetDetectors();
- AliInfo( Form(" Triggering Detectors: %s \n", detStr.Data() ) );
TString detWithDigits = detectors;
- AliInfo( Form(" Detectors with digits: %s \n", detWithDigits.Data() ) );
TObjArray* detArray = runLoader->GetAliRun()->Detectors();
// Reset Mask
fClassMask = 0;
if( IsSelected(det->GetName(), detStr) &&
IsSelected(det->GetName(), detWithDigits) ) {
- AliInfo( Form("Triggering from digits for %s", det->GetName() ) );
+ AliDebug(1,Form("Triggering from digits for %s", det->GetName() ) );
AliTriggerDetector* trgdet = det->CreateTriggerDetector();
- trgdet->CreateInputs(fConfiguration->GetInputs());
+ trgdet->AssignInputs(fConfiguration->GetInputs());
TStopwatch stopwatchDet;
stopwatchDet.Start();
trgdet->Trigger();
- AliInfo( Form("Execution time for %s: R:%.2fs C:%.2fs",
+ AliDebug(1, Form("Execution time for %s: R:%.2fs C:%.2fs",
det->GetName(), stopwatchDet.RealTime(), stopwatchDet.CpuTime() ) );
trgdetArray.AddLast( trgdet );
// Check trigger conditions and create the trigger class mask
TriggerClasses();
+ // Calculate trigger Input pattern
+ TriggerInputs();
// Clear trigger detectors
trgdetArray.SetOwner();
// Save trigger mask
tree->Fill();
- AliInfo( Form("**************** Central Trigger Class Mask:0x%X", fClassMask ) );
+ AliDebug(1, Form("Event:%d Class Mask:0x%X", iEvent,fClassMask ) );
} // end event loop
Reset();
return kTRUE;
}
-
+//----------------------------------------------------------------------------
+void AliCentralTrigger::TriggerInputs()
+{
+ // Find which inputs are in configuration
+ // and calculate input pattern
+ fL0TriggerInputs=0;
+ fL1TriggerInputs=0;
+ fL2TriggerInputs=0;
+ if(fConfiguration){
+ const TObjArray& inputsArray = fConfiguration->GetInputs();
+ Int_t ninputs = inputsArray.GetEntriesFast();
+ for( Int_t j=0; j<ninputs; j++ ) {
+ AliTriggerInput* input = (AliTriggerInput*)inputsArray.At( j );
+ if(input->GetValue()){
+ UChar_t level=input->GetLevel();
+ if(level == 0) fL0TriggerInputs |= (input->GetMask());
+ else if(level == 1) fL1TriggerInputs |= (input->GetMask());
+ else if(level == 2) fL2TriggerInputs |= (input->GetMask());
+ else{
+ AliError(Form("Unknown input level:%c:",level));
+ }
+ }
+ }
+ }
+}
//_____________________________________________________________________________
ULong64_t AliCentralTrigger::TriggerClasses()
{
// Check trigger conditions and create the trigger class
// and trigger cluster masks
+ fClassMask = 0;
+ fClusterMask = 0;
if (fConfiguration) {
const TObjArray& classesArray = fConfiguration->GetClasses();
Int_t nclasses = classesArray.GetEntriesFast();
AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
trclass->Trigger( fConfiguration->GetInputs(), fConfiguration->GetFunctions() );
fClassMask |= trclass->GetValue();
- if (trclass->GetStatus())
- fClusterMask |= (trclass->GetCluster())->GetClusterMask();
+ if (trclass->GetStatus()) {
+ AliTriggerCluster *trclust = trclass->GetCluster();
+ fClusterMask |= AliDAQ::DetectorPattern(trclust->GetDetectorsInCluster());
+ }
}
}
return fClassMask;
}
//_____________________________________________________________________________
-TString AliCentralTrigger::GetTriggeredDetectors() const
+Bool_t AliCentralTrigger::CheckTriggeredDetectors() const
{
// Check the trigger mask, finds which trigger classes
// have been fired, load the corresponding trigger clusters and
// finally makes a list of the detectors that have been readout
- // for each particular event
+ // for each particular event. This list is then compared to the
+ // one stored in fClusterMask. Return value:
+ // true = two lists are equal
+ // false = two lists are not equal meaning wrong trigger config
+ // is loaded.
if (!fConfiguration) {
- AliError("The trigger confiration has not yet been loaded!");
- return "";
+ AliError("The trigger confiration has not yet been loaded! Cross-check is not possible!");
+ return kFALSE;
}
+ else {
- // Now loop over the trigger classes
- const TObjArray& classesArray = fConfiguration->GetClasses();
- Int_t nclasses = classesArray.GetEntriesFast();
- UChar_t clustMask = 0;
- for( Int_t j=0; j<nclasses; j++ ) {
- AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
- if (trclass->GetMask() & fClassMask) { // class was fired
- AliTriggerCluster *clust = trclass->GetCluster();
- clustMask |= clust->GetClusterMask();
+ // Make a cross-check so that to exclude wrong trigger configuration used
+ // Loop over the trigger classes
+ UInt_t clusterMask = 0;
+ const TObjArray& classesArray = fConfiguration->GetClasses();
+ Int_t nclasses = classesArray.GetEntriesFast();
+ for( Int_t j=0; j<nclasses; j++ ) {
+ AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
+ if (trclass->GetMask() & fClassMask) { // class was fired
+ AliTriggerCluster *trclust = trclass->GetCluster();
+ clusterMask |= AliDAQ::DetectorPattern(trclust->GetDetectorsInCluster());
+ }
}
- }
-
- // Compare the stored cluster mask with the one
- // that we get from trigger classes
- // To be enables after we store the cluster mask in the trigger tree
- // if (clustMask != fClusterMask)
- // AliError(Form("Wrong cluster mask from trigger classes (%x), expecting (%x)!",(UInt_t)clustMask,(UInt_t)fClusterMask));
-
- // Now loop over clusters and produce the string
- // with the triggered detectors
- TString trigDets;
- const TObjArray& clustArray = fConfiguration->GetClusters();
- Int_t nclust = clustArray.GetEntriesFast();
- for( Int_t i=0; i<nclust; i++ ) {
- AliTriggerCluster* clust = (AliTriggerCluster*)clustArray.At( i );
- if (clustMask & clust->GetClusterMask()) { // the cluster was fired
- TString detStr = clust->GetDetectorsInCluster();
- TObjArray* det = detStr.Tokenize(" ");
- Int_t ndet = det->GetEntriesFast();
- for( Int_t j=0; j<ndet; j++ ) {
- TString &detj = ((TObjString*)det->At(j))->String();
- if((trigDets.CompareTo(detj) == 0) ||
- trigDets.BeginsWith(detj) ||
- trigDets.EndsWith(detj) ||
- trigDets.Contains( " "+detj+" " )) continue;
- trigDets.Append( " " );
- trigDets.Append( detj );
+ // Compare the stored cluster mask with the one
+ // that we get from trigger classes
+ if (clusterMask != fClusterMask) {
+ if ((clusterMask & fClusterMask) == clusterMask) {
+ AliInfo(Form("Cluster mask from trigger classes (%x) and from data (%x) differ. Concurrent DAQ run(s) could be the reason.",
+ (UInt_t)clusterMask,(UInt_t)fClusterMask));
+ return kTRUE;
+ }
+ else {
+ AliError(Form("Wrong cluster mask from trigger classes (%x), expecting (%x)! Loaded trigger configuration is possibly wrong!",
+ (UInt_t)clusterMask,(UInt_t)fClusterMask));
+ return kFALSE;
}
}
}
- return trigDets;
+ return kTRUE;
}