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.14 2002/10/14 14:57:00 hristov
19 Merging the VirtualMC branch to the main development branch (HEAD)
21 Revision 1.10.4.2 2002/07/24 09:27:50 alibrary
24 Revision 1.13 2002/06/12 18:59:47 nilsen
25 Added Starting track location to hit class and related changes to modules.
26 This is at present still fully backwards compatible since starting hits
27 are still written to the file. When aliroot v4.0 will be released, this
28 backwards compatiblity will be broken by removing the enterence hit, and making
29 the nessesary changes to module at that time.
31 Revision 1.12 2002/06/10 17:31:03 nilsen
32 Replaced TArrayI expansion with Root version.
34 Revision 1.11 2002/06/04 18:43:15 nilsen
35 Fix to avoid divide by zero problem in MedianHitG and MedianHitL for track
36 that enter and exit the same side of a detector sensitive volume. Needed
37 for Fast simulation. Thanks to Nicola Carrer.
39 Revision 1.10 2002/03/15 17:21:54 nilsen
40 Removed zero-ing of fModules variable in constructors.
42 Revision 1.9 2000/10/04 19:46:39 barbera
43 Corrected by F. Carminati for v3.04
45 Revision 1.8 2000/10/02 16:32:57 barbera
46 Forward declarations added and formatting
48 Revision 1.3.4.8 2000/10/02 15:55:26 barbera
49 Forward declarations added and formatting
51 Revision 1.7 2000/09/22 12:36:38 nilsen
52 Minor changes to improve compilation and create less NOISE.
54 Revision 1.6 2000/07/10 16:07:18 fca
55 Release version of ITS code
57 Revision 1.3.4.2 2000/03/02 21:42:29 nilsen
58 Linked AliDetector::fDigit to AliITSmodule::fDigitsM and AliITS::fITSRecPoints
59 to AliITSmodule::fRecPointsM. Renamed AliITSmodule::fPointsM to fRecPointsM.
60 Removed the deletion of fDigitsM from the distructor since it is only a copy
61 of what is in AliDetector. Fixed a bug in the functions LineSegmentL and
62 LineSegmentG. Added two new versions of LineSegmentL and LineSegmentG to
63 additionaly return track number from the hit. Removed FastPoint function,
64 haven't found anywere it was used, also it had very many problems, should
65 just call FastPointSPD... .
67 Revision 1.3.4.1 2000/01/12 19:03:32 nilsen
68 This is the version of the files after the merging done in December 1999.
69 See the ReadMe110100.txt file for details
71 Revision 1.3 1999/10/04 15:20:12 fca
72 Correct syntax accepted by g++ but not standard for static members, remove minor warnings
74 Revision 1.2 1999/09/29 09:24:20 fca
75 Introduction of the Copyright and cvs Log
85 #include "AliITShit.h"
86 #include "AliITSmodule.h"
87 #include "AliITSgeom.h"
89 ClassImp(AliITSmodule)
91 //_______________________________________________________________________
93 // Impementation of class AliITSmodule
95 // created by: A. Bouchm, W. Peryt, S. Radomski, P. Skowronski
96 // R. Barbers, B. Batyunia, B. S. Nilsen
97 // ver 1.0 CERN 16.09.1999
98 //_______________________________________________________________________
99 //________________________________________________________________________
101 // Constructors and deconstructor
102 //________________________________________________________________________
104 AliITSmodule::AliITSmodule() {
113 //_________________________________________________________________________
114 AliITSmodule::AliITSmodule(Int_t index) {
118 fHitsM = new TObjArray();
119 fTrackIndex = new TArrayI(16);
120 fHitIndex = new TArrayI(16);
121 fITS = (AliITS*)(gAlice->GetDetector("ITS"));
123 //__________________________________________________________________________
124 AliITSmodule::~AliITSmodule() {
125 // The destructor for AliITSmodule. Before destoring AliITSmodule
126 // we must first destroy all of it's members.
129 for(Int_t i=0;i<fHitsM->GetEntriesFast();i++)
130 delete ((AliITShit *)(fHitsM->At(i)));
131 // must delete each object in the TObjArray.
136 fITS = 0; // We don't delete this pointer since it is just a copy.
138 //____________________________________________________________________________
139 AliITSmodule::AliITSmodule(const AliITSmodule &source){
140 ////////////////////////////////////////////////////////////////////////
142 ////////////////////////////////////////////////////////////////////////
143 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
147 //_____________________________________________________________________________
148 AliITSmodule& AliITSmodule::operator=(const AliITSmodule &source){
149 ////////////////////////////////////////////////////////////////////////
150 // Assignment operator
151 ////////////////////////////////////////////////////////////////////////
152 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
154 return *this; // fake return neded on Sun
157 //_________________________________________________________________________
160 //__________________________________________________________________________
161 Int_t AliITSmodule::AddHit(AliITShit* hit,Int_t t,Int_t h) {
164 //printf("AddHit: beginning hit %p t h %d %d\n",hit,t,h);
165 fHitsM->AddLast(new AliITShit(*hit));
166 Int_t fNhitsM = fHitsM->GetEntriesFast();
167 if(fNhitsM-1>=fTrackIndex->GetSize()){ // need to expand the TArrayI
168 fTrackIndex->Set(fNhitsM+64);
170 if(fNhitsM-1>=fHitIndex->GetSize()){ // need to expand the TArrayI
171 fHitIndex->Set(fNhitsM+64);
173 (*fTrackIndex)[fNhitsM-1] = t;
174 (*fHitIndex)[fNhitsM-1] = h;
177 //___________________________________________________________________________
178 Double_t AliITSmodule::PathLength(Int_t index,AliITShit *itsHit1,
185 itsHit1->GetPositionG(x1g,y1g,z1g);
186 itsHit2->GetPositionG(x2g,y2g,z2g);
188 s = TMath::Sqrt( ((Double_t)(x2g-x1g)*(Double_t)(x2g-x1g)) +
189 ((Double_t)(y2g-y1g)*(Double_t)(y2g-y1g)) +
190 ((Double_t)(z2g-z1g)*(Double_t)(z2g-z1g)) );
193 //___________________________________________________________________________
194 void AliITSmodule::PathLength(Int_t index,
195 Float_t x,Float_t y,Float_t z,
196 Int_t status,Int_t &nseg,
197 Float_t &x1,Float_t &y1,Float_t &z1,
198 Float_t &dx1,Float_t &dy1,Float_t &dz1,
201 static Float_t x0,y0,z0;
203 if ((status&0x0002)!=0){ // entering
217 if ((status&0x0004)!=0) flag = 0; //exiting
218 if ((status&0x0001)!=0) flag = 2; // inside
219 else flag = 2; //inside ?
225 //___________________________________________________________________________
226 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
227 Double_t &c,Double_t &d,
228 Double_t &e,Double_t &f,Double_t &de){
230 static Int_t hitindex0;
233 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
235 h1 = (AliITShit *) (fHitsM->At(hitindex));
236 if(h1->StatusEntering()){ // if track entering volume, get index for next
238 hitindex0 = hitindex;
240 } // end if StatusEntering()
242 h0 = (AliITShit *) (fHitsM->At(hitindex0));
243 de = h1->GetIonization();
244 h0->GetPositionL(a,c,e);
245 h1->GetPositionL(b,d,f);
249 hitindex0 = hitindex;
252 //___________________________________________________________________________
253 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
254 Double_t &c,Double_t &d,
255 Double_t &e,Double_t &f,Double_t &de){
257 static Int_t hitindex0;
260 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
262 h1 = (AliITShit *) (fHitsM->At(hitindex));
263 if(h1->StatusEntering()){ // if track entering volume, get index for next
265 hitindex0 = hitindex;
267 } // end if StatusEntering()
269 h0 = (AliITShit *) (fHitsM->At(hitindex0));
270 de = h1->GetIonization();
271 h0->GetPositionG(a,c,e);
272 h1->GetPositionG(b,d,f);
276 hitindex0 = hitindex;
279 //___________________________________________________________________________
280 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
281 Double_t &c,Double_t &d,
282 Double_t &e,Double_t &f,
283 Double_t &de,Int_t &track){
285 static Int_t hitindex0;
288 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
290 h1 = (AliITShit *) (fHitsM->At(hitindex));
291 if(h1->StatusEntering()){ // if track entering volume, get index for next
293 hitindex0 = hitindex;
294 track = h1->GetTrack();
296 } // end if StatusEntering()
298 h0 = (AliITShit *) (fHitsM->At(hitindex0));
299 de = h1->GetIonization();
300 h0->GetPositionL(a,c,e);
301 h1->GetPositionL(b,d,f);
305 hitindex0 = hitindex;
306 track = h1->GetTrack();
309 //___________________________________________________________________________
310 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
311 Double_t &c,Double_t &d,
312 Double_t &e,Double_t &f,
313 Double_t &de,Int_t &track){
315 static Int_t hitindex0;
318 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
320 h1 = (AliITShit *) (fHitsM->At(hitindex));
321 if(h1->StatusEntering()){ // if track entering volume, get index for next
323 hitindex0 = hitindex;
324 track = h1->GetTrack();
326 } // end if StatusEntering()
328 h0 = (AliITShit *) (fHitsM->At(hitindex0));
329 de = h1->GetIonization();
330 h0->GetPositionG(a,c,e);
331 h1->GetPositionG(b,d,f);
335 hitindex0 = hitindex;
336 track = h1->GetTrack();
339 //______________________________________________________________________
340 Bool_t AliITSmodule::MedianHitG(AliITShit *h1,AliITShit *h2,
341 Float_t &x,Float_t &y,Float_t &z){
342 // Computes the mean hit location for a set of hits that make up a track
343 // passing through a volume. Returns kFALSE untill the the track leaves
346 AliITSgeom *gm = fITS->GetITSgeom();
347 Float_t x1l=0.,y1l=0.,z1l=0.;
348 Float_t x2l=0.,y2l=0.,z2l=0.;
349 Float_t xMl,yMl=0,zMl;
352 h1->GetPositionG(x1l,y1l,z1l);
353 h2->GetPositionG(x2l,y2l,z2l);
356 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
357 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
366 gm->LtoG(h1->GetModule(),l,g);
372 //___________________________________________________________________________
373 void AliITSmodule::MedianHitG(Int_t index,
374 Float_t hitx1,Float_t hity1,Float_t hitz1,
375 Float_t hitx2,Float_t hity2,Float_t hitz2,
376 Float_t &xMg, Float_t &yMg, Float_t &zMg){
378 AliITSgeom *gm = fITS->GetITSgeom();
381 Float_t xMl,yMl=0,zMl;
401 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
402 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
416 //___________________________________________________________________________
417 Bool_t AliITSmodule::MedianHitL( AliITShit *itsHit1,
419 Float_t &xMl, Float_t &yMl, Float_t &zMl){
424 itsHit1->GetPositionL(x1l,y1l,z1l);
425 itsHit2->GetPositionL(x2l,y2l,z2l);
429 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
430 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
437 //___________________________________________________________________________
438 void AliITSmodule::MedianHit(Int_t index,
439 Float_t xg,Float_t yg,Float_t zg,
441 Float_t &xMg,Float_t &yMg,Float_t &zMg,
444 static Float_t x1,y1,z1;
446 if ((status&0x0002)!=0){ // entering
451 } else if ((status&0x0004)!=0){ // exiting
452 MedianHitG(index,x1,y1,z1,xg,yg,zg,xMg,yMg,zMg);
457 //___________________________________________________________________________
458 void AliITSmodule::GetID(Int_t &lay,Int_t &lad,Int_t &det){
460 fITS->GetITSgeom()->GetModuleId(fIndex,lay,lad,det);