fix minor bug: add task argument was not passed to tak
[u/mrichter/AliRoot.git] / AD / AliAD.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
16 /* $Id: AliAD.cxx  $ */
17
18 ///////////////////////////////////////////////////////////////////////////
19 //                                                                       //
20 //                  AD (ALICE Diffractive)  Detector                     //
21 //                                                                       //
22 //  This class contains the base procedures for the AD  detector         //
23 //  All comments should be sent to :                                     //
24 //                                                                       //
25 //                                                                       //
26 ///////////////////////////////////////////////////////////////////////////
27
28
29 // --- Standard libraries ---
30 #include <Riostream.h>
31 #include <stdlib.h>
32
33 // --- ROOT libraries ---
34 #include <TNamed.h>
35 #include "TROOT.h"
36 #include "TFile.h"
37 #include "TNetFile.h"
38 #include "TRandom.h"
39 #include "TTree.h"
40 #include "TBranch.h"
41 #include "TClonesArray.h"
42 #include "TGeoGlobalMagField.h"
43 #include "AliMagF.h"
44 #include "TStopwatch.h"
45 #include "TParameter.h"
46 #include "TF1.h"
47
48 // --- AliRoot header files ---
49 #include "AliRun.h"
50 #include "AliMC.h"
51 #include "AliAD.h"
52 #include "AliADhit.h"
53 #include "AliADLoader.h"
54 #include "AliADDigitizer.h"
55 #include "AliDigitizationInput.h"
56 #include "AliADdigit.h"
57 #include "AliADSDigit.h"
58 #include "AliDAQ.h"
59 #include "AliRawReader.h"
60 #include "AliCDBManager.h"
61 #include "AliCDBEntry.h"
62 #include "AliADReconstructor.h"
63
64 ClassImp(AliAD)
65  //__________________________________________________________________
66 AliAD::AliAD()
67    : AliDetector(),
68      fSetADAToInstalled(0),
69      fSetADCToInstalled(0)
70 {
71         /// Default Constructor
72     
73
74 }
75
76 //_____________________________________________________________________________
77 AliAD::AliAD(const char *name, const char *title)
78    : AliDetector(name,title),
79      fSetADAToInstalled(kTRUE),
80      fSetADCToInstalled(kTRUE)
81
82 {
83   
84    // Standard constructor for AD Detector
85   
86
87 }
88
89 //_____________________________________________________________________________
90 AliAD::~AliAD()
91 {
92    //
93    // Default destructor for AD Detector
94    //
95   
96 }
97
98 //_____________________________________________________________________________
99 void AliAD::CreateMaterials()
100 {
101    //
102    // MATERIALS FOR ADC AND ADA
103    //
104    
105    // Parameters for simulation scope for ADA and ADC (stolen from AliVZEROv7::CreateMaterials )
106    Int_t    fieldType       = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();     // Field type 
107    Double_t maxField        = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();       // Field max.
108    Double_t maxBending      = 10;    // Max Angle
109    Double_t maxStepSize     = 0.01;  // Max step size 
110    Double_t maxEnergyLoss   = 1;     // Max Delta E
111    Double_t precision       = 0.003; // Precision
112    Double_t minStepSize     = 0.003; // Minimum step size 
113    Float_t  density,  as[11], zs[11], ws[11];
114    Double_t radLength, absLength, a_ad, z_ad;
115    Int_t    id;
116    
117    //
118    // Parameters  for AD scintillator: NE-102 (BC400)
119    //
120    // NE-102, has the following properties : (from internet, need better reference)
121    //    Density : ca. 1.03 g/cm3
122    //    Electrons/cm3: 3.39 x 10^23
123    //    H atoms/cm3: 5.28 x 10^22
124    //    C atoms/cm3: 4.78 x 10^22
125    //    Ratio of H to C : 1.104 .
126    //    wavelength of emission : ~4.23 nm.
127    //    Decay time : ~2.4 ns.
128    //    Luminescent efficiency : typically 18% of NaI(Tl)
129    //    Photons/MeV: 2.5 x 10^4 
130    //
131    // H                // C 
132    as[0] = 1.00794;    as[1] = 12.011;
133    zs[0] = 1.;         zs[1] = 6.;
134    ws[0] = 5.23;       ws[1] = 4.74;
135    density = 1.032;
136    id      = 1;
137    AliMixture( id, "NE102", as, zs, density, -2, ws );
138    AliMedium( id, "NE102", id, 1, fieldType, maxField, maxBending, maxStepSize,
139               maxEnergyLoss, precision, minStepSize );
140
141    //
142    // Parameters for lightGuide:  
143    //     TODO check material 
144    // Should be Poly(methyl methacrylate) (PMMA) acrylic 
145    // (C5O2H8)n 
146    // Density  1.18 g/cm3
147    // Mixture PMMA    Aeff=12.3994 Zeff=6.23653 rho=1.18 radlen=34.0677 intlen=63.3073
148    // Element #0 : C  Z=  6.00 A= 12.01 w= 0.600 natoms=5
149    // Element #1 : H  Z=  1.00 A=  1.01 w= 0.081 natoms=8
150    // Element #2 : O  Z=  8.00 A= 16.00 w= 0.320 natoms=2
151
152    // Carbon          Hydrogen          Oxygen
153    as[0] = 12.0107;   as[1] = 1.00794;  as[2] = 15.9994;
154    zs[0] = 6.;        zs[1] = 1.;       zs[2] = 8.;
155    ws[0] = 0.60;      ws[1] = 0.081;    ws[2] = 0.32;
156    density = 1.18;
157    id      = 2;
158    AliMixture( id, "PMMA", as, zs, density, 3, ws );
159    AliMedium( id,"PMMA", id, 1, fieldType, maxField, maxBending, maxStepSize,
160               maxEnergyLoss, precision, minStepSize );
161
162    
163    // mu-metal
164    // Niquel          Iron              Molybdenum        Manganese
165    as[0] = 58.6934;   as[1] = 55.845;   as[2] = 95.94;    as[3] = 54.9380;  
166    zs[0] = 28.;       zs[1] = 26.;      zs[2] = 42.;      zs[3] = 25.;   
167    ws[0] = 0.802;     ws[1] = 0.14079;  ws[2] = 0.0485;   ws[3] = 0.005;
168    // Silicon         Chromium          Cobalt            Aluminium
169    as[4] = 28.0855;   as[5] = 51.9961;  as[6] = 58.9332;  as[7] = 26.981539;   
170    zs[4] = 14.;       zs[5] = 24.;      zs[6] = 27.;      zs[7] = 13.;   
171    ws[4] = 0.003;     ws[5] = 0.0002;   ws[6] = 0.0002;   ws[7] = 0.0001;
172    // Carbon          Phosphorus        Sulfur
173    as[8] = 12.0107;   as[9] = 30.97376; as[10] = 32.066;
174    zs[8] = 6.;        zs[9] = 15.;      zs[10] = 16.;
175    ws[8] = 0.00015;   ws[9] = 0.00005;  ws[10] = 0.00001;
176    density = 8.25;
177    id      = 3;
178    AliMixture( id, "MuMetal", as, zs, density, 11, ws );
179    AliMedium( id,"MuMetal", id, 1, fieldType, maxField, maxBending, maxStepSize,
180               maxEnergyLoss, precision, minStepSize );
181
182    // Parameters for ADCPMA: Aluminium
183    a_ad = 26.98; 
184    z_ad = 13.00;
185    density   = 2.7;
186    radLength = 8.9;
187    absLength = 37.2;
188    id = 4;
189    AliMaterial (id, "Alum",  a_ad, z_ad, density, radLength, absLength, 0, 0 );
190    AliMedium( id, "Alum", id, 1, fieldType, maxField, maxBending, maxStepSize,
191               maxEnergyLoss, precision, minStepSize );
192
193    // Parameters for ADCPMG: Glass for the simulation Aluminium 
194    // TODO fix material
195    a_ad = 26.98; 
196    z_ad = 13.00;
197    density   = 2.7;
198    radLength = 8.9;
199    absLength = 37.2;
200    id = 5;
201    AliMaterial( id, "Glass",  a_ad, z_ad, density, radLength, absLength, 0, 0 );
202    AliMedium( id, "Glass", id, 1, fieldType, maxField, maxBending, maxStepSize,
203               maxEnergyLoss, precision, minStepSize );
204
205
206 }
207 //_____________________________________________________________________________
208 void AliAD::SetTreeAddress()
209 {
210    //
211    // Sets tree address for hits.
212    //
213
214         TBranch *branch;
215         char branchname[20];
216         snprintf(branchname,19,"%s",GetName());
217         // Branch address for hit tree
218         TTree *treeH = fLoader->TreeH();
219         if (treeH ) 
220         {
221                 branch = treeH->GetBranch(branchname);
222                 if (branch) branch->SetAddress(&fHits);
223         }
224 }
225
226
227 //_____________________________________________________________________________
228 void AliAD::MakeBranch(Option_t* opt)
229 {
230         const char* oH = strstr(opt,"H");
231         if (fLoader->TreeH() && oH && (fHits==0x0))
232         {
233                 fHits = new TClonesArray("AliADhit",1000);
234                 fNhits = 0;
235         }
236         AliDetector::MakeBranch(opt);
237 }
238 //_____________________________________________________________________________
239 AliLoader* AliAD::MakeLoader(const char* topfoldername)
240
241  
242    AliDebug(1,Form("Creating AliADLoader, Top folder is %s ",topfoldername));
243    fLoader = new AliADLoader(GetName(),topfoldername);
244    return fLoader;
245 }
246
247 //_____________________________________________________________________________
248 AliDigitizer* AliAD::CreateDigitizer(AliDigitizationInput* digInput) const
249 {
250    //
251    // Creates a digitizer for AD
252    //
253    return new AliADDigitizer(digInput);
254 }
255
256 //_____________________________________________________________________________
257 void AliAD::Hits2Digits(){
258   //
259   // Converts hits to digits
260   //
261   // Creates the AD digitizer 
262   AliADDigitizer* dig = new AliADDigitizer(this,AliADDigitizer::kHits2Digits);
263
264   // Creates the digits
265   dig->Digitize("");
266
267   // deletes the digitizer
268   delete dig;
269 }
270
271 //_____________________________________________________________________________
272 void AliAD::Hits2SDigits(){
273   //
274   // Converts hits to summable digits
275   //
276   // Creates the AD digitizer 
277   AliADDigitizer* dig = new AliADDigitizer(this,AliADDigitizer::kHits2SDigits);
278
279   // Creates the sdigits
280   dig->Digitize("");
281
282   // deletes the digitizer
283   delete dig;
284 }
285
286
287 //_____________________________________________________________________________
288
289 void AliAD::Digits2Raw()
290 {
291         // produces raw data from digits
292         // for AD not implemented yet (needs detailed hardware info)
293 }
294
295 //_____________________________________________________________________________
296
297 Bool_t AliAD::Raw2SDigits(AliRawReader* /*rawReader*/)
298 {
299         // reads raw data to produce digits
300         // for AD not implemented yet (needs detailed hardware info)
301         return kTRUE;
302 }