]>
Commit | Line | Data |
---|---|---|
dfbc1173 | 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 | /// \class AliMUONStopwatchGroup | |
19 | /// | |
20 | /// A class to group timers by name | |
21 | /// Typically used to time out some methods, e.g. | |
22 | /// | |
23 | /// AliMUONStopwatchGroup timers; | |
24 | /// | |
25 | /// void Class::Method() | |
26 | /// { | |
27 | /// timers.Start("Class","Method"); | |
28 | /// ... | |
29 | /// timers.Stop(); | |
30 | /// } | |
31 | /// | |
32 | /// and later on : | |
33 | /// | |
34 | /// timers.Print(); | |
35 | /// | |
36 | /// | |
37 | /// \author Laurent Aphecetche, Subatech | |
38 | ||
39 | #include "AliMUONStopwatchGroup.h" | |
40 | ||
41 | #include "AliLog.h" | |
42 | #include <TMap.h> | |
43 | #include <TObjString.h> | |
44 | #include <TStopwatch.h> | |
45 | #include <Riostream.h> | |
46 | ||
47 | /// \cond CLASSIMP | |
48 | ClassImp(AliMUONStopwatchGroup) | |
49 | /// \endcond | |
50 | ||
51 | //_____________________________________________________________________________ | |
52 | AliMUONStopwatchGroup::AliMUONStopwatchGroup() : TObject(), fTimers(new TMap) | |
53 | { | |
54 | /// Ctor | |
55 | fTimers->SetOwner(kTRUE); | |
56 | } | |
57 | ||
58 | //_____________________________________________________________________________ | |
59 | AliMUONStopwatchGroup::AliMUONStopwatchGroup(const AliMUONStopwatchGroup& other) : TObject(), fTimers(new TMap) | |
60 | { | |
61 | /// Copy ctor | |
62 | other.CopyTo(*this); | |
63 | } | |
64 | ||
65 | //_____________________________________________________________________________ | |
66 | AliMUONStopwatchGroup& | |
67 | AliMUONStopwatchGroup::operator=(const AliMUONStopwatchGroup& other) | |
68 | { | |
69 | /// Assignment | |
70 | Reset(); | |
71 | other.CopyTo(*this); | |
72 | return *this; | |
73 | } | |
74 | ||
75 | //_____________________________________________________________________________ | |
76 | AliMUONStopwatchGroup::~AliMUONStopwatchGroup() | |
77 | { | |
78 | /// Dtor | |
79 | Reset(); | |
80 | delete fTimers; | |
81 | } | |
82 | ||
83 | //_____________________________________________________________________________ | |
84 | void AliMUONStopwatchGroup::Continue(const char* detector, const char* method) | |
85 | { | |
86 | /// Resume a previously stop timer | |
87 | TStopwatch* t = Stopwatch(detector,method); | |
88 | if (t) | |
89 | { | |
90 | t->Continue(); | |
91 | } | |
92 | else | |
93 | { | |
94 | AliError(Form("No timer for %s/%s",detector,method)); | |
95 | } | |
96 | } | |
97 | ||
98 | //_____________________________________________________________________________ | |
99 | void | |
100 | AliMUONStopwatchGroup::CopyTo(AliMUONStopwatchGroup& other) const | |
101 | { | |
102 | /// Copy this to other | |
103 | TIter next(fTimers); | |
104 | TObjString* detector; | |
105 | ||
106 | while ( ( detector = static_cast<TObjString*>(next()) ) ) | |
107 | { | |
108 | TMap* m = static_cast<TMap*>(fTimers->GetValue(detector->String().Data())); | |
109 | TMap* otherm = new TMap; | |
110 | otherm->SetOwner(kTRUE); | |
111 | other.fTimers->Add(new TObjString(detector->String()),otherm); | |
112 | TIter next2(m); | |
113 | TObjString* method; | |
114 | while ( ( method = static_cast<TObjString*>(next2()) ) ) | |
115 | { | |
116 | TStopwatch* timer = static_cast<TStopwatch*>(m->GetValue(method->String().Data())); | |
117 | otherm->Add(new TObjString(method->String()),new TStopwatch(*timer)); | |
118 | } | |
119 | } | |
120 | } | |
121 | ||
122 | //_____________________________________________________________________________ | |
123 | Double_t AliMUONStopwatchGroup::CpuTime(const char* detector, const char* method) const | |
124 | { | |
125 | /// Return cpu time for a given timer | |
126 | TStopwatch* t = Stopwatch(detector,method); | |
127 | if (t) | |
128 | { | |
129 | return t->CpuTime(); | |
130 | } | |
131 | else | |
132 | { | |
133 | return 0; | |
134 | } | |
135 | } | |
136 | ||
137 | //_____________________________________________________________________________ | |
138 | TMap* | |
139 | AliMUONStopwatchGroup::Map(const char* detector) const | |
140 | { | |
141 | /// Return the map for a given "detector" | |
142 | return static_cast<TMap*>(fTimers->GetValue(detector)); | |
143 | } | |
144 | ||
145 | //_____________________________________________________________________________ | |
146 | void AliMUONStopwatchGroup::Print(Option_t* /*opt*/) const | |
147 | { | |
148 | /// Print all the timers we hold | |
149 | TIter next(fTimers); | |
150 | TObjString* detector; | |
151 | ||
152 | while ( ( detector = static_cast<TObjString*>(next()) ) ) | |
153 | { | |
154 | cout << detector->String() << endl; | |
155 | TMap* m = static_cast<TMap*>(fTimers->GetValue(detector->String().Data())); | |
156 | TIter next2(m); | |
157 | TObjString* method; | |
158 | while ( ( method = static_cast<TObjString*>(next2()) ) ) | |
159 | { | |
160 | TStopwatch* timer = static_cast<TStopwatch*>(m->GetValue(method->String().Data())); | |
161 | cout << Form(" %s R:%.2fs C:%.2fs (%d slices)", | |
162 | method->String().Data(),timer->RealTime(), | |
163 | timer->CpuTime(),timer->Counter()-1) << endl; | |
164 | } | |
165 | } | |
166 | } | |
167 | ||
168 | //_____________________________________________________________________________ | |
169 | Double_t | |
170 | AliMUONStopwatchGroup::RealTime(const char* detector, const char* method) const | |
171 | { | |
172 | /// Return real time of a given time | |
173 | TStopwatch* t = Stopwatch(detector,method); | |
174 | if (t) | |
175 | { | |
176 | return t->RealTime(); | |
177 | } | |
178 | else | |
179 | { | |
180 | return 0; | |
181 | } | |
182 | } | |
183 | ||
184 | //_____________________________________________________________________________ | |
185 | void | |
186 | AliMUONStopwatchGroup::Reset() | |
187 | { | |
188 | /// Reset | |
189 | TIter next(fTimers); | |
190 | TObjString* detector; | |
191 | ||
192 | while ( ( detector = static_cast<TObjString*>(next()) ) ) | |
193 | { | |
194 | TMap* m = static_cast<TMap*>(fTimers->GetValue(detector->String().Data())); | |
195 | m->DeleteAll(); | |
196 | } | |
197 | ||
198 | fTimers->DeleteAll(); | |
199 | } | |
200 | ||
201 | //_____________________________________________________________________________ | |
202 | void | |
203 | AliMUONStopwatchGroup::Start(const char* detector, const char* method) | |
204 | { | |
205 | /// Start a given time | |
206 | TStopwatch* t = Stopwatch(detector,method); | |
207 | if (!t) | |
208 | { | |
209 | TMap* m = Map(detector); | |
210 | if (!m) | |
211 | { | |
212 | m = new TMap; | |
213 | m->SetOwner(kTRUE); | |
214 | fTimers->Add(new TObjString(detector),m); | |
215 | } | |
216 | t = new TStopwatch; | |
217 | t->Start(kTRUE); | |
218 | t->Stop(); | |
219 | m->Add(new TObjString(method),t); | |
220 | } | |
221 | t->Start(kFALSE); | |
222 | } | |
223 | ||
224 | //_____________________________________________________________________________ | |
225 | void | |
226 | AliMUONStopwatchGroup::Stop(const char* detector, const char* method) | |
227 | { | |
228 | /// Stop a given timer | |
229 | TStopwatch* t = Stopwatch(detector,method); | |
230 | if (!t) | |
231 | { | |
232 | AliError(Form("No timer for %s/%s",detector,method)); | |
233 | } | |
234 | else | |
235 | { | |
236 | t->Stop(); | |
237 | } | |
238 | } | |
239 | ||
240 | //_____________________________________________________________________________ | |
241 | TStopwatch* | |
242 | AliMUONStopwatchGroup::Stopwatch(const char* detector, const char* method) const | |
243 | { | |
244 | /// Return the internal TStopwatch for a given timer | |
245 | TMap* m = Map(detector); | |
246 | if (m) | |
247 | { | |
248 | return static_cast<TStopwatch*>(m->GetValue(method)); | |
249 | } | |
250 | else | |
251 | { | |
252 | return 0x0; | |
253 | } | |
254 | } | |
255 |