1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 /// \class AliMUONTriggerStoreV1
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.
25 /// \author Laurent Aphecetche, Subatech
27 #include "AliMUONTriggerStoreV1.h"
29 #include "AliMUONGlobalTrigger.h"
30 #include "AliMUONLocalTrigger.h"
31 #include "AliMUONRegionalTrigger.h"
32 #include "AliMUONTreeManager.h"
33 #include <Riostream.h>
34 #include <TClonesArray.h>
38 ClassImp(AliMUONTriggerStoreV1)
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))
49 fLocal->SetOwner(kTRUE);
50 fRegional->SetOwner(kTRUE);
51 fGlobal->SetOwner(kTRUE);
52 fEmptyLocal->SetOwner(kTRUE);
55 //_____________________________________________________________________________
56 AliMUONTriggerStoreV1::~AliMUONTriggerStoreV1()
65 //_____________________________________________________________________________
67 AliMUONTriggerStoreV1::Add(const AliMUONLocalTrigger& localTrigger)
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.
78 if ( !localTrigger.IsNull() )
80 new((*fLocal)[fLocal->GetLast()+1]) AliMUONLocalTrigger(localTrigger);
85 new((*fEmptyLocal)[fEmptyLocal->GetLast()+1]) AliMUONLocalTrigger(localTrigger);
89 //_____________________________________________________________________________
91 AliMUONTriggerStoreV1::Connect(TTree& tree, Bool_t alone) const
93 /// Connect this store to the tree
94 AliMUONTreeManager tman;
97 Bool_t isMaking = ( tree.GetBranch("MUONLocalTrigger") == 0 );
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());
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());
118 //_____________________________________________________________________________
120 AliMUONTriggerStoreV1::SetGlobal(const AliMUONGlobalTrigger& globalTrigger)
122 /// Set the global information
123 new((*fGlobal)[0]) AliMUONGlobalTrigger(globalTrigger);
126 //_____________________________________________________________________________
128 AliMUONTriggerStoreV1::Add(const AliMUONRegionalTrigger& regionalTrigger)
130 /// Add regional information
131 new((*fRegional)[fRegional->GetLast()+1]) AliMUONRegionalTrigger(regionalTrigger);
134 //_____________________________________________________________________________
136 AliMUONTriggerStoreV1::CreateLocalIterator() const
138 /// Return iterator on local cards
139 return fLocal->MakeIterator();
142 //_____________________________________________________________________________
144 AliMUONTriggerStoreV1::CreateRegionalIterator() const
146 /// Return iterator on regional cards
147 return fRegional->MakeIterator();
150 //_____________________________________________________________________________
152 AliMUONTriggerStoreV1::FindLocal(Int_t boardNumber) const
154 /// Find a local board, by its *number* (not to be confused with its index,
155 /// which used to be the key)
158 for ( Int_t i = 0; i <= fLocal->GetLast(); ++i )
160 AliMUONLocalTrigger* local = static_cast<AliMUONLocalTrigger*>(fLocal->At(i));
161 if (local && local->LoCircuit()==boardNumber)
167 for ( Int_t i = 0; i <= fEmptyLocal->GetLast(); ++i )
169 AliMUONLocalTrigger* local = static_cast<AliMUONLocalTrigger*>(fEmptyLocal->At(i));
170 if (local && local->LoCircuit()==boardNumber)
176 if ( boardNumber>=1 && boardNumber<=234 )
178 AliMUONLocalTrigger empty;
179 empty.SetLoCircuit(boardNumber);
180 new((*fEmptyLocal)[fEmptyLocal->GetLast()+1]) AliMUONLocalTrigger(empty);
181 return FindLocal(boardNumber);
187 //_____________________________________________________________________________
188 AliMUONRegionalTrigger*
189 AliMUONTriggerStoreV1::FindRegional(Int_t boardNumber) const
191 /// Return a given regional board
192 for ( Int_t i = 0; i <= fRegional->GetLast(); ++i )
194 AliMUONRegionalTrigger* regional = static_cast<AliMUONRegionalTrigger*>(fRegional->At(i));
195 if (regional && regional->GetId()==boardNumber)
203 //_____________________________________________________________________________
204 AliMUONGlobalTrigger*
205 AliMUONTriggerStoreV1::Global() const
207 /// Return global trigger
208 return static_cast<AliMUONGlobalTrigger*>(fGlobal->At(0));
211 //_____________________________________________________________________________
213 AliMUONTriggerStoreV1::Clear(Option_t*)
217 fRegional->Clear("C");
219 fEmptyLocal->Clear("C");
222 //_____________________________________________________________________________
224 AliMUONTriggerStoreV1::GetSize() const
226 /// Number of non-empty local boards we hold
227 return fLocal->GetSize();
230 //_____________________________________________________________________________
232 AliMUONTriggerStoreV1::Print(Option_t* what, Option_t* opt) const
235 /// \param what used to tell what to print, can be GLOBAL, LOCAL, REGIONAL
237 /// \param opt is passed to the local, regional, global object
243 if ( swhat.Length() == 0 ) swhat = "ALL";
245 if ( swhat.Contains("GLOBAL") || swhat.Contains("ALL") )
249 cout << "Global:" << endl;
250 fGlobal->Print("",opt);
254 cout << "No GlobalTrigger information" << endl;
258 if ( fLocal && ( swhat.Contains("LOCAL")|| swhat.Contains("ALL") ) )
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)
265 AliMUONLocalTrigger* local;
268 while ( ( local = static_cast<AliMUONLocalTrigger*>(next()) ) )
270 if ( local->IsNull() ) ++n;
273 cout << Form("Local: %d cards (and %d null ones)",
274 fLocal->GetLast()+1,n) << endl;
278 while ( ( local = static_cast<AliMUONLocalTrigger*>(next()) ) )
280 if ( !local->IsNull() )
287 if ( fRegional && ( swhat.Contains("REGIONAL") || swhat.Contains("ALL") ) )
289 fRegional->Print("",opt);