Make separate, specialized geometries for RPhi and RhoZ views.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSvImpacts.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 /* $Id$ */
18
19 /* History of cvs commits:
20  *
21  * $Log$
22  * Revision 1.24  2006/11/14 17:11:15  hristov
23  * Removing inheritances from TAttLine, TAttMarker and AliRndm in AliModule. The copy constructor and assignment operators are moved to the private part of the class and not implemented. The corresponding changes are propagated to the detectors
24  *
25  * Revision 1.23  2006/09/13 07:31:01  kharlov
26  * Effective C++ corrections (T.Pocheptsov)
27  *
28  * Revision 1.22  2005/06/17 07:39:07  hristov
29  * Removing GetDebug and SetDebug from AliRun and AliModule. Using AliLog for the messages
30  *
31  * Revision 1.21  2005/05/28 14:19:05  schutz
32  * Compilation warnings fixed by T.P.
33  *
34  */
35
36 //_________________________________________________________________________
37 // Implementation version vImpacts of PHOS Manager class.
38 // This class inherits from v1 and adds impacts storing.
39 // Impacts stands for exact values of track coming to the detectors
40 // EMC, CPV or PPSD.
41 // Impacts are written to the same tree as hits are
42 // but in separate branches.
43 //---
44 //*-- Author: Yuri Kharlov (IHEP, Protvino/SUBATECH, Nantes)
45
46
47 // --- ROOT system ---
48
49 //#include <TTree.h>
50 #include <TClonesArray.h>
51 #include <TVirtualMC.h>
52
53 // --- Standard library ---
54
55 // --- AliRoot header files ---
56
57 #include "AliPHOSGeometry.h"
58 #include "AliPHOSImpact.h"
59 #include "AliPHOSvImpacts.h"
60 #include "AliRun.h"
61 #include "AliMC.h"
62 #include "AliLog.h"
63
64 ClassImp(AliPHOSvImpacts)
65
66 //____________________________________________________________________________
67 AliPHOSvImpacts::AliPHOSvImpacts():
68   fEMCImpacts(0),
69   fCPVImpacts(0),
70   fPPSDImpacts(0)
71 {
72   // ctor
73 }
74
75 //____________________________________________________________________________
76 AliPHOSvImpacts::AliPHOSvImpacts(const char *name, const char *title):
77   AliPHOSv1(name,title),
78   fEMCImpacts(new TList),
79   fCPVImpacts(new TList),
80   fPPSDImpacts(0)
81 {
82   // ctor : title is used to identify the layout
83   //
84   // We store hits :
85   //   - fHits (the "normal" one), which retains the hits associated with
86   //     the current primary particle being tracked
87   //     (this array is reset after each primary has been tracked).
88   //     This part inherits from AliPHOSv1
89   //
90   // We store impacts :
91   //  - fEMCImpacts, fCPVImpacts which are
92   //    TList of EMC and CPV modules respectively, each
93   //    modules contains TClonesArray of AliPHOSImpacts
94
95   Int_t nPHOSModules = GetGeometry()->GetNModules();
96   Int_t nCPVModules  = GetGeometry()->GetNModules();
97
98   Int_t iPHOSModule;
99   TClonesArray * impacts;
100   for (iPHOSModule=0; iPHOSModule<nPHOSModules; iPHOSModule++) {
101     fEMCImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
102     fNEMCImpacts[iPHOSModule] = 0;
103     impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(iPHOSModule));
104   }
105   for (iPHOSModule=0; iPHOSModule<nCPVModules; iPHOSModule++) {
106     fCPVImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
107     fNCPVImpacts[iPHOSModule] = 0;
108     impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(iPHOSModule));
109   }
110
111 }
112
113 //____________________________________________________________________________
114 AliPHOSvImpacts::~AliPHOSvImpacts()
115 {
116   // dtor
117
118   // Delete hits
119   if ( fHits ) {
120     fHits->Delete() ; 
121     delete fHits ;
122     fHits = 0 ; 
123   }
124
125   // Delete impacts in EMC, CPV
126   if ( fEMCImpacts ) {
127     fEMCImpacts->Delete() ; 
128     delete fEMCImpacts ;
129     fEMCImpacts = 0 ; 
130   }
131   if ( fCPVImpacts ) {
132     fCPVImpacts->Delete() ; 
133     delete fCPVImpacts ;
134     fCPVImpacts = 0 ; 
135   }
136 }
137
138 //____________________________________________________________________________
139 void AliPHOSvImpacts::AddImpact(const char* det, Int_t shunt, Int_t primary, Int_t track, Int_t module,
140                            Int_t pid, TLorentzVector p, Float_t *xyz)
141 {
142   // Add an impact to the impact list.
143
144   TClonesArray * impacts = 0;
145   Int_t         nImpacts = 0;
146
147   if (strcmp(det,"EMC ")==0) {
148     impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(module));
149     nImpacts= fNEMCImpacts[module];
150     fNEMCImpacts[module]++ ;
151   }
152   else if (strcmp(det,"CPV ")==0) {
153     impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(module));
154     nImpacts= fNCPVImpacts[module];
155     fNCPVImpacts[module]++ ;
156   }
157
158   new((*impacts)[nImpacts]) AliPHOSImpact(shunt,primary,track,pid,p,xyz) ;
159
160   AliDebugClass(1,Form("Module %d %s: ",module,det));
161   if (AliLog::GetGlobalDebugLevel()>0)
162     (dynamic_cast<AliPHOSImpact*>((impacts->At(nImpacts))))->Print();
163 }
164
165 //____________________________________________________________________________
166 void AliPHOSvImpacts::MakeBranch(Option_t *opt)
167 {  
168   // Create new branch in the current Hits Root Tree containing
169   // a list of PHOS impacts (exact values of track coming to detector)
170
171   AliDetector::MakeBranch(opt);
172   
173   Int_t bufferSize = 32000 ;
174   Int_t splitlevel = 0 ;
175   TreeH()->Branch("PHOSEmcImpacts" , "TList", &fEMCImpacts , bufferSize, splitlevel);
176   TreeH()->Branch("PHOSCpvImpacts" , "TList", &fCPVImpacts , bufferSize, splitlevel);
177   
178 }
179
180 //____________________________________________________________________________
181 void AliPHOSvImpacts::ResetHits() 
182 {              
183   // Reset impact branches for EMC, CPV and PPSD
184
185   AliDetector::ResetHits();
186
187   Int_t i;
188   for (i=0; i<GetGeometry()->GetNModules(); i++) {
189     (dynamic_cast<TClonesArray*>(fEMCImpacts->At(i))) -> Clear();
190     fNEMCImpacts[i] = 0 ;
191   }
192
193   for (i=0; i<GetGeometry()->GetNModules(); i++) {
194     (dynamic_cast<TClonesArray*>(fCPVImpacts->At(i))) -> Clear();
195     fNCPVImpacts[i] = 0 ;
196   }
197   
198 }
199
200 //_____________________________________________________________________________
201 void AliPHOSvImpacts::StepManager(void)
202 {
203   // Find impacts (tracks which enter the EMC, CPV)
204   // and add them to to the impact lists
205
206   AliPHOSv1::StepManager();
207
208   Float_t xyzm[3], xyzd[3], pm[3], pd[3];
209   TLorentzVector pmom     ;           // Lorentz momentum of the particle initiated hit
210   TLorentzVector pos      ;           // Lorentz vector of the track current position
211   Int_t          copy     ;
212
213   Int_t tracknumber =  gAlice->GetMCApp()->GetCurrentTrackNumber() ; 
214   Int_t primary     =  gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() ); 
215   TString name      =  GetGeometry()->GetName() ; 
216
217   // Add impact to EMC
218
219   static Int_t idPXTL = gMC->VolId("PXTL");
220   if( gMC->CurrentVolID(copy) == idPXTL &&
221       gMC->IsTrackEntering() ) {
222     gMC->TrackMomentum(pmom);
223     gMC->TrackPosition(pos) ;
224
225     Int_t i;
226     for (i=0; i<3; i++) xyzm[i] = pos[i];
227
228     for (i=0; i<3; i++) {
229       xyzm[i] = pos[i] ;
230       pm[i]   = pmom[i];
231     }
232     gMC -> Gmtod (xyzm, xyzd, 1);    // transform coordinate from master to daughter system
233     gMC -> Gmtod (pm,   pd,   2);    // transform 3-momentum from master to daughter system
234
235     // Select tracks coming to the crystal from up or down sides
236     if (pd[1]<0 && xyzd[1] >  GetGeometry()->GetCrystalSize(1)/2-0.1 ||
237         pd[1]>0 && xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.1) {
238     // Select tracks coming to the crystal from up or down sides
239       Int_t pid = gMC->TrackPid();
240       Int_t module;
241       gMC->CurrentVolOffID(10,module);
242       module--;
243       AddImpact("EMC ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
244     }
245   }
246
247   // Add impact to CPV
248
249   static Int_t idPCPQ = gMC->VolId("PCPQ");
250   if( gMC->CurrentVolID(copy) == idPCPQ &&
251       gMC->IsTrackEntering() ) {
252     gMC->TrackMomentum(pmom);
253     gMC->TrackPosition(pos) ;
254
255     Int_t i;
256     for (i=0; i<3; i++) xyzm[i] = pos[i];
257
258     for (i=0; i<3; i++) {
259       xyzm[i] = pos[i] ;
260       pm[i]   = pmom[i];
261     }
262     Int_t pid = gMC->TrackPid();
263     Int_t module;
264     gMC->CurrentVolOffID(3,module);
265     module--;
266     AddImpact("CPV ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
267   }
268   
269 }