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$ */
// Author: Andrei Gheata, 28/07/2009


#include "AliTrigDevice.h"

#include <TObjArray.h>
#include "AliTrigScheduler.h"
#include "AliTrigScheduledEntry.h"

ClassImp(AliTrigDevice)
//==============================================================================
//   AliTrigDevice - Generic device class. A device has a number of inputs and
// outputs. The data handled by the device can be either Boolean (digital
// devices) or arbitrary (wrapped by the class AliTrigSignal). A device must
// provide a response function that may depend on the output id. To replay the 
// device response function for a given output id, the device MUST register the
// output via the RegisterResponseFunction() method providing the delay in arbitrary time
// units. After the execution of the response for some output, the result will
// be propagated to all devices connected to this output. The method CreateDevice() 
// must be implemented by all devices and should connect all component devices
// and register all response functions. 
// The ResetInputs() method is called during simulation after the execution of 
// all response functions.
//==============================================================================

//______________________________________________________________________________
AliTrigDevice::AliTrigDevice()
              :TNamed(),
               fNinputs(0),
               fNoutputs(0),
               fScheduler(NULL),
               fComponents(NULL),
               fResponseFunctions(NULL) 
{
// I/O constructor.
}

//______________________________________________________________________________
AliTrigDevice::AliTrigDevice(const char *name, Int_t ninputs, Int_t noutputs)
              :TNamed(name, ""),
               fNinputs(ninputs),
               fNoutputs(noutputs),
               fScheduler(new AliTrigScheduler(name)),
               fComponents(NULL),
               fResponseFunctions(NULL) 
{
// Constructor.
}

//______________________________________________________________________________
AliTrigDevice::~AliTrigDevice()
{
// Destructor.
  delete fScheduler;
  if (fComponents) {fComponents->Delete(); delete fComponents;}
  if (fResponseFunctions) {fResponseFunctions->Delete(); delete fResponseFunctions;}
}   

//______________________________________________________________________________
void AliTrigDevice::AddDevice(AliTrigDevice *other)
{
// Add another device as component of this device.
  if (!fComponents) fComponents = new TObjArray();
  fComponents->Add(other);
}

//______________________________________________________________________________
Int_t AliTrigDevice::GetNcomponents() const
{
// Returns number of components.
  if (!fComponents) return 0;
  return fComponents->GetEntriesFast();
}

//______________________________________________________________________________
AliTrigDevice *AliTrigDevice::GetComponent(Int_t n)
{
// Get component at index n.
  if (!fComponents) return NULL;
  return (AliTrigDevice*)fComponents->At(n);
}

//______________________________________________________________________________
AliTrigScheduledResponse *AliTrigDevice::GetResponseFunction(const char *name)
{
// Get a response function by name.
  if (!fResponseFunctions) return NULL;
  return (AliTrigScheduledResponse*)fResponseFunctions->FindObject(name);
}  

//______________________________________________________________________________
AliTrigScheduledResponse *AliTrigDevice::RegisterResponseFunction(const char *name, Int_t output, Int_t delay)
{
// Creates a response function of the device. The delay argument is in arbitrary 
// time units with respect to the startup reference. Note that the created 
// scheduled entry must be registered to the device scheduler via: 
//    fDevice->AddScheduledEntry() method, otherwise it will not be replayed.
  if (!fResponseFunctions) fResponseFunctions = new TObjArray();
  if (fResponseFunctions->FindObject(name)) {
    Error("RegisterResponseFunction", "A response function named %s was already registered for device %s",
          name, GetName());
    return NULL;
  }        
  AliTrigScheduledResponse *response = new AliTrigScheduledResponse(name, (AliTrigDevice*)this, output, delay);
  fResponseFunctions->Add(response);
  return response;
}
 AliTrigDevice.cxx:1
 AliTrigDevice.cxx:2
 AliTrigDevice.cxx:3
 AliTrigDevice.cxx:4
 AliTrigDevice.cxx:5
 AliTrigDevice.cxx:6
 AliTrigDevice.cxx:7
 AliTrigDevice.cxx:8
 AliTrigDevice.cxx:9
 AliTrigDevice.cxx:10
 AliTrigDevice.cxx:11
 AliTrigDevice.cxx:12
 AliTrigDevice.cxx:13
 AliTrigDevice.cxx:14
 AliTrigDevice.cxx:15
 AliTrigDevice.cxx:16
 AliTrigDevice.cxx:17
 AliTrigDevice.cxx:18
 AliTrigDevice.cxx:19
 AliTrigDevice.cxx:20
 AliTrigDevice.cxx:21
 AliTrigDevice.cxx:22
 AliTrigDevice.cxx:23
 AliTrigDevice.cxx:24
 AliTrigDevice.cxx:25
 AliTrigDevice.cxx:26
 AliTrigDevice.cxx:27
 AliTrigDevice.cxx:28
 AliTrigDevice.cxx:29
 AliTrigDevice.cxx:30
 AliTrigDevice.cxx:31
 AliTrigDevice.cxx:32
 AliTrigDevice.cxx:33
 AliTrigDevice.cxx:34
 AliTrigDevice.cxx:35
 AliTrigDevice.cxx:36
 AliTrigDevice.cxx:37
 AliTrigDevice.cxx:38
 AliTrigDevice.cxx:39
 AliTrigDevice.cxx:40
 AliTrigDevice.cxx:41
 AliTrigDevice.cxx:42
 AliTrigDevice.cxx:43
 AliTrigDevice.cxx:44
 AliTrigDevice.cxx:45
 AliTrigDevice.cxx:46
 AliTrigDevice.cxx:47
 AliTrigDevice.cxx:48
 AliTrigDevice.cxx:49
 AliTrigDevice.cxx:50
 AliTrigDevice.cxx:51
 AliTrigDevice.cxx:52
 AliTrigDevice.cxx:53
 AliTrigDevice.cxx:54
 AliTrigDevice.cxx:55
 AliTrigDevice.cxx:56
 AliTrigDevice.cxx:57
 AliTrigDevice.cxx:58
 AliTrigDevice.cxx:59
 AliTrigDevice.cxx:60
 AliTrigDevice.cxx:61
 AliTrigDevice.cxx:62
 AliTrigDevice.cxx:63
 AliTrigDevice.cxx:64
 AliTrigDevice.cxx:65
 AliTrigDevice.cxx:66
 AliTrigDevice.cxx:67
 AliTrigDevice.cxx:68
 AliTrigDevice.cxx:69
 AliTrigDevice.cxx:70
 AliTrigDevice.cxx:71
 AliTrigDevice.cxx:72
 AliTrigDevice.cxx:73
 AliTrigDevice.cxx:74
 AliTrigDevice.cxx:75
 AliTrigDevice.cxx:76
 AliTrigDevice.cxx:77
 AliTrigDevice.cxx:78
 AliTrigDevice.cxx:79
 AliTrigDevice.cxx:80
 AliTrigDevice.cxx:81
 AliTrigDevice.cxx:82
 AliTrigDevice.cxx:83
 AliTrigDevice.cxx:84
 AliTrigDevice.cxx:85
 AliTrigDevice.cxx:86
 AliTrigDevice.cxx:87
 AliTrigDevice.cxx:88
 AliTrigDevice.cxx:89
 AliTrigDevice.cxx:90
 AliTrigDevice.cxx:91
 AliTrigDevice.cxx:92
 AliTrigDevice.cxx:93
 AliTrigDevice.cxx:94
 AliTrigDevice.cxx:95
 AliTrigDevice.cxx:96
 AliTrigDevice.cxx:97
 AliTrigDevice.cxx:98
 AliTrigDevice.cxx:99
 AliTrigDevice.cxx:100
 AliTrigDevice.cxx:101
 AliTrigDevice.cxx:102
 AliTrigDevice.cxx:103
 AliTrigDevice.cxx:104
 AliTrigDevice.cxx:105
 AliTrigDevice.cxx:106
 AliTrigDevice.cxx:107
 AliTrigDevice.cxx:108
 AliTrigDevice.cxx:109
 AliTrigDevice.cxx:110
 AliTrigDevice.cxx:111
 AliTrigDevice.cxx:112
 AliTrigDevice.cxx:113
 AliTrigDevice.cxx:114
 AliTrigDevice.cxx:115
 AliTrigDevice.cxx:116
 AliTrigDevice.cxx:117
 AliTrigDevice.cxx:118
 AliTrigDevice.cxx:119
 AliTrigDevice.cxx:120
 AliTrigDevice.cxx:121
 AliTrigDevice.cxx:122
 AliTrigDevice.cxx:123