]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOS.cxx
106380d121c951209dedb8f8ced1846106bcb00b
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.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 /* $Id$ */
16 /* History of cvs commits:
17  *
18  * $Log$
19  * Revision 1.110  2007/02/13 10:52:08  policheh
20  * Raw2SDigits() implemented
21  *
22  * Revision 1.109  2007/02/05 10:43:25  hristov
23  * Changes for correct initialization of Geant4 (Mihaela)
24  *
25  * Revision 1.108  2007/02/01 10:34:47  hristov
26  * Removing warnings on Solaris x86
27  *
28  * Revision 1.107  2007/01/29 16:29:37  kharlov
29  * Digits2Raw(): special workaround for digits with time out of range
30  *
31  * Revision 1.106  2007/01/17 17:28:56  kharlov
32  * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
33  *
34  * Revision 1.105  2007/01/12 21:44:29  kharlov
35  * Simulate and reconstruct two gains simulaneouslsy
36  *
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)
39  *
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
42  *
43  * Revision 1.102  2006/10/27 17:14:27  kharlov
44  * Introduce AliDebug and AliLog (B.Polichtchouk)
45  *
46  * Revision 1.101  2006/10/13 06:47:29  kharlov
47  * Simulation of RAW data applies real mapping (B.Polichtchouk)
48  *
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)
51  *
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.
54  *
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
57  *
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)
60  *
61  * Revision 1.96  2006/04/07 08:41:59  hristov
62  * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
63  *
64  * Revision 1.95  2006/03/14 19:40:41  kharlov
65  * Remove De-digitizing of raw data and digitizing the raw data fit
66  *
67  * Revision 1.94  2006/03/07 18:56:25  kharlov
68  * CDB is passed via environment variable
69  *
70  * Revision 1.93  2005/11/22 08:45:11  kharlov
71  * Calibration is read from CDB if any (Boris Polichtchouk)
72  *
73  * Revision 1.92  2005/11/03 13:09:19  hristov
74  * Removing meaningless const declarations (linuxicc)
75  *
76  * Revision 1.91  2005/07/27 15:08:53  kharlov
77  * Mixture ArCO2 is corrected
78  *
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
81  *
82  * Revision 1.89  2005/05/28 12:10:07  schutz
83  * Copy constructor is corrected (by T.P.)
84  *
85  */
86
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.   
93 // 
94 //*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) 
95 //////////////////////////////////////////////////////////////////////////////
96
97
98 // --- ROOT system ---
99 class TFile;
100 #include <TFolder.h> 
101 #include <TTree.h>
102 #include <TVirtualMC.h> 
103 #include <TH1F.h> 
104 #include <TF1.h> 
105 #include <TRandom.h> 
106
107 // --- Standard library ---
108
109 // --- AliRoot header files ---
110 #include "AliMagF.h"
111 #include "AliPHOS.h"
112 #include "AliPHOSGetter.h"
113 #include "AliRun.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"
120 #include "AliLog.h"
121 #include "AliCDBManager.h"
122 #include "AliCDBEntry.h"
123 #include "AliCDBStorage.h"
124 #include "AliPHOSCalibData.h"
125 #include "AliPHOSPulseGenerator.h"
126 #include "AliDAQ.h"
127 #include "AliPHOSRawDecoder.h"
128 #include "AliPHOSRawDigiProducer.h"
129
130 ClassImp(AliPHOS)
131
132 //____________________________________________________________________________
133   AliPHOS:: AliPHOS() : AliDetector()
134 {
135   // Default ctor
136   fName   = "PHOS" ;
137
138 }
139
140 //____________________________________________________________________________
141 AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
142 {
143   //   ctor : title is used to identify the layout
144 }
145
146 //____________________________________________________________________________
147 AliPHOS::~AliPHOS() 
148 {  
149 }
150
151 //____________________________________________________________________________
152 AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
153 {
154   return new AliPHOSDigitizer(manager);
155 }
156
157 //____________________________________________________________________________
158 void AliPHOS::CreateMaterials()
159 {
160   // Definitions of materials to build PHOS and associated tracking media.
161   // media number in idtmed are 699 to 798.
162
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} ;
167   Float_t dX = 8.28 ;
168
169   AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
170
171
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} ;
176   Float_t dP = 1.032 ;
177
178   AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
179
180   // --- Aluminium ---
181   AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
182   // ---         Absorption length is ignored ^
183
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} ;
188   Float_t dT = 0.331 ;
189
190   AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
191
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} ;
196   Float_t dF = 0.12 ;
197
198   AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
199
200  // --- Titanium ---
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} ;
204   Float_t dTIT = 4.5 ;
205
206   AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
207
208  // --- Silicon ---
209   AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
210
211
212
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} ;
217   Float_t dTI = 0.04 ;
218
219   AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
220
221   // --- Textolith ---
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} ;
225   Float_t dTX    = 1.75 ;
226
227   AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
228
229   //--- FR4  ---
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} ;
233   Float_t dFR = 1.8 ; 
234
235   AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
236
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 ; 
242
243   AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
244
245   // --- Copper ---                                                                    
246   AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
247  
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} ;
252   Float_t dG10  = 1.7 ;
253   
254   AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
255
256   // --- Lead ---                                                                     
257   AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
258
259  // --- The gas mixture ---                                                                
260  // Co2
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 ; 
265
266   AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
267
268  // Ar
269   Float_t dAr = 0.001782 ; 
270   AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;   
271  
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} ;
276   Float_t wArCO[3];
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) ;
282
283   // --- Stainless steel (let it be pure iron) ---
284   AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
285
286
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} ;
291   Float_t dFG    = 1.9 ;
292
293   AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
294
295   // --- Cables in Air box  ---
296   // SERVICES
297
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
302
303   AliMixture(19, "Cables  $", aCA, zCA, dCA, -4, wCA) ;
304
305
306   // --- Air ---
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;
311  
312   AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
313
314   // DEFINITION OF THE TRACKING MEDIA
315
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() ;
319
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) ;
323
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) ;
327
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) ;
331
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) ;
335
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) ;
339
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) ;
343
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) ;
347
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) ;
351
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) ;
355
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) ; 
359
360
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) ;
364
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) ;
368
369   // G10: Printed Circuit material                                                  -> idtmed[711]
370  
371   AliMedium(12, "G10        $", 12, 0,
372              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
373
374   // The Lead                                                                       -> idtmed[712]
375  
376   AliMedium(13, "Lead      $", 13, 0,
377              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
378
379   // The gas mixture: ArCo2                                                         -> idtmed[715]
380  
381   AliMedium(16, "ArCo2      $", 16, 1,
382              isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
383  
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) ;
387
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) ;
391
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) ;
395
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) ;
399 }
400
401 //_____________________________________________________________________________
402 void AliPHOS::Init()
403 {
404   //
405   // Initialises cuts for PHOS
406   //
407   // --- Set decent energy thresholds for gamma and electron tracking
408   Int_t * idtmed = fIdtmed->GetArray() - 699 ; 
409
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) ;
413  
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.) ;
440 }
441
442 //____________________________________________________________________________
443 void AliPHOS::Digits2Raw()
444 {
445 // convert digits of the current event to raw data
446   
447   AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ; 
448
449   // get the digits
450   loader->LoadDigits();
451   TClonesArray* digits = loader->Digits() ;
452
453   if (!digits) {
454     AliError(Form("No digits found !"));
455     return;
456   }
457
458   // get the geometry
459   AliPHOSGeometry* geom = GetGeometry();
460   if (!geom) {
461     AliError(Form("No geometry found !"));
462     return;
463   }
464
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
468
469   AliAltroBuffer* buffer = NULL;
470   Int_t prevDDL = -1;
471
472   // Create a shaper pulse object
473   AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
474
475   Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
476   Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
477
478   AliAltroMapping* mapping = 0;
479
480   //!!!!for debug!!!
481   Int_t modMax=-111;
482   Int_t colMax=-111;
483   Int_t rowMax=-111;
484   Float_t eMax=-333;
485   //!!!for debug!!!
486
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) 
491       continue;
492     Int_t relId[4];
493     geom->AbsToRelNumbering(digit->GetId(), relId);
494     Int_t module = relId[0];
495  
496     // Begin FIXME 
497     if (relId[1] != 0) 
498       continue;    // ignore digits from CPV
499     // End FIXME 
500
501     Int_t row = relId[2]-1;
502     Int_t col = relId[3]-1;
503
504     Int_t iRCU = -111;
505
506     //RCU0
507     if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
508
509     //RCU1
510     if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
511
512     //RCU2
513     if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
514
515     //RCU3
516     if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
517
518
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;
522
523     // new DDL
524     if (iDDL != prevDDL) {
525       // write real header and close previous file
526       if (buffer) {
527         buffer->Flush();
528         buffer->WriteDataHeader(kFALSE, kFALSE);
529         delete buffer;
530         if (mapping) delete mapping;
531       }
532
533       // open new file and write dummy header
534       TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
535
536       TString path = gSystem->Getenv("ALICE_ROOT");
537       path += "/PHOS/mapping/RCU";
538       path += iRCU;
539       path += ".data";
540
541       mapping = new AliCaloAltroMapping(path.Data());
542       buffer  = new AliAltroBuffer(fileName.Data(),mapping);
543       buffer->WriteDataHeader(kTRUE, kFALSE);  //Dummy;
544
545       prevDDL = iDDL;
546     }
547
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
558       
559     // calculate the time response function
560     } else {
561       Double_t energy = 0 ;
562       module = relId[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;}
566       }
567       else {
568         energy = 0; // CPV raw data format is now know yet
569       }
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);
578     }
579   }
580   
581   // write real header and close last file
582   if (buffer) {
583     buffer->Flush();
584     buffer->WriteDataHeader(kFALSE, kFALSE);
585     delete buffer;
586     if (mapping) delete mapping;
587   }
588   
589   AliDebug(1,Form("Digit with max. energy:  modMax %d colMax %d rowMax %d  eMax %f\n",
590          modMax,colMax,rowMax,eMax));
591
592   delete pulse;
593   loader->UnloadDigits();
594 }
595
596 //____________________________________________________________________________
597 void AliPHOS::Hits2SDigits()  
598
599 // create summable digits
600
601   AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
602   phosDigitizer.SetEventRange(0, -1) ; // do all the events
603   phosDigitizer.ExecuteTask("all") ; 
604 }
605
606 //____________________________________________________________________________
607 AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
608 {
609 //different behaviour than standard (singleton getter)
610 // --> to be discussed and made eventually coherent
611  fLoader = new AliPHOSLoader(GetName(),topfoldername);
612  return fLoader;
613 }
614
615 //____________________________________________________________________________
616 void AliPHOS::SetTreeAddress()
617
618   // Links Hits in the Tree to Hits array
619   TBranch *branch;
620   char branchname[20];
621   sprintf(branchname,"%s",GetName());
622   // Branch address for hit tree
623     TTree *treeH = TreeH();
624   if (treeH) {
625     branch = treeH->GetBranch(branchname);
626     if (branch) 
627      { 
628        if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
629        //AliInfo(Form("<%s> Setting Hits Address",GetName()));
630        branch->SetAddress(&fHits);
631      }
632   }
633 }
634
635 //____________________________________________________________________________
636 Bool_t AliPHOS::Raw2SDigits(AliRawReader* rawReader)
637 {
638
639   AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
640
641   TTree * tree = 0 ;
642   tree = loader->TreeS() ;
643   if ( !tree ) {
644     loader->MakeTree("S");
645     tree = loader->TreeS() ;
646   }
647
648   TClonesArray * sdigits = loader->SDigits() ;
649   if(!sdigits) { 
650     loader->MakeSDigitsArray();
651     sdigits = loader->SDigits();
652   }
653   sdigits->Clear();
654
655   AliPHOSRawDecoder dc(rawReader);
656   AliPHOSRawDigiProducer pr;
657   pr.MakeDigits(sdigits,&dc);
658
659   Int_t bufferSize = 32000 ;
660   TBranch * sdigitsBranch = tree->Branch("PHOS",&sdigits,bufferSize);
661   tree->Fill();
662
663   fLoader->WriteSDigits("OVERWRITE");
664   return kTRUE;
665     
666 }