Rotated FMD1 half-rings 90 degrees, so that the 3 sensors on long legs
[u/mrichter/AliRoot.git] / STEER / AliCentralTrigger.cxx
CommitLineData
a5a091ce 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// This class for running the Central Trigger Processor //
21// //
22// //
51f6d619 23// Load Configuration //
24// Make a list the trigger detectors involved (from the classes) //
a5a091ce 25// For the each event //
26// Run the Trigger for the each detector //
27// Get the inputs //
51f6d619 28// Check the trigger classes //
a5a091ce 29// Create the class mask //
30// Save result //
31// //
32// //
33///////////////////////////////////////////////////////////////////////////////
34
35#include <TString.h>
36#include <TObjString.h>
37#include <TObjArray.h>
38#include <TStopwatch.h>
bacbe0fd 39#include <TFile.h>
40#include <TTree.h>
a5a091ce 41
42#include "AliLog.h"
43#include "AliRun.h"
44#include "AliRunLoader.h"
45#include "AliModule.h"
46
47#include "AliTriggerInput.h"
48#include "AliTriggerDetector.h"
51f6d619 49#include "AliTriggerConfiguration.h"
50#include "AliTriggerClass.h"
51#include "AliTriggerCluster.h"
a5a091ce 52#include "AliCentralTrigger.h"
bacbe0fd 53#include "AliDetectorEventHeader.h"
54#include "AliHeader.h"
55
51f6d619 56#include "AliCDBManager.h"
57#include "AliCDBPath.h"
58#include "AliCDBEntry.h"
a5a091ce 59
60ClassImp( AliCentralTrigger )
61
62//_____________________________________________________________________________
63AliCentralTrigger::AliCentralTrigger() :
64 TObject(),
75e3794b 65 fClassMask(0),
51f6d619 66 fClusterMask(0),
67 fConfiguration(NULL)
a5a091ce 68{
69 // Default constructor
a5a091ce 70}
71
72//_____________________________________________________________________________
51f6d619 73AliCentralTrigger::AliCentralTrigger( TString & config ) :
a5a091ce 74 TObject(),
75e3794b 75 fClassMask(0),
51f6d619 76 fClusterMask(0),
77 fConfiguration(NULL)
a5a091ce 78{
79 // Default constructor
51f6d619 80 LoadConfiguration( config );
bacbe0fd 81}
82
83//_____________________________________________________________________________
a5a091ce 84AliCentralTrigger::~AliCentralTrigger()
85{
51f6d619 86 // Destructor
87 DeleteConfiguration();
bacbe0fd 88}
89
90//_____________________________________________________________________________
51f6d619 91void AliCentralTrigger::DeleteConfiguration()
bacbe0fd 92{
51f6d619 93 // Delete the active configuration
94 fClassMask = 0;
95 fClusterMask = 0;
96 if (fConfiguration) delete fConfiguration;
a5a091ce 97}
98
99//_____________________________________________________________________________
bacbe0fd 100void AliCentralTrigger::Reset()
101{
51f6d619 102 // Reset Class Mask and classes
bacbe0fd 103 fClassMask = 0;
51f6d619 104 fClusterMask = 0;
105
106 if (fConfiguration) {
107 const TObjArray& classesArray = fConfiguration->GetClasses();
108 Int_t nclasses = classesArray.GetEntriesFast();
109 for( Int_t j=0; j<nclasses; j++ ) {
110 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
111 trclass->Reset();
112 }
bacbe0fd 113 }
114}
115
116//_____________________________________________________________________________
117void AliCentralTrigger::MakeBranch( TString name, TTree * tree )
118{
119 // Make a branch to store only trigger class mask event by event
120
121 if( tree ) {
122 AliDebug( 1, "Got Tree from folder." );
123 TBranch* branch = tree->GetBranch( name );
124 if( branch == 0x0 ) {
125 AliDebug( 1, "Creating new branch" );
126 branch = tree->Branch( name, &(this->fClassMask), "fClassMask/l" );
127 branch->SetAutoDelete( kFALSE );
128 }
129 else {
130 AliDebug( 1, "Got Branch from Tree" );
131 branch->SetAddress( &(this->fClassMask) );
132 }
133 }
134}
135
136//_____________________________________________________________________________
51f6d619 137Bool_t AliCentralTrigger::LoadConfiguration( TString & config )
a5a091ce 138{
51f6d619 139 // Load one and only one pre-created COnfiguration from database/file that match
140 // with the input string 'config'
141 // Ej: "p-p", "Pb-Pb" or "p-p-DIMUON CALIBRATION-CENTRAL-BARREL"
142
143 // Delete the active configuration, if any
144 DeleteConfiguration();
145
146 // Load the selected configuration
147 if (!config.IsNull()) {
148 fConfiguration = AliTriggerConfiguration::LoadConfiguration( config );
149 if(fConfiguration)
150 return kTRUE;
151 else {
152 AliError( Form( "Valid TriggerConfiguration (%s) is not found ! Disabling the trigger simulation !", config.Data() ) );
153 return kFALSE;
154 }
155 }
156 else {
157 // Load one and only one trigger descriptor from CDB
158 AliInfo( "GETTING TRIGGER DESCRIPTORS FROM CDB!!!" );
159
160 AliCDBPath path( "GRP", "CTP", "Config" );
161
162 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
163 if( !entry ) AliFatal( "Couldn't load trigger description data from CDB!" );
164
165 fConfiguration = (AliTriggerConfiguration *)entry->GetObject();
166 if(fConfiguration)
167 return kTRUE;
168 else {
169 AliError( "No valid configuration is found in the CDB ! Disabling the trigger simulation !" );
170 return kFALSE;
171 }
a5a091ce 172 }
a5a091ce 173}
174
175//_____________________________________________________________________________
176TString AliCentralTrigger::GetDetectors()
177{
51f6d619 178 // return TString with the detectors (modules) to be used for triggering
a5a091ce 179
180 TString result;
181
51f6d619 182 if (fConfiguration)
183 result = fConfiguration->GetTriggeringModules();
a5a091ce 184
185 return result;
186}
187
188//_____________________________________________________________________________
8480396b 189Bool_t AliCentralTrigger::RunTrigger( AliRunLoader* runLoader, const char *detectors )
a5a091ce 190{
191 // run the trigger
bacbe0fd 192
51f6d619 193 if( !fConfiguration ) {
194 AliError( "No trigger configuration loaded, skipping trigger" );
bacbe0fd 195 return kFALSE;
196 }
197
198 TTree *tree = runLoader->TreeCT();
199 if( !tree ) {
51f6d619 200 AliError( "No folder with trigger loaded, skipping trigger" );
a5a091ce 201 return kFALSE;
202 }
203
204 TStopwatch stopwatch;
205 stopwatch.Start();
bacbe0fd 206
a5a091ce 207 // Process each event
208 for( Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++ ) {
bacbe0fd 209 AliInfo( Form(" ***** Processing event %d *****\n", iEvent) );
210 runLoader->GetEvent( iEvent );
a5a091ce 211 // Get detectors involve
212 TString detStr = GetDetectors();
8480396b 213 AliInfo( Form(" Triggering Detectors: %s \n", detStr.Data() ) );
214 TString detWithDigits = detectors;
215 AliInfo( Form(" Detectors with digits: %s \n", detWithDigits.Data() ) );
a5a091ce 216 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
217 // Reset Mask
218 fClassMask = 0;
895affe8 219 fClusterMask = 0;
220 // Reset configuration object (inputs and classes)
221 fConfiguration->Reset();
bacbe0fd 222 TObjArray trgdetArray; // use as garbage collector
a5a091ce 223 for( Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++ ) {
224 AliModule* det = (AliModule*) detArray->At( iDet );
225 if( !det || !det->IsActive() ) continue;
8480396b 226 if( IsSelected(det->GetName(), detStr) &&
227 IsSelected(det->GetName(), detWithDigits) ) {
bacbe0fd 228
229 AliInfo( Form("Triggering from digits for %s", det->GetName() ) );
a5a091ce 230 AliTriggerDetector* trgdet = det->CreateTriggerDetector();
51f6d619 231 trgdet->CreateInputs(fConfiguration->GetInputs());
a5a091ce 232 TStopwatch stopwatchDet;
233 stopwatchDet.Start();
234 trgdet->Trigger();
235 AliInfo( Form("Execution time for %s: R:%.2fs C:%.2fs",
236 det->GetName(), stopwatchDet.RealTime(), stopwatchDet.CpuTime() ) );
bacbe0fd 237
bacbe0fd 238 trgdetArray.AddLast( trgdet );
239
240 // Write trigger detector in Event folder in Digits file
241 TString loadername = det->GetName();
242 loadername.Append( "Loader" );
243 AliLoader * loader = runLoader->GetLoader( loadername );
244 if( loader ) {
245 AliDataLoader * dataLoader = loader->GetDigitsDataLoader();
246 if( !dataLoader->IsFileOpen() ) {
247 if( dataLoader->OpenFile( "UPDATE" ) ) {
248 AliWarning( Form( "\n\nCan't write trigger for %s\n", det->GetName() ) );
249 }
250 }
251 dataLoader->Cd();
252 if( gFile && !gFile->IsWritable() ) {
253 gFile->ReOpen( "UPDATE" );
254 dataLoader->Cd();
255 }
256 trgdet->Write( "Trigger", TObject::kOverwrite );
257 dataLoader->CloseFile();
258 }
259 else AliWarning( Form( "Not loader found for %s", det->GetName() ) );
a5a091ce 260 }
261 }
262
263 // Check trigger conditions and create the trigger class mask
51f6d619 264 TriggerClasses();
bacbe0fd 265
a5a091ce 266 // Clear trigger detectors
267 trgdetArray.SetOwner();
268 trgdetArray.Delete();
269
270 if( (detStr.CompareTo( "ALL" ) != 0) && !detStr.IsNull() ) {
271 AliError( Form("the following detectors were not found: %s",
272 detStr.Data()));
e229562b 273 //JF return kFALSE;
a5a091ce 274 }
275
bacbe0fd 276 // Save trigger mask
277 tree->Fill();
278 AliInfo( Form("**************** Central Trigger Class Mask:0x%X", fClassMask ) );
a5a091ce 279 } // end event loop
a5a091ce 280
bacbe0fd 281 Reset();
282// cout << endl << " Print " << endl;
283// Print();
284
285 // Write
286 runLoader->WriteTrigger( "OVERWRITE" );
a5a091ce 287
bacbe0fd 288 return kTRUE;
289}
a5a091ce 290
291//_____________________________________________________________________________
51f6d619 292ULong64_t AliCentralTrigger::TriggerClasses()
a5a091ce 293{
51f6d619 294 // Check trigger conditions and create the trigger class
295 // and trigger cluster masks
296 if (fConfiguration) {
297 const TObjArray& classesArray = fConfiguration->GetClasses();
298 Int_t nclasses = classesArray.GetEntriesFast();
299 for( Int_t j=0; j<nclasses; j++ ) {
300 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
301 trclass->Trigger( fConfiguration->GetInputs(), fConfiguration->GetFunctions() );
302 fClassMask |= trclass->GetValue();
303 if (trclass->GetStatus())
304 fClusterMask |= (trclass->GetCluster())->GetClusterMask();
305 }
306 }
307 return fClassMask;
a5a091ce 308}
309//_____________________________________________________________________________
51f6d619 310TObjArray* AliCentralTrigger::GetFiredClasses() const
a5a091ce 311{
312 // return only the true conditions
313
314 TObjArray* result = new TObjArray();
315
51f6d619 316 if (fConfiguration) {
317 const TObjArray& classesArray = fConfiguration->GetClasses();
318 Int_t nclasses = classesArray.GetEntriesFast();
319 for( Int_t j=0; j<nclasses; j++ ) {
320 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
321 if( trclass->GetStatus() ) result->AddLast( trclass );
322 }
a5a091ce 323 }
324
325 return result;
326}
327
a5a091ce 328//_____________________________________________________________________________
329void AliCentralTrigger::Print( const Option_t* ) const
330{
331 // Print
332 cout << "Central Trigger: " << endl;
333 cout << " Trigger Class Mask: 0x" << hex << fClassMask << dec << endl;
51f6d619 334 if (fConfiguration) fConfiguration->Print();
a5a091ce 335 cout << endl;
336}
337
338
339//////////////////////////////////////////////////////////////////////////////
340// Helper method
341
342//_____________________________________________________________________________
343Bool_t AliCentralTrigger::IsSelected( TString detName, TString& detectors ) const
344{
345 // check whether detName is contained in detectors
346 // if yes, it is removed from detectors
347
348 // check if all detectors are selected
349 if( (detectors.CompareTo("ALL") == 0 ) ||
350 detectors.BeginsWith("ALL ") ||
351 detectors.EndsWith(" ALL") ||
352 detectors.Contains(" ALL ") ) {
353 detectors = "ALL";
354 return kTRUE;
355 }
356
357 // search for the given detector
358 Bool_t result = kFALSE;
359 if( (detectors.CompareTo( detName ) == 0) ||
360 detectors.BeginsWith( detName+" " ) ||
361 detectors.EndsWith( " "+detName ) ||
362 detectors.Contains( " "+detName+" " ) ) {
363 detectors.ReplaceAll( detName, "" );
364 result = kTRUE;
365 }
366
367 // clean up the detectors string
368 while( detectors.Contains(" ") ) detectors.ReplaceAll( " ", " " );
369 while( detectors.BeginsWith(" ") ) detectors.Remove( 0, 1 );
370 while( detectors.EndsWith(" ") ) detectors.Remove( detectors.Length()-1, 1 );
371
372 return result;
373}
67327b72 374
375//_____________________________________________________________________________
376TString AliCentralTrigger::GetTriggeredDetectors() const
377{
378 // Check the trigger mask, finds which trigger classes
379 // have been fired, load the corresponding trigger clusters and
380 // finally makes a list of the detectors that have been readout
381 // for each particular event
382
383 if (!fConfiguration) {
384 AliError("The trigger confiration has not yet been loaded!");
385 return "";
386 }
387
388 // Now loop over the trigger classes
389 const TObjArray& classesArray = fConfiguration->GetClasses();
390 Int_t nclasses = classesArray.GetEntriesFast();
391 UChar_t clustMask = 0;
392 for( Int_t j=0; j<nclasses; j++ ) {
393 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
394 if (trclass->GetMask() & fClassMask) { // class was fired
395 AliTriggerCluster *clust = trclass->GetCluster();
396 clustMask |= clust->GetClusterMask();
397 }
398 }
399
400 // Compare the stored cluster mask with the one
401 // that we get from trigger classes
402 // To be enables after we store the cluster mask in the trigger tree
403 // if (clustMask != fClusterMask)
404 // AliError(Form("Wrong cluster mask from trigger classes (%x), expecting (%x)!",(UInt_t)clustMask,(UInt_t)fClusterMask));
405
406 // Now loop over clusters and produce the string
407 // with the triggered detectors
408 TString trigDets;
409 const TObjArray& clustArray = fConfiguration->GetClusters();
410 Int_t nclust = clustArray.GetEntriesFast();
411 for( Int_t i=0; i<nclust; i++ ) {
412 AliTriggerCluster* clust = (AliTriggerCluster*)clustArray.At( i );
413 if (clustMask & clust->GetClusterMask()) { // the cluster was fired
414 TString detStr = clust->GetDetectorsInCluster();
415 TObjArray* det = detStr.Tokenize(" ");
416 Int_t ndet = det->GetEntriesFast();
417 for( Int_t j=0; j<ndet; j++ ) {
418 TString &detj = ((TObjString*)det->At(j))->String();
419 if((trigDets.CompareTo(detj) == 0) ||
420 trigDets.BeginsWith(detj) ||
421 trigDets.EndsWith(detj) ||
422 trigDets.Contains( " "+detj+" " )) continue;
423 trigDets.Append( " " );
424 trigDets.Append( detj );
425 }
426 }
427 }
428
429 return trigDets;
430}