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():
68 fEMCImpacts(new TList),
69 fCPVImpacts(new TList),
70 fPPSDImpacts(new TList),
78 //____________________________________________________________________________
79 AliPHOSvImpacts::AliPHOSvImpacts(const char *name, const char *title):
80 AliPHOSv1(name,title),
81 fEMCImpacts(new TList),
82 fCPVImpacts(new TList),
88 // ctor : title is used to identify the layout
91 // - fHits (the "normal" one), which retains the hits associated with
92 // the current primary particle being tracked
93 // (this array is reset after each primary has been tracked).
94 // This part inherits from AliPHOSv1
97 // - fEMCImpacts, fCPVImpacts which are
98 // TList of EMC and CPV modules respectively, each
99 // modules contains TClonesArray of AliPHOSImpacts
101 Int_t nPHOSModules = GetGeometry()->GetNModules();
102 Int_t nCPVModules = GetGeometry()->GetNModules();
105 TClonesArray * impacts;
106 for (iPHOSModule=0; iPHOSModule<nPHOSModules; iPHOSModule++) {
107 fEMCImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
108 fNEMCImpacts[iPHOSModule] = 0;
109 impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(iPHOSModule));
111 for (iPHOSModule=0; iPHOSModule<nCPVModules; iPHOSModule++) {
112 fCPVImpacts->Add(new TClonesArray("AliPHOSImpact",200)) ;
113 fNCPVImpacts[iPHOSModule] = 0;
114 impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(iPHOSModule));
119 //____________________________________________________________________________
120 AliPHOSvImpacts::~AliPHOSvImpacts()
131 // Delete impacts in EMC, CPV
133 fEMCImpacts->Delete() ;
138 fCPVImpacts->Delete() ;
144 //____________________________________________________________________________
145 void AliPHOSvImpacts::AddImpact(const char* det, Int_t shunt, Int_t primary, Int_t track, Int_t module,
146 Int_t pid, TLorentzVector p, Float_t *xyz)
148 // Add an impact to the impact list.
150 TClonesArray * impacts = 0;
153 if (strcmp(det,"EMC ")==0) {
154 impacts = dynamic_cast<TClonesArray *>(fEMCImpacts->At(module));
155 nImpacts= fNEMCImpacts[module];
156 fNEMCImpacts[module]++ ;
158 else if (strcmp(det,"CPV ")==0) {
159 impacts = dynamic_cast<TClonesArray *>(fCPVImpacts->At(module));
160 nImpacts= fNCPVImpacts[module];
161 fNCPVImpacts[module]++ ;
164 AliFatal(Form("Wrong PHOS configuration: det=%s",det));
166 new((*impacts)[nImpacts]) AliPHOSImpact(shunt,primary,track,pid,p,xyz) ;
168 AliDebugClass(1,Form("Module %d %s: ",module,det));
169 if (AliLog::GetGlobalDebugLevel()>0)
170 (static_cast<AliPHOSImpact*>((impacts->At(nImpacts))))->Print();
173 //____________________________________________________________________________
174 void AliPHOSvImpacts::MakeBranch(Option_t *opt)
176 // Create new branch in the current Hits Root Tree containing
177 // a list of PHOS impacts (exact values of track coming to detector)
179 AliDetector::MakeBranch(opt);
181 Int_t bufferSize = 32000 ;
182 Int_t splitlevel = 0 ;
183 fLoader->TreeH()->Branch("PHOSEmcImpacts" , "TList", &fEMCImpacts , bufferSize, splitlevel);
184 fLoader->TreeH()->Branch("PHOSCpvImpacts" , "TList", &fCPVImpacts , bufferSize, splitlevel);
188 //____________________________________________________________________________
189 void AliPHOSvImpacts::ResetHits()
191 // Reset impact branches for EMC, CPV and PPSD
193 AliDetector::ResetHits();
196 for (i=0; i<GetGeometry()->GetNModules(); i++) {
197 (static_cast<TClonesArray*>(fEMCImpacts->At(i))) -> Clear();
198 fNEMCImpacts[i] = 0 ;
201 for (i=0; i<GetGeometry()->GetNModules(); i++) {
202 (static_cast<TClonesArray*>(fCPVImpacts->At(i))) -> Clear();
203 fNCPVImpacts[i] = 0 ;
208 //_____________________________________________________________________________
209 void AliPHOSvImpacts::StepManager(void)
211 // Find impacts (tracks which enter the EMC, CPV)
212 // and add them to to the impact lists
214 AliPHOSv1::StepManager();
216 Float_t xyzm[3], xyzd[3], pm[3], pd[3];
217 TLorentzVector pmom ; // Lorentz momentum of the particle initiated hit
218 TLorentzVector pos ; // Lorentz vector of the track current position
221 Int_t tracknumber = gAlice->GetMCApp()->GetCurrentTrackNumber() ;
222 Int_t primary = gAlice->GetMCApp()->GetPrimary( gAlice->GetMCApp()->GetCurrentTrackNumber() );
223 TString name = GetGeometry()->GetName() ;
227 static Int_t idPXTL = gMC->VolId("PXTL");
228 if( gMC->CurrentVolID(copy) == idPXTL &&
229 gMC->IsTrackEntering() ) {
230 gMC->TrackMomentum(pmom);
231 gMC->TrackPosition(pos) ;
234 for (i=0; i<3; i++) xyzm[i] = pos[i];
236 for (i=0; i<3; i++) {
240 gMC -> Gmtod (xyzm, xyzd, 1); // transform coordinate from master to daughter system
241 gMC -> Gmtod (pm, pd, 2); // transform 3-momentum from master to daughter system
243 // Select tracks coming to the crystal from up or down sides
244 if ((pd[1]<0 && xyzd[1] > GetGeometry()->GetCrystalSize(1)/2-0.1) ||
245 (pd[1]>0 && xyzd[1] < -GetGeometry()->GetCrystalSize(1)/2+0.1)) {
246 // Select tracks coming to the crystal from up or down sides
247 Int_t pid = gMC->TrackPid();
249 gMC->CurrentVolOffID(10,module);
251 AddImpact("EMC ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);
257 static Int_t idPCPQ = gMC->VolId("PCPQ");
258 if( gMC->CurrentVolID(copy) == idPCPQ &&
259 gMC->IsTrackEntering() ) {
260 gMC->TrackMomentum(pmom);
261 gMC->TrackPosition(pos) ;
264 for (i=0; i<3; i++) xyzm[i] = pos[i];
266 for (i=0; i<3; i++) {
270 Int_t pid = gMC->TrackPid();
272 gMC->CurrentVolOffID(3,module);
274 AddImpact("CPV ",fIshunt, primary,tracknumber, module, pid, pmom, xyzm);