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