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.10.4.2 2002/07/24 09:27:50 alibrary
21 Revision 1.13 2002/06/12 18:59:47 nilsen
22 Added Starting track location to hit class and related changes to modules.
23 This is at present still fully backwards compatible since starting hits
24 are still written to the file. When aliroot v4.0 will be released, this
25 backwards compatiblity will be broken by removing the enterence hit, and making
26 the nessesary changes to module at that time.
28 Revision 1.12 2002/06/10 17:31:03 nilsen
29 Replaced TArrayI expansion with Root version.
31 Revision 1.11 2002/06/04 18:43:15 nilsen
32 Fix to avoid divide by zero problem in MedianHitG and MedianHitL for track
33 that enter and exit the same side of a detector sensitive volume. Needed
34 for Fast simulation. Thanks to Nicola Carrer.
36 Revision 1.10 2002/03/15 17:21:54 nilsen
37 Removed zero-ing of fModules variable in constructors.
39 Revision 1.9 2000/10/04 19:46:39 barbera
40 Corrected by F. Carminati for v3.04
42 Revision 1.8 2000/10/02 16:32:57 barbera
43 Forward declarations added and formatting
45 Revision 1.3.4.8 2000/10/02 15:55:26 barbera
46 Forward declarations added and formatting
48 Revision 1.7 2000/09/22 12:36:38 nilsen
49 Minor changes to improve compilation and create less NOISE.
51 Revision 1.6 2000/07/10 16:07:18 fca
52 Release version of ITS code
54 Revision 1.3.4.2 2000/03/02 21:42:29 nilsen
55 Linked AliDetector::fDigit to AliITSmodule::fDigitsM and AliITS::fITSRecPoints
56 to AliITSmodule::fRecPointsM. Renamed AliITSmodule::fPointsM to fRecPointsM.
57 Removed the deletion of fDigitsM from the distructor since it is only a copy
58 of what is in AliDetector. Fixed a bug in the functions LineSegmentL and
59 LineSegmentG. Added two new versions of LineSegmentL and LineSegmentG to
60 additionaly return track number from the hit. Removed FastPoint function,
61 haven't found anywere it was used, also it had very many problems, should
62 just call FastPointSPD... .
64 Revision 1.3.4.1 2000/01/12 19:03:32 nilsen
65 This is the version of the files after the merging done in December 1999.
66 See the ReadMe110100.txt file for details
68 Revision 1.3 1999/10/04 15:20:12 fca
69 Correct syntax accepted by g++ but not standard for static members, remove minor warnings
71 Revision 1.2 1999/09/29 09:24:20 fca
72 Introduction of the Copyright and cvs Log
82 #include "AliITShit.h"
83 #include "AliITSmodule.h"
84 #include "AliITSgeom.h"
86 ClassImp(AliITSmodule)
88 //_______________________________________________________________________
90 // Impementation of class AliITSmodule
92 // created by: A. Bouchm, W. Peryt, S. Radomski, P. Skowronski
93 // R. Barbers, B. Batyunia, B. S. Nilsen
94 // ver 1.0 CERN 16.09.1999
95 //_______________________________________________________________________
96 //________________________________________________________________________
98 // Constructors and deconstructor
99 //________________________________________________________________________
101 AliITSmodule::AliITSmodule() {
110 //_________________________________________________________________________
111 AliITSmodule::AliITSmodule(Int_t index) {
115 fHitsM = new TObjArray();
116 fTrackIndex = new TArrayI(16);
117 fHitIndex = new TArrayI(16);
118 fITS = (AliITS*)(gAlice->GetDetector("ITS"));
120 //__________________________________________________________________________
121 AliITSmodule::~AliITSmodule() {
122 // The destructor for AliITSmodule. Before destoring AliITSmodule
123 // we must first destroy all of it's members.
126 for(Int_t i=0;i<fHitsM->GetEntriesFast();i++)
127 delete ((AliITShit *)(fHitsM->At(i)));
128 // must delete each object in the TObjArray.
133 fITS = 0; // We don't delete this pointer since it is just a copy.
135 //____________________________________________________________________________
136 AliITSmodule::AliITSmodule(const AliITSmodule &source){
137 ////////////////////////////////////////////////////////////////////////
139 ////////////////////////////////////////////////////////////////////////
140 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
144 //_____________________________________________________________________________
145 AliITSmodule& AliITSmodule::operator=(const AliITSmodule &source){
146 ////////////////////////////////////////////////////////////////////////
147 // Assignment operator
148 ////////////////////////////////////////////////////////////////////////
149 printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n");
151 return *this; // fake return neded on Sun
154 //_________________________________________________________________________
157 //__________________________________________________________________________
158 Int_t AliITSmodule::AddHit(AliITShit* hit,Int_t t,Int_t h) {
161 //printf("AddHit: beginning hit %p t h %d %d\n",hit,t,h);
162 fHitsM->AddLast(new AliITShit(*hit));
163 Int_t fNhitsM = fHitsM->GetEntriesFast();
164 if(fNhitsM-1>=fTrackIndex->GetSize()){ // need to expand the TArrayI
165 fTrackIndex->Set(fNhitsM+64);
167 if(fNhitsM-1>=fHitIndex->GetSize()){ // need to expand the TArrayI
168 fHitIndex->Set(fNhitsM+64);
170 (*fTrackIndex)[fNhitsM-1] = t;
171 (*fHitIndex)[fNhitsM-1] = h;
174 //___________________________________________________________________________
175 Double_t AliITSmodule::PathLength(Int_t index,AliITShit *itsHit1,
182 itsHit1->GetPositionG(x1g,y1g,z1g);
183 itsHit2->GetPositionG(x2g,y2g,z2g);
185 s = TMath::Sqrt( ((Double_t)(x2g-x1g)*(Double_t)(x2g-x1g)) +
186 ((Double_t)(y2g-y1g)*(Double_t)(y2g-y1g)) +
187 ((Double_t)(z2g-z1g)*(Double_t)(z2g-z1g)) );
190 //___________________________________________________________________________
191 void AliITSmodule::PathLength(Int_t index,
192 Float_t x,Float_t y,Float_t z,
193 Int_t status,Int_t &nseg,
194 Float_t &x1,Float_t &y1,Float_t &z1,
195 Float_t &dx1,Float_t &dy1,Float_t &dz1,
198 static Float_t x0,y0,z0;
200 if ((status&0x0002)!=0){ // entering
214 if ((status&0x0004)!=0) flag = 0; //exiting
215 if ((status&0x0001)!=0) flag = 2; // inside
216 else flag = 2; //inside ?
222 //___________________________________________________________________________
223 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
224 Double_t &c,Double_t &d,
225 Double_t &e,Double_t &f,Double_t &de){
227 static Int_t hitindex0;
230 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
232 h1 = (AliITShit *) (fHitsM->At(hitindex));
233 if(h1->StatusEntering()){ // if track entering volume, get index for next
235 hitindex0 = hitindex;
237 } // end if StatusEntering()
239 h0 = (AliITShit *) (fHitsM->At(hitindex0));
240 de = h1->GetIonization();
241 h0->GetPositionL(a,c,e);
242 h1->GetPositionL(b,d,f);
246 hitindex0 = hitindex;
249 //___________________________________________________________________________
250 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
251 Double_t &c,Double_t &d,
252 Double_t &e,Double_t &f,Double_t &de){
254 static Int_t hitindex0;
257 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
259 h1 = (AliITShit *) (fHitsM->At(hitindex));
260 if(h1->StatusEntering()){ // if track entering volume, get index for next
262 hitindex0 = hitindex;
264 } // end if StatusEntering()
266 h0 = (AliITShit *) (fHitsM->At(hitindex0));
267 de = h1->GetIonization();
268 h0->GetPositionG(a,c,e);
269 h1->GetPositionG(b,d,f);
273 hitindex0 = hitindex;
276 //___________________________________________________________________________
277 Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b,
278 Double_t &c,Double_t &d,
279 Double_t &e,Double_t &f,
280 Double_t &de,Int_t &track){
282 static Int_t hitindex0;
285 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
287 h1 = (AliITShit *) (fHitsM->At(hitindex));
288 if(h1->StatusEntering()){ // if track entering volume, get index for next
290 hitindex0 = hitindex;
291 track = h1->GetTrack();
293 } // end if StatusEntering()
295 h0 = (AliITShit *) (fHitsM->At(hitindex0));
296 de = h1->GetIonization();
297 h0->GetPositionL(a,c,e);
298 h1->GetPositionL(b,d,f);
302 hitindex0 = hitindex;
303 track = h1->GetTrack();
306 //___________________________________________________________________________
307 Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b,
308 Double_t &c,Double_t &d,
309 Double_t &e,Double_t &f,
310 Double_t &de,Int_t &track){
312 static Int_t hitindex0;
315 if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE;
317 h1 = (AliITShit *) (fHitsM->At(hitindex));
318 if(h1->StatusEntering()){ // if track entering volume, get index for next
320 hitindex0 = hitindex;
321 track = h1->GetTrack();
323 } // end if StatusEntering()
325 h0 = (AliITShit *) (fHitsM->At(hitindex0));
326 de = h1->GetIonization();
327 h0->GetPositionG(a,c,e);
328 h1->GetPositionG(b,d,f);
332 hitindex0 = hitindex;
333 track = h1->GetTrack();
336 //______________________________________________________________________
337 Bool_t AliITSmodule::MedianHitG(AliITShit *h1,AliITShit *h2,
338 Float_t &x,Float_t &y,Float_t &z){
339 // Computes the mean hit location for a set of hits that make up a track
340 // passing through a volume. Returns kFALSE untill the the track leaves
343 AliITSgeom *gm = fITS->GetITSgeom();
344 Float_t x1l=0.,y1l=0.,z1l=0.;
345 Float_t x2l=0.,y2l=0.,z2l=0.;
346 Float_t xMl,yMl=0,zMl;
349 h1->GetPositionG(x1l,y1l,z1l);
350 h2->GetPositionG(x2l,y2l,z2l);
352 // Modified by N.Carrer. In very rare occasions the track may be just
353 // tangent to the module. Therefore the entrance and exit points have the
355 if( (y2l-y1l) != 0.0 ) {
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;
400 // Modified by N.Carrer. In very rare occasions the track may be just
401 // tangent to the module. Therefore the entrance and exit points have the
403 if( (y2l-y1l) != 0.0 ) {
404 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
405 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
419 //___________________________________________________________________________
420 Bool_t AliITSmodule::MedianHitL( AliITShit *itsHit1,
422 Float_t &xMl, Float_t &yMl, Float_t &zMl){
427 itsHit1->GetPositionL(x1l,y1l,z1l);
428 itsHit2->GetPositionL(x2l,y2l,z2l);
431 // Modified by N.Carrer. In very rare occasions the track may be just
432 // tangent to the module. Therefore the entrance and exit points have the
434 if( (y2l-y1l) != 0.0 ) {
435 xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l;
436 zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l;
443 //___________________________________________________________________________
444 void AliITSmodule::MedianHit(Int_t index,
445 Float_t xg,Float_t yg,Float_t zg,
447 Float_t &xMg,Float_t &yMg,Float_t &zMg,
450 static Float_t x1,y1,z1;
452 if ((status&0x0002)!=0){ // entering
457 } else if ((status&0x0004)!=0){ // exiting
458 MedianHitG(index,x1,y1,z1,xg,yg,zg,xMg,yMg,zMg);
463 //___________________________________________________________________________
464 void AliITSmodule::GetID(Int_t &lay,Int_t &lad,Int_t &det){
466 fITS->GetITSgeom()->GetModuleId(fIndex,lay,lad,det);