Line data Source code
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 : /// \class AliMUONTriggerStoreV1
20 : ///
21 : /// Implementation of AliMUONVTriggerStore, which is backward compatible,
22 : /// i.e. should be able to read back old TreeR and TreeD files, produced
23 : /// before the introduction of the AliMUONVStore concept.
24 : ///
25 : /// \author Laurent Aphecetche, Subatech
26 : //-----------------------------------------------------------------------------
27 :
28 : #include "AliMUONTriggerStoreV1.h"
29 :
30 : #include "AliMUONGlobalTrigger.h"
31 : #include "AliMUONLocalTrigger.h"
32 : #include "AliMUONRegionalTrigger.h"
33 : #include "AliMUONTreeManager.h"
34 : #include <Riostream.h>
35 : #include <TClonesArray.h>
36 : #include <TTree.h>
37 :
38 : using std::cout;
39 : using std::endl;
40 : /// \cond CLASSIMP
41 18 : ClassImp(AliMUONTriggerStoreV1)
42 : /// \endcond
43 :
44 : //_____________________________________________________________________________
45 19 : AliMUONTriggerStoreV1::AliMUONTriggerStoreV1() : AliMUONVTriggerStore(),
46 57 : fLocal(new TClonesArray("AliMUONLocalTrigger",242)),
47 57 : fRegional(new TClonesArray("AliMUONRegionalTrigger",16)),
48 57 : fGlobal(new TClonesArray("AliMUONGlobalTrigger",1)),
49 57 : fEmptyLocal(new TClonesArray("AliMUONLocalTrigger",242))
50 95 : {
51 : /// ctor
52 19 : fLocal->SetOwner(kTRUE);
53 19 : fRegional->SetOwner(kTRUE);
54 19 : fGlobal->SetOwner(kTRUE);
55 19 : fEmptyLocal->SetOwner(kTRUE);
56 38 : }
57 :
58 : //_____________________________________________________________________________
59 : AliMUONTriggerStoreV1::~AliMUONTriggerStoreV1()
60 102 : {
61 : /// dtor
62 38 : delete fLocal;
63 38 : delete fRegional;
64 38 : delete fGlobal;
65 38 : delete fEmptyLocal;
66 51 : }
67 :
68 : //_____________________________________________________________________________
69 : void
70 : AliMUONTriggerStoreV1::Add(const AliMUONLocalTrigger& localTrigger)
71 : {
72 : /// Add local information
73 : /// If the local board has no information (IsNull), we
74 : /// add it in the fEmpty array
75 : /// This is really an implementation choice, to store empty boards
76 : /// in order to be able to return them, if asked for, as is the case
77 : /// in some client code. Note that only the non-empty boards
78 : /// are streamed to disk.
79 : ///
80 :
81 345092 : if ( !localTrigger.IsNull() )
82 : {
83 2399 : new((*fLocal)[fLocal->GetLast()+1]) AliMUONLocalTrigger(localTrigger);
84 :
85 : }
86 : else
87 : {
88 170147 : new((*fEmptyLocal)[fEmptyLocal->GetLast()+1]) AliMUONLocalTrigger(localTrigger);
89 : }
90 172546 : }
91 :
92 : //_____________________________________________________________________________
93 : Bool_t
94 : AliMUONTriggerStoreV1::Connect(TTree& tree, Bool_t alone) const
95 : {
96 : /// Connect this store to the tree
97 32 : AliMUONTreeManager tman;
98 : Bool_t ok(kTRUE);
99 :
100 64 : Bool_t isMaking = ( tree.GetBranch("MUONLocalTrigger") == 0 );
101 :
102 32 : if ( isMaking )
103 : {
104 48 : ok = ok && tman.MakeBranch(tree,ClassName(),"TClonesArray",
105 12 : "MUONLocalTrigger",LocalPtr());
106 48 : ok = ok && tman.MakeBranch(tree,ClassName(),"TClonesArray",
107 12 : "MUONRegionalTrigger",RegionalPtr());
108 48 : ok = ok && tman.MakeBranch(tree,ClassName(),"TClonesArray",
109 12 : "MUONGlobalTrigger",GlobalPtr());
110 12 : }
111 : else
112 : {
113 24 : if ( alone ) tman.UpdateBranchStatuses(tree,"Trigger");
114 60 : ok = ok && tman.SetAddress(tree,"MUONLocalTrigger",LocalPtr());
115 60 : ok = ok && tman.SetAddress(tree,"MUONRegionalTrigger",RegionalPtr());
116 60 : ok = ok && tman.SetAddress(tree,"MUONGlobalTrigger",GlobalPtr());
117 : }
118 32 : return ok;
119 32 : }
120 :
121 : //_____________________________________________________________________________
122 : void
123 : AliMUONTriggerStoreV1::SetGlobal(const AliMUONGlobalTrigger& globalTrigger)
124 : {
125 : /// Set the global information
126 1426 : new((*fGlobal)[0]) AliMUONGlobalTrigger(globalTrigger);
127 713 : }
128 :
129 : //_____________________________________________________________________________
130 : void
131 : AliMUONTriggerStoreV1::Add(const AliMUONRegionalTrigger& regionalTrigger)
132 : {
133 : /// Add regional information
134 22688 : new((*fRegional)[fRegional->GetLast()+1]) AliMUONRegionalTrigger(regionalTrigger);
135 11344 : }
136 :
137 : //_____________________________________________________________________________
138 : TIterator*
139 : AliMUONTriggerStoreV1::CreateLocalIterator() const
140 : {
141 : /// Return iterator on local cards
142 54 : return fLocal->MakeIterator();
143 : }
144 :
145 : //_____________________________________________________________________________
146 : TIterator*
147 : AliMUONTriggerStoreV1::CreateRegionalIterator() const
148 : {
149 : /// Return iterator on regional cards
150 0 : return fRegional->MakeIterator();
151 : }
152 :
153 : //_____________________________________________________________________________
154 : AliMUONLocalTrigger*
155 : AliMUONTriggerStoreV1::FindLocal(Int_t boardNumber) const
156 : {
157 : /// Find a local board, by its *number* (not to be confused with its index,
158 : /// which used to be the key)
159 : ///
160 :
161 29384 : for ( Int_t i = 0; i <= fLocal->GetLast(); ++i )
162 : {
163 10931 : AliMUONLocalTrigger* local = static_cast<AliMUONLocalTrigger*>(fLocal->At(i));
164 21862 : if (local && local->LoCircuit()==boardNumber)
165 : {
166 74 : return local;
167 : }
168 10857 : }
169 :
170 426248 : for ( Int_t i = 0; i <= fEmptyLocal->GetLast(); ++i )
171 : {
172 211747 : AliMUONLocalTrigger* local = static_cast<AliMUONLocalTrigger*>(fEmptyLocal->At(i));
173 423494 : if (local && local->LoCircuit()==boardNumber)
174 : {
175 944 : return local;
176 : }
177 210803 : }
178 :
179 918 : if ( boardNumber>=1 && boardNumber<=242 )
180 : {
181 914 : AliMUONLocalTrigger empty;
182 914 : empty.SetLoCircuit(boardNumber);
183 3656 : new((*fEmptyLocal)[fEmptyLocal->GetLast()+1]) AliMUONLocalTrigger(empty);
184 914 : return FindLocal(boardNumber);
185 914 : }
186 :
187 4 : return 0x0;
188 1936 : }
189 :
190 : //_____________________________________________________________________________
191 : AliMUONRegionalTrigger*
192 : AliMUONTriggerStoreV1::FindRegional(Int_t boardNumber) const
193 : {
194 : /// Return a given regional board
195 1152 : for ( Int_t i = 0; i <= fRegional->GetLast(); ++i )
196 : {
197 544 : AliMUONRegionalTrigger* regional = static_cast<AliMUONRegionalTrigger*>(fRegional->At(i));
198 1088 : if (regional && regional->GetId()==boardNumber)
199 : {
200 64 : return regional;
201 : }
202 480 : }
203 0 : return 0x0;
204 64 : }
205 :
206 : //_____________________________________________________________________________
207 : AliMUONGlobalTrigger*
208 : AliMUONTriggerStoreV1::Global() const
209 : {
210 : /// Return global trigger
211 1436 : return static_cast<AliMUONGlobalTrigger*>(fGlobal->At(0));
212 : }
213 :
214 : //_____________________________________________________________________________
215 : void
216 : AliMUONTriggerStoreV1::Clear(Option_t*)
217 : {
218 : /// Reset
219 2870 : fLocal->Clear("C");
220 1435 : fRegional->Clear("C");
221 1435 : fGlobal->Clear("C");
222 1435 : fEmptyLocal->Clear("C");
223 1435 : }
224 :
225 : //_____________________________________________________________________________
226 : Int_t
227 : AliMUONTriggerStoreV1::GetSize() const
228 : {
229 : /// Number of non-empty local boards we hold
230 0 : return fLocal->GetSize();
231 : }
232 :
233 : //_____________________________________________________________________________
234 : void
235 : AliMUONTriggerStoreV1::Print(Option_t* what, Option_t* opt) const
236 : {
237 : /// Printout
238 : /// \param what used to tell what to print, can be GLOBAL, LOCAL, REGIONAL
239 : /// or ALL
240 : /// \param opt is passed to the local, regional, global object
241 : ///
242 :
243 0 : TString swhat(what);
244 0 : swhat.ToUpper();
245 :
246 0 : if ( swhat.Length() == 0 ) swhat = "ALL";
247 :
248 0 : if ( swhat.Contains("GLOBAL") || swhat.Contains("ALL") )
249 : {
250 0 : if ( fGlobal )
251 : {
252 0 : cout << "Global:" << endl;
253 0 : fGlobal->Print("",opt);
254 : }
255 : else
256 : {
257 0 : cout << "No GlobalTrigger information" << endl;
258 : }
259 : }
260 :
261 0 : if ( fLocal && ( swhat.Contains("LOCAL")|| swhat.Contains("ALL") ) )
262 : {
263 : // make loops instead of just relying on fLocal
264 : // to insure backward compatibility with trees where all local boards where
265 : // stored (even null ones)
266 :
267 0 : TIter next(fLocal);
268 : AliMUONLocalTrigger* local;
269 : Int_t n(0);
270 :
271 0 : while ( ( local = static_cast<AliMUONLocalTrigger*>(next()) ) )
272 : {
273 0 : if ( local->IsNull() ) ++n;
274 : }
275 :
276 0 : cout << Form("Local: %d cards (and %d null ones)",
277 0 : fLocal->GetLast()+1,n) << endl;
278 :
279 0 : next.Reset();
280 :
281 0 : while ( ( local = static_cast<AliMUONLocalTrigger*>(next()) ) )
282 : {
283 0 : if ( !local->IsNull() )
284 : {
285 0 : local->Print(opt);
286 : }
287 : }
288 0 : }
289 :
290 0 : if ( fRegional && ( swhat.Contains("REGIONAL") || swhat.Contains("ALL") ) )
291 : {
292 0 : fRegional->Print("",opt);
293 : }
294 0 : }
295 :
|