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