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