ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Base Class for Detector specific Trigger                                 //                                                                           //
//                                                                           //
//                                                                           //
//                                                                           //
//                                                                           //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <Riostream.h>
#include <TNamed.h>
#include <TString.h>
#include <TObjArray.h>
#include <TRandom.h>


#include "AliLog.h"
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLoader.h"

#include "AliTriggerInput.h"
#include "AliTriggerDetector.h"


using std::endl;
using std::cout;
using std::hex;
using std::dec;
ClassImp( AliTriggerDetector )

//_____________________________________________________________________________
AliTriggerDetector::AliTriggerDetector() :
  TNamed(),
  fMask(0),
  fInputs()
{
   // Default constructor
}

//_____________________________________________________________________________
AliTriggerDetector::AliTriggerDetector(const AliTriggerDetector & de ):
  TNamed(de),
  fMask(de.fMask),
  fInputs(de.fInputs)
{
  // Copy constructor
  
}

//_____________________________________________________________________________
AliTriggerDetector::~AliTriggerDetector()
{
  // Destructor
  // Delete only inputs that are not
  // associated to the CTP
  Int_t ninputs = fInputs.GetEntriesFast();
  for(Int_t i = 0; i < ninputs; i++) {
    AliTriggerInput *inp = (AliTriggerInput *)fInputs.At(i);
    if (inp->GetSignature() == -1 &&
	inp->GetMask() == 0)
      delete fInputs.RemoveAt(i);
  }
}

//_____________________________________________________________________________
void AliTriggerDetector::AssignInputs(const TObjArray &inputs)
{
  // Cross-check the trigger inputs provided by the detector trigger
  // processor (TP) and the inputs defined in CTP
  // a) If the input is defined in the TP, but not in CTP it
  // will be generated but not used by CTP. It will be possibly stored
  // in the detector raw data if the hardware allows this.
  // b) If hte input is not defined in the TP, but is defined in CTP
  // then a warning is issued and the CTP simulation is working
  // with this input disabled.
 
   // Check if we have to create the inputs first
   if( fInputs.GetEntriesFast() == 0 ) {
     // Create the inputs that the detector can provide
     CreateInputs();
   }

   TString name = GetName();

   // Pointer to the available inputs provided by the detector
   TObjArray* availInputs = &fInputs;

   Int_t ninputs = inputs.GetEntriesFast();
   for( Int_t j=0; j<ninputs; j++ ) {
     AliTriggerInput *inp = (AliTriggerInput*)inputs.At(j);
     if ( name.CompareTo(inp->GetModule().Data()) ) continue;

     TObject *tempObj = availInputs->FindObject(inp->GetInputName().Data());
     if ( tempObj ) {
       Int_t tempIndex = availInputs->IndexOf(tempObj);
       delete availInputs->Remove(tempObj);
       fInputs.AddAt( inp, tempIndex );
       inp->Enable();
       AliDebug(1,Form("Trigger input (%s) is found in the CTP configuration. Therefore it is enabled for trigger detector (%s)",
		    inp->GetInputName().Data(),name.Data()));
     }
     else {
       AliWarning(Form("Trigger Input (%s) is not implemented for the trigger detector (%s) ! It will be disabled !",
		       inp->GetInputName().Data(),name.Data()));
     }
   }

   for( Int_t j=0; j<fInputs.GetEntriesFast(); j++ ) {
     AliTriggerInput *inp = (AliTriggerInput *)fInputs.At(j);
     if (inp->GetSignature() == -1 &&
	 inp->GetMask() == 0) {
       inp->Enable();
       AliDebug(1,Form("Trigger input (%s) was not found in the CTP configuration. Therefore it will be run in a stand-alone mode",
		    inp->GetInputName().Data()));
     }
   }

   fInputs.SetOwner(kFALSE);
}

//_____________________________________________________________________________
void AliTriggerDetector::CreateInputs()
{
   // Define the inputs to the Central Trigger Processor
   // This is a dummy version 
   
   // Do not create inputs again!!
   if( fInputs.GetEntriesFast() > 0 ) return;
   
   fInputs.AddLast( new AliTriggerInput( "TEST1_L0", "TEST", 0 ) );
   fInputs.AddLast( new AliTriggerInput( "TEST2_L0", "TEST", 0 ) );
   fInputs.AddLast( new AliTriggerInput( "TEST3_L0", "TEST", 0 ) );
}

//_____________________________________________________________________________
void AliTriggerDetector::Trigger()
{
   // This is a dummy version set all inputs in a random way

   AliWarning( Form( "Triggering dummy detector %s", GetName() ) );

   //  ********** Get Digits for the current event **********
   AliRunLoader* runLoader = AliRunLoader::Instance();
   AliInfo( Form( "Event %d", runLoader->GetEventNumber() ) );
   
   TString loadername = GetName(); 
   loadername.Append( "Loader" );
   AliLoader * loader = runLoader->GetLoader( loadername.Data() );
   if( loader ) {
      loader->LoadDigits( "READ" );
      TTree* digits = loader->TreeD();
      // Do something with the digits !!!
      if( digits ) { 
//         digits->Print();
      }   
      loader->UnloadDigits();
   }
   //  ******************************************************

   // set all inputs in a random way
   Int_t nInputs = fInputs.GetEntriesFast();
   for( Int_t j=0; j<nInputs; j++ ) {
      AliTriggerInput* in = (AliTriggerInput*)fInputs.At( j );
      if( gRandom->Rndm() > 0.5 ) {
         in->Set();
         fMask |= in->GetValue();
      }
   }
}

//_____________________________________________________________________________
void AliTriggerDetector::SetInput( TString& name )
{
   // Set Input by name
   SetInput( name.Data() );
}

//_____________________________________________________________________________
void AliTriggerDetector::SetInput( const char * name )
{
   // Set Input by name
   AliTriggerInput* in = ((AliTriggerInput*)fInputs.FindObject( name ));
   if( in ) {
      in->Set();
      fMask |= in->GetValue();
   } else
      AliError( Form( "There is not input named %s", name ) );
}

//_____________________________________________________________________________
void AliTriggerDetector::Print( const Option_t* opt ) const
{
   // Print
   cout << "Trigger Detector : " << GetName() << endl;
   cout << "  Trigger Class Mask: 0x" << hex << GetMask() << dec << endl;
   Int_t nInputs = fInputs.GetEntriesFast();
   for( Int_t j=0; j<nInputs; j++ ) {
      AliTriggerInput* in = (AliTriggerInput*)fInputs.At( j );
      in->Print( opt );
   }
}
 AliTriggerDetector.cxx:1
 AliTriggerDetector.cxx:2
 AliTriggerDetector.cxx:3
 AliTriggerDetector.cxx:4
 AliTriggerDetector.cxx:5
 AliTriggerDetector.cxx:6
 AliTriggerDetector.cxx:7
 AliTriggerDetector.cxx:8
 AliTriggerDetector.cxx:9
 AliTriggerDetector.cxx:10
 AliTriggerDetector.cxx:11
 AliTriggerDetector.cxx:12
 AliTriggerDetector.cxx:13
 AliTriggerDetector.cxx:14
 AliTriggerDetector.cxx:15
 AliTriggerDetector.cxx:16
 AliTriggerDetector.cxx:17
 AliTriggerDetector.cxx:18
 AliTriggerDetector.cxx:19
 AliTriggerDetector.cxx:20
 AliTriggerDetector.cxx:21
 AliTriggerDetector.cxx:22
 AliTriggerDetector.cxx:23
 AliTriggerDetector.cxx:24
 AliTriggerDetector.cxx:25
 AliTriggerDetector.cxx:26
 AliTriggerDetector.cxx:27
 AliTriggerDetector.cxx:28
 AliTriggerDetector.cxx:29
 AliTriggerDetector.cxx:30
 AliTriggerDetector.cxx:31
 AliTriggerDetector.cxx:32
 AliTriggerDetector.cxx:33
 AliTriggerDetector.cxx:34
 AliTriggerDetector.cxx:35
 AliTriggerDetector.cxx:36
 AliTriggerDetector.cxx:37
 AliTriggerDetector.cxx:38
 AliTriggerDetector.cxx:39
 AliTriggerDetector.cxx:40
 AliTriggerDetector.cxx:41
 AliTriggerDetector.cxx:42
 AliTriggerDetector.cxx:43
 AliTriggerDetector.cxx:44
 AliTriggerDetector.cxx:45
 AliTriggerDetector.cxx:46
 AliTriggerDetector.cxx:47
 AliTriggerDetector.cxx:48
 AliTriggerDetector.cxx:49
 AliTriggerDetector.cxx:50
 AliTriggerDetector.cxx:51
 AliTriggerDetector.cxx:52
 AliTriggerDetector.cxx:53
 AliTriggerDetector.cxx:54
 AliTriggerDetector.cxx:55
 AliTriggerDetector.cxx:56
 AliTriggerDetector.cxx:57
 AliTriggerDetector.cxx:58
 AliTriggerDetector.cxx:59
 AliTriggerDetector.cxx:60
 AliTriggerDetector.cxx:61
 AliTriggerDetector.cxx:62
 AliTriggerDetector.cxx:63
 AliTriggerDetector.cxx:64
 AliTriggerDetector.cxx:65
 AliTriggerDetector.cxx:66
 AliTriggerDetector.cxx:67
 AliTriggerDetector.cxx:68
 AliTriggerDetector.cxx:69
 AliTriggerDetector.cxx:70
 AliTriggerDetector.cxx:71
 AliTriggerDetector.cxx:72
 AliTriggerDetector.cxx:73
 AliTriggerDetector.cxx:74
 AliTriggerDetector.cxx:75
 AliTriggerDetector.cxx:76
 AliTriggerDetector.cxx:77
 AliTriggerDetector.cxx:78
 AliTriggerDetector.cxx:79
 AliTriggerDetector.cxx:80
 AliTriggerDetector.cxx:81
 AliTriggerDetector.cxx:82
 AliTriggerDetector.cxx:83
 AliTriggerDetector.cxx:84
 AliTriggerDetector.cxx:85
 AliTriggerDetector.cxx:86
 AliTriggerDetector.cxx:87
 AliTriggerDetector.cxx:88
 AliTriggerDetector.cxx:89
 AliTriggerDetector.cxx:90
 AliTriggerDetector.cxx:91
 AliTriggerDetector.cxx:92
 AliTriggerDetector.cxx:93
 AliTriggerDetector.cxx:94
 AliTriggerDetector.cxx:95
 AliTriggerDetector.cxx:96
 AliTriggerDetector.cxx:97
 AliTriggerDetector.cxx:98
 AliTriggerDetector.cxx:99
 AliTriggerDetector.cxx:100
 AliTriggerDetector.cxx:101
 AliTriggerDetector.cxx:102
 AliTriggerDetector.cxx:103
 AliTriggerDetector.cxx:104
 AliTriggerDetector.cxx:105
 AliTriggerDetector.cxx:106
 AliTriggerDetector.cxx:107
 AliTriggerDetector.cxx:108
 AliTriggerDetector.cxx:109
 AliTriggerDetector.cxx:110
 AliTriggerDetector.cxx:111
 AliTriggerDetector.cxx:112
 AliTriggerDetector.cxx:113
 AliTriggerDetector.cxx:114
 AliTriggerDetector.cxx:115
 AliTriggerDetector.cxx:116
 AliTriggerDetector.cxx:117
 AliTriggerDetector.cxx:118
 AliTriggerDetector.cxx:119
 AliTriggerDetector.cxx:120
 AliTriggerDetector.cxx:121
 AliTriggerDetector.cxx:122
 AliTriggerDetector.cxx:123
 AliTriggerDetector.cxx:124
 AliTriggerDetector.cxx:125
 AliTriggerDetector.cxx:126
 AliTriggerDetector.cxx:127
 AliTriggerDetector.cxx:128
 AliTriggerDetector.cxx:129
 AliTriggerDetector.cxx:130
 AliTriggerDetector.cxx:131
 AliTriggerDetector.cxx:132
 AliTriggerDetector.cxx:133
 AliTriggerDetector.cxx:134
 AliTriggerDetector.cxx:135
 AliTriggerDetector.cxx:136
 AliTriggerDetector.cxx:137
 AliTriggerDetector.cxx:138
 AliTriggerDetector.cxx:139
 AliTriggerDetector.cxx:140
 AliTriggerDetector.cxx:141
 AliTriggerDetector.cxx:142
 AliTriggerDetector.cxx:143
 AliTriggerDetector.cxx:144
 AliTriggerDetector.cxx:145
 AliTriggerDetector.cxx:146
 AliTriggerDetector.cxx:147
 AliTriggerDetector.cxx:148
 AliTriggerDetector.cxx:149
 AliTriggerDetector.cxx:150
 AliTriggerDetector.cxx:151
 AliTriggerDetector.cxx:152
 AliTriggerDetector.cxx:153
 AliTriggerDetector.cxx:154
 AliTriggerDetector.cxx:155
 AliTriggerDetector.cxx:156
 AliTriggerDetector.cxx:157
 AliTriggerDetector.cxx:158
 AliTriggerDetector.cxx:159
 AliTriggerDetector.cxx:160
 AliTriggerDetector.cxx:161
 AliTriggerDetector.cxx:162
 AliTriggerDetector.cxx:163
 AliTriggerDetector.cxx:164
 AliTriggerDetector.cxx:165
 AliTriggerDetector.cxx:166
 AliTriggerDetector.cxx:167
 AliTriggerDetector.cxx:168
 AliTriggerDetector.cxx:169
 AliTriggerDetector.cxx:170
 AliTriggerDetector.cxx:171
 AliTriggerDetector.cxx:172
 AliTriggerDetector.cxx:173
 AliTriggerDetector.cxx:174
 AliTriggerDetector.cxx:175
 AliTriggerDetector.cxx:176
 AliTriggerDetector.cxx:177
 AliTriggerDetector.cxx:178
 AliTriggerDetector.cxx:179
 AliTriggerDetector.cxx:180
 AliTriggerDetector.cxx:181
 AliTriggerDetector.cxx:182
 AliTriggerDetector.cxx:183
 AliTriggerDetector.cxx:184
 AliTriggerDetector.cxx:185
 AliTriggerDetector.cxx:186
 AliTriggerDetector.cxx:187
 AliTriggerDetector.cxx:188
 AliTriggerDetector.cxx:189
 AliTriggerDetector.cxx:190
 AliTriggerDetector.cxx:191
 AliTriggerDetector.cxx:192
 AliTriggerDetector.cxx:193
 AliTriggerDetector.cxx:194
 AliTriggerDetector.cxx:195
 AliTriggerDetector.cxx:196
 AliTriggerDetector.cxx:197
 AliTriggerDetector.cxx:198
 AliTriggerDetector.cxx:199
 AliTriggerDetector.cxx:200
 AliTriggerDetector.cxx:201
 AliTriggerDetector.cxx:202
 AliTriggerDetector.cxx:203
 AliTriggerDetector.cxx:204
 AliTriggerDetector.cxx:205
 AliTriggerDetector.cxx:206
 AliTriggerDetector.cxx:207
 AliTriggerDetector.cxx:208
 AliTriggerDetector.cxx:209
 AliTriggerDetector.cxx:210
 AliTriggerDetector.cxx:211
 AliTriggerDetector.cxx:212
 AliTriggerDetector.cxx:213
 AliTriggerDetector.cxx:214
 AliTriggerDetector.cxx:215
 AliTriggerDetector.cxx:216
 AliTriggerDetector.cxx:217
 AliTriggerDetector.cxx:218
 AliTriggerDetector.cxx:219
 AliTriggerDetector.cxx:220