AliLog is implemented
[u/mrichter/AliRoot.git] / PMD / AliPMD.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$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //
20 //                                                                           //
21 //  Photon Multiplicity Detector                                             //
22 //  This class contains the basic functions for the Photon Multiplicity      //
23 //  Detector. Functions specific to one particular geometry are              //
24 //  contained in the derived classes                                         //
25 //                                                                           //
26 //Begin_Html
27 /*
28 <img src="picts/AliPMDClass.gif">
29 </pre>
30 <br clear=left>
31 <font size=+2 color=red>
32 <p>The responsible person for this module is
33 <a href="mailto:sub@vecdec.veccal.ernet.in">Subhasis Chattopadhyay</a>.
34 </font>
35 <pre>
36 */
37 //End_Html
38 //                                                                           //
39 ///////////////////////////////////////////////////////////////////////////////
40
41 #include <TBRIK.h>
42 #include <TClonesArray.h>
43 #include <TGeometry.h>
44 #include <TNode.h>
45 #include <TTree.h>
46 #include <TVirtualMC.h>
47
48 #include "AliLog.h"
49 #include "AliLoader.h" 
50 #include "AliPMDLoader.h" 
51 #include "AliPMD.h"
52 #include "AliRun.h"
53 #include "AliMC.h"
54 #include "AliPMDDigitizer.h"
55 #include "AliPMDhit.h"
56 #include "AliPMDDDLRawData.h"
57   
58 ClassImp(AliPMD)
59  
60 //_____________________________________________________________________________
61 AliPMD::AliPMD()
62 {
63   //
64   // Default constructor
65   //
66   fIshunt = 0;
67
68 }
69  
70 //_____________________________________________________________________________
71 AliPMD::AliPMD(const char *name, const char *title)
72   : AliDetector(name,title)
73 {
74   //
75   // Default constructor
76   //
77
78   // 
79   // Allocate the array of hits
80   fHits   = new TClonesArray("AliPMDhit",  405);
81   gAlice->GetMCApp()->AddHitList(fHits);
82
83
84   fIshunt =  0;
85   
86   fPar[0] = 1;
87   fPar[1] = 1;
88   fPar[2] = 0.8;
89   fPar[3] = 0.02;
90   fIn[0]  = 6;
91   fIn[1]  = 20;
92   fIn[2]  = 600;
93   fIn[3]  = 27;
94   fIn[4]  = 27;
95   fGeo[0] = 0;
96   fGeo[1] = 0.2;
97   fGeo[2] = 4;
98   fPadSize[0] = 0.8;
99   fPadSize[1] = 1.0;
100   fPadSize[2] = 1.2;
101   fPadSize[3] = 1.5;
102 }
103
104 AliLoader* AliPMD::MakeLoader(const char* topfoldername)
105 {
106   // Makes PMD Loader
107  
108   fLoader = new AliPMDLoader(GetName(),topfoldername);
109  
110   if (fLoader)
111     {
112       AliInfo("Success");
113     }
114   else
115     {
116       AliError("Failure");
117     }
118
119   return fLoader;
120 }
121
122 AliPMD::~AliPMD()
123 {
124   //
125   // Destructor
126   //
127 }
128
129 //_____________________________________________________________________________
130 void AliPMD::AddHit(Int_t track, Int_t *vol, Float_t *hits)
131 {
132   //
133   // Add a PMD hit
134   //
135   TClonesArray &lhits = *fHits;
136   AliPMDhit *newcell, *curcell;
137   //  printf("PMD++ Adding energy %f, prim %d, vol %d %d %d %d %d %d %d %d\n",
138   // hits[3],gAlice->GetPrimary(track-1),vol[0],vol[1],vol[2],vol[3],
139   // vol[4],vol[5],vol[6],vol[7]);
140
141   newcell = new AliPMDhit(fIshunt, track, vol, hits);
142   Int_t i;
143   for (i=0; i<fNhits; i++) {
144     //
145     // See if this cell has already been hit
146     curcell=(AliPMDhit*) lhits[i];
147     if (*curcell==*newcell) {
148 //        printf("Cell with same numbers found\n") ; curcell->Print();
149       *curcell = *curcell+*newcell;
150 //        printf("Cell after addition\n") ; curcell->Print();
151       delete newcell;
152       return;
153     }
154   }
155   new(lhits[fNhits++]) AliPMDhit(newcell);
156   delete newcell;
157 }
158  
159 //_____________________________________________________________________________
160 void AliPMD::BuildGeometry()
161 {
162   //
163   // Build simple ROOT TNode geometry for event display
164   //
165
166   TNode *node, *top;
167   const int kColorPMD  = kRed;
168
169   //
170   top=gAlice->GetGeometry()->GetNode("alice");
171
172   // PMD
173   new TBRIK("S_PMD","PMD box","void",300,300,5);
174   top->cd();
175   node = new TNode("PMD","PMD","S_PMD",0,0,-600,"");
176   node->SetLineColor(kColorPMD);
177   fNodes->Add(node);
178 }
179
180 //_____________________________________________________________________________
181 Int_t AliPMD::DistancetoPrimitive(Int_t , Int_t ) const
182 {
183   //
184   // Distance from mouse to detector on the screen
185   // dummy routine
186   //
187    return 9999;
188 }
189  
190 //_____________________________________________________________________________
191 void AliPMD::SetPAR(Float_t p1, Float_t p2, Float_t p3,Float_t p4)
192 {
193   //
194   // Set PMD parameters
195   //
196   fPar[0] = p1;
197   fPar[1] = p2;
198   fPar[2] = p3;
199   fPar[3] = p4;
200 }
201  
202 //_____________________________________________________________________________
203 void AliPMD::SetIN(Float_t p1, Float_t p2, Float_t p3,Float_t p4,Float_t p5)
204 {
205   //
206   // Set PMD parameters
207   //
208   fIn[0] = p1;
209   fIn[1] = p2;
210   fIn[2] = p3;
211   fIn[3] = p4;
212   fIn[4] = p5;
213 }
214  
215 //_____________________________________________________________________________
216 void AliPMD::SetGEO(Float_t p1, Float_t p2, Float_t p3)
217 {
218   //
219   // Set geometry parameters
220   //
221   fGeo[0] = p1;
222   fGeo[1] = p2;
223   fGeo[2] = p3;
224 }
225  
226 //_____________________________________________________________________________
227 void AliPMD::SetPadSize(Float_t p1, Float_t p2, Float_t p3,Float_t p4)
228 {
229   //
230   // Set pad size
231   //
232   fPadSize[0] = p1;
233   fPadSize[1] = p2;
234   fPadSize[2] = p3;
235   fPadSize[3] = p4;
236 }
237  
238 //_____________________________________________________________________________
239 void AliPMD::StepManager()
240 {
241   //
242   // Called at every step in PMD
243   //
244 }
245
246 void AliPMD::MakeBranch(Option_t* option)
247 {
248     // Create Tree branches for the PMD
249     
250     const char *cH = strstr(option,"H");
251     if (cH && fLoader->TreeH() && (fHits == 0x0))
252       fHits   = new TClonesArray("AliPMDhit",  405);
253     
254     AliDetector::MakeBranch(option);
255 }
256
257
258 void AliPMD::SetTreeAddress()
259 {
260   // Set branch address
261
262     if (fLoader->TreeH() && fHits==0x0)
263       fHits   = new TClonesArray("AliPMDhit",  405);
264       
265     AliDetector::SetTreeAddress();
266 }
267
268 //____________________________________________________________________________
269 void AliPMD::Hits2SDigits()  
270
271 // create summable digits
272
273   AliRunLoader* runLoader = fLoader->GetRunLoader(); 
274   AliPMDDigitizer* pmdDigitizer = new AliPMDDigitizer;
275   pmdDigitizer->OpengAliceFile(fLoader->GetRunLoader()->GetFileName().Data(),
276                                "HS");
277   pmdDigitizer->SetZPosition(361.5);
278
279   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
280     pmdDigitizer->Hits2SDigits(iEvent);
281   }
282   fLoader->UnloadHits();
283   fLoader->UnloadSDigits();
284   delete pmdDigitizer;
285 }
286 //____________________________________________________________________________
287 void AliPMD::SDigits2Digits()  
288
289   // creates sdigits to digits
290 }
291 //____________________________________________________________________________
292 void AliPMD::Hits2Digits()  
293
294 // create digits
295
296   AliRunLoader* runLoader = fLoader->GetRunLoader(); 
297   AliPMDDigitizer* pmdDigitizer = new AliPMDDigitizer;
298   pmdDigitizer->OpengAliceFile(fLoader->GetRunLoader()->GetFileName().Data(),
299                                "HD");
300   pmdDigitizer->SetZPosition(361.5);
301
302   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
303     pmdDigitizer->Hits2Digits(iEvent);
304   }
305   fLoader->UnloadHits();
306   fLoader->UnloadDigits();
307   delete pmdDigitizer;
308
309 }
310 // ---------------------------------------------------------------------------
311 AliDigitizer* AliPMD::CreateDigitizer(AliRunDigitizer* manager) const
312
313   return new AliPMDDigitizer(manager);
314 }
315 // ---------------------------------------------------------------------------
316 void AliPMD::Digits2Raw()
317
318 // convert digits of the current event to raw data
319
320   fLoader->LoadDigits();
321   TTree* digits = fLoader->TreeD();
322   if (!digits) {
323     AliError("No digits tree");
324     return;
325   }
326
327   AliPMDDDLRawData rawWriter;
328   rawWriter.WritePMDRawData(digits);
329
330   fLoader->UnloadDigits();
331 }
332
333
334