]>
Commit | Line | Data |
---|---|---|
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 | // Author: Andrei Gheata, 28/07/2009 | |
18 | ||
19 | ||
20 | #include "AliTrigDevice.h" | |
21 | ||
22 | #include <TObjArray.h> | |
23 | #include "AliTrigScheduler.h" | |
24 | #include "AliTrigScheduledEntry.h" | |
25 | ||
26 | ClassImp(AliTrigDevice) | |
27 | //============================================================================== | |
28 | // AliTrigDevice - Generic device class. A device has a number of inputs and | |
29 | // outputs. The data handled by the device can be either Boolean (digital | |
30 | // devices) or arbitrary (wrapped by the class AliTrigSignal). A device must | |
31 | // provide a response function that may depend on the output id. To replay the | |
32 | // device response function for a given output id, the device MUST register the | |
33 | // output via the RegisterResponseFunction() method providing the delay in arbitrary time | |
34 | // units. After the execution of the response for some output, the result will | |
35 | // be propagated to all devices connected to this output. The method CreateDevice() | |
36 | // must be implemented by all devices and should connect all component devices | |
37 | // and register all response functions. | |
38 | // The ResetInputs() method is called during simulation after the execution of | |
39 | // all response functions. | |
40 | //============================================================================== | |
41 | ||
42 | //______________________________________________________________________________ | |
43 | AliTrigDevice::AliTrigDevice() | |
44 | :TNamed(), | |
45 | fNinputs(0), | |
46 | fNoutputs(0), | |
47 | fScheduler(NULL), | |
48 | fComponents(NULL), | |
49 | fResponseFunctions(NULL) | |
50 | { | |
51 | // I/O constructor. | |
52 | } | |
53 | ||
54 | //______________________________________________________________________________ | |
55 | AliTrigDevice::AliTrigDevice(const char *name, Int_t ninputs, Int_t noutputs) | |
56 | :TNamed(name, ""), | |
57 | fNinputs(ninputs), | |
58 | fNoutputs(noutputs), | |
59 | fScheduler(new AliTrigScheduler(name)), | |
60 | fComponents(NULL), | |
61 | fResponseFunctions(NULL) | |
62 | { | |
63 | // Constructor. | |
64 | } | |
65 | ||
66 | //______________________________________________________________________________ | |
67 | AliTrigDevice::~AliTrigDevice() | |
68 | { | |
69 | // Destructor. | |
70 | delete fScheduler; | |
71 | if (fComponents) {fComponents->Delete(); delete fComponents;} | |
72 | if (fResponseFunctions) {fResponseFunctions->Delete(); delete fResponseFunctions;} | |
73 | } | |
74 | ||
75 | //______________________________________________________________________________ | |
76 | void AliTrigDevice::AddDevice(AliTrigDevice *other) | |
77 | { | |
78 | // Add another device as component of this device. | |
79 | if (!fComponents) fComponents = new TObjArray(); | |
80 | fComponents->Add(other); | |
81 | } | |
82 | ||
83 | //______________________________________________________________________________ | |
84 | Int_t AliTrigDevice::GetNcomponents() const | |
85 | { | |
86 | // Returns number of components. | |
87 | if (!fComponents) return 0; | |
88 | return fComponents->GetEntriesFast(); | |
89 | } | |
90 | ||
91 | //______________________________________________________________________________ | |
92 | AliTrigDevice *AliTrigDevice::GetComponent(Int_t n) | |
93 | { | |
94 | // Get component at index n. | |
95 | if (!fComponents) return NULL; | |
96 | return (AliTrigDevice*)fComponents->At(n); | |
97 | } | |
98 | ||
99 | //______________________________________________________________________________ | |
100 | AliTrigScheduledResponse *AliTrigDevice::GetResponseFunction(const char *name) | |
101 | { | |
102 | // Get a response function by name. | |
103 | if (!fResponseFunctions) return NULL; | |
104 | return (AliTrigScheduledResponse*)fResponseFunctions->FindObject(name); | |
105 | } | |
106 | ||
107 | //______________________________________________________________________________ | |
108 | AliTrigScheduledResponse *AliTrigDevice::RegisterResponseFunction(const char *name, Int_t output, Int_t delay) | |
109 | { | |
110 | // Creates a response function of the device. The delay argument is in arbitrary | |
111 | // time units with respect to the startup reference. Note that the created | |
112 | // scheduled entry must be registered to the device scheduler via: | |
113 | // fDevice->AddScheduledEntry() method, otherwise it will not be replayed. | |
114 | if (!fResponseFunctions) fResponseFunctions = new TObjArray(); | |
115 | if (fResponseFunctions->FindObject(name)) { | |
116 | Error("RegisterResponseFunction", "A response function named %s was already registered for device %s", | |
117 | name, GetName()); | |
118 | return NULL; | |
119 | } | |
120 | AliTrigScheduledResponse *response = new AliTrigScheduledResponse(name, (AliTrigDevice*)this, output, delay); | |
121 | fResponseFunctions->Add(response); | |
122 | return response; | |
123 | } |