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 **************************************************************************/
16 /* History of cvs commits:
19 * Revision 1.110 2007/02/13 10:52:08 policheh
20 * Raw2SDigits() implemented
22 * Revision 1.109 2007/02/05 10:43:25 hristov
23 * Changes for correct initialization of Geant4 (Mihaela)
25 * Revision 1.108 2007/02/01 10:34:47 hristov
26 * Removing warnings on Solaris x86
28 * Revision 1.107 2007/01/29 16:29:37 kharlov
29 * Digits2Raw(): special workaround for digits with time out of range
31 * Revision 1.106 2007/01/17 17:28:56 kharlov
32 * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
34 * Revision 1.105 2007/01/12 21:44:29 kharlov
35 * Simulate and reconstruct two gains simulaneouslsy
37 * Revision 1.104 2006/11/23 13:40:44 hristov
38 * Common class for raw data reading and ALTRO mappiing for PHOS and EMCAL (Gustavo, Cvetan)
40 * Revision 1.103 2006/11/14 17:11:15 hristov
41 * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
43 * Revision 1.102 2006/10/27 17:14:27 kharlov
44 * Introduce AliDebug and AliLog (B.Polichtchouk)
46 * Revision 1.101 2006/10/13 06:47:29 kharlov
47 * Simulation of RAW data applies real mapping (B.Polichtchouk)
49 * Revision 1.100 2006/08/11 12:36:26 cvetan
50 * Update of the PHOS code needed in order to read and reconstruct the beam test raw data (i.e. without an existing galice.root)
52 * Revision 1.99 2006/06/28 11:36:09 cvetan
53 * New detector numbering scheme (common for DAQ/HLT/Offline). All the subdetectors shall use the AliDAQ class for the sim and rec of the raw data. The AliDAQ and raw reader classes now provide all the necessary interfaces to write and select the detector specific raw-data payload. Look into the AliDAQ.h and AliRawReader.h for more details.
55 * Revision 1.98 2006/05/11 11:30:48 cvetan
56 * Major changes in AliAltroBuffer. Now it can be used only for writing of raw data. All the corresponding read method are removed. It is based now on AliFstream in order to avoid endianess problems. The altro raw data is written always with little endian
58 * Revision 1.97 2006/04/22 10:30:17 hristov
59 * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
61 * Revision 1.96 2006/04/07 08:41:59 hristov
62 * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
64 * Revision 1.95 2006/03/14 19:40:41 kharlov
65 * Remove De-digitizing of raw data and digitizing the raw data fit
67 * Revision 1.94 2006/03/07 18:56:25 kharlov
68 * CDB is passed via environment variable
70 * Revision 1.93 2005/11/22 08:45:11 kharlov
71 * Calibration is read from CDB if any (Boris Polichtchouk)
73 * Revision 1.92 2005/11/03 13:09:19 hristov
74 * Removing meaningless const declarations (linuxicc)
76 * Revision 1.91 2005/07/27 15:08:53 kharlov
77 * Mixture ArCO2 is corrected
79 * Revision 1.90 2005/06/17 07:39:07 hristov
80 * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
82 * Revision 1.89 2005/05/28 12:10:07 schutz
83 * Copy constructor is corrected (by T.P.)
87 //_________________________________________________________________________
88 // Base Class for PHOS description:
89 // PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged
90 // particles detector (CPV or PPSD).
91 // The only provided method here is CreateMaterials,
92 // which defines the materials common to all PHOS versions.
94 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH)
95 //////////////////////////////////////////////////////////////////////////////
98 // --- ROOT system ---
102 #include <TVirtualMC.h>
107 // --- Standard library ---
109 // --- AliRoot header files ---
112 #include "AliPHOSGetter.h"
114 #include "AliPHOSDigitizer.h"
115 #include "AliPHOSSDigitizer.h"
116 #include "AliPHOSDigit.h"
117 #include "AliAltroBuffer.h"
118 #include "AliAltroMapping.h"
119 #include "AliCaloAltroMapping.h"
121 #include "AliCDBManager.h"
122 #include "AliCDBEntry.h"
123 #include "AliCDBStorage.h"
124 #include "AliPHOSCalibData.h"
125 #include "AliPHOSPulseGenerator.h"
127 #include "AliPHOSRawDecoder.h"
128 #include "AliPHOSRawDigiProducer.h"
132 //____________________________________________________________________________
133 AliPHOS:: AliPHOS() : AliDetector()
140 //____________________________________________________________________________
141 AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
143 // ctor : title is used to identify the layout
146 //____________________________________________________________________________
151 //____________________________________________________________________________
152 AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
154 return new AliPHOSDigitizer(manager);
157 //____________________________________________________________________________
158 void AliPHOS::CreateMaterials()
160 // Definitions of materials to build PHOS and associated tracking media.
161 // media number in idtmed are 699 to 798.
163 // --- The PbWO4 crystals ---
164 Float_t aX[3] = {207.19, 183.85, 16.0} ;
165 Float_t zX[3] = {82.0, 74.0, 8.0} ;
166 Float_t wX[3] = {1.0, 1.0, 4.0} ;
169 AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
172 // --- The polysterene scintillator (CH) ---
173 Float_t aP[2] = {12.011, 1.00794} ;
174 Float_t zP[2] = {6.0, 1.0} ;
175 Float_t wP[2] = {1.0, 1.0} ;
178 AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
181 AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
182 // --- Absorption length is ignored ^
184 // --- Tyvek (CnH2n) ---
185 Float_t aT[2] = {12.011, 1.00794} ;
186 Float_t zT[2] = {6.0, 1.0} ;
187 Float_t wT[2] = {1.0, 2.0} ;
190 AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
192 // --- Polystyrene foam ---
193 Float_t aF[2] = {12.011, 1.00794} ;
194 Float_t zF[2] = {6.0, 1.0} ;
195 Float_t wF[2] = {1.0, 1.0} ;
198 AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
201 Float_t aTIT[3] = {47.88, 26.98, 54.94} ;
202 Float_t zTIT[3] = {22.0, 13.0, 25.0} ;
203 Float_t wTIT[3] = {69.0, 6.0, 1.0} ;
206 AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
209 AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
213 // --- Foam thermo insulation ---
214 Float_t aTI[2] = {12.011, 1.00794} ;
215 Float_t zTI[2] = {6.0, 1.0} ;
216 Float_t wTI[2] = {1.0, 1.0} ;
219 AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
222 Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ;
223 Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ;
224 Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ;
227 AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
230 Float_t aFR[4] = {16.0, 28.09, 12.011, 1.00794} ;
231 Float_t zFR[4] = {8.0, 14.0, 6.0, 1.0} ;
232 Float_t wFR[4] = {292.0, 68.0, 462.0, 736.0} ;
235 AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
237 // --- The Composite Material for micromegas (so far polyetylene) ---
238 Float_t aCM[2] = {12.01, 1.} ;
239 Float_t zCM[2] = {6., 1.} ;
240 Float_t wCM[2] = {1., 2.} ;
241 Float_t dCM = 0.935 ;
243 AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
246 AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
248 // --- G10 : Printed Circuit material ---
249 Float_t aG10[4] = { 12., 1., 16., 28.} ;
250 Float_t zG10[4] = { 6., 1., 8., 14.} ;
251 Float_t wG10[4] = { .259, .288, .248, .205} ;
254 AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
257 AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
259 // --- The gas mixture ---
261 Float_t aCO[2] = {12.0, 16.0} ;
262 Float_t zCO[2] = {6.0, 8.0} ;
263 Float_t wCO[2] = {1.0, 2.0} ;
264 Float_t dCO = 0.001977 ;
266 AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
269 Float_t dAr = 0.001782 ;
270 AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;
272 // Ar+CO2 Mixture (80% / 20%)
273 Float_t arContent = 0.80 ; // Ar-content of the ArCO2-mixture
274 Float_t aArCO[3] = {39.948, 12.0, 16.0} ;
275 Float_t zArCO[3] = {18.0 , 6.0, 8.0} ;
277 wArCO[0] = arContent;
278 wArCO[1] = (1-arContent)*1;
279 wArCO[2] = (1-arContent)*2;
280 Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
281 AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ;
283 // --- Stainless steel (let it be pure iron) ---
284 AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
287 // --- Fiberglass ---
288 Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ;
289 Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ;
290 Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ;
293 AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
295 // --- Cables in Air box ---
298 Float_t aCA[4] = { 1.,12.,55.8,63.5 };
299 Float_t zCA[4] = { 1.,6.,26.,29. };
300 Float_t wCA[4] = { .014,.086,.42,.48 };
301 Float_t dCA = 0.8 ; //this density is raw estimation, if you know better - correct
303 AliMixture(19, "Cables $", aCA, zCA, dCA, -4, wCA) ;
307 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
308 Float_t zAir[4]={6.,7.,8.,18.};
309 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
310 Float_t dAir = 1.20479E-3;
312 AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
314 // DEFINITION OF THE TRACKING MEDIA
316 // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
317 Int_t isxfld = gAlice->Field()->Integ() ;
318 Float_t sxmgmx = gAlice->Field()->Max() ;
320 // The scintillator of the calorimeter made of PBW04 -> idtmed[699]
321 AliMedium(0, "PHOS Xtal $", 0, 1,
322 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
324 // The scintillator of the CPV made of Polystyrene scintillator -> idtmed[700]
325 AliMedium(1, "CPV scint. $", 1, 1,
326 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
328 // Various Aluminium parts made of Al -> idtmed[701]
329 AliMedium(2, "Al parts $", 2, 0,
330 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
332 // The Tywek which wraps the calorimeter crystals -> idtmed[702]
333 AliMedium(3, "Tyvek wrapper$", 3, 0,
334 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
336 // The Polystyrene foam around the calorimeter module -> idtmed[703]
337 AliMedium(4, "Polyst. foam $", 4, 0,
338 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
340 // The Titanium around the calorimeter crystal -> idtmed[704]
341 AliMedium(5, "Titan. cover $", 5, 0,
342 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ;
344 // The Silicon of the pin diode to read out the calorimeter crystal -> idtmed[705]
345 AliMedium(6, "Si PIN $", 6, 0,
346 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ;
348 // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706]
349 AliMedium(7, "Thermo Insul.$", 7, 0,
350 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
352 // The Textolit which makes up the box which contains the calorimeter module -> idtmed[707]
353 AliMedium(8, "Textolit $", 8, 0,
354 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
356 // FR4: The Plastic which makes up the frame of micromegas -> idtmed[708]
357 AliMedium(9, "FR4 $", 9, 0,
358 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
361 // The Composite Material for micromegas -> idtmed[709]
362 AliMedium(10, "CompoMat $", 10, 0,
363 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
365 // Copper -> idtmed[710]
366 AliMedium(11, "Copper $", 11, 0,
367 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
369 // G10: Printed Circuit material -> idtmed[711]
371 AliMedium(12, "G10 $", 12, 0,
372 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
374 // The Lead -> idtmed[712]
376 AliMedium(13, "Lead $", 13, 0,
377 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
379 // The gas mixture: ArCo2 -> idtmed[715]
381 AliMedium(16, "ArCo2 $", 16, 1,
382 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
384 // Stainless steel -> idtmed[716]
385 AliMedium(17, "Steel $", 17, 0,
386 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
388 // Fibergalss -> idtmed[717]
389 AliMedium(18, "Fiberglass$", 18, 0,
390 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
392 // Cables in air -> idtmed[718]
393 AliMedium(19, "Cables $", 19, 0,
394 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
396 // Air -> idtmed[798]
397 AliMedium(99, "Air $", 99, 0,
398 isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ;
401 //_____________________________________________________________________________
405 // Initialises cuts for PHOS
407 // --- Set decent energy thresholds for gamma and electron tracking
408 Int_t * idtmed = fIdtmed->GetArray() - 699 ;
410 // Tracking threshold for photons and electrons in the scintillator crystal
411 gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ;
412 gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ;
414 // --- Generate explicitly delta rays in the titan cover ---
415 gMC->Gstpar(idtmed[704], "LOSS",3.) ;
416 gMC->Gstpar(idtmed[704], "DRAY",1.) ;
417 // --- and in aluminium parts ---
418 gMC->Gstpar(idtmed[701], "LOSS",3.) ;
419 gMC->Gstpar(idtmed[701], "DRAY",1.) ;
420 // --- and in PIN diode
421 gMC->Gstpar(idtmed[705], "LOSS",3) ;
422 gMC->Gstpar(idtmed[705], "DRAY",1) ;
423 // --- and in the passive convertor
424 gMC->Gstpar(idtmed[712], "LOSS",3) ;
425 gMC->Gstpar(idtmed[712], "DRAY",1) ;
426 // Tracking threshold for photons and electrons in the gas ArC02
427 gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ;
428 gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ;
429 gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ;
430 gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ;
431 gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ;
432 gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ;
433 gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ;
434 gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ;
435 gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ;
436 gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ;
437 gMC->Gstpar(idtmed[715], "LOSS",2.) ;
438 gMC->Gstpar(idtmed[715], "DRAY",0.) ;
439 gMC->Gstpar(idtmed[715], "STRA",2.) ;
442 //____________________________________________________________________________
443 void AliPHOS::Digits2Raw()
445 // convert digits of the current event to raw data
447 AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
450 loader->LoadDigits();
451 TClonesArray* digits = loader->Digits() ;
454 AliError(Form("No digits found !"));
459 AliPHOSGeometry* geom = GetGeometry();
461 AliError(Form("No geometry found !"));
465 // some digitization constants
466 const Float_t kThreshold = 0.001; // skip digits below 1 MeV
467 const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data
469 AliAltroBuffer* buffer = NULL;
472 // Create a shaper pulse object
473 AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
475 Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
476 Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
478 AliAltroMapping* mapping = 0;
487 // loop over digits (assume ordered digits)
488 for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
489 AliPHOSDigit* digit = dynamic_cast<AliPHOSDigit *>(digits->At(iDigit)) ;
490 if (digit->GetEnergy() < kThreshold)
493 geom->AbsToRelNumbering(digit->GetId(), relId);
494 Int_t module = relId[0];
498 continue; // ignore digits from CPV
501 Int_t row = relId[2]-1;
502 Int_t col = relId[3]-1;
507 if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
510 if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
513 if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
516 if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
519 // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers.
520 // PHOS internal convention: 1<module<5.
521 Int_t iDDL = 4 * (module - 1) + iRCU;
524 if (iDDL != prevDDL) {
525 // write real header and close previous file
528 buffer->WriteDataHeader(kFALSE, kFALSE);
530 if (mapping) delete mapping;
533 // open new file and write dummy header
534 TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
536 TString path = gSystem->Getenv("ALICE_ROOT");
537 path += "/PHOS/mapping/RCU";
541 mapping = new AliCaloAltroMapping(path.Data());
542 buffer = new AliAltroBuffer(fileName.Data(),mapping);
543 buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
548 AliDebug(2,Form("digit E=%.4f GeV, t=%g s, (mod,col,row)=(%d,%d,%d)\n",
549 digit->GetEnergy(),digit->GetTimeR(),
550 relId[0]-1,relId[3]-1,relId[2]-1));
551 // if a signal is out of time range, write only trailer
552 if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) {
553 AliInfo("Signal is out of time range.\n");
554 buffer->FillBuffer(0);
555 buffer->FillBuffer(pulse->GetRawFormatTimeBins() ); // time bin
556 buffer->FillBuffer(3); // bunch length
557 buffer->WriteTrailer(3, relId[3]-1, relId[2]-1, 0); // trailer
559 // calculate the time response function
561 Double_t energy = 0 ;
563 if (digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) {
564 energy=digit->GetEnergy();
565 if(energy>eMax) {eMax=energy; modMax=module; colMax=col; rowMax=row;}
568 energy = 0; // CPV raw data format is now know yet
570 pulse->SetAmplitude(energy);
571 pulse->SetTZero(digit->GetTimeR());
572 pulse->MakeSamples();
573 pulse->GetSamples(adcValuesHigh, adcValuesLow) ;
574 buffer->WriteChannel(relId[3]-1, relId[2]-1, 0,
575 pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
576 buffer->WriteChannel(relId[3]-1, relId[2]-1, 1,
577 pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
581 // write real header and close last file
584 buffer->WriteDataHeader(kFALSE, kFALSE);
586 if (mapping) delete mapping;
589 AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n",
590 modMax,colMax,rowMax,eMax));
593 loader->UnloadDigits();
596 //____________________________________________________________________________
597 void AliPHOS::Hits2SDigits()
599 // create summable digits
601 AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
602 phosDigitizer.SetEventRange(0, -1) ; // do all the events
603 phosDigitizer.ExecuteTask("all") ;
606 //____________________________________________________________________________
607 AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
609 //different behaviour than standard (singleton getter)
610 // --> to be discussed and made eventually coherent
611 fLoader = new AliPHOSLoader(GetName(),topfoldername);
615 //____________________________________________________________________________
616 void AliPHOS::SetTreeAddress()
618 // Links Hits in the Tree to Hits array
621 sprintf(branchname,"%s",GetName());
622 // Branch address for hit tree
623 TTree *treeH = TreeH();
625 branch = treeH->GetBranch(branchname);
628 if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
629 //AliInfo(Form("<%s> Setting Hits Address",GetName()));
630 branch->SetAddress(&fHits);
635 //____________________________________________________________________________
636 Bool_t AliPHOS::Raw2SDigits(AliRawReader* rawReader)
639 AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
642 tree = loader->TreeS() ;
644 loader->MakeTree("S");
645 tree = loader->TreeS() ;
648 TClonesArray * sdigits = loader->SDigits() ;
650 loader->MakeSDigitsArray();
651 sdigits = loader->SDigits();
655 AliPHOSRawDecoder dc(rawReader);
656 AliPHOSRawDigiProducer pr;
657 pr.MakeDigits(sdigits,&dc);
659 Int_t bufferSize = 32000 ;
660 TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize);
663 fLoader->WriteSDigits("OVERWRITE");