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