Digits2Raw(): special workaround for digits with time out of range
[u/mrichter/AliRoot.git] / PHOS / AliPHOS.cxx
CommitLineData
4c039060 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 **************************************************************************/
b2a60966 15/* $Id$ */
ffcecca6 16/* History of cvs commits:
17 *
18 * $Log$
d11294bb 19 * Revision 1.106 2007/01/17 17:28:56 kharlov
20 * Extract ALTRO sample generation to a separate class AliPHOSPulseGenerator
21 *
431a9211 22 * Revision 1.105 2007/01/12 21:44:29 kharlov
23 * Simulate and reconstruct two gains simulaneouslsy
24 *
6a0d2265 25 * Revision 1.104 2006/11/23 13:40:44 hristov
26 * Common class for raw data reading and ALTRO mappiing for PHOS and EMCAL (Gustavo, Cvetan)
27 *
d84933b0 28 * Revision 1.103 2006/11/14 17:11:15 hristov
29 * 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
30 *
e939a978 31 * Revision 1.102 2006/10/27 17:14:27 kharlov
32 * Introduce AliDebug and AliLog (B.Polichtchouk)
33 *
e1afea68 34 * Revision 1.101 2006/10/13 06:47:29 kharlov
35 * Simulation of RAW data applies real mapping (B.Polichtchouk)
36 *
464a797e 37 * Revision 1.100 2006/08/11 12:36:26 cvetan
38 * Update of the PHOS code needed in order to read and reconstruct the beam test raw data (i.e. without an existing galice.root)
39 *
52c5f046 40 * Revision 1.99 2006/06/28 11:36:09 cvetan
41 * 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.
42 *
362c9d61 43 * Revision 1.98 2006/05/11 11:30:48 cvetan
44 * 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
45 *
4c846604 46 * Revision 1.97 2006/04/22 10:30:17 hristov
47 * Add fEnergy to AliPHOSDigit and operate with EMC amplitude in energy units (Yu.Kharlov)
48 *
27a73a5d 49 * Revision 1.96 2006/04/07 08:41:59 hristov
50 * Follow AliAlignObj framework and remove AliPHOSAlignData (Yu.Kharlov)
51 *
85698486 52 * Revision 1.95 2006/03/14 19:40:41 kharlov
53 * Remove De-digitizing of raw data and digitizing the raw data fit
54 *
b482deac 55 * Revision 1.94 2006/03/07 18:56:25 kharlov
56 * CDB is passed via environment variable
57 *
7b60fe7e 58 * Revision 1.93 2005/11/22 08:45:11 kharlov
59 * Calibration is read from CDB if any (Boris Polichtchouk)
60 *
c15b04ad 61 * Revision 1.92 2005/11/03 13:09:19 hristov
62 * Removing meaningless const declarations (linuxicc)
63 *
eb0b1051 64 * Revision 1.91 2005/07/27 15:08:53 kharlov
65 * Mixture ArCO2 is corrected
66 *
a004143a 67 * Revision 1.90 2005/06/17 07:39:07 hristov
68 * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
69 *
4951e003 70 * Revision 1.89 2005/05/28 12:10:07 schutz
71 * Copy constructor is corrected (by T.P.)
72 *
ffcecca6 73 */
b2a60966 74
d15a28e7 75//_________________________________________________________________________
b2a60966 76// Base Class for PHOS description:
77// PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged
78// particles detector (CPV or PPSD).
79// The only provided method here is CreateMaterials,
80// which defines the materials common to all PHOS versions.
81//
82//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH)
d15a28e7 83//////////////////////////////////////////////////////////////////////////////
e84be1eb 84
fdeead01 85
fe4da5cc 86// --- ROOT system ---
2ab0c725 87class TFile;
88cb7938 88#include <TFolder.h>
88cb7938 89#include <TTree.h>
90#include <TVirtualMC.h>
046ae904 91#include <TH1F.h>
92#include <TF1.h>
e9a5efdf 93#include <TRandom.h>
fe4da5cc 94
95// --- Standard library ---
d15a28e7 96
548f0134 97// --- AliRoot header files ---
94de3818 98#include "AliMagF.h"
88cb7938 99#include "AliPHOS.h"
e9a5efdf 100#include "AliPHOSGetter.h"
85a5290f 101#include "AliRun.h"
102#include "AliPHOSDigitizer.h"
103#include "AliPHOSSDigitizer.h"
65792ca0 104#include "AliPHOSDigit.h"
105#include "AliAltroBuffer.h"
464a797e 106#include "AliAltroMapping.h"
d84933b0 107#include "AliCaloAltroMapping.h"
e4d04cf1 108#include "AliLog.h"
c15b04ad 109#include "AliCDBManager.h"
110#include "AliCDBEntry.h"
111#include "AliCDBStorage.h"
112#include "AliPHOSCalibData.h"
431a9211 113#include "AliPHOSPulseGenerator.h"
362c9d61 114#include "AliDAQ.h"
7f78a025 115
fe4da5cc 116ClassImp(AliPHOS)
e4d04cf1 117
d15a28e7 118//____________________________________________________________________________
046ae904 119 AliPHOS:: AliPHOS() : AliDetector()
6b87d0dd 120{
a532e9d8 121 // Default ctor
046ae904 122 fName = "PHOS" ;
e4d04cf1 123
6b87d0dd 124}
fa7cce36 125
6b87d0dd 126//____________________________________________________________________________
046ae904 127AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title)
0ce0b56f 128{
a532e9d8 129 // ctor : title is used to identify the layout
6b87d0dd 130}
fa7cce36 131
0ce0b56f 132//____________________________________________________________________________
7b326aac 133AliPHOS::~AliPHOS()
134{
0ce0b56f 135}
136
137//____________________________________________________________________________
487d23e3 138AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const
139{
140 return new AliPHOSDigitizer(manager);
141}
142
143//____________________________________________________________________________
fe4da5cc 144void AliPHOS::CreateMaterials()
145{
b2a60966 146 // Definitions of materials to build PHOS and associated tracking media.
147 // media number in idtmed are 699 to 798.
fe4da5cc 148
d15a28e7 149 // --- The PbWO4 crystals ---
92862013 150 Float_t aX[3] = {207.19, 183.85, 16.0} ;
151 Float_t zX[3] = {82.0, 74.0, 8.0} ;
152 Float_t wX[3] = {1.0, 1.0, 4.0} ;
153 Float_t dX = 8.28 ;
fe4da5cc 154
92862013 155 AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ;
fe4da5cc 156
fe4da5cc 157
d15a28e7 158 // --- The polysterene scintillator (CH) ---
92862013 159 Float_t aP[2] = {12.011, 1.00794} ;
160 Float_t zP[2] = {6.0, 1.0} ;
161 Float_t wP[2] = {1.0, 1.0} ;
162 Float_t dP = 1.032 ;
fe4da5cc 163
92862013 164 AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ;
fe4da5cc 165
d15a28e7 166 // --- Aluminium ---
167 AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ;
168 // --- Absorption length is ignored ^
fe4da5cc 169
d15a28e7 170 // --- Tyvek (CnH2n) ---
92862013 171 Float_t aT[2] = {12.011, 1.00794} ;
172 Float_t zT[2] = {6.0, 1.0} ;
173 Float_t wT[2] = {1.0, 2.0} ;
174 Float_t dT = 0.331 ;
fe4da5cc 175
92862013 176 AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ;
fe4da5cc 177
d15a28e7 178 // --- Polystyrene foam ---
92862013 179 Float_t aF[2] = {12.011, 1.00794} ;
180 Float_t zF[2] = {6.0, 1.0} ;
181 Float_t wF[2] = {1.0, 1.0} ;
182 Float_t dF = 0.12 ;
fe4da5cc 183
92862013 184 AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ;
fe4da5cc 185
d15a28e7 186 // --- Titanium ---
92862013 187 Float_t aTIT[3] = {47.88, 26.98, 54.94} ;
188 Float_t zTIT[3] = {22.0, 13.0, 25.0} ;
189 Float_t wTIT[3] = {69.0, 6.0, 1.0} ;
190 Float_t dTIT = 4.5 ;
fe4da5cc 191
92862013 192 AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT);
fe4da5cc 193
d15a28e7 194 // --- Silicon ---
195 AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ;
fe4da5cc 196
fe4da5cc 197
fe4da5cc 198
d15a28e7 199 // --- Foam thermo insulation ---
92862013 200 Float_t aTI[2] = {12.011, 1.00794} ;
201 Float_t zTI[2] = {6.0, 1.0} ;
202 Float_t wTI[2] = {1.0, 1.0} ;
85218d13 203 Float_t dTI = 0.04 ;
fe4da5cc 204
92862013 205 AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ;
fe4da5cc 206
74e56d72 207 // --- Textolith ---
92862013 208 Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ;
209 Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ;
210 Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ;
211 Float_t dTX = 1.75 ;
fe4da5cc 212
92862013 213 AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ;
fe4da5cc 214
d15a28e7 215 //--- FR4 ---
74e56d72 216 Float_t aFR[4] = {16.0, 28.09, 12.011, 1.00794} ;
217 Float_t zFR[4] = {8.0, 14.0, 6.0, 1.0} ;
218 Float_t wFR[4] = {292.0, 68.0, 462.0, 736.0} ;
92862013 219 Float_t dFR = 1.8 ;
fe4da5cc 220
74e56d72 221 AliMixture(9, "FR4$", aFR, zFR, dFR, -4, wFR) ;
fe4da5cc 222
d15a28e7 223 // --- The Composite Material for micromegas (so far polyetylene) ---
92862013 224 Float_t aCM[2] = {12.01, 1.} ;
225 Float_t zCM[2] = {6., 1.} ;
226 Float_t wCM[2] = {1., 2.} ;
227 Float_t dCM = 0.935 ;
fe4da5cc 228
92862013 229 AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ;
fe4da5cc 230
d15a28e7 231 // --- Copper ---
232 AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ;
233
234 // --- G10 : Printed Circuit material ---
92862013 235 Float_t aG10[4] = { 12., 1., 16., 28.} ;
236 Float_t zG10[4] = { 6., 1., 8., 14.} ;
237 Float_t wG10[4] = { .259, .288, .248, .205} ;
238 Float_t dG10 = 1.7 ;
d15a28e7 239
92862013 240 AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10);
fe4da5cc 241
d15a28e7 242 // --- Lead ---
243 AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ;
fe4da5cc 244
d15a28e7 245 // --- The gas mixture ---
246 // Co2
92862013 247 Float_t aCO[2] = {12.0, 16.0} ;
248 Float_t zCO[2] = {6.0, 8.0} ;
249 Float_t wCO[2] = {1.0, 2.0} ;
250 Float_t dCO = 0.001977 ;
fe4da5cc 251
92862013 252 AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO);
fe4da5cc 253
d15a28e7 254 // Ar
92862013 255 Float_t dAr = 0.001782 ;
256 AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ;
d15a28e7 257
a004143a 258 // Ar+CO2 Mixture (80% / 20%)
259 Float_t arContent = 0.80 ; // Ar-content of the ArCO2-mixture
260 Float_t aArCO[3] = {39.948, 12.0, 16.0} ;
261 Float_t zArCO[3] = {18.0 , 6.0, 8.0} ;
262 Float_t wArCO[3];
263 wArCO[0] = arContent;
264 wArCO[1] = (1-arContent)*1;
265 wArCO[2] = (1-arContent)*2;
266 Float_t dArCO = arContent*dAr + (1-arContent)*dCO ;
267 AliMixture(16, "ArCO2$", aArCO, zArCO, dArCO, -3, wArCO) ;
fe4da5cc 268
a530ba0a 269 // --- Stainless steel (let it be pure iron) ---
270 AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ;
85218d13 271
272
273 // --- Fiberglass ---
274 Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ;
275 Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ;
276 Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ;
277 Float_t dFG = 1.9 ;
278
279 AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ;
280
281 // --- Cables in Air box ---
282 // SERVICES
283
284 Float_t aCA[4] = { 1.,12.,55.8,63.5 };
285 Float_t zCA[4] = { 1.,6.,26.,29. };
286 Float_t wCA[4] = { .014,.086,.42,.48 };
287 Float_t dCA = 0.8 ; //this density is raw estimation, if you know better - correct
288
289 AliMixture(19, "Cables $", aCA, zCA, dCA, -4, wCA) ;
290
291
d15a28e7 292 // --- Air ---
a7262d8e 293 Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
294 Float_t zAir[4]={6.,7.,8.,18.};
295 Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
296 Float_t dAir = 1.20479E-3;
d15a28e7 297
a7262d8e 298 AliMixture(99, "Air$", aAir, zAir, dAir, 4, wAir) ;
299
d15a28e7 300 // DEFINITION OF THE TRACKING MEDIA
fe4da5cc 301
d15a28e7 302 // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100]
303 Int_t * idtmed = fIdtmed->GetArray() - 699 ;
92862013 304 Int_t isxfld = gAlice->Field()->Integ() ;
305 Float_t sxmgmx = gAlice->Field()->Max() ;
fe4da5cc 306
d15a28e7 307 // The scintillator of the calorimeter made of PBW04 -> idtmed[699]
308 AliMedium(0, "PHOS Xtal $", 0, 1,
92862013 309 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 310
d15a28e7 311 // The scintillator of the CPV made of Polystyrene scintillator -> idtmed[700]
312 AliMedium(1, "CPV scint. $", 1, 1,
92862013 313 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 314
d15a28e7 315 // Various Aluminium parts made of Al -> idtmed[701]
316 AliMedium(2, "Al parts $", 2, 0,
92862013 317 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
fe4da5cc 318
d15a28e7 319 // The Tywek which wraps the calorimeter crystals -> idtmed[702]
320 AliMedium(3, "Tyvek wrapper$", 3, 0,
92862013 321 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
fe4da5cc 322
d15a28e7 323 // The Polystyrene foam around the calorimeter module -> idtmed[703]
324 AliMedium(4, "Polyst. foam $", 4, 0,
92862013 325 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 326
d15a28e7 327 // The Titanium around the calorimeter crystal -> idtmed[704]
328 AliMedium(5, "Titan. cover $", 5, 0,
92862013 329 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ;
fe4da5cc 330
d15a28e7 331 // The Silicon of the pin diode to read out the calorimeter crystal -> idtmed[705]
332 AliMedium(6, "Si PIN $", 6, 0,
7b326aac 333 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ;
fe4da5cc 334
d15a28e7 335 // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706]
336 AliMedium(7, "Thermo Insul.$", 7, 0,
92862013 337 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 338
d15a28e7 339 // The Textolit which makes up the box which contains the calorimeter module -> idtmed[707]
340 AliMedium(8, "Textolit $", 8, 0,
92862013 341 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 342
d15a28e7 343 // FR4: The Plastic which makes up the frame of micromegas -> idtmed[708]
344 AliMedium(9, "FR4 $", 9, 0,
92862013 345 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
fe4da5cc 346
fe4da5cc 347
d15a28e7 348 // The Composite Material for micromegas -> idtmed[709]
349 AliMedium(10, "CompoMat $", 10, 0,
92862013 350 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 351
d15a28e7 352 // Copper -> idtmed[710]
353 AliMedium(11, "Copper $", 11, 0,
92862013 354 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
fe4da5cc 355
d15a28e7 356 // G10: Printed Circuit material -> idtmed[711]
357
358 AliMedium(12, "G10 $", 12, 0,
92862013 359 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
fe4da5cc 360
d15a28e7 361 // The Lead -> idtmed[712]
362
363 AliMedium(13, "Lead $", 13, 0,
92862013 364 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
fe4da5cc 365
d15a28e7 366 // The gas mixture: ArCo2 -> idtmed[715]
367
368 AliMedium(16, "ArCo2 $", 16, 1,
92862013 369 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ;
d15a28e7 370
a530ba0a 371 // Stainless steel -> idtmed[716]
372 AliMedium(17, "Steel $", 17, 0,
373 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ;
374
85218d13 375 // Fibergalss -> idtmed[717]
376 AliMedium(18, "Fiberglass$", 18, 0,
377 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
378
379 // Cables in air -> idtmed[718]
380 AliMedium(19, "Cables $", 19, 0,
381 isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ;
382
d15a28e7 383 // Air -> idtmed[798]
384 AliMedium(99, "Air $", 99, 0,
92862013 385 isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ;
fe4da5cc 386
d15a28e7 387 // --- Set decent energy thresholds for gamma and electron tracking
fe4da5cc 388
d15a28e7 389 // Tracking threshold for photons and electrons in the scintillator crystal
390 gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ;
391 gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ;
9f616d61 392
d15a28e7 393 // --- Generate explicitly delta rays in the titan cover ---
394 gMC->Gstpar(idtmed[704], "LOSS",3.) ;
395 gMC->Gstpar(idtmed[704], "DRAY",1.) ;
d15a28e7 396 // --- and in aluminium parts ---
397 gMC->Gstpar(idtmed[701], "LOSS",3.) ;
398 gMC->Gstpar(idtmed[701], "DRAY",1.) ;
92862013 399 // --- and in PIN diode
400 gMC->Gstpar(idtmed[705], "LOSS",3) ;
401 gMC->Gstpar(idtmed[705], "DRAY",1) ;
402 // --- and in the passive convertor
403 gMC->Gstpar(idtmed[712], "LOSS",3) ;
404 gMC->Gstpar(idtmed[712], "DRAY",1) ;
405 // Tracking threshold for photons and electrons in the gas ArC02
b7101219 406 gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ;
407 gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ;
408 gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ;
409 gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ;
410 gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ;
411 gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ;
412 gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ;
413 gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ;
414 gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ;
415 gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ;
9f616d61 416 gMC->Gstpar(idtmed[715], "LOSS",2.) ;
417 gMC->Gstpar(idtmed[715], "DRAY",0.) ;
418 gMC->Gstpar(idtmed[715], "STRA",2.) ;
419
0c409cb2 420}
a532e9d8 421
0c409cb2 422//____________________________________________________________________________
65792ca0 423void AliPHOS::Digits2Raw()
424{
425// convert digits of the current event to raw data
e4d04cf1 426
427 AliPHOSLoader * loader = dynamic_cast<AliPHOSLoader*>(fLoader) ;
65792ca0 428
429 // get the digits
e4d04cf1 430 loader->LoadDigits();
431 TClonesArray* digits = loader->Digits() ;
e9a5efdf 432
65792ca0 433 if (!digits) {
351dd634 434 AliError(Form("No digits found !"));
65792ca0 435 return;
436 }
437
438 // get the geometry
e4d04cf1 439 AliPHOSGeometry* geom = GetGeometry();
65792ca0 440 if (!geom) {
351dd634 441 AliError(Form("No geometry found !"));
65792ca0 442 return;
443 }
444
445 // some digitization constants
27a73a5d 446 const Float_t kThreshold = 0.001; // skip digits below 1 MeV
447 const Int_t kAdcThreshold = 1; // Lower ADC threshold to write to raw data
65792ca0 448
449 AliAltroBuffer* buffer = NULL;
450 Int_t prevDDL = -1;
65792ca0 451
431a9211 452 // Create a shaper pulse object
453 AliPHOSPulseGenerator *pulse = new AliPHOSPulseGenerator();
454
455 Int_t *adcValuesLow = new Int_t[pulse->GetRawFormatTimeBins()];
456 Int_t *adcValuesHigh= new Int_t[pulse->GetRawFormatTimeBins()];
e1afea68 457
458 //!!!!for debug!!!
459 Int_t modMax=-111;
460 Int_t colMax=-111;
461 Int_t rowMax=-111;
462 Float_t eMax=-333;
463 //!!!for debug!!!
464
65792ca0 465 // loop over digits (assume ordered digits)
466 for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
e4d04cf1 467 AliPHOSDigit* digit = dynamic_cast<AliPHOSDigit *>(digits->At(iDigit)) ;
27a73a5d 468 if (digit->GetEnergy() < kThreshold)
e9a5efdf 469 continue;
65792ca0 470 Int_t relId[4];
471 geom->AbsToRelNumbering(digit->GetId(), relId);
472 Int_t module = relId[0];
e9a5efdf 473
431a9211 474 // Begin FIXME
e9a5efdf 475 if (relId[1] != 0)
476 continue; // ignore digits from CPV
431a9211 477 // End FIXME
e9a5efdf 478
464a797e 479 Int_t row = relId[2]-1;
480 Int_t col = relId[3]-1;
481
482 Int_t iRCU = -111;
483
484 //RCU0
485 if(0<=row&&row<32 && 0<=col&&col<28) iRCU=0;
486
487 //RCU1
488 if(0<=row&&row<32 && 28<=col&&col<56) iRCU=1;
489
490 //RCU2
491 if(32<=row&&row<64 && 0<=col&&col<28) iRCU=2;
492
493 //RCU3
494 if(32<=row&&row<64 && 28<=col&&col<56) iRCU=3;
495
496
497 // PHOS EMCA has 4 DDL per module. Splitting is based on the (row,column) numbers.
498 // PHOS internal convention: 1<module<5.
499 Int_t iDDL = 4 * (module - 1) + iRCU;
65792ca0 500
501 // new DDL
502 if (iDDL != prevDDL) {
503 // write real header and close previous file
504 if (buffer) {
505 buffer->Flush();
506 buffer->WriteDataHeader(kFALSE, kFALSE);
507 delete buffer;
508 }
509
510 // open new file and write dummy header
362c9d61 511 TString fileName = AliDAQ::DdlFileName("PHOS",iDDL);
464a797e 512
513 TString path = gSystem->Getenv("ALICE_ROOT");
514 path += "/PHOS/mapping/RCU";
515 path += iRCU;
516 path += ".data";
517
d84933b0 518 AliAltroMapping* mapping = new AliCaloAltroMapping(path.Data());
464a797e 519 buffer = new AliAltroBuffer(fileName.Data(),mapping);
65792ca0 520 buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
521
522 prevDDL = iDDL;
523 }
524
d11294bb 525 AliDebug(2,Form("digit E=%.4f GeV, t=%g s, (mod,col,row)=(%d,%d,%d)\n",
526 digit->GetEnergy(),digit->GetTimeR(),
527 relId[0]-1,relId[3]-1,relId[2]-1));
528 // if a signal is out of time range, write only trailer
529 if (digit->GetTimeR() > pulse->GetRawFormatTimeMax()*0.5 ) {
e1afea68 530 AliInfo("Signal is out of time range.\n");
d11294bb 531 buffer->FillBuffer(0);
431a9211 532 buffer->FillBuffer(pulse->GetRawFormatTimeBins() ); // time bin
d11294bb 533 buffer->FillBuffer(3); // bunch length
534 buffer->WriteTrailer(3, relId[3]-1, relId[2]-1, 0); // trailer
65792ca0 535
e4d04cf1 536 // calculate the time response function
65792ca0 537 } else {
c15b04ad 538 Double_t energy = 0 ;
539 Int_t module = relId[0];
d11294bb 540 if (digit->GetId() <= geom->GetNModules() * geom->GetNCristalsInModule()) {
27a73a5d 541 energy=digit->GetEnergy();
e1afea68 542 if(energy>eMax) {eMax=energy; modMax=module; colMax=col; rowMax=row;}
b482deac 543 }
544 else {
b482deac 545 energy = 0; // CPV raw data format is now know yet
d11294bb 546 }
431a9211 547 pulse->SetAmplitude(energy);
548 pulse->SetTZero(digit->GetTimeR());
549 pulse->MakeSamples();
550 pulse->GetSamples(adcValuesHigh, adcValuesLow) ;
431a9211 551 buffer->WriteChannel(relId[3]-1, relId[2]-1, 0,
552 pulse->GetRawFormatTimeBins(), adcValuesLow , kAdcThreshold);
553 buffer->WriteChannel(relId[3]-1, relId[2]-1, 1,
554 pulse->GetRawFormatTimeBins(), adcValuesHigh, kAdcThreshold);
65792ca0 555 }
556 }
046ae904 557
65792ca0 558 // write real header and close last file
559 if (buffer) {
560 buffer->Flush();
561 buffer->WriteDataHeader(kFALSE, kFALSE);
562 delete buffer;
563 }
046ae904 564
e1afea68 565 AliDebug(1,Form("Digit with max. energy: modMax %d colMax %d rowMax %d eMax %f\n",
566 modMax,colMax,rowMax,eMax));
567
431a9211 568 delete pulse;
e4d04cf1 569 loader->UnloadDigits();
e9a5efdf 570}
571
572//____________________________________________________________________________
573void AliPHOS::Hits2SDigits()
574{
575// create summable digits
576
a1952ef7 577 AliPHOSSDigitizer phosDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
578 phosDigitizer.SetEventRange(0, -1) ; // do all the events
579 phosDigitizer.ExecuteTask("all") ;
e9a5efdf 580}
581
582//____________________________________________________________________________
583AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
584{
585//different behaviour than standard (singleton getter)
586// --> to be discussed and made eventually coherent
587 fLoader = new AliPHOSLoader(GetName(),topfoldername);
588 return fLoader;
589}
590
591//____________________________________________________________________________
592void AliPHOS::SetTreeAddress()
593{
594 // Links Hits in the Tree to Hits array
595 TBranch *branch;
596 char branchname[20];
597 sprintf(branchname,"%s",GetName());
e9a5efdf 598 // Branch address for hit tree
351dd634 599 TTree *treeH = TreeH();
e9a5efdf 600 if (treeH) {
601 branch = treeH->GetBranch(branchname);
602 if (branch)
603 {
604 if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
351dd634 605 //AliInfo(Form("<%s> Setting Hits Address",GetName()));
e9a5efdf 606 branch->SetAddress(&fHits);
607 }
608 }
609}
610