Merging implemented
[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.23  2001/05/15 13:44:57  coppedis
19 Changes in AddHit method
20
21 Revision 1.22  2001/05/14 09:53:32  coppedis
22 Adding functions ZMin and ZMax
23
24 Revision 1.21  2001/04/20 10:05:02  coppedis
25 Minor changes
26
27 Revision 1.20  2001/03/26 13:39:20  coppedis
28 Comment prints
29
30 Revision 1.19  2001/03/26 09:10:23  coppedis
31 Corrected bug in constructor (fIshunt has to be =1)
32
33 Revision 1.18  2001/03/20 08:21:55  coppedis
34 ZDC needs PIPE, ABSO, DIPO and SHIL
35
36 Revision 1.17  2001/03/16 16:18:03  coppedis
37 Correction for superposition of ZDC volumes with MUON arm one
38
39 Revision 1.16  2001/03/15 16:01:11  coppedis
40 Code review
41
42 Revision 1.15  2001/01/26 19:56:27  hristov
43 Major upgrade of AliRoot code
44
45 Revision 1.14  2000/12/12 13:17:01  coppedis
46 Minor corrections suggested by P. Hristov
47
48 Revision 1.12  2000/12/01 08:19:01  coppedis
49 Adding a message error if ZDC is constructed without DIPO
50
51 Revision 1.11  2000/11/30 17:21:03  coppedis
52 Introduce hit array fStHits reset only at the end of the event (for digitization)
53
54 Revision 1.10  2000/11/22 11:32:58  coppedis
55 Major code revision
56
57 Revision 1.9  2000/10/02 21:28:20  fca
58 Removal of useless dependecies via forward declarations
59
60 Revision 1.8  2000/07/10 13:58:01  fca
61 New version of ZDC from E.Scomparin & C.Oppedisano
62
63 Revision 1.7  2000/01/19 17:17:40  fca
64
65 Revision 1.6  1999/09/29 09:24:35  fca
66 Introduction of the Copyright and cvs Log
67
68 */
69
70 ///////////////////////////////////////////////////////////////////////////////
71 //                                                                           //
72 //                      Zero Degree Calorimeter                              //
73 //           This class contains the basic functions for the ZDCs;           //
74 //            functions specific to one particular geometry are              //
75 //                      contained in the derived classes                     //
76 //                                                                           //
77 ///////////////////////////////////////////////////////////////////////////////
78
79 #include <stdlib.h>
80 #include <iostream.h>
81
82 // --- ROOT system
83 #include <TBRIK.h>
84 #include <TNode.h>
85 #include <TGeometry.h>
86 #include <TFile.h>
87 #include <TTree.h>
88
89 // --- AliRoot header files
90 #include "AliZDC.h"
91 #include "AliZDCHit.h"
92 #include "AliZDCDigit.h"
93 #include "AliZDCMerger.h"
94 #include "AliDetector.h"
95 #include "AliCallf77.h"
96 #include "AliConst.h"
97 #include "AliMC.h"
98 #include "AliRun.h"
99 #include "AliHeader.h"
100
101  
102 ClassImp(AliZDC)
103  
104 //_____________________________________________________________________________
105 AliZDC::AliZDC()
106 {
107   //
108   // Default constructor for the Zero Degree Calorimeter base class
109   //
110   
111   fIshunt   = 1;
112   fNoShower = 0;
113   fMerger   = 0;
114
115   fHits     = 0;
116   fNhits    = 0;
117
118   fDigits   = 0;
119   fNdigits  = 0;
120   
121 }
122  
123 //_____________________________________________________________________________
124 AliZDC::AliZDC(const char *name, const char *title)
125   : AliDetector(name,title)
126 {
127   //
128   // Standard constructor for the Zero Degree Calorimeter base class
129   //
130
131   fIshunt   = 1;
132   fNoShower = 0;
133   fMerger   = 0;
134
135   // Allocate the hits array  
136   fHits   = new TClonesArray("AliZDCHit",1000);
137   gAlice->AddHitList(fHits);
138
139   // Allocate the digits array  
140   fDigits = new TClonesArray("AliZDCDigit",1000);
141   
142
143 }
144 //____________________________________________________________________________ 
145 AliZDC::~AliZDC()
146 {
147   //
148   // ZDC destructor
149   //
150
151   fIshunt   = 0;
152   
153 //  if(fMerger) delete fMerger;
154
155 //  if(fHits){
156 //    fHits->Delete();
157 //    delete fHits;
158 //  }
159
160 //  if(fDigits){
161 //    fDigits->Delete();
162 //    delete fDigits;
163 //  }
164
165 }
166 //_____________________________________________________________________________
167 void AliZDC::AddHit(Int_t track, Int_t *vol, Float_t *hits)
168 {
169   //
170   //            Add a ZDC hit to the hit list.
171   // -> We make use of 2 array of hits:
172   // [1]  fHits (the usual one) that contains hits for each PRIMARY
173   // [2]  fStHits that contains hits for each EVENT and is used to
174   //      obtain digits at the end of each event
175   //
176   
177   static Float_t primKinEn, xImpact, yImpact, sFlag;
178
179   AliZDCHit *newquad, *curprimquad;
180   newquad = new AliZDCHit(fIshunt, track, vol, hits);
181   TClonesArray &lhits = *fHits;
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;  // SECONDARY particle entering the ZDC
188       }
189       else if(track == primary){
190         newquad->fSFlag = 0;  // 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   Int_t j;
206   for(j=0; j<fNhits; j++){
207     // If hits are equal (same track, same volume), sum them.
208      curprimquad = (AliZDCHit*) lhits[j];
209      if(*curprimquad == *newquad){
210         *curprimquad = *curprimquad+*newquad;
211         delete newquad;
212         return;
213      } 
214   }
215
216     //Otherwise create a new hit
217     new(lhits[fNhits]) AliZDCHit(newquad);
218     fNhits++;
219     
220     delete newquad;
221 }
222
223 //_____________________________________________________________________________
224 void  AliZDC::AddDigit(Int_t *sect, Int_t digit)
225 {
226 //
227   AliZDCDigit *newdigit;
228   newdigit = new AliZDCDigit(sect, digit);
229
230 //  AliZDCDigit *curdigit;
231 //  TClonesArray &ldigits = *fDigits;
232 //
233 //  Int_t j;
234 //  for(j=0; j<fNdigits; j++){
235 //     curdigit = (AliZDCDigit*) ldigits[j];
236 //     if(*curdigit == *newdigit){
237 //      *curdigit = *curdigit+*newdigit;
238 //      delete newdigit;
239 //      return;
240 //     } 
241 //  } 
242 //
243   
244 //  printf("\n  AddDigit -> sector[0] = %d, sector[1] = %d, digit = %d",
245 //         sect[0], sect[1], digit);
246   new((*fDigits)[fNdigits]) AliZDCDigit(*newdigit);
247   fNdigits++;
248   delete newdigit;
249 }
250       
251 //_____________________________________________________________________________
252 void AliZDC::BuildGeometry()
253 {
254   //
255   // Build the ROOT TNode geometry for event display 
256   // in the Zero Degree Calorimeter
257   // This routine is dummy for the moment
258   //
259
260   TNode *node, *top;
261   TBRIK *brik;
262   const int kColorZDC  = kBlue;
263   
264   //
265   top=gAlice->GetGeometry()->GetNode("alice");
266   
267   // ZDC
268     brik = new TBRIK("S_ZDC","ZDC box","void",300,300,5);
269     top->cd();
270     node = new TNode("ZDC","ZDC","S_ZDC",0,0,600,"");
271     node->SetLineColor(kColorZDC);
272     fNodes->Add(node);
273 }
274
275 //_____________________________________________________________________________
276 Int_t AliZDC::DistancetoPrimitive(Int_t , Int_t )
277 {
278   //
279   // Distance from the mouse to the Zero Degree Calorimeter
280   // Dummy routine
281   //
282   return 9999;
283 }
284
285 //____________________________________________________________________________
286 Float_t AliZDC::ZMin(void) const
287 {
288   // Minimum dimension of the ZDC module in z
289   return 11600.;
290 }
291
292 //____________________________________________________________________________
293 Float_t AliZDC::ZMax(void) const
294 {
295   // Maximum dimension of the ZDC module in z
296   return  11750.;
297 }
298   
299
300 //_____________________________________________________________________________
301  void AliZDC::MakeBranch(Option_t *opt, const char *file)
302 {
303   //
304   // Create Tree branches for the ZDC
305   //
306
307   char branchname[10];
308   sprintf(branchname,"%s",GetName());
309   
310   AliDetector::MakeBranch(opt);
311
312   const char *cS = strstr(opt,"S");
313
314   if (gAlice->TreeS() && cS) {
315     MakeBranchInTree(gAlice->TreeS(), 
316                      branchname, &fHits, fBufferSize, file) ;
317     printf("* AliZDC::MakeBranch    * Making Branch %s for SDigits\n\n",branchname);
318   }
319
320     
321   const char *cD = strstr(opt,"D");
322
323   if (gAlice->TreeD() && cD) {
324     if(fDigits!=0) fDigits->Clear();
325     else fDigits = new TClonesArray ("AliZDCDigit",1000);
326     MakeBranchInTree(gAlice->TreeD(), 
327                      branchname, &fDigits, fBufferSize, file) ;
328     printf("* AliZDC::MakeBranch    * Making Branch %s for Digits\n\n",branchname);
329   }
330
331   
332   const char *cR = strstr(opt,"R");
333
334   if (gAlice->TreeR() && cR) {
335     MakeBranchInTree(gAlice->TreeR(), 
336                      branchname, &fRecPoints, fBufferSize, file) ;
337     printf("* AliZDC::MakeBranch    * Making Branch %s for RecPoints\n\n",branchname);   }
338           
339 }
340
341 //_____________________________________________________________________________
342 void AliZDC::Hits2SDigits()
343 {
344
345   if(!fMerger){ 
346     // ### Copy of TreeH in TreeS
347     // Pointer to TreeH
348 //    printf("\n        ZDC digitization (without merging)\n");
349     TTree *treeH = gAlice->TreeH();
350     Int_t ntracks = (Int_t) treeH->GetEntries();
351     Int_t fNhits = 0;
352     gAlice->ResetHits();
353   
354     // Tracks loop
355     for(Int_t itrack=0; itrack<ntracks; itrack++){
356        treeH->GetEvent(itrack);
357        // Hits loop
358        for(AliZDCHit* zdcHit=(AliZDCHit*)this->FirstHit(-1); zdcHit;
359            zdcHit = (AliZDCHit*)this->NextHit()){ 
360           TClonesArray &sdigits = *fHits;
361           new (sdigits[fNhits++]) AliZDCHit(zdcHit);
362        }
363     }
364   
365     gAlice->TreeS()->Fill();
366     gAlice->TreeS()->Write(0,TObject::kOverwrite);  
367     gAlice->TreeS()->Reset();  
368   }
369   
370 }
371
372 //_____________________________________________________________________________
373 void AliZDC::SDigits2Digits()
374 {
375   if(!fMerger){ // Only digitization
376 //    printf("\n        ZDC digitization (without merging) \n");
377     fMerger = new AliZDCMerger();    
378     fMerger->Digitize();
379   }
380   else{ // Merging and digitization
381     printf("\n        ZDC merging and digitization\n");
382     fMerger -> InitMerging();
383   }
384
385   char hname[30];
386   sprintf(hname,"TreeD%d",gAlice->GetHeader()->GetEvent());
387
388   gAlice->TreeD()->Fill();
389   gAlice->TreeD()->Write(0,TObject::kOverwrite);
390   gAlice->TreeD()->Reset();  
391   
392 }
393 //_____________________________________________________________________________
394 void AliZDC::Hits2Digits()
395 {
396     gAlice->Hits2SDigits();
397     gAlice->SDigits2Digits();
398 }
399
400 //_____________________________________________________________________________
401 void AliZDC::Digits2Reco()
402 {
403     
404 }
405
406  
407 //_____________________________________________________________________________
408 void   AliZDC::SetMerger(AliZDCMerger* merger)
409 {
410 // Set pointer to merger 
411     fMerger = merger;
412 }
413
414 //_____________________________________________________________________________
415 AliZDCMerger*  AliZDC::Merger()
416 {
417 // Return pointer to merger
418     return fMerger;
419 }
420