]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PHOS/AliPHOSGetter.cxx
In ReadRaw(): create pulse generator in stack instead of heap, correct logics of...
[u/mrichter/AliRoot.git] / PHOS / AliPHOSGetter.cxx
CommitLineData
4ae78bb1 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
803d1ab0 16/* $Id$ */
4ae78bb1 17
18//_________________________________________________________________________
19// A singleton. This class should be used in the analysis stage to get
20// reconstructed objects: Digits, RecPoints, TrackSegments and RecParticles,
21// instead of directly reading them from galice.root file. This container
22// ensures, that one reads Digits, made of these particular digits, RecPoints,
23// made of these particular RecPoints, TrackSegments and RecParticles.
24// This becomes non trivial if there are several identical branches, produced with
25// different set of parameters.
26//
27// An example of how to use (see also class AliPHOSAnalyser):
28// AliPHOSGetter * gime = AliPHOSGetter::GetInstance("galice.root","test") ;
29// for(Int_t irecp = 0; irecp < gime->NRecParticles() ; irecp++)
30// AliPHOSRecParticle * part = gime->RecParticle(1) ;
31// ................
2a657981 32// gime->Event(event) ; // reads new event from galice.root
4ae78bb1 33//
2a657981 34//*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (RRC KI & SUBATECH)
35//*-- Completely redesigned by Dmitri Peressounko March 2001
4ae78bb1 36//
37//*-- YS June 2001 : renamed the original AliPHOSIndexToObject and make
38//*-- systematic usage of TFolders without changing the interface
39//////////////////////////////////////////////////////////////////////////////
40
4ae78bb1 41// --- ROOT system ---
88cb7938 42
d7b234dd 43#include <TFile.h>
44#include <TROOT.h>
45#include <TSystem.h>
46#include <TParticle.h>
a43c51c3 47#include <TF1.h>
e4d04cf1 48#include <TGraph.h>
2bb77d5e 49#include <TCanvas.h>
50#include <TStyle.h>
351dd634 51//#include <TFrame.h>
4ae78bb1 52
53// --- Standard library ---
4ae78bb1 54
55// --- AliRoot header files ---
024a7e64 56#include "AliESD.h"
57#include "AliHeader.h"
58#include "AliMC.h"
e957fea8 59#include "AliPHOS.h"
024a7e64 60#include "AliPHOSBeamTestEvent.h"
61#include "AliPHOSGetter.h"
62#include "AliPHOSLoader.h"
431a9211 63#include "AliPHOSPulseGenerator.h"
88cb7938 64#include "AliRunLoader.h"
65#include "AliStack.h"
d84933b0 66#include "AliCaloRawStream.h"
a43c51c3 67#include "AliRawReaderFile.h"
e4d04cf1 68#include "AliLog.h"
7ca0684e 69#include "AliCDBLocal.h"
70#include "AliCDBStorage.h"
9e1ceb13 71#include "AliCDBManager.h"
88cb7938 72
4ae78bb1 73ClassImp(AliPHOSGetter)
74
2bb77d5e 75AliPHOSGetter * AliPHOSGetter::fgObjGetter = 0 ;
76AliPHOSLoader * AliPHOSGetter::fgPhosLoader = 0;
77AliPHOSCalibData* AliPHOSGetter::fgCalibData = 0;
88cb7938 78Int_t AliPHOSGetter::fgDebug = 0;
79
80// TFile * AliPHOSGetter::fgFile = 0 ;
4ae78bb1 81
3663622c 82AliPHOSGetter::AliPHOSGetter() :
83 fBTE(0),
84 fLoadingStatus(),
85 fNPrimaries(0),
86 fPrimaries(0),
87 fESDFile(0),
88 fESDFileName(),
89 fESD(0),
90 fESDTree(0),
91 fRawDigits(kFALSE),
92 fcdb(0)
93{
94 // ctor: this is a singleton, the ctor should never be called but cint needs it as public
95 Fatal("ctor", "AliPHOSGetter is a singleton default ctor not callable") ;
96}
97
98
4ae78bb1 99//____________________________________________________________________________
3663622c 100AliPHOSGetter::AliPHOSGetter(const char* headerFile, const char* version, Option_t * openingOption) :
101 fBTE(0),
102 fLoadingStatus(),
103 fNPrimaries(0),
104 fPrimaries(0),
105 fESDFile(0),
106 fESDFileName(),
107 fESD(0),
108 fESDTree(0),
109 fRawDigits(kFALSE),
110 fcdb(0)
4ae78bb1 111{
88cb7938 112 // ctor only called by Instance()
4ae78bb1 113
88cb7938 114 AliRunLoader* rl = AliRunLoader::GetRunLoader(version) ;
115 if (!rl) {
116 rl = AliRunLoader::Open(headerFile, version, openingOption);
117 if (!rl) {
118 Fatal("AliPHOSGetter", "Could not find the Run Loader for %s - %s",headerFile, version) ;
119 return ;
120 }
121 if (rl->GetAliRun() == 0x0) {
122 rl->LoadgAlice();
123 gAlice = rl->GetAliRun(); // should be removed
12a7cec1 124 rl->LoadHeader();
88cb7938 125 }
fbf811ec 126 }
88cb7938 127 fgPhosLoader = dynamic_cast<AliPHOSLoader*>(rl->GetLoader("PHOSLoader"));
128 if ( !fgPhosLoader )
129 Error("AliPHOSGetter", "Could not find PHOSLoader") ;
130 else
131 fgPhosLoader->SetTitle(version);
132
88cb7938 133 // initialize data members
134 SetDebug(0) ;
135 fBTE = 0 ;
136 fPrimaries = 0 ;
137 fLoadingStatus = "" ;
d2713783 138
139 fESDFileName = rl->GetFileName() ; // this should be the galice.root file
140 fESDFileName.ReplaceAll("galice.root", "AliESDs.root") ;
95635748 141 fESDFile = 0 ;
677c8a30 142 fESD = 0 ;
143 fESDTree = 0 ;
66f895c8 144 fRawDigits = kFALSE ;
7ca0684e 145
88cb7938 146}
9bd3caba 147
3663622c 148AliPHOSGetter::AliPHOSGetter(const AliPHOSGetter & obj) :
149 TObject(obj),
150 fBTE(0),
151 fLoadingStatus(),
152 fNPrimaries(0),
153 fPrimaries(0),
154 fESDFile(0),
155 fESDFileName(),
156 fESD(0),
157 fESDTree(0),
158 fRawDigits(kFALSE),
159 fcdb(0)
160{
161 // cpy ctor requested by Coding Convention
162 Fatal("cpy ctor", "not implemented") ;
163}
164
165//____________________________________________________________________________
166AliPHOSGetter::AliPHOSGetter(Int_t /*i*/) :
167 fBTE(0),
168 fLoadingStatus(),
169 fNPrimaries(0),
170 fPrimaries(0),
171 fESDFile(0),
172 fESDFileName(),
173 fESD(0),
174 fESDTree(0),
175 fRawDigits(kFALSE),
176 fcdb(0)
177{
178 // special constructor for onflight
179}
180
181
88cb7938 182//____________________________________________________________________________
183AliPHOSGetter::~AliPHOSGetter()
184{
185 // dtor
66f895c8 186 if(fgPhosLoader){
187 delete fgPhosLoader ;
188 fgPhosLoader = 0 ;
189 }
190 if(fBTE){
191 delete fBTE ;
192 fBTE = 0 ;
193 }
194 if(fPrimaries){
195 fPrimaries->Delete() ;
196 delete fPrimaries ;
197 }
677c8a30 198 if (fESD)
199 delete fESD ;
200 if (fESDTree)
66f895c8 201 delete fESDTree ;
202
7c193632 203 fgObjGetter = 0;
0ef40383 204}
205
206//____________________________________________________________________________
207void AliPHOSGetter::Reset()
208{
209 // resets things in case the getter is called consecutively with different files
210 // the PHOS Loader is already deleted by the Run Loader
211
212 if (fPrimaries) {
213 fPrimaries->Delete() ;
214 delete fPrimaries ;
215 }
216 fgPhosLoader = 0;
217 fgObjGetter = 0;
88cb7938 218}
fbf811ec 219
88cb7938 220//____________________________________________________________________________
221AliPHOSClusterizer * AliPHOSGetter::Clusterizer()
222{
e957fea8 223 // Returns pointer to the Clusterizer task
88cb7938 224 AliPHOSClusterizer * rv ;
225 rv = dynamic_cast<AliPHOSClusterizer *>(PhosLoader()->Reconstructioner()) ;
226 if (!rv) {
227 Event(0, "R") ;
228 rv = dynamic_cast<AliPHOSClusterizer*>(PhosLoader()->Reconstructioner()) ;
229 }
230 return rv ;
231}
4ae78bb1 232
88cb7938 233//____________________________________________________________________________
2bb77d5e 234TObjArray * AliPHOSGetter::CpvRecPoints() const
88cb7938 235{
236 // asks the Loader to return the CPV RecPoints container
4ae78bb1 237
88cb7938 238 TObjArray * rv = 0 ;
239
240 rv = PhosLoader()->CpvRecPoints() ;
241 if (!rv) {
242 PhosLoader()->MakeRecPointsArray() ;
243 rv = PhosLoader()->CpvRecPoints() ;
244 }
245 return rv ;
246}
dca3a7c4 247
88cb7938 248//____________________________________________________________________________
2bb77d5e 249TClonesArray * AliPHOSGetter::Digits() const
88cb7938 250{
251 // asks the Loader to return the Digits container
7bb289a7 252
88cb7938 253 TClonesArray * rv = 0 ;
254 rv = PhosLoader()->Digits() ;
7bb289a7 255
88cb7938 256 if( !rv ) {
257 PhosLoader()->MakeDigitsArray() ;
258 rv = PhosLoader()->Digits() ;
4ae78bb1 259 }
88cb7938 260 return rv ;
261}
4b808d52 262
88cb7938 263//____________________________________________________________________________
264AliPHOSDigitizer * AliPHOSGetter::Digitizer()
265{
e957fea8 266 // Returns pointer to the Digitizer task
88cb7938 267 AliPHOSDigitizer * rv ;
268 rv = dynamic_cast<AliPHOSDigitizer *>(PhosLoader()->Digitizer()) ;
269 if (!rv) {
270 Event(0, "D") ;
271 rv = dynamic_cast<AliPHOSDigitizer *>(PhosLoader()->Digitizer()) ;
272 }
273 return rv ;
4ae78bb1 274}
fbf811ec 275
88cb7938 276
4ae78bb1 277//____________________________________________________________________________
2bb77d5e 278TObjArray * AliPHOSGetter::EmcRecPoints() const
0bc3b8ed 279{
88cb7938 280 // asks the Loader to return the EMC RecPoints container
d489fb96 281
88cb7938 282 TObjArray * rv = 0 ;
65549808 283
88cb7938 284 rv = PhosLoader()->EmcRecPoints() ;
285 if (!rv) {
286 PhosLoader()->MakeRecPointsArray() ;
287 rv = PhosLoader()->EmcRecPoints() ;
89165262 288 }
88cb7938 289 return rv ;
81bb1a45 290}
7a9d98f9 291
65549808 292//____________________________________________________________________________
2bb77d5e 293TClonesArray * AliPHOSGetter::TrackSegments() const
65549808 294{
88cb7938 295 // asks the Loader to return the TrackSegments container
296
297 TClonesArray * rv = 0 ;
298
299 rv = PhosLoader()->TrackSegments() ;
300 if (!rv) {
301 PhosLoader()->MakeTrackSegmentsArray() ;
302 rv = PhosLoader()->TrackSegments() ;
303 }
304 return rv ;
65549808 305}
4ae78bb1 306
0c87da39 307//____________________________________________________________________________
e957fea8 308AliPHOSTrackSegmentMaker * AliPHOSGetter::TrackSegmentMaker()
88cb7938 309{
e957fea8 310 // Returns pointer to the TrackSegmentMaker task
88cb7938 311 AliPHOSTrackSegmentMaker * rv ;
312 rv = dynamic_cast<AliPHOSTrackSegmentMaker *>(PhosLoader()->TrackSegmentMaker()) ;
313 if (!rv) {
314 Event(0, "T") ;
315 rv = dynamic_cast<AliPHOSTrackSegmentMaker *>(PhosLoader()->TrackSegmentMaker()) ;
0c87da39 316 }
88cb7938 317 return rv ;
0c87da39 318}
319
4ae78bb1 320//____________________________________________________________________________
2bb77d5e 321TClonesArray * AliPHOSGetter::RecParticles() const
4ae78bb1 322{
88cb7938 323 // asks the Loader to return the TrackSegments container
324
325 TClonesArray * rv = 0 ;
4ae78bb1 326
88cb7938 327 rv = PhosLoader()->RecParticles() ;
328 if (!rv) {
329 PhosLoader()->MakeRecParticlesArray() ;
330 rv = PhosLoader()->RecParticles() ;
b134c32f 331 }
88cb7938 332 return rv ;
4ae78bb1 333}
4ae78bb1 334//____________________________________________________________________________
fc7e2f43 335void AliPHOSGetter::Event(Int_t event, const char* opt)
4ae78bb1 336{
88cb7938 337 // Reads the content of all Tree's S, D and R
548f0134 338
66f895c8 339// if ( event >= MaxEvent() ) {
340// Error("Event", "%d not found in TreeE !", event) ;
341// return ;
342// }
4ae78bb1 343
88cb7938 344 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
df25f7dd 345
66f895c8 346// // checks if we are dealing with test-beam data
347// TBranch * btb = rl->TreeE()->GetBranch("AliPHOSBeamTestEvent") ;
348// if(btb){
349// if(!fBTE)
350// fBTE = new AliPHOSBeamTestEvent() ;
351// btb->SetAddress(&fBTE) ;
352// btb->GetEntry(event) ;
353// }
354// else{
355// if(fBTE){
356// delete fBTE ;
357// fBTE = 0 ;
358// }
359// }
88cb7938 360
361 // Loads the type of object(s) requested
b134c32f 362
88cb7938 363 rl->GetEvent(event) ;
364
66f895c8 365 if(strstr(opt,"X") || (strcmp(opt,"")==0)){
88cb7938 366 ReadPrimaries() ;
66f895c8 367 }
368
369 if(strstr(opt,"H") ){
88cb7938 370 ReadTreeH();
66f895c8 371 }
372
373 if(strstr(opt,"S") ){
88cb7938 374 ReadTreeS() ;
66f895c8 375 }
376
377 if(strstr(opt,"D") ){
88cb7938 378 ReadTreeD() ;
66f895c8 379 }
380
381 if(strstr(opt,"R") ){
88cb7938 382 ReadTreeR() ;
66f895c8 383 }
88cb7938 384
66f895c8 385 if( strstr(opt,"T") ){
88cb7938 386 ReadTreeT() ;
66f895c8 387 }
88cb7938 388
66f895c8 389 if( strstr(opt,"P") ){
88cb7938 390 ReadTreeP() ;
66f895c8 391 }
677c8a30 392
66f895c8 393 if( strstr(opt,"E") ){
677c8a30 394 ReadTreeE(event) ;
3cf4f75f 395 }
396
397}
398
399
400//____________________________________________________________________________
f5eaa851 401void AliPHOSGetter::Event(AliRawReader *rawReader, const char* opt, Bool_t isOldRCUFormat)
3cf4f75f 402{
403 // Reads the raw event from rawReader
f5eaa851 404 // isOldRCUFormat defines whenever to assume
405 // the old RCU format or not
f88e2313 406
3cf4f75f 407 if( strstr(opt,"W") ){
e1c29d81 408 rawReader->NextEvent();
f5eaa851 409 ReadRaw(rawReader,isOldRCUFormat) ;
66f895c8 410 }
95635748 411
88cb7938 412}
413
414
415//____________________________________________________________________________
416Int_t AliPHOSGetter::EventNumber() const
417 {
418 // return the current event number
419 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
420 return static_cast<Int_t>(rl->GetEventNumber()) ;
fbf811ec 421}
d489fb96 422
fbf811ec 423//____________________________________________________________________________
2bb77d5e 424 TClonesArray * AliPHOSGetter::Hits() const
fbf811ec 425{
88cb7938 426 // asks the loader to return the Hits container
427
428 TClonesArray * rv = 0 ;
429
430 rv = PhosLoader()->Hits() ;
431 if ( !rv ) {
432 PhosLoader()->LoadHits("read");
433 rv = PhosLoader()->Hits() ;
fbf811ec 434 }
88cb7938 435 return rv ;
436}
fbf811ec 437
88cb7938 438//____________________________________________________________________________
439AliPHOSGetter * AliPHOSGetter::Instance(const char* alirunFileName, const char* version, Option_t * openingOption)
440{
441 // Creates and returns the pointer of the unique instance
442 // Must be called only when the environment has changed
d489fb96 443
88cb7938 444 if(!fgObjGetter){ // first time the getter is called
445 fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;
fbf811ec 446 }
88cb7938 447 else { // the getter has been called previously
448 AliRunLoader * rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle());
449 if ( rl->GetFileName() == alirunFileName ) {// the alirunFile has the same name
450 // check if the file is already open
451 TFile * galiceFile = dynamic_cast<TFile *>(gROOT->FindObject(rl->GetFileName()) ) ;
452
453 if ( !galiceFile )
454 fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;
455
456 else { // the file is already open check the version name
457 TString currentVersionName = rl->GetEventFolder()->GetName() ;
458 TString newVersionName(version) ;
459 if (currentVersionName == newVersionName)
460 if(fgDebug)
461 ::Warning( "Instance", "Files with version %s already open", currentVersionName.Data() ) ;
462 else {
463 fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;
464 }
465 }
466 }
7fba1747 467 else {
468 AliRunLoader * rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle()) ;
e191bb57 469 if ( strstr(version, AliConfig::GetDefaultEventFolderName()) ) // false in case of merging
1c221c70 470 delete rl ;
88cb7938 471 fgObjGetter = new AliPHOSGetter(alirunFileName, version, openingOption) ;
7fba1747 472 }
48f12df6 473 }
88cb7938 474 if (!fgObjGetter)
95635748 475 ::Error("AliPHOSGetter::Instance", "Failed to create the PHOS Getter object") ;
88cb7938 476 else
477 if (fgDebug)
478 Print() ;
4ae78bb1 479
88cb7938 480 return fgObjGetter ;
4ae78bb1 481}
482
6ad0e528 483//____________________________________________________________________________
88cb7938 484AliPHOSGetter * AliPHOSGetter::Instance()
6ad0e528 485{
88cb7938 486 // Returns the pointer of the unique instance already defined
fbf811ec 487
95635748 488 if(!fgObjGetter && fgDebug)
489 ::Warning("AliPHOSGetter::Instance", "Getter not initialized") ;
6ad0e528 490
88cb7938 491 return fgObjGetter ;
492
6ad0e528 493}
494
495//____________________________________________________________________________
88cb7938 496Int_t AliPHOSGetter::MaxEvent() const
6ad0e528 497{
88cb7938 498 // returns the number of events in the run (from TE)
0bc3b8ed 499
88cb7938 500 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
501 return static_cast<Int_t>(rl->GetNumberOfEvents()) ;
6ad0e528 502}
503
504//____________________________________________________________________________
88cb7938 505TParticle * AliPHOSGetter::Primary(Int_t index) const
6ad0e528 506{
88cb7938 507 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
508 return rl->Stack()->Particle(index) ;
509}
6ad0e528 510
4ae78bb1 511//____________________________________________________________________________
88cb7938 512AliPHOS * AliPHOSGetter:: PHOS() const
4ae78bb1 513{
514 // returns the PHOS object
5c4bcd63 515 AliPHOSLoader * loader = 0;
516 static AliPHOSLoader * oldloader = 0;
517 static AliPHOS * phos = 0;
518
519 loader = PhosLoader();
520
521 if ( loader != oldloader) {
522 phos = dynamic_cast<AliPHOS*>(loader->GetModulesFolder()->FindObject("PHOS")) ;
523 oldloader = loader;
524 }
7a9d98f9 525 if (!phos)
88cb7938 526 if (fgDebug)
527 Warning("PHOS", "PHOS module not found in module folders: %s", PhosLoader()->GetModulesFolder()->GetName() ) ;
7a9d98f9 528 return phos ;
4ae78bb1 529}
530
88cb7938 531
532
533//____________________________________________________________________________
e957fea8 534AliPHOSPID * AliPHOSGetter::PID()
88cb7938 535{
e957fea8 536 // Returns pointer to the PID task
88cb7938 537 AliPHOSPID * rv ;
538 rv = dynamic_cast<AliPHOSPID *>(PhosLoader()->PIDTask()) ;
539 if (!rv) {
540 Event(0, "P") ;
541 rv = dynamic_cast<AliPHOSPID *>(PhosLoader()->PIDTask()) ;
542 }
543 return rv ;
544}
545
4ae78bb1 546//____________________________________________________________________________
88cb7938 547AliPHOSGeometry * AliPHOSGetter::PHOSGeometry() const
4ae78bb1 548{
0bc3b8ed 549 // Returns PHOS geometry
550
7a9d98f9 551 AliPHOSGeometry * rv = 0 ;
552 if (PHOS() )
553 rv = PHOS()->GetGeometry() ;
52c5f046 554 else {
555 rv = AliPHOSGeometry::GetInstance();
556 if (!rv) {
557 AliError("Could not find PHOS geometry! Loading the default one !");
558 rv = AliPHOSGeometry::GetInstance("IHEP","");
559 }
560 }
7a9d98f9 561 return rv ;
562}
4ae78bb1 563
cb34a1fa 564//____________________________________________________________________________
88cb7938 565TClonesArray * AliPHOSGetter::Primaries()
566{
567 // creates the Primaries container if needed
568 if ( !fPrimaries ) {
569 if (fgDebug)
570 Info("Primaries", "Creating a new TClonesArray for primaries") ;
571 fPrimaries = new TClonesArray("TParticle", 1000) ;
572 }
573 return fPrimaries ;
574}
575
576//____________________________________________________________________________
577void AliPHOSGetter::Print()
578{
579 // Print usefull information about the getter
580
581 AliRunLoader * rl = AliRunLoader::GetRunLoader(fgPhosLoader->GetTitle());
582 ::Info( "Print", "gAlice file is %s -- version name is %s", (rl->GetFileName()).Data(), rl->GetEventFolder()->GetName() ) ;
583}
cb34a1fa 584
88cb7938 585//____________________________________________________________________________
586void AliPHOSGetter::ReadPrimaries()
587{
588 // Read Primaries from Kinematics.root
cb34a1fa 589
88cb7938 590 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
cb34a1fa 591
88cb7938 592 // gets kine tree from the root file (Kinematics.root)
7fba1747 593 if ( ! rl->TreeK() ) { // load treeK the first time
88cb7938 594 rl->LoadKinematics() ;
7fba1747 595 }
88cb7938 596
7fba1747 597 fNPrimaries = (rl->GetHeader())->GetNtrack();
88cb7938 598 if (fgDebug)
599 Info( "ReadTreeK", "Found %d particles in event # %d", fNPrimaries, EventNumber() ) ;
cb34a1fa 600
cb34a1fa 601
88cb7938 602 // first time creates the container
603 if ( Primaries() )
604 fPrimaries->Clear() ;
cb34a1fa 605
88cb7938 606 Int_t index = 0 ;
607 for (index = 0 ; index < fNPrimaries; index++) {
608 new ((*fPrimaries)[index]) TParticle(*(Primary(index)));
cb34a1fa 609 }
cb34a1fa 610}
611
95635748 612//____________________________________________________________________________
d2713783 613Bool_t AliPHOSGetter::OpenESDFile()
95635748 614{
d2713783 615 //Open the ESD file
95635748 616 Bool_t rv = kTRUE ;
d2713783 617 if (!fESDFile) {
618 fESDFile = TFile::Open(fESDFileName) ;
619 if (!fESDFile )
620 return kFALSE ;
621 }
95635748 622 else if (fESDFile->IsOpen()) {
623 fESDFile->Close() ;
624 fESDFile = TFile::Open(fESDFileName) ;
625 }
626 if (!fESDFile->IsOpen())
627 rv = kFALSE ;
628 return rv ;
629}
630
45c1ce6f 631//____________________________________________________________________________
2bb77d5e 632void AliPHOSGetter::FitRaw(Bool_t lowGainFlag, TGraph * gLowGain, TGraph * gHighGain, TF1* signalF, Double_t & energy, Double_t & time) const
45c1ce6f 633{
634 // Fits the raw signal time distribution
635
636 const Int_t kNoiseThreshold = 0 ;
637 Double_t timezero1 = 0., timezero2 = 0., timemax = 0. ;
638 Double_t signal = 0., signalmax = 0. ;
44ae287e 639 time = 0. ;
640 energy = 0. ;
45c1ce6f 641
431a9211 642 // Create a shaper pulse object which contains all the shaper parameters
75d640cb 643 AliPHOSPulseGenerator pulse;
431a9211 644
45c1ce6f 645 if (lowGainFlag) {
646 timezero1 = timezero2 = signalmax = timemax = 0. ;
75d640cb 647 signalF->FixParameter(0, pulse.GetRawFormatLowCharge()) ;
648 signalF->FixParameter(1, pulse.GetRawFormatLowGain()) ;
45c1ce6f 649 Int_t index ;
75d640cb 650 for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
45c1ce6f 651 gLowGain->GetPoint(index, time, signal) ;
652 if (signal > kNoiseThreshold && timezero1 == 0.)
653 timezero1 = time ;
654 if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.)
655 timezero2 = time ;
656 if (signal > signalmax) {
657 signalmax = signal ;
658 timemax = time ;
659 }
660 }
431a9211 661 signalmax /=
75d640cb 662 pulse.RawResponseFunctionMax(pulse.GetRawFormatLowCharge(),
663 pulse.GetRawFormatLowGain()) ;
664 if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.GetRawFormatTimeMax() * 0.4 ) { // else its noise
45c1ce6f 665 signalF->SetParameter(2, signalmax) ;
666 signalF->SetParameter(3, timezero1) ;
2bb77d5e 667 gLowGain->Fit(signalF, "QRO", "", 0., timezero2); //, "QRON") ;
45c1ce6f 668 energy = signalF->GetParameter(2) ;
75d640cb 669 time = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
45c1ce6f 670 }
671 } else {
672 timezero1 = timezero2 = signalmax = timemax = 0. ;
75d640cb 673 signalF->FixParameter(0, pulse.GetRawFormatHighCharge()) ;
674 signalF->FixParameter(1, pulse.GetRawFormatHighGain()) ;
45c1ce6f 675 Int_t index ;
75d640cb 676 for (index = 0; index < pulse.GetRawFormatTimeBins(); index++) {
45c1ce6f 677 gHighGain->GetPoint(index, time, signal) ;
678 if (signal > kNoiseThreshold && timezero1 == 0.)
679 timezero1 = time ;
680 if (signal <= kNoiseThreshold && timezero1 > 0. && timezero2 == 0.)
681 timezero2 = time ;
682 if (signal > signalmax) {
683 signalmax = signal ;
684 timemax = time ;
685 }
686 }
75d640cb 687 signalmax /= pulse.RawResponseFunctionMax(pulse.GetRawFormatHighCharge(),
688 pulse.GetRawFormatHighGain()) ;;
689 if ( timezero1 + pulse.GetRawFormatTimePeak() < pulse.GetRawFormatTimeMax() * 0.4 ) { // else its noise
45c1ce6f 690 signalF->SetParameter(2, signalmax) ;
691 signalF->SetParameter(3, timezero1) ;
2bb77d5e 692 gHighGain->Fit(signalF, "QRO", "", 0., timezero2) ;
45c1ce6f 693 energy = signalF->GetParameter(2) ;
75d640cb 694 time = signalF->GetMaximumX() - pulse.GetRawFormatTimePeak() - pulse.GetRawFormatTimeTrigger() ;
45c1ce6f 695 }
696 }
44ae287e 697 if (time == 0) energy = 0 ;
45c1ce6f 698}
699
44ae287e 700//____________________________________________________________________________
701Int_t AliPHOSGetter::CalibrateRaw(Double_t energy, Int_t *relId)
702{
703 // Convert energy into digitized amplitude for a cell relId
704 // It is a user responsilibity to open CDB and set
705 // AliPHOSCalibData object by the following operators:
706 //
707 // AliCDBLocal *loc = new AliCDBLocal("deCalibDB");
708 // AliPHOSCalibData* clb = (AliPHOSCalibData*)AliCDBStorage::Instance()
709 // ->Get(path_to_calibdata,run_number);
710 // AliPHOSGetter* gime = AliPHOSGetter::Instance("galice.root");
711 // gime->SetCalibData(clb);
712
713 if (CalibData() == 0)
f88e2313 714 Warning("CalibrateRaw","Calibration DB is not initiated!");
44ae287e 715
716 Int_t module = relId[0];
f88e2313 717 Int_t column = relId[3];
718 Int_t row = relId[2];
719
720 Float_t gainFactor = 0.0015; // width of one Emc ADC channel in GeV
721 Float_t pedestal = 0.005; // Emc pedestals
722
723 if(CalibData()) {
724 gainFactor = CalibData()->GetADCchannelEmc (module,column,row);
725 pedestal = CalibData()->GetADCpedestalEmc(module,column,row);
726 }
727
44ae287e 728 Int_t amp = static_cast<Int_t>( (energy - pedestal) / gainFactor + 0.5 ) ;
729 return amp;
730}
a43c51c3 731//____________________________________________________________________________
f5eaa851 732Int_t AliPHOSGetter::ReadRaw(AliRawReader *rawReader,Bool_t isOldRCUFormat)
a43c51c3 733{
734 // reads the raw format data, converts it into digits format and store digits in Digits()
735 // container.
f5eaa851 736 // isOldRCUFormat = kTRUE in case of the old RCU
02e48b45 737 // format used in the raw data readout.
738 // Reimplemented by Boris Polichtchouk (Jul 2006)
739 // to make it working with the Jul-Aug 2006 beam test data.
740
d84933b0 741 AliCaloRawStream in(rawReader,"PHOS");
f5eaa851 742 in.SetOldRCUFormat(isOldRCUFormat);
a43c51c3 743
431a9211 744 // Create a shaper pulse object
75d640cb 745 AliPHOSPulseGenerator pulse;
746 TF1 * signalF = new TF1("signal", AliPHOSPulseGenerator::RawResponseFunction, 0, pulse.GetRawFormatTimeMax(), 4);
45c1ce6f 747 signalF->SetParNames("Charge", "Gain", "Amplitude", "TimeZero") ;
748
6a0d2265 749 Int_t relId[4], absId =0;
45c1ce6f 750 Bool_t lowGainFlag = kFALSE ;
2bb77d5e 751
a43c51c3 752 TClonesArray * digits = Digits() ;
02e48b45 753 digits->Clear() ;
754
6a0d2265 755 Int_t iBin = 0;
756 Int_t iDigit = 0 ;
69464fdb 757 Double_t energyHG = 0. ;
758 Double_t energyLG = 0. ;
6a0d2265 759 Double_t time = 0. ;
760 Int_t iOldDigit;
761 Bool_t seen;
762 TH1F* hLowGain = 0;
763 TH1F* hHighGain = 0;
19309784 764
45c1ce6f 765 while ( in.Next() ) { // PHOS entries loop
02e48b45 766
767 lowGainFlag = in.IsLowGain();
6a0d2265 768
769 // (Re)create histograms to store samples
770
771 if (lowGainFlag) {
772 if(!hLowGain)
773 hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
774 else
775 if(hLowGain->GetNbinsX() != in.GetTimeLength()) {
776 delete hLowGain;
777 hLowGain = new TH1F("hLowGain","Low gain",in.GetTimeLength(),0,in.GetTimeLength());
778 }
779 } else {
780 if(!hHighGain)
781 hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
782 else
783 if(hHighGain->GetNbinsX() != in.GetTimeLength()) {
784 delete hHighGain;
785 hHighGain = new TH1F("hHighGain","High gain",in.GetTimeLength(),0,in.GetTimeLength());
786 }
787 }
788
789 // Fill histograms with samples
02e48b45 790 if(lowGainFlag)
6a0d2265 791 hLowGain ->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
c89c49ca 792 else {
6a0d2265 793 hHighGain->SetBinContent(in.GetTimeLength()-iBin-1,in.GetSignal());
c89c49ca 794 }
19309784 795
02e48b45 796 iBin++;
797
6a0d2265 798 // Fit the full sample
02e48b45 799 if(iBin==in.GetTimeLength()) {
800 iBin=0;
801
02e48b45 802 // Temporarily we do not fit the sample graph, but
803 // take the energy from the graph maximum, and the pedestal from the 0th point
804 // 30 Aug 2006
69464fdb 805
6a0d2265 806 //FitRaw(lowGainFlag, hLowGain, hHighGain, signalF, energy, time);
69464fdb 807
6a0d2265 808 if(lowGainFlag) {
809 energyLG = hLowGain ->GetMaximum(); // "digit amplitude"
810// energyLG -= hLowGain ->GetBinContent(0); // "pedestal subtraction"
75d640cb 811 energyLG *= pulse.GetRawFormatHighLowGainFactor(); // *16
812 if(AliLog::GetGlobalDebugLevel()>3) {
813 AliDebug(4,Form("----Printing hLowGain: ----\n")) ;
814 hLowGain ->Print("all");
815 }
816 if(AliLog::GetGlobalDebugLevel()>2)
817 AliDebug(2,Form("(mod,col,row)=(%d,%d,%d), low gain energy=%f\n\n",
818 in.GetModule(),in.GetColumn(),in.GetRow(),energyLG));
6a0d2265 819 }
820
821 else {
822 energyHG = hHighGain->GetMaximum(); // "digit amplitude"
823// energyHG -= hHighGain->GetBinContent(0); // "pedestal subtraction"
75d640cb 824 if(AliLog::GetGlobalDebugLevel()>3) {
825 AliDebug(4,Form("----Printing hHighGain: ----\n"));
826 hHighGain->Print("all");
827 }
828 if(AliLog::GetGlobalDebugLevel()>2)
829 AliDebug(2,Form("(mod,col,row)=(%d,%d,%d), high gain energy=%f\n\n",
830 in.GetModule(),in.GetColumn(),in.GetRow(),energyHG));
45c1ce6f 831 }
69464fdb 832
6a0d2265 833 // Time is not evaluated for the moment (12.01.2007). To be implemented later.
02e48b45 834 time = -1;
835
69464fdb 836 relId[0] = in.GetModule()+1;
75d640cb 837 relId[1] = 0;
838 relId[2] = in.GetRow() +1;
839 relId[3] = in.GetColumn()+1;
6a0d2265 840 if(!PHOSGeometry()) AliFatal("Couldn't find PHOSGeometry!");
841 PHOSGeometry()->RelToAbsNumbering(relId, absId);
842
75d640cb 843 AliDebug(2,Form("relId=(mod,row,col)=(%d,%d,%d), absId=%d\n\n",
844 relId[0],relId[2],relId[3],absId));
845
6a0d2265 846 // Add low gain digit only if the high gain digit does not exist in the digits array
75d640cb 847 seen = kFALSE;
6a0d2265 848 if(lowGainFlag) {
75d640cb 849 for (iOldDigit=iDigit-1; iOldDigit==0; iOldDigit--) {
850 if ((dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit)))->GetId() == absId) {
6a0d2265 851 seen = kTRUE;
852 break;
853 }
854 }
855 if (!seen)
856 new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyLG,time);
857 energyLG = 0. ;
69464fdb 858 }
eef8bd53 859 // Add high gain digit only if it is not saturated;
860 // replace low gain digit by a high gain one
69464fdb 861 else {
eef8bd53 862 if (energyHG >= 1023) continue;
75d640cb 863 for (iOldDigit=iDigit-1; iOldDigit==0; iOldDigit--) {
864 if ((dynamic_cast<AliPHOSDigit*>(digits->At(iOldDigit)))->GetId() == absId) {
eef8bd53 865 digits->RemoveAt(iOldDigit);
866 new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyHG,time);
75d640cb 867 seen = kTRUE;
6a0d2265 868 break;
869 }
870 }
75d640cb 871 if (!seen)
872 new((*digits)[iDigit]) AliPHOSDigit(-1,absId,(Float_t)energyHG,time);
6a0d2265 873 energyHG = 0. ;
02e48b45 874 }
75d640cb 875 AliPHOSDigit *dig = dynamic_cast<AliPHOSDigit*>(digits->At(iDigit));
876 dig->Print();
6a0d2265 877 iDigit++;
66f895c8 878 }
44ae287e 879 }
45c1ce6f 880
02e48b45 881 // PHOS entries loop
882
883 digits->Sort() ;
75d640cb 884 digits->Print();
69464fdb 885
886 //!!!!for debug!!!
887 Int_t modMax=-111;
888 Int_t colMax=-111;
889 Int_t rowMax=-111;
890 Float_t eMax=-333;
891 //!!!for debug!!!
892
6a0d2265 893 for(iDigit=0; iDigit<digits->GetEntries(); iDigit++) {
69464fdb 894 AliPHOSDigit* digit = (AliPHOSDigit*)digits->At(iDigit);
895 if(digit->GetEnergy()>eMax) {
896 PHOSGeometry()->AbsToRelNumbering(digit->GetId(),relId);
897 eMax=digit->GetEnergy();
898 modMax=relId[0];
899 rowMax=relId[2];
900 colMax=relId[3];
901 }
902 }
19309784 903
6a0d2265 904 AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n\n",
905 modMax,colMax,rowMax,eMax));
69464fdb 906
19309784 907 delete signalF ;
6a0d2265 908 delete hHighGain;
909 delete hLowGain;
02e48b45 910
e4d04cf1 911 return digits->GetEntriesFast() ;
a43c51c3 912}
45c1ce6f 913
b0bba0af 914//____________________________________________________________________________
fd31ff92 915Int_t AliPHOSGetter::ReadTreeD() const
88cb7938 916{
917 // Read the Digits
b0bba0af 918
41c29fde 919 PhosLoader()->CleanDigits() ;
ff808dc7 920 PhosLoader()->LoadDigits("UPDATE") ;
921 PhosLoader()->LoadDigitizer("UPDATE") ;
88cb7938 922 return Digits()->GetEntries() ;
923}
7a9d98f9 924
b0bba0af 925//____________________________________________________________________________
fd31ff92 926Int_t AliPHOSGetter::ReadTreeH() const
88cb7938 927{
928 // Read the Hits
41c29fde 929 PhosLoader()->CleanHits() ;
88cb7938 930 // gets TreeH from the root file (PHOS.Hit.root)
41c29fde 931 //if ( !IsLoaded("H") ) {
88cb7938 932 PhosLoader()->LoadHits("UPDATE") ;
41c29fde 933 // SetLoaded("H") ;
934 //}
88cb7938 935 return Hits()->GetEntries() ;
936}
4ae78bb1 937
88cb7938 938//____________________________________________________________________________
fd31ff92 939Int_t AliPHOSGetter::ReadTreeR() const
88cb7938 940{
941 // Read the RecPoints
b0bba0af 942
41c29fde 943 PhosLoader()->CleanRecPoints() ;
88cb7938 944 // gets TreeR from the root file (PHOS.RecPoints.root)
41c29fde 945 //if ( !IsLoaded("R") ) {
88cb7938 946 PhosLoader()->LoadRecPoints("UPDATE") ;
947 PhosLoader()->LoadClusterizer("UPDATE") ;
41c29fde 948 // SetLoaded("R") ;
949 //}
f1611b7c 950
88cb7938 951 return EmcRecPoints()->GetEntries() ;
b0bba0af 952}
7a9d98f9 953
b0bba0af 954//____________________________________________________________________________
fd31ff92 955Int_t AliPHOSGetter::ReadTreeT() const
88cb7938 956{
957 // Read the TrackSegments
7a9d98f9 958
41c29fde 959 PhosLoader()->CleanTracks() ;
88cb7938 960 // gets TreeT from the root file (PHOS.TrackSegments.root)
41c29fde 961 //if ( !IsLoaded("T") ) {
88cb7938 962 PhosLoader()->LoadTracks("UPDATE") ;
963 PhosLoader()->LoadTrackSegmentMaker("UPDATE") ;
41c29fde 964 // SetLoaded("T") ;
965 //}
fbf811ec 966
88cb7938 967 return TrackSegments()->GetEntries() ;
968}
b0bba0af 969//____________________________________________________________________________
fd31ff92 970Int_t AliPHOSGetter::ReadTreeP() const
88cb7938 971{
41c29fde 972 // Read the RecParticles
88cb7938 973
41c29fde 974 PhosLoader()->CleanRecParticles() ;
975
88cb7938 976 // gets TreeT from the root file (PHOS.TrackSegments.root)
41c29fde 977 // if ( !IsLoaded("P") ) {
88cb7938 978 PhosLoader()->LoadRecParticles("UPDATE") ;
979 PhosLoader()->LoadPID("UPDATE") ;
41c29fde 980 // SetLoaded("P") ;
981 //}
7a9d98f9 982
88cb7938 983 return RecParticles()->GetEntries() ;
984}
985//____________________________________________________________________________
fd31ff92 986Int_t AliPHOSGetter::ReadTreeS() const
88cb7938 987{
988 // Read the SDigits
989
41c29fde 990 PhosLoader()->CleanSDigits() ;
88cb7938 991 // gets TreeS from the root file (PHOS.SDigits.root)
41c29fde 992 //if ( !IsLoaded("S") ) {
7b4c1168 993 PhosLoader()->LoadSDigits("READ") ;
994 PhosLoader()->LoadSDigitizer("READ") ;
41c29fde 995 // SetLoaded("S") ;
996 //}
b0bba0af 997
88cb7938 998 return SDigits()->GetEntries() ;
999}
f1611b7c 1000
677c8a30 1001//____________________________________________________________________________
1002Int_t AliPHOSGetter::ReadTreeE(Int_t event)
1003{
1004 // Read the ESD
1005
1006 // gets esdTree from the root file (AliESDs.root)
1007 if (!fESDFile)
1008 if ( !OpenESDFile() )
1009 return -1 ;
1010
1011 fESDTree = static_cast<TTree*>(fESDFile->Get("esdTree")) ;
1012 fESD = new AliESD;
1013 if (!fESDTree) {
1014
1015 Error("ReadTreeE", "no ESD tree found");
1016 return -1;
1017 }
1018 fESDTree->SetBranchAddress("ESD", &fESD);
1019 fESDTree->GetEvent(event);
1020
1021 return event ;
1022}
1023
88cb7938 1024//____________________________________________________________________________
2bb77d5e 1025TClonesArray * AliPHOSGetter::SDigits() const
88cb7938 1026{
1027 // asks the Loader to return the Digits container
b0bba0af 1028
88cb7938 1029 TClonesArray * rv = 0 ;
1030
1031 rv = PhosLoader()->SDigits() ;
1032 if (!rv) {
1033 PhosLoader()->MakeSDigitsArray() ;
1034 rv = PhosLoader()->SDigits() ;
1035 }
1036 return rv ;
b0bba0af 1037}
1038
1039//____________________________________________________________________________
e957fea8 1040AliPHOSSDigitizer * AliPHOSGetter::SDigitizer()
88cb7938 1041{
e957fea8 1042 // Returns pointer to the SDigitizer task
88cb7938 1043 AliPHOSSDigitizer * rv ;
1044 rv = dynamic_cast<AliPHOSSDigitizer *>(PhosLoader()->SDigitizer()) ;
1045 if (!rv) {
1046 Event(0, "S") ;
1047 rv = dynamic_cast<AliPHOSSDigitizer *>(PhosLoader()->SDigitizer()) ;
b0bba0af 1048 }
88cb7938 1049 return rv ;
b0bba0af 1050}
7a9d98f9 1051
b0bba0af 1052//____________________________________________________________________________
fc7e2f43 1053TParticle * AliPHOSGetter::Secondary(const TParticle* p, Int_t index) const
88cb7938 1054{
1055 // Return first (index=1) or second (index=2) secondary particle of primary particle p
1056
1057 if(index <= 0)
1058 return 0 ;
1059 if(index > 2)
1060 return 0 ;
b0bba0af 1061
88cb7938 1062 if(p) {
1063 Int_t daughterIndex = p->GetDaughter(index-1) ;
1064 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
5d12ce38 1065 return rl->GetAliRun()->GetMCApp()->Particle(daughterIndex) ;
88cb7938 1066 }
1067 else
1068 return 0 ;
1069}
4ae78bb1 1070
88cb7938 1071//____________________________________________________________________________
fc7e2f43 1072void AliPHOSGetter::Track(Int_t itrack)
88cb7938 1073{
1074 // Read the first entry of PHOS branch in hit tree gAlice->TreeH()
1075
1076 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
b0bba0af 1077
88cb7938 1078 if( !TreeH() ) // load treeH the first time
1079 rl->LoadHits() ;
b0bba0af 1080
88cb7938 1081 // first time create the container
1082 TClonesArray * hits = Hits() ;
1083 if ( hits )
1084 hits->Clear() ;
b0bba0af 1085
88cb7938 1086 TBranch * phosbranch = dynamic_cast<TBranch*>(TreeH()->GetBranch("PHOS")) ;
1087 phosbranch->SetAddress(&hits) ;
1088 phosbranch->GetEntry(itrack) ;
b0bba0af 1089}
1090
b0bba0af 1091//____________________________________________________________________________
88cb7938 1092TTree * AliPHOSGetter::TreeD() const
1093{
e957fea8 1094 // Returns pointer to the Digits Tree
88cb7938 1095 TTree * rv = 0 ;
1096 rv = PhosLoader()->TreeD() ;
1097 if ( !rv ) {
1098 PhosLoader()->MakeTree("D");
1099 rv = PhosLoader()->TreeD() ;
b0bba0af 1100 }
b0bba0af 1101
88cb7938 1102 return rv ;
b0bba0af 1103}
548f0134 1104
b0bba0af 1105//____________________________________________________________________________
88cb7938 1106TTree * AliPHOSGetter::TreeH() const
1107{
e957fea8 1108 // Returns pointer to the Hits Tree
88cb7938 1109 TTree * rv = 0 ;
1110 rv = PhosLoader()->TreeH() ;
1111 if ( !rv ) {
1112 PhosLoader()->MakeTree("H");
1113 rv = PhosLoader()->TreeH() ;
1114 }
1115
1116 return rv ;
b0bba0af 1117}
7a9d98f9 1118
b0bba0af 1119//____________________________________________________________________________
88cb7938 1120TTree * AliPHOSGetter::TreeR() const
0bc3b8ed 1121{
e957fea8 1122 // Returns pointer to the RecPoints Tree
88cb7938 1123 TTree * rv = 0 ;
1124 rv = PhosLoader()->TreeR() ;
1125 if ( !rv ) {
1126 PhosLoader()->MakeTree("R");
1127 rv = PhosLoader()->TreeR() ;
1128 }
b0bba0af 1129
88cb7938 1130 return rv ;
b0bba0af 1131}
1132
b0bba0af 1133//____________________________________________________________________________
88cb7938 1134TTree * AliPHOSGetter::TreeT() const
0bc3b8ed 1135{
e957fea8 1136 // Returns pointer to the TrackSegments Tree
88cb7938 1137 TTree * rv = 0 ;
1138 rv = PhosLoader()->TreeT() ;
1139 if ( !rv ) {
1140 PhosLoader()->MakeTree("T");
1141 rv = PhosLoader()->TreeT() ;
1142 }
b0bba0af 1143
88cb7938 1144 return rv ;
b0bba0af 1145}
b0bba0af 1146//____________________________________________________________________________
88cb7938 1147TTree * AliPHOSGetter::TreeP() const
0bc3b8ed 1148{
e957fea8 1149 // Returns pointer to the RecParticles Tree
88cb7938 1150 TTree * rv = 0 ;
1151 rv = PhosLoader()->TreeP() ;
1152 if ( !rv ) {
1153 PhosLoader()->MakeTree("P");
1154 rv = PhosLoader()->TreeP() ;
1155 }
4ae78bb1 1156
88cb7938 1157 return rv ;
b0bba0af 1158}
1159
1160//____________________________________________________________________________
88cb7938 1161TTree * AliPHOSGetter::TreeS() const
e957fea8 1162{
1163 // Returns pointer to the SDigits Tree
88cb7938 1164 TTree * rv = 0 ;
1165 rv = PhosLoader()->TreeS() ;
1166 if ( !rv ) {
1167 PhosLoader()->MakeTree("S");
1168 rv = PhosLoader()->TreeS() ;
b0bba0af 1169 }
b0bba0af 1170
88cb7938 1171 return rv ;
b0bba0af 1172}
7a9d98f9 1173
b0bba0af 1174//____________________________________________________________________________
88cb7938 1175Bool_t AliPHOSGetter::VersionExists(TString & opt) const
1176{
1177 // checks if the version with the present name already exists in the same directory
7a9d98f9 1178
88cb7938 1179 Bool_t rv = kFALSE ;
1180
1181 AliRunLoader * rl = AliRunLoader::GetRunLoader(PhosLoader()->GetTitle());
1182 TString version( rl->GetEventFolder()->GetName() ) ;
7a9d98f9 1183
88cb7938 1184 opt.ToLower() ;
b0bba0af 1185
88cb7938 1186 if ( opt == "sdigits") {
1187 // add the version name to the root file name
1188 TString fileName( PhosLoader()->GetSDigitsFileName() ) ;
e191bb57 1189 if (version != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
88cb7938 1190 fileName = fileName.ReplaceAll(".root", "") + "_" + version + ".root" ;
1191 if ( !(gSystem->AccessPathName(fileName)) ) {
1192 Warning("VersionExists", "The file %s already exists", fileName.Data()) ;
1193 rv = kTRUE ;
4ae78bb1 1194 }
88cb7938 1195 PhosLoader()->SetSDigitsFileName(fileName) ;
b0bba0af 1196 }
7a9d98f9 1197
88cb7938 1198 if ( opt == "digits") {
1199 // add the version name to the root file name
1200 TString fileName( PhosLoader()->GetDigitsFileName() ) ;
e191bb57 1201 if (version != AliConfig::GetDefaultEventFolderName()) // only if not the default folder name
88cb7938 1202 fileName = fileName.ReplaceAll(".root", "") + "_" + version + ".root" ;
1203 if ( !(gSystem->AccessPathName(fileName)) ) {
1204 Warning("VersionExists", "The file %s already exists", fileName.Data()) ;
1205 rv = kTRUE ;
7a9d98f9 1206 }
b0bba0af 1207 }
7a9d98f9 1208
88cb7938 1209 return rv ;
7a9d98f9 1210
b0bba0af 1211}
88cb7938 1212
7bb289a7 1213//____________________________________________________________________________
88cb7938 1214UShort_t AliPHOSGetter::EventPattern(void) const
0bc3b8ed 1215{
1216 // Return the pattern (trigger bit register) of the beam-test event
7bb289a7 1217 if(fBTE)
1218 return fBTE->GetPattern() ;
1219 else
1220 return 0 ;
1221}
1222//____________________________________________________________________________
88cb7938 1223Float_t AliPHOSGetter::BeamEnergy(void) const
0bc3b8ed 1224{
1225 // Return the beam energy of the beam-test event
7bb289a7 1226 if(fBTE)
1227 return fBTE->GetBeamEnergy() ;
1228 else
1229 return 0 ;
1230}
7ca0684e 1231//____________________________________________________________________________
1232
1233AliPHOSCalibData* AliPHOSGetter::CalibData()
1234{
ef868168 1235 // Check if the instance of AliPHOSCalibData exists, and return it
7ca0684e 1236
2bb77d5e 1237 return fgCalibData;
7ca0684e 1238}