1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
19 /* History of cvs commits:
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
25 * Revision 1.23 2006/09/13 07:31:01 kharlov
26 * Effective C++ corrections (T.Pocheptsov)
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
31 * Revision 1.21 2005/05/28 14:19:05 schutz
32 * Compilation warnings fixed by T.P.
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
41 // Impacts are written to the same tree as hits are
42 // but in separate branches.
44 //*-- Author: Yuri Kharlov (IHEP, Protvino/SUBATECH, Nantes)
47 // --- ROOT system ---
50 #include <TClonesArray.h>
51 #include <TVirtualMC.h>
53 // --- Standard library ---
55 // --- AliRoot header files ---
57 #include "AliPHOSGeometry.h"
58 #include "AliPHOSImpact.h"
59 #include "AliPHOSvImpacts.h"
64 ClassImp(AliPHOSvImpacts)
66 //____________________________________________________________________________
67 AliPHOSvImpacts::AliPHOSvImpacts():
75 //____________________________________________________________________________
76 AliPHOSvImpacts::AliPHOSvImpacts(const char *name, const char *title):
77 AliPHOSv1(name,title),
78 fEMCImpacts(new TList),
79 fCPVImpacts(new TList),
82 // ctor : title is used to identify the layout
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
91 // - fEMCImpacts, fCPVImpacts which are
92 // TList of EMC and CPV modules respectively, each
93 // modules contains TClonesArray of AliPHOSImpacts
95 Int_t nPHOSModules = GetGeometry()->GetNModules();
96 Int_t nCPVModules = GetGeometry()->GetNModules();
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));
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));
113 //____________________________________________________________________________
114 AliPHOSvImpacts::~AliPHOSvImpacts()
125 // Delete impacts in EMC, CPV
127 fEMCImpacts->Delete() ;
132 fCPVImpacts->Delete() ;
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)
142 // Add an impact to the impact list.
144 TClonesArray * impacts = 0;
147 if (strcmp(det,"EMC ")==0) {
148 impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(module));
149 nImpacts= fNEMCImpacts[module];
150 fNEMCImpacts[module]++ ;
152 else if (strcmp(det,"CPV ")==0) {
153 impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(module));
154 nImpacts= fNCPVImpacts[module];
155 fNCPVImpacts[module]++ ;
158 new((*impacts)[nImpacts]) AliPHOSImpact(shunt,primary,track,pid,p,xyz) ;
160 AliDebugClass(1,Form("Module %d %s: ",module,det));
161 if (AliLog::GetGlobalDebugLevel()>0)
162 (dynamic_cast<AliPHOSImpact*>((impacts->At(nImpacts))))->Print();
165 //____________________________________________________________________________
166 void AliPHOSvImpacts::MakeBranch(Option_t *opt)
168 // Create new branch in the current Hits Root Tree containing
169 // a list of PHOS impacts (exact values of track coming to detector)
171 AliDetector::MakeBranch(opt);
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);
180 //____________________________________________________________________________
181 void AliPHOSvImpacts::ResetHits()
183 // Reset impact branches for EMC, CPV and PPSD
185 AliDetector::ResetHits();
188 for (i=0; i<GetGeometry()->GetNModules(); i++) {
189 (dynamic_cast<TClonesArray*>(fEMCImpacts->At(i))) -> Clear();
190 fNEMCImpacts[i] = 0 ;
193 for (i=0; i<GetGeometry()->GetNModules(); i++) {
194 (dynamic_cast<TClonesArray*>(fCPVImpacts->At(i))) -> Clear();
195 fNCPVImpacts[i] = 0 ;
200 //_____________________________________________________________________________
201 void AliPHOSvImpacts::StepManager(void)
203 // Find impacts (tracks which enter the EMC, CPV)
204 // and add them to to the impact lists
206 AliPHOSv1::StepManager();
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
213 Int_t tracknumber = gAlice->GetMCApp()->GetCurrentTrackNumber() ;
214 Int_t primary = gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() );
215 TString name = GetGeometry()->GetName() ;
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) ;
226 for (i=0; i<3; i++) xyzm[i] = pos[i];
228 for (i=0; i<3; i++) {
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
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();
241 gMC->CurrentVolOffID(10,module);
243 AddImpact("EMC ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
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) ;
256 for (i=0; i<3; i++) xyzm[i] = pos[i];
258 for (i=0; i<3; i++) {
262 Int_t pid = gMC->TrackPid();
264 gMC->CurrentVolOffID(3,module);
266 AddImpact("CPV ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);