Code review
[u/mrichter/AliRoot.git] / ZDC / AliZDC.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.15  2001/01/26 19:56:27  hristov
19 Major upgrade of AliRoot code
20
21 Revision 1.14  2000/12/12 13:17:01  coppedis
22 Minor corrections suggested by P. Hristov
23
24 Revision 1.12  2000/12/01 08:19:01  coppedis
25 Adding a message error if ZDC is constructed without DIPO
26
27 Revision 1.11  2000/11/30 17:21:03  coppedis
28 Introduce hit array fStHits reset only at the end of the event (for digitization)
29
30 Revision 1.10  2000/11/22 11:32:58  coppedis
31 Major code revision
32
33 Revision 1.9  2000/10/02 21:28:20  fca
34 Removal of useless dependecies via forward declarations
35
36 Revision 1.8  2000/07/10 13:58:01  fca
37 New version of ZDC from E.Scomparin & C.Oppedisano
38
39 Revision 1.7  2000/01/19 17:17:40  fca
40
41 Revision 1.6  1999/09/29 09:24:35  fca
42 Introduction of the Copyright and cvs Log
43
44 */
45
46 ///////////////////////////////////////////////////////////////////////////////
47 //                                                                           //
48 //  Zero Degree Calorimeter                                                  //
49 //  This class contains the basic functions for the ZDCs                     //
50 //  Functions specific to one particular geometry are                        //
51 //  contained in the derived classes                                         //
52 //                                                                           //
53 ///////////////////////////////////////////////////////////////////////////////
54
55 #include <stdlib.h>
56
57 // --- ROOT system
58 #include <TBRIK.h>
59 #include <TNode.h>
60 #include <TGeometry.h>
61 #include <TFile.h>
62 #include <TTree.h>
63
64 // --- AliRoot header files
65 #include "AliZDC.h"
66 #include "AliZDCHit.h"
67 #include "AliRun.h"
68 #include "AliDetector.h"
69 #include "AliCallf77.h"
70 #include "AliConst.h"
71 #include "AliMC.h"
72
73  
74 ClassImp(AliZDC)
75  
76 //_____________________________________________________________________________
77 AliZDC::AliZDC()
78 {
79   //
80   // Default constructor for the Zero Degree Calorimeter base class
81   //
82
83   fNhits = 0;
84
85   fNStHits = 0;
86   fStHits = new TClonesArray("AliZDCHit",1000);
87
88   fNPrimaryHits = 0;
89   fNoShower   = 0;
90   
91   fIshunt = 0;
92 }
93  
94 //_____________________________________________________________________________
95 AliZDC::AliZDC(const char *name, const char *title)
96   : AliDetector(name,title)
97 {
98   //
99   // Standard constructor for the Zero Degree Calorimeter base class
100   //
101
102   // Check that DIPO is there (otherwise tracking is wrong!!!)
103   
104   AliModule* DIPO=gAlice->GetModule("DIPO");
105   if(!DIPO) {
106     Error("Constructor","ZDC needs DIPO!!!\n");
107     exit(1);
108   } 
109
110   //
111   // Allocate the array of hits
112
113   fHits   = new TClonesArray("AliZDCHit",1000);
114   gAlice->AddHitList(fHits);
115   
116   fStHits = new TClonesArray("AliZDCHit",1000);
117   fNStHits = 0;
118
119   fNPrimaryHits = 0;
120   fNoShower   = 0;
121   
122   fIshunt =  0;
123
124 }
125 //____________________________________________________________________________ 
126 AliZDC::~AliZDC()
127 {
128   //
129   // ZDC destructor
130   //
131
132   fIshunt   = 0;
133 //  delete fHits;
134 //  if(fStHits){
135 //    fStHits->Delete();
136 //    delete fStHits;
137 //    fNStHits = 0;
138 //  }
139 //  delete fDigits;
140 }
141 //_____________________________________________________________________________
142 void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
143 {
144   //
145   //            Add a ZDC hit to the hit list.
146   // -> We make use of 2 array of hits:
147   // [1]  fHits (the usual one) that contains hits for each PRIMARY
148   // [2]  fStHits that contains hits for each EVENT and is used to
149   //      obtain digits at the end of each event
150   //
151   
152   static Float_t primKinEn, xImpact, yImpact, sFlag;
153
154   TClonesArray &lsthits = *fStHits;
155
156
157   AliZDCHit *newquad, *curevquad, *curprimquad;
158   newquad = new AliZDCHit(fIshunt, track, vol, hits);
159
160   TClonesArray &lhits = *fHits;
161    
162   Int_t i,j,kStHit = 1;
163   for(i=0; i<fNStHits; i++){
164     // If the hits are equal (same track, same volume), sum them.
165      curevquad = (AliZDCHit*) lsthits[i];
166      kStHit = 1;
167      if(*curevquad == *newquad){
168         *curevquad = *curevquad+*newquad;
169         kStHit = 0;
170      } 
171   }
172
173   for(j=0; j<fNhits; j++){
174     // If the hits are equal (same track, same volume), sum them.
175      curprimquad = (AliZDCHit*) lhits[j];
176      if(*curprimquad == *newquad){
177         *curprimquad = *curprimquad+*newquad;
178         delete newquad;
179         return;
180      } 
181   }
182   
183   if(fNhits==0){
184       // First hit -> setting flag for primary or secondary particle
185       Int_t primary = gAlice->GetPrimary(track);     
186       if(track != primary){
187         newquad->fSFlag = 1;  // Hit created by secondary particle entering the ZDC
188       }
189       else if(track == primary){
190         newquad->fSFlag = 0;  // Hit created by PRIMARY particle entering the ZDC
191       }  
192       fNPrimaryHits += 1;
193       sFlag = newquad->fSFlag;
194       primKinEn = newquad->fPrimKinEn;
195       xImpact = newquad->fXImpact;
196       yImpact = newquad->fYImpact;
197    }
198    else{       
199       newquad->fPrimKinEn = primKinEn;
200       newquad->fXImpact = xImpact;
201       newquad->fYImpact = yImpact;
202       newquad->fSFlag = sFlag;
203    }
204
205     //Otherwise create a new hit
206     new(lhits[fNhits]) AliZDCHit(newquad);
207     fNhits++;
208     
209     if(kStHit){
210       new(lsthits[fNStHits]) AliZDCHit(newquad);
211       fNStHits++;
212     }
213  
214     if(fDebug == 1){ 
215       printf("\n  Primary Hits --------------------------------------------------------\n");
216       fHits->Print("");
217       printf("\n  Event Hits --------------------------------------------------------\n");
218       fStHits->Print("");
219     }
220
221     delete newquad;
222   }
223   
224 //_____________________________________________________________________________
225 void AliZDC::ResetDigits()
226 {
227   //
228   // Reset number of digits and the digits array
229   //
230     
231     AliDetector::ResetDigits();
232 //    fNStHits = 0;
233 //    if(fStHits) fStHits->Clear();
234 }
235
236 //_____________________________________________________________________________
237 void AliZDC::BuildGeometry()
238 {
239   //
240   // Build the ROOT TNode geometry for event display 
241   // in the Zero Degree Calorimeter
242   // This routine is dummy for the moment
243   //
244
245   TNode *node, *top;
246   TBRIK *brik;
247   const int kColorZDC  = kRed;
248   
249   //
250   top=gAlice->GetGeometry()->GetNode("alice");
251   
252   // ZDC
253     brik = new TBRIK("S_ZDC","ZDC box","void",300,300,5);
254     top->cd();
255     node = new TNode("ZDC","ZDC","S_ZDC",0,0,600,"");
256     node->SetLineColor(kColorZDC);
257     fNodes->Add(node);
258 }
259
260 //_____________________________________________________________________________
261 Int_t AliZDC::DistancetoPrimitive(Int_t , Int_t )
262 {
263   //
264   // Distance from the mouse to the Zero Degree Calorimeter
265   // Dummy routine
266   //
267   return 9999;
268 }
269  
270 //_____________________________________________________________________________
271 void AliZDC::StepManager()
272 {
273   //
274   // Routine called at every step in the Zero Degree Calorimeter
275   //
276 }