]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONSimData.cxx
Updated list of MUON libraries
[u/mrichter/AliRoot.git] / MUON / AliMUONSimData.cxx
CommitLineData
990f8c6b 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 AliMUONSimData
19///
20/// Class containing MUON data: hits, digits, rawclusters, globaltrigger, localtrigger, etc ..
21/// The classe makes the lik between the MUON data lists and the event trees from loaders
22///
23/// \author Gines Martinez, Subatech, September 2003
24///
25
26#include "AliMUONSimData.h"
27#include "AliMUONDataIterator.h"
28#include "AliMUONConstants.h"
29#include "AliMUONHit.h"
30#include "AliMUONDigit.h"
31#include "AliMUONGlobalTrigger.h"
32#include "AliMUONLocalTrigger.h"
33#include "AliMUONRegionalTrigger.h"
34#include "AliMUONTriggerCrateStore.h"
35#include "AliMUONTriggerCircuit.h"
36#include "AliMUONGeometryTransformer.h"
37#include "AliMUONRawCluster.h"
38
39// This is from rec, classes in base should not depend on rec !!!
40//#include "AliMUONTrack.h"
41//#include "AliMUONTriggerTrack.h"
42
43#include "AliRunLoader.h"
44#include "AliStack.h"
45#include "AliLog.h"
46
47#include <TString.h>
48#include <TParticle.h>
49#include <TNtuple.h>
50#include <Riostream.h>
51#include <TFile.h>
52
53/// \cond CLASSIMP
54ClassImp(AliMUONSimData)
55/// \endcond
56
57//_____________________________________________________________________________
58AliMUONSimData::AliMUONSimData()
59 : AliMUONData(),
60 fHits(0x0),
61 //fSDigits(0x0),
62 fNhits(0)
63 //fNSdigits(0x0)
64{
65/// Default constructor
66}
67//_____________________________________________________________________________
68AliMUONSimData::AliMUONSimData(AliLoader * loader, const char* name, const char* title)
69 : AliMUONData(loader, name, title),
70 fHits(0x0),
71 //fSDigits(0x0),
72 fNhits(0)
73 //fNSdigits(0x0)
74{
75/// Standard constructor
76}
77
78//_____________________________________________________________________________
79AliMUONSimData::AliMUONSimData(const char* galiceFile)
80 : AliMUONData(galiceFile, "MUONFolderSim"),
81 fHits(0x0),
82 //fSDigits(0x0),
83 fNhits(0)
84 //fNSdigits(0x0)
85{
86/// Constructor for loading data from gAlice file
87}
88
89//_____________________________________________________________________________
90AliMUONSimData::~AliMUONSimData()
91{
92/// Destructor for AliMUONSimData
93 if (fHits) {
94 fHits->Delete();
95 delete fHits;
96 }
97/*
98 if (fSDigits) {
99 fSDigits->Delete();
100 delete fSDigits;
101 }
102*/
103}
104//____________________________________________________________________________
105void AliMUONSimData::AddHit(Int_t fIshunt, Int_t track, Int_t detElemId,
106 Int_t idpart, Float_t X, Float_t Y, Float_t Z,
107 Float_t tof, Float_t momentum, Float_t theta,
108 Float_t phi, Float_t length, Float_t destep,
109 Float_t Xref,Float_t Yref,Float_t Zref)
110{
111 /// Add new hit to the hit list
112
113 TClonesArray &lhits = *fHits;
114 new(lhits[fNhits++]) AliMUONHit(fIshunt, track, detElemId,
115 idpart, X, Y, Z,
116 tof, momentum, theta,
117 phi, length, destep,
118 Xref,Yref,Zref);
119}
120/*
121//_____________________________________________________________________________
122void AliMUONSimData::AddSDigit(Int_t id, const AliMUONDigit& Sdigit)
123{
124/// Add a MUON Sdigit to the list of SDigits of the detection plane id
125
126 TClonesArray &lSdigits = * SDigits(id) ;
127 new(lSdigits[fNSdigits[id]++]) AliMUONDigit(Sdigit);
128}
129
130//____________________________________________________________________________
131TClonesArray* AliMUONSimData::SDigits(Int_t DetectionPlane) const
132{
133/// Getting List of SDigits
134
135 if (fSDigits)
136 return ( (TClonesArray*) fSDigits->At(DetectionPlane) );
137 else
138 return NULL;
139}
140*/
141//____________________________________________________________________________
142void AliMUONSimData::FillOwn(Option_t* option)
143{
144/// Method to fill the trees
145
146 const char *cH = strstr(option,"H");
147 //const char *cS = strstr(option,"S"); // SDigits branches in TreeS
148
149 //const char *cRP = strstr(option,"RP"); // Reconstructed Particle in TreeP
150
151 // Filling TreeH
152 if ( TreeH() && cH )
153 {
154 TreeH()->Fill();
155 }
156/*
157 // Filling TreeS
158 if ( TreeS() && cS)
159 {
160 TreeS()->Fill();
161 }
162*/
163}
164
165//_____________________________________________________________________________
166void AliMUONSimData::MakeOwnBranch(Option_t* option)
167{
168/// Create Tree branches for the MUON.
169
170 const Int_t kBufferSize = 4000;
171 char branchname[30];
172
173 //Setting Data Container
174 SetDataContainer(option);
175
176 const char *cH = strstr(option,"H");
177 //const char *cS = strstr(option,"S"); // Digits branches in TreeS
178
179 TBranch * branch = 0x0;
180
181 // Creating Branches for Hits
182 if (TreeH() && cH) {
183 sprintf(branchname,"%sHits",GetName());
184 branch = TreeH()->GetBranch(branchname);
185 if (branch) {
186 AliInfo(Form("MakeBranch","Branch %s is already in tree.",branchname));
187 return ;
188 }
189 branch = TreeH()->Branch(branchname,&fHits,kBufferSize);
190 //Info("MakeBranch","Making Branch %s for hits \n",branchname);
191 }
192/*
193 //Creating Branches for SDigits
194 if (TreeS() && cS ) {
195 // one branch for Sdigits per chamber
196 for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) {
197 sprintf(branchname,"%sSDigits%d",GetName(),iDetectionPlane+1);
198 branch = 0x0;
199 branch = TreeS()->GetBranch(branchname);
200 if (branch) {
201 AliInfo(Form("Branch %s is already in tree.",branchname));
202 return;
203 }
204 TClonesArray * sdigits = SDigits(iDetectionPlane);
205 branch = TreeS()->Branch(branchname, &sdigits, kBufferSize,1);
206 //Info("MakeBranch","Making Branch %s for sdigits in detection plane %d\n",branchname,iDetectionPlane+1);
207 }
208 }
209*/
210}
211
212//____________________________________________________________________________
213void AliMUONSimData::SetOwnDataContainer(Option_t* option)
214{
215/// Setting data containers of muon data
216
217 const char *cH = strstr(option,"H");
218 //const char *cS = strstr(option,"S"); // SDigits
219 //const char *cRP = strstr(option,"RP"); // Reconstructed Particles
220 AliDebug(1,Form("option=%s",option));
221 //
222 // Clones array for hits
223 if ( cH ) {
224 if (fHits == 0x0) {
225 fHits = new TClonesArray("AliMUONHit",1000);
226 }
227 ResetHits();
228 }
229/*
230 //
231 // Container for Sdigits
232 if (cS) {
233 if (fSDigits == 0x0) {
234 AliDebug(1,"Creating fSDigits TObjArray");
235 fSDigits = new TObjArray(AliMUONConstants::NCh());
236 fNSdigits= new Int_t[AliMUONConstants::NCh()];
237 for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) {
238 TClonesArray* a = new TClonesArray("AliMUONDigit",10000);
239 a->SetOwner();
240 fSDigits->AddAt(a,i);
241 AliDebug(1,Form("fSDigits[%d]=%p",i,a));
242 fNSdigits[i]=0;
243 }
244 }
245 else {
246 AliDebug(1,Form("fSDigits already there = %p",fSDigits));
247 }
248 ResetSDigits();
249 }
250*/
251}
252
253//____________________________________________________________________________
254void AliMUONSimData::SetOwnTreeAddress(Option_t* option)
255{
256 // Setting Data containers
257 SetOwnDataContainer(option);
258
259/// Setting Addresses to the events trees
260
261 const char *cH = strstr(option,"H");
262 //const char *cS = strstr(option,"S"); // SDigits branches in TreeS
263
264 // Set branch address for the Hits, Digits, RawClusters, GlobalTrigger and LocalTrigger Tree.
265 char branchname[30];
266 TBranch * branch = 0x0;
267
268 AliDebug(1,Form("option=%s",option));
269 //
270 // Branch address for hit tree
271 if (TreeH() && fHits && cH) {
272 sprintf(branchname,"%sHits",GetName());
273 branch = TreeH()->GetBranch(branchname);
274 if (branch) {
275 // Info("SetTreeAddress","(%s) Setting for Hits",GetName());
276 branch->SetAddress(&fHits);
277 }
278 else { //can be invoked before branch creation
279 //AliWarning(Form("(%s) Failed for Hits. Can not find branch in tree.",GetName()));
280 }
281 }
282/*
283 //
284 // Branch address for Sdigit tree
285 if (TreeS() && fSDigits && cS) {
286 AliDebug(1,"Setting branch addresses");
287 for (int i=0; i<AliMUONConstants::NCh(); i++) {
288 sprintf(branchname,"%sSDigits%d",GetName(),i+1);
289 if (fSDigits) {
290 AliDebug(1,Form("TreeS=%p for ich=%d branchname=%s",
291 TreeS(),i,branchname));
292 branch = TreeS()->GetBranch(branchname);
293 TClonesArray * sdigits = SDigits(i);
294 if (branch) branch->SetAddress( &sdigits );
295 else AliWarning(Form("(%s) Failed for SDigits Detection plane %d. Can not find branch in tree.",GetName(),i));
296 }
297 }
298 }
299*/
300}
301
302//____________________________________________________________________________
303void AliMUONSimData::Fill(Option_t* option)
304{
305/// Method to fill the trees
306
307 AliMUONData::Fill(option);
308 FillOwn(option);
309}
310
311//_____________________________________________________________________________
312void AliMUONSimData::MakeBranch(Option_t* option)
313{
314/// Create Tree branches for the MUON.
315
316 AliMUONData::MakeBranch(option);
317 MakeOwnBranch(option);
318}
319
320//____________________________________________________________________________
321void AliMUONSimData::SetDataContainer(Option_t* option)
322{
323/// Setting data containers of muon data
324
325 AliMUONData::SetDataContainer(option);
326 SetOwnDataContainer(option);
327}
328
329//____________________________________________________________________________
330void AliMUONSimData::SetTreeAddress(Option_t* option)
331{
332 // Setting Data containers
333 SetDataContainer(option);
334
335 AliMUONData::SetTreeAddress(option);
336 SetOwnTreeAddress(option);
337}
338
339//____________________________________________________________________________
340Int_t
341AliMUONSimData::GetNtracks() const
342{
343/// Get number of entries in hits three
344
345 Int_t ntrk = 0;
346 if (fLoader && fLoader->TreeH())
347 ntrk = (Int_t) fLoader->TreeH()->GetEntries();
348 return ntrk;
349}
350/*
351//____________________________________________________________________________
352void AliMUONSimData::ResetSDigits()
353{
354/// Reset number of Sdigits and the Sdigits array for this detector
355
356 if (fSDigits == 0x0) return;
357 for ( int i=0;i<AliMUONConstants::NCh();i++ ) {
358 if ((*fSDigits)[i]) ((TClonesArray*)fSDigits->At(i))->Clear();
359 if (fNSdigits) fNSdigits[i]=0;
360 }
361}
362*/
363//______________________________________________________________________________
364void AliMUONSimData::ResetHits()
365{
366/// Reset number of clusters and the cluster array for this detector
367
368 fNhits = 0;
369 if (fHits) fHits->Clear();
370}
371
372//_____________________________________________________________________________
373void
374AliMUONSimData::DumpKine(Int_t event2Check)
375{
376/// Dump kinematics
377
378 fRunLoader->LoadKinematics("READ");
379
380 Int_t nevents = fRunLoader->GetNumberOfEvents();
381 for (Int_t ievent=0; ievent<nevents; ievent++) { // Event loop
382 if ( event2Check != 0 ) ievent=event2Check;
383
384 // Getting event ievent
385 fRunLoader->GetEvent(ievent);
386
387 // Stack of particle for this event
388 AliStack* stack = fRunLoader->Stack();
389
390 Int_t nparticles = (Int_t) fRunLoader->Stack()->GetNtrack();
391 printf(">>> Event %d, Number of particles is %d \n", ievent, nparticles);
392
393 for (Int_t iparticle=0; iparticle<nparticles; iparticle++) {
394 stack->Particle(iparticle)->Print("");
395 }
396 if (event2Check!=0) ievent=nevents;
397 }
398 fRunLoader->UnloadKinematics();
399}
400
401
402//_____________________________________________________________________________
403void
404AliMUONSimData::DumpHits(Int_t event2Check, Option_t* opt)
405{
406/// Dump hits
407
408 fLoader->LoadHits("READ");
409
410 // Event loop
411 Int_t nevents = fRunLoader->GetNumberOfEvents();
412 for (Int_t ievent=0; ievent<nevents; ievent++) {
413 if (event2Check!=0) ievent=event2Check;
414 printf(">>> Event %d \n",ievent);
415
416 // Getting event ievent
417 fRunLoader->GetEvent(ievent);
418 SetTreeAddress("H");
419
420 // Track loop
421 Int_t ntracks = (Int_t) GetNtracks();
422 for (Int_t itrack=0; itrack<ntracks; itrack++) {
423 //Getting List of Hits of Track itrack
424 GetTrack(itrack);
425
426 Int_t nhits = (Int_t) Hits()->GetEntriesFast();
427 printf(">>> Track %d, Number of hits %d \n",itrack,nhits);
428 for (Int_t ihit=0; ihit<nhits; ihit++) {
429 AliMUONHit* mHit = static_cast<AliMUONHit*>(Hits()->At(ihit));
430 mHit->Print(opt);
431 }
432 ResetHits();
433 }
434 if (event2Check!=0) ievent=nevents;
435 }
436 fLoader->UnloadHits();
437}
438/*
439//_____________________________________________________________________________
440void
441AliMUONSimData::DumpSDigits(Int_t event2Check, Option_t* opt)
442{
443/// Dump SDigits
444
445 fLoader->LoadSDigits("READ");
446
447 // Event loop
448 Int_t nevents = fRunLoader->GetNumberOfEvents();
449 for (Int_t ievent=0; ievent<nevents; ievent++) {
450 if (event2Check!=0) ievent=event2Check;
451 printf(">>> Event %d \n",ievent);
452
453 // Getting event ievent
454 fRunLoader->GetEvent(ievent);
455 SetTreeAddress("S");
456 GetSDigits();
457
458 // Loop on chambers
459 Int_t nchambers = AliMUONConstants::NCh(); ;
460 for (Int_t ichamber=0; ichamber<nchambers; ichamber++) {
461 TClonesArray* digits = SDigits(ichamber);
462
463 // Loop on Sdigits
464 Int_t ndigits = (Int_t)digits->GetEntriesFast();
465 for (Int_t idigit=0; idigit<ndigits; idigit++) {
466 AliMUONDigit* mDigit = static_cast<AliMUONDigit*>(digits->At(idigit));
467 mDigit->Print(opt);
468 }
469 }
470 ResetSDigits();
471 if (event2Check!=0) ievent=nevents;
472 }
473 fLoader->UnloadSDigits();
474}
475*/