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