Merging the VirtualMC branch to the main development branch (HEAD)
[u/mrichter/AliRoot.git] / RICH / AliRICHv1.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 /*
17   $Log$
18   Revision 1.16.6.2  2002/07/24 10:07:52  alibrary
19   Updating VirtualMC
20
21   Revision 1.16.6.1  2002/06/10 15:12:46  hristov
22   Merged with v3-08-02
23
24   Revision 1.16  2001/10/10 11:29:17  morsch
25   Use segmentation v1 and wire sag as default. It does not work otherwise. Why ?
26
27   Revision 1.15  2001/08/30 09:51:23  hristov
28   The operator[] is replaced by At() or AddAt() in case of TObjArray.
29
30   Revision 1.14  2001/05/16 14:57:20  alibrary
31   New files for folders and Stack
32
33   Revision 1.13  2001/05/10 12:28:04  jbarbosa
34   Repositioned the RICH modules.
35
36   Revision 1.12  2001/02/23 17:26:12  jbarbosa
37   Setters for wire sag effect and voltage values.
38
39   Revision 1.11  2001/02/13 20:10:33  jbarbosa
40   Removed call to SetNSec() (obsolete). Fixed bug in chamber initialisation (not all chambers were initialised).
41
42   Revision 1.10  2000/12/20 14:08:02  jbarbosa
43   Removed dependencies on TGeant3 (thanks to F. Carminati and I. Hrivnacova)
44
45   Revision 1.9  2000/12/18 17:44:40  jbarbosa
46   Took two lines out of output.
47
48   Revision 1.8  2000/11/01 15:39:00  jbarbosa
49   Updated default geometry.
50
51   Revision 1.7  2000/10/03 21:44:09  morsch
52   Use AliSegmentation and AliHit abstract base classes.
53
54   Revision 1.6  2000/07/10 15:28:39  fca
55   Correction of the inheritance scheme
56
57   Revision 1.5  2000/06/30 16:38:51  dibari
58   Removed setters.
59
60   Revision 1.4  2000/06/13 13:13:40  jbarbosa
61   Correcting previous correction...
62
63   Revision 1.3  2000/06/13 13:06:38  jbarbosa
64   Fixed compiling error for HP (multiple declaration)
65
66   Revision 1.2  2000/06/12 15:36:16  jbarbosa
67   Cleaned up version.
68
69   Revision 1.1  2000/06/09 15:00:31  jbarbosa
70   New full version. All parameters configurable.
71
72   Revision 1.9  2000/05/31 08:19:38  jbarbosa
73   Fixed bug in StepManager
74
75   Revision 1.8  2000/05/26 17:30:08  jbarbosa
76   Cerenkov angle now stored within cerenkov data structure.
77
78   Revision 1.7  2000/05/18 10:31:36  jbarbosa
79   Fixed positioning of spacers inside freon.
80   Fixed positioning of proximity gap
81   inside methane.
82   Fixed cut on neutral particles in the StepManager.
83
84   Revision 1.6  2000/04/28 11:51:58  morsch
85    Dimensions of arrays hits and Ckov_data corrected.
86
87   Revision 1.5  2000/04/19 13:28:46  morsch
88   Major changes in geometry (parametrised), materials (updated) and
89   step manager (diagnostics) (JB, AM)
90
91 */
92
93
94
95 //////////////////////////////////////////////////////////
96 //  Manager and hits classes for set: RICH full version //
97 //////////////////////////////////////////////////////////
98
99 #include <TTUBE.h>
100 #include <TNode.h> 
101 #include <TRandom.h> 
102 #include <TParticle.h> 
103
104 #include "AliRICHv1.h"
105 #include "AliRICHHit.h"
106 #include "AliSegmentation.h"
107 #include "AliRICHResponse.h"
108 #include "AliRICHSegmentationV1.h"
109 #include "AliRICHResponseV0.h"
110 #include "AliRICHGeometry.h"
111 #include "AliRun.h"
112 #include "AliMC.h"
113 #include "iostream.h"
114 #include "AliConst.h" 
115 #include "AliPDG.h" 
116
117 ClassImp(AliRICHv1)
118     
119 //___________________________________________
120 AliRICHv1::AliRICHv1()
121 {
122
123 // Default constructor fo AliRICHvv1 (full version)
124
125     //fChambers = 0;
126 }
127
128 //___________________________________________
129 AliRICHv1::AliRICHv1(const char *name, const char *title)
130     : AliRICH(name,title)
131 {
132
133 // Full version of RICH with hits and diagnostics
134
135   // Version 0
136 // Default Segmentation, no hits
137     AliRICHSegmentationV1* segmentation = new AliRICHSegmentationV1;
138 //
139 //  Segmentation parameters
140     segmentation->SetPadSize(0.84,0.80);
141     segmentation->SetDAnod(0.84/2);
142 //
143 //  Geometry parameters
144     AliRICHGeometry* geometry = new AliRICHGeometry;
145     geometry->SetGapThickness(8);
146     geometry->SetProximityGapThickness(.4);
147     geometry->SetQuartzLength(133);
148     geometry->SetQuartzWidth(127.9);
149     geometry->SetQuartzThickness(.5);
150     geometry->SetOuterFreonLength(133);
151     geometry->SetOuterFreonWidth(41.3);
152     geometry->SetInnerFreonLength(133);
153     geometry->SetInnerFreonWidth(41.3);
154     geometry->SetFreonThickness(1.5);
155 //
156 //  Response parameters
157     AliRICHResponseV0*  response   = new AliRICHResponseV0;
158     response->SetSigmaIntegration(5.);
159     response->SetChargeSlope(27.);
160     response->SetChargeSpread(0.18, 0.18);
161     response->SetMaxAdc(4096);
162     response->SetAlphaFeedback(0.036);
163     response->SetEIonisation(26.e-9);
164     response->SetSqrtKx3(0.77459667);
165     response->SetKx2(0.962);
166     response->SetKx4(0.379);
167     response->SetSqrtKy3(0.77459667);
168     response->SetKy2(0.962);
169     response->SetKy4(0.379);
170     response->SetPitch(0.25);
171     response->SetWireSag(1);                     // 1->On, 0->Off
172     response->SetVoltage(2150);                  // Should only be 2000, 2050, 2100 or 2150
173
174 //
175 //    AliRICH *RICH = (AliRICH *) gAlice->GetDetector("RICH"); 
176     
177     fCkovNumber=0;
178     fFreonProd=0;
179     Int_t i=0;
180     
181     fChambers = new TObjArray(kNCH);
182     for (i=0; i<kNCH; i++) {
183       
184       //PH      (*fChambers)[i] = new AliRICHChamber();  
185       fChambers->AddAt(new AliRICHChamber(), i);  
186       
187     }
188   
189     for (i=0; i<kNCH; i++) {
190       SetGeometryModel(i,geometry);
191       SetSegmentationModel(i, segmentation);
192       SetResponseModel(i, response);
193       SetDebugLevel(0);
194     }
195
196
197 }
198
199 void AliRICHv1::Init()
200 {
201
202   if(fDebug) {
203     printf("%s: *********************************** RICH_INIT ***********************************\n",ClassName());
204     printf("%s: *                                                                               *\n",ClassName());
205     printf("%s: *                        AliRICHv1 Full version started                         *\n",ClassName());
206     printf("%s: *                                                                               *\n",ClassName());
207   }
208
209   
210   AliSegmentation*  segmentation;
211   AliRICHGeometry*  geometry;
212   AliRICHResponse*  response;
213
214
215     // 
216     // Initialize Tracking Chambers
217     //
218     for (Int_t i=0; i<kNCH; i++) {
219         //printf ("i:%d",i);
220       //PH      ( (AliRICHChamber*) (*fChambers)[i])->Init(i);  
221         ( (AliRICHChamber*)fChambers->At(i))->Init(i);  
222     }  
223     
224     //
225     // Set the chamber (sensitive region) GEANT identifier
226     
227     //PH    ((AliRICHChamber*)(*fChambers)[0])->SetGid(1);  
228     //PH    ((AliRICHChamber*)(*fChambers)[1])->SetGid(2);  
229     //PH    ((AliRICHChamber*)(*fChambers)[2])->SetGid(3);  
230     //PH    ((AliRICHChamber*)(*fChambers)[3])->SetGid(4);  
231     //PH    ((AliRICHChamber*)(*fChambers)[4])->SetGid(5);  
232     //PH    ((AliRICHChamber*)(*fChambers)[5])->SetGid(6);  
233     //PH    ((AliRICHChamber*)(*fChambers)[6])->SetGid(7); 
234
235     ((AliRICHChamber*)fChambers->At(0))->SetGid(1);  
236     ((AliRICHChamber*)fChambers->At(1))->SetGid(2);  
237     ((AliRICHChamber*)fChambers->At(2))->SetGid(3);  
238     ((AliRICHChamber*)fChambers->At(3))->SetGid(4);  
239     ((AliRICHChamber*)fChambers->At(4))->SetGid(5);  
240     ((AliRICHChamber*)fChambers->At(5))->SetGid(6);  
241     ((AliRICHChamber*)fChambers->At(6))->SetGid(7);  
242
243
244     segmentation=Chamber(0).GetSegmentationModel(0);
245     geometry=Chamber(0).GetGeometryModel();
246     response=Chamber(0).GetResponseModel();
247     
248     Float_t offset       = 490 + 1.276 - geometry->GetGapThickness()/2;        //distance from center of mother volume to methane
249     Float_t deltaphi     = 19.5;                                               //phi angle between center of chambers - z direction
250     Float_t deltatheta   = 20;                                                 //theta angle between center of chambers - x direction
251     Float_t cosphi       = TMath::Cos(deltaphi*TMath::Pi()/180);
252     Float_t sinphi       = TMath::Sin(deltaphi*TMath::Pi()/180);
253     Float_t costheta     = TMath::Cos(deltatheta*TMath::Pi()/180);
254     Float_t sintheta     = TMath::Sin(deltatheta*TMath::Pi()/180);
255
256     Float_t pos1[3]={0.                , offset*cosphi         , offset*sinphi};
257     Float_t pos2[3]={offset*sintheta   , offset*costheta       , 0. };
258     Float_t pos3[3]={0.                , offset                , 0.};
259     Float_t pos4[3]={-offset*sintheta  , offset*costheta       , 0.};
260     Float_t pos5[3]={offset*sinphi     , offset*costheta*cosphi, -offset*sinphi};
261     Float_t pos6[3]={0.                , offset*cosphi         , -offset*sinphi};
262     Float_t pos7[3]={ -offset*sinphi   , offset*costheta*cosphi, -offset*sinphi};
263
264     Chamber(0).SetChamberTransform(pos1[0],pos1[1],pos1[2],new TRotMatrix("rot993","rot993",90., 0.               , 90. - deltaphi, 90.             , deltaphi, -90.           ));
265     Chamber(1).SetChamberTransform(pos2[0],pos2[1],pos2[2],new TRotMatrix("rot994","rot994",90., -deltatheta      , 90.           , 90.- deltatheta , 0.      , 0.             ));
266     Chamber(2).SetChamberTransform(pos3[0],pos3[1],pos3[2],new TRotMatrix("rot995","rot995",90., 0.               , 90.           , 90.             , 0.      , 0.             ));
267     Chamber(3).SetChamberTransform(pos4[0],pos4[1],pos4[2],new TRotMatrix("rot996","rot996",90.,  deltatheta      , 90.           , 90 + deltatheta , 0.      , 0.             ));
268     Chamber(4).SetChamberTransform(pos5[0],pos5[1],pos5[2],new TRotMatrix("rot997","rot997",90., 360. - deltatheta, 108.2         , 90.- deltatheta ,18.2     , 90 - deltatheta));
269     Chamber(5).SetChamberTransform(pos6[0],pos6[1],pos6[2],new TRotMatrix("rot998","rot998",90., 0.               , 90 + deltaphi , 90.             , deltaphi, 90.            ));
270     Chamber(6).SetChamberTransform(pos7[0],pos7[1],pos7[2],new TRotMatrix("rot999","rot999",90., deltatheta       , 108.2         , 90.+ deltatheta ,18.2     , 90 + deltatheta));   
271      
272     if(fDebug) {
273       printf("%s: *                            Pads            : %3dx%3d                          *\n",
274              ClassName(),segmentation->Npx(),segmentation->Npy());
275       printf("%s: *                            Pad size        : %5.2f x%5.2f mm2                 *\n",
276              ClassName(),segmentation->Dpx(),segmentation->Dpy()); 
277       printf("%s: *                            Gap Thickness   : %5.1f cm                         *\n",
278              ClassName(),geometry->GetGapThickness());
279       printf("%s: *                            Radiator Width  : %5.1f cm                         *\n",
280              ClassName(),geometry->GetQuartzWidth());
281       printf("%s: *                            Radiator Length : %5.1f cm                         *\n",
282              ClassName(),geometry->GetQuartzLength());
283       printf("%s: *                            Freon Thickness : %5.1f cm                         *\n",
284              ClassName(),geometry->GetFreonThickness());
285       printf("%s: *                            Charge Slope    : %5.1f ADC                        *\n",
286              ClassName(),response->ChargeSlope());
287       printf("%s: *                            Feedback Prob.  : %5.2f %%                          *\n",
288              ClassName(),response->AlphaFeedback()*100);
289       printf("%s: *                            Debug Level     : %3d                              *\n",
290              ClassName(),GetDebugLevel());
291       printf("%s: *                                                                               *\n",
292              ClassName());
293       printf("%s: *********************************************************************************\n",
294              ClassName());
295     }
296 }
297
298
299
300
301
302
303
304