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