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 **************************************************************************/
18 Revision 1.12 2002/06/10 17:31:03 nilsen
19 Replaced TArrayI expansion with Root version.
21 Revision 1.11 2002/06/04 18:43:15 nilsen
22 Fix to avoid divide by zero problem in MedianHitG and MedianHitL for track
23 that enter and exit the same side of a detector sensitive volume. Needed
24 for Fast simulation. Thanks to Nicola Carrer.
26 Revision 1.10 2002/03/15 17:21:54 nilsen
27 Removed zero-ing of fModules variable in constructors.
29 Revision 1.9 2000/10/04 19:46:39 barbera
30 Corrected by F. Carminati for v3.04
32 Revision 1.8 2000/10/02 16:32:57 barbera
33 Forward declarations added and formatting
35 Revision 1.3.4.8 2000/10/02 15:55:26 barbera
36 Forward declarations added and formatting
38 Revision 1.7 2000/09/22 12:36:38 nilsen
39 Minor changes to improve compilation and create less NOISE.
41 Revision 1.6 2000/07/10 16:07:18 fca
42 Release version of ITS code
44 Revision 1.3.4.2 2000/03/02 21:42:29 nilsen
45 Linked AliDetector::fDigit to AliITSmodule::fDigitsM and AliITS::fITSRecPoints
46 to AliITSmodule::fRecPointsM. Renamed AliITSmodule::fPointsM to fRecPointsM.
47 Removed the deletion of fDigitsM from the distructor since it is only a copy
48 of what is in AliDetector. Fixed a bug in the functions LineSegmentL and
49 LineSegmentG. Added two new versions of LineSegmentL and LineSegmentG to
50 additionaly return track number from the hit. Removed FastPoint function,
51 haven't found anywere it was used, also it had very many problems, should
52 just call FastPointSPD... .
54 Revision 1.3.4.1 2000/01/12 19:03:32 nilsen
55 This is the version of the files after the merging done in December 1999.
56 See the ReadMe110100.txt file for details
58 Revision 1.3 1999/10/04 15:20:12 fca
59 Correct syntax accepted by g++ but not standard for static members, remove minor warnings
61 Revision 1.2 1999/09/29 09:24:20 fca
62 Introduction of the Copyright and cvs Log
72 #include "AliITShit.h"
73 #include "AliITSmodule.h"
74 #include "AliITSgeom.h"
76 ClassImp(AliITSmodule)
78 //_______________________________________________________________________
80 // Impementation of class AliITSmodule
82 // created by: A. Bouchm, W. Peryt, S. Radomski, P. Skowronski
83 // R. Barbers, B. Batyunia, B. S. Nilsen
84 // ver 1.0 CERN 16.09.1999
85 //_______________________________________________________________________
86 //________________________________________________________________________
88 // Constructors and deconstructor
89 //________________________________________________________________________
91 AliITSmodule::AliITSmodule() {
100 //_________________________________________________________________________
101 AliITSmodule::AliITSmodule(Int_t index) {
105 fHitsM = new TObjArray();
106 fTrackIndex = new TArrayI(16);
107 fHitIndex = new TArrayI(16);
108 fITS = (AliITS*)(gAlice->GetDetector("ITS"));
110 //__________________________________________________________________________
111 AliITSmodule::~AliITSmodule() {
112 // The destructor for AliITSmodule. Before destoring AliITSmodule
113 // we must first destroy all of it's members.
116 for(Int_t i=0;i<fHitsM->GetEntriesFast();i++)
117 delete ((AliITShit *)(fHitsM->At(i)));
118 // must delete each object in the TObjArray.
123 fITS = 0; // We don't delete this pointer since it is just a copy.
125 //____________________________________________________________________________
126 AliITSmodule::AliITSmodule(const AliITSmodule &source){
127 ////////////////////////////////////////////////////////////////////////
129 ////////////////////////////////////////////////////////////////////////
130 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
134 //_____________________________________________________________________________
135 AliITSmodule& AliITSmodule::operator=(const AliITSmodule &source){
136 ////////////////////////////////////////////////////////////////////////
137 // Assignment operator
138 ////////////////////////////////////////////////////////////////////////
139 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
141 return *this; // fake return neded on Sun
144 //_________________________________________________________________________
147 //__________________________________________________________________________
148 Int_t AliITSmodule::AddHit(AliITShit* hit,Int_t t,Int_t h) {
151 //printf("AddHit: beginning hit %p t h %d %d\n",hit,t,h);
152 fHitsM->AddLast(new AliITShit(*hit));
153 Int_t fNhitsM = fHitsM->GetEntriesFast();
154 if(fNhitsM-1>=fTrackIndex->GetSize()){ // need to expand the TArrayI
155 fTrackIndex->Set(fNhitsM+64);
157 if(fNhitsM-1>=fHitIndex->GetSize()){ // need to expand the TArrayI
158 fHitIndex->Set(fNhitsM+64);
160 (*fTrackIndex)[fNhitsM-1] = t;
161 (*fHitIndex)[fNhitsM-1] = h;
164 //___________________________________________________________________________
165 Double_t AliITSmodule::PathLength(Int_t index,AliITShit *itsHit1,
172 itsHit1->GetPositionG(x1g,y1g,z1g);
173 itsHit2->GetPositionG(x2g,y2g,z2g);
175 s = TMath::Sqrt( ((Double_t)(x2g-x1g)*(Double_t)(x2g-x1g)) +
176 ((Double_t)(y2g-y1g)*(Double_t)(y2g-y1g)) +
177 ((Double_t)(z2g-z1g)*(Double_t)(z2g-z1g)) );
180 //___________________________________________________________________________
181 void AliITSmodule::PathLength(Int_t index,
182 Float_t x,Float_t y,Float_t z,
183 Int_t status,Int_t &nseg,
184 Float_t &x1,Float_t &y1,Float_t &z1,
185 Float_t &dx1,Float_t &dy1,Float_t &dz1,
188 static Float_t x0,y0,z0;
190 if ((status&0x0002)!=0){ // entering
204 if ((status&0x0004)!=0) flag = 0; //exiting
205 if ((status&0x0001)!=0) flag = 2; // inside
206 else flag = 2; //inside ?
212 //___________________________________________________________________________
213 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
214 Double_t &c,Double_t &d,
215 Double_t &e,Double_t &f,Double_t &de){
217 static Int_t hitindex0;
220 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
222 h1 = (AliITShit *) (fHitsM->At(hitindex));
223 if(h1->StatusEntering()){ // if track entering volume, get index for next
225 hitindex0 = hitindex;
227 } // end if StatusEntering()
229 h0 = (AliITShit *) (fHitsM->At(hitindex0));
230 de = h1->GetIonization();
231 h0->GetPositionL(a,c,e);
232 h1->GetPositionL(b,d,f);
236 hitindex0 = hitindex;
239 //___________________________________________________________________________
240 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
241 Double_t &c,Double_t &d,
242 Double_t &e,Double_t &f,Double_t &de){
244 static Int_t hitindex0;
247 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
249 h1 = (AliITShit *) (fHitsM->At(hitindex));
250 if(h1->StatusEntering()){ // if track entering volume, get index for next
252 hitindex0 = hitindex;
254 } // end if StatusEntering()
256 h0 = (AliITShit *) (fHitsM->At(hitindex0));
257 de = h1->GetIonization();
258 h0->GetPositionG(a,c,e);
259 h1->GetPositionG(b,d,f);
263 hitindex0 = hitindex;
266 //___________________________________________________________________________
267 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
268 Double_t &c,Double_t &d,
269 Double_t &e,Double_t &f,
270 Double_t &de,Int_t &track){
272 static Int_t hitindex0;
275 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
277 h1 = (AliITShit *) (fHitsM->At(hitindex));
278 if(h1->StatusEntering()){ // if track entering volume, get index for next
280 hitindex0 = hitindex;
281 track = h1->GetTrack();
283 } // end if StatusEntering()
285 h0 = (AliITShit *) (fHitsM->At(hitindex0));
286 de = h1->GetIonization();
287 h0->GetPositionL(a,c,e);
288 h1->GetPositionL(b,d,f);
292 hitindex0 = hitindex;
293 track = h1->GetTrack();
296 //___________________________________________________________________________
297 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
298 Double_t &c,Double_t &d,
299 Double_t &e,Double_t &f,
300 Double_t &de,Int_t &track){
302 static Int_t hitindex0;
305 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
307 h1 = (AliITShit *) (fHitsM->At(hitindex));
308 if(h1->StatusEntering()){ // if track entering volume, get index for next
310 hitindex0 = hitindex;
311 track = h1->GetTrack();
313 } // end if StatusEntering()
315 h0 = (AliITShit *) (fHitsM->At(hitindex0));
316 de = h1->GetIonization();
317 h0->GetPositionG(a,c,e);
318 h1->GetPositionG(b,d,f);
322 hitindex0 = hitindex;
323 track = h1->GetTrack();
326 //______________________________________________________________________
327 Bool_t AliITSmodule::MedianHitG(AliITShit *h1,AliITShit *h2,
328 Float_t &x,Float_t &y,Float_t &z){
329 // Computes the mean hit location for a set of hits that make up a track
330 // passing through a volume. Returns kFALSE untill the the track leaves
333 AliITSgeom *gm = fITS->GetITSgeom();
334 Float_t x1l=0.,y1l=0.,z1l=0.;
335 Float_t x2l=0.,y2l=0.,z2l=0.;
336 Float_t xMl,yMl=0,zMl;
339 h1->GetPositionG(x1l,y1l,z1l);
340 h2->GetPositionG(x2l,y2l,z2l);
342 // Modified by N.Carrer. In very rare occasions the track may be just
343 // tangent to the module. Therefore the entrance and exit points have the
345 if( (y2l-y1l) != 0.0 ) {
346 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
347 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
356 gm->LtoG(h1->GetModule(),l,g);
362 //___________________________________________________________________________
363 void AliITSmodule::MedianHitG(Int_t index,
364 Float_t hitx1,Float_t hity1,Float_t hitz1,
365 Float_t hitx2,Float_t hity2,Float_t hitz2,
366 Float_t &xMg, Float_t &yMg, Float_t &zMg){
368 AliITSgeom *gm = fITS->GetITSgeom();
371 Float_t xMl,yMl=0,zMl;
390 // Modified by N.Carrer. In very rare occasions the track may be just
391 // tangent to the module. Therefore the entrance and exit points have the
393 if( (y2l-y1l) != 0.0 ) {
394 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
395 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
409 //___________________________________________________________________________
410 Bool_t AliITSmodule::MedianHitL( AliITShit *itsHit1,
412 Float_t &xMl, Float_t &yMl, Float_t &zMl){
417 itsHit1->GetPositionL(x1l,y1l,z1l);
418 itsHit2->GetPositionL(x2l,y2l,z2l);
421 // Modified by N.Carrer. In very rare occasions the track may be just
422 // tangent to the module. Therefore the entrance and exit points have the
424 if( (y2l-y1l) != 0.0 ) {
425 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
426 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
433 //___________________________________________________________________________
434 void AliITSmodule::MedianHit(Int_t index,
435 Float_t xg,Float_t yg,Float_t zg,
437 Float_t &xMg,Float_t &yMg,Float_t &zMg,
440 static Float_t x1,y1,z1;
442 if ((status&0x0002)!=0){ // entering
447 } else if ((status&0x0004)!=0){ // exiting
448 MedianHitG(index,x1,y1,z1,xg,yg,zg,xMg,yMg,zMg);
453 //___________________________________________________________________________
454 void AliITSmodule::GetID(Int_t &lay,Int_t &lad,Int_t &det){
456 fITS->GetITSgeom()->GetModuleId(fIndex,lay,lad,det);