X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSmodule.cxx;h=18ed2338a7214f18f29ae15a731d2220b01550d3;hb=dc422a31fdd453d94b4a4d3c5dc73597997caf25;hp=057851be929ba3ae97b059bd8be41a957b0fb8ad;hpb=5a62ee9673c5823c961ee785608bbab7d9744423;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSmodule.cxx b/ITS/AliITSmodule.cxx index 057851be929..18ed2338a72 100644 --- a/ITS/AliITSmodule.cxx +++ b/ITS/AliITSmodule.cxx @@ -1,6 +1,6 @@ /************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * - * * + * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * @@ -13,44 +13,17 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.4 2000/06/12 23:49:02 nilsen -New ITS code replacing the old structure and simulations code. - -Revision 1.3.4.4 2000/06/12 18:10:32 barbera -fixed posible compilation errors on HP unix - -Revision 1.3.4.3 2000/06/11 20:34:20 barbera -Update class for the new structures. - -Revision 1.3.4.2 2000/03/02 21:42:29 nilsen -Linked AliDetector::fDigit to AliITSmodule::fDigitsM and AliITS::fITSRecPoints -to AliITSmodule::fRecPointsM. Renamed AliITSmodule::fPointsM to fRecPointsM. -Removed the deletion of fDigitsM from the distructor since it is only a copy -of what is in AliDetector. Fixed a bug in the functions LineSegmentL and -LineSegmentG. Added two new versions of LineSegmentL and LineSegmentG to -additionaly return track number from the hit. Removed FastPoint function, -haven't found anywere it was used, also it had very many problems, should -just call FastPointSPD... . +/* $Id$ */ -Revision 1.3.4.1 2000/01/12 19:03:32 nilsen -This is the version of the files after the merging done in December 1999. -See the ReadMe110100.txt file for details +#include -Revision 1.3 1999/10/04 15:20:12 fca -Correct syntax accepted by g++ but not standard for static members, remove minor warnings - -Revision 1.2 1999/09/29 09:24:20 fca -Introduction of the Copyright and cvs Log - -*/ - -#include "AliITSmodule.h" +#include #include "AliRun.h" #include "AliITS.h" #include "AliITShit.h" +#include "AliITSmodule.h" +#include "AliITSgeom.h" ClassImp(AliITSmodule) @@ -67,20 +40,24 @@ ClassImp(AliITSmodule) // Constructors and deconstructor //________________________________________________________________________ // -AliITSmodule::AliITSmodule() { - // constructor - fIndex = 0; - fHitsM = 0; - fTrackIndex = 0; - fHitIndex = 0; - fITS = 0; +AliITSmodule::AliITSmodule(): +fITS(0), +fIndex(0), +fHitsM(0), +fTrackIndex(0), +fHitIndex(0) { + // constructor } //_________________________________________________________________________ -AliITSmodule::AliITSmodule(Int_t index) { +AliITSmodule::AliITSmodule(Int_t index): +fITS(0), +fIndex(index), +fHitsM(0), +fTrackIndex(0), +fHitIndex(0) { // constructor - fIndex = index; fHitsM = new TObjArray(); fTrackIndex = new TArrayI(16); fHitIndex = new TArrayI(16); @@ -91,37 +68,36 @@ AliITSmodule::~AliITSmodule() { // The destructor for AliITSmodule. Before destoring AliITSmodule // we must first destroy all of it's members. - fIndex = 0; - Int_t i; if(fHitsM){ - for(i=0;iGetEntriesFast();i++) - delete ((AliITShit *)(fHitsM->At(i))); - // must delete each object in the TObjArray. - delete fHitsM; + fHitsM->Delete(); + delete fHitsM; + fHitsM = 0; } // end if delete fTrackIndex; delete fHitIndex; fITS = 0; // We don't delete this pointer since it is just a copy. } //____________________________________________________________________________ -AliITSmodule::AliITSmodule(const AliITSmodule &source){ +AliITSmodule::AliITSmodule(const AliITSmodule &source):TObject(source), +fITS(source.fITS), +fIndex(source.fIndex), +fHitsM(source.fHitsM), +fTrackIndex(source.fTrackIndex), +fHitIndex(source.fHitIndex){ //////////////////////////////////////////////////////////////////////// // Copy Constructor //////////////////////////////////////////////////////////////////////// - printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n"); - exit(1); -} +} //_____________________________________________________________________________ AliITSmodule& AliITSmodule::operator=(const AliITSmodule &source){ //////////////////////////////////////////////////////////////////////// // Assignment operator //////////////////////////////////////////////////////////////////////// - printf("AliITSmodule error: AliITSmodule class has not to be copied! Exit.\n"); - exit(1); + this->~AliITSmodule(); + new(this) AliITSmodule(source); return *this; -} - +} //_________________________________________________________________________ // // Hits management @@ -129,70 +105,22 @@ AliITSmodule& AliITSmodule::operator=(const AliITSmodule &source){ Int_t AliITSmodule::AddHit(AliITShit* hit,Int_t t,Int_t h) { // Hits management - Int_t i; + //printf("AddHit: beginning hit %p t h %d %d\n",hit,t,h); fHitsM->AddLast(new AliITShit(*hit)); Int_t fNhitsM = fHitsM->GetEntriesFast(); if(fNhitsM-1>=fTrackIndex->GetSize()){ // need to expand the TArrayI - TArrayI *p = new TArrayI(fNhitsM+64); - for(i=0;iGetSize();i++) - (*p)[i] = fTrackIndex->At(i); - delete fTrackIndex; - fTrackIndex = p; + fTrackIndex->Set(fNhitsM+64); } // end if if(fNhitsM-1>=fHitIndex->GetSize()){ // need to expand the TArrayI - TArrayI *p = new TArrayI(fNhitsM+64); - for(i=0;iGetSize();i++) - (*p)[i] = fHitIndex->At(i); - delete fHitIndex; - fHitIndex = p; + fHitIndex->Set(fNhitsM+64); } // end if (*fTrackIndex)[fNhitsM-1] = t; (*fHitIndex)[fNhitsM-1] = h; return fNhitsM; } - -//___________________________________________________________________________ -void AliITSmodule::MedianHitG(Int_t index, - Float_t hitx1,Float_t hity1,Float_t hitz1, - Float_t hitx2,Float_t hity2,Float_t hitz2, - Float_t &xMg, Float_t &yMg, Float_t &zMg){ - // median hit - AliITSgeom *gm = fITS->GetITSgeom(); - Float_t x1l,y1l,z1l; - Float_t x2l,y2l,z2l; - Float_t xMl,yMl=0,zMl; - Float_t l[3], g[3]; - - g[0] = hitx1; - g[1] = hity1; - g[2] = hitz1; - gm->GtoL(index,g,l); - x1l = l[0]; - y1l = l[1]; - z1l = l[2]; - - g[0] = hitx2; - g[1] = hity2; - g[2] = hitz2; - gm->GtoL(index,g,l); - x2l = l[0]; - y2l = l[1]; - z2l = l[2]; - - xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l; - zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l; - - l[0] = xMl; - l[1] = yMl; - l[2] = zMl; - gm->LtoG(index,l,g); - xMg = g[0]; - yMg = g[1]; - zMg = g[2]; -} //___________________________________________________________________________ -Double_t AliITSmodule::PathLength(Int_t index,AliITShit *itsHit1, - AliITShit *itsHit2){ +Double_t AliITSmodule::PathLength(AliITShit *itsHit1, + AliITShit *itsHit2) { // path lenght Float_t x1g,y1g,z1g; Float_t x2g,y2g,z2g; @@ -207,16 +135,15 @@ Double_t AliITSmodule::PathLength(Int_t index,AliITShit *itsHit1, return s; } //___________________________________________________________________________ -void AliITSmodule::PathLength(Int_t index, - Float_t x,Float_t y,Float_t z, +void AliITSmodule::PathLength(Float_t x,Float_t y,Float_t z, Int_t status,Int_t &nseg, Float_t &x1,Float_t &y1,Float_t &z1, Float_t &dx1,Float_t &dy1,Float_t &dz1, - Int_t &flag){ + Int_t &flag) const{ // path length static Float_t x0,y0,z0; - if (status == 66){ // entering + if ((status&0x0002)!=0){ // entering x0 = x; y0 = y; z0 = z; @@ -230,8 +157,9 @@ void AliITSmodule::PathLength(Int_t index, dy1 = y-y1; dz1 = z-z1; nseg++; - if (status == 68) flag = 0; //exiting - else flag = 2; //inside + if ((status&0x0004)!=0) flag = 0; //exiting + if ((status&0x0001)!=0) flag = 2; // inside + else flag = 2; //inside ? x0 = x; y0 = y; z0 = z; @@ -242,26 +170,23 @@ Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b, Double_t &c,Double_t &d, Double_t &e,Double_t &f,Double_t &de){ // line segment - static Int_t hitindex0; - AliITShit *h0,*h1; + AliITShit *h1; + Double_t t; if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE; h1 = (AliITShit *) (fHitsM->At(hitindex)); if(h1->StatusEntering()){ // if track entering volume, get index for next // step - hitindex0 = hitindex; return kFALSE; } // end if StatusEntering() // else stepping - h0 = (AliITShit *) (fHitsM->At(hitindex0)); de = h1->GetIonization(); - h0->GetPositionL(a,c,e); + h1->GetPositionL0(a,c,e,t); h1->GetPositionL(b,d,f); b = b - a; d = d - c; f = f - e; - hitindex0 = hitindex; return kTRUE; } //___________________________________________________________________________ @@ -269,26 +194,23 @@ Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b, Double_t &c,Double_t &d, Double_t &e,Double_t &f,Double_t &de){ // line segment - static Int_t hitindex0; - AliITShit *h0,*h1; + AliITShit *h1; + Double_t t; if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE; h1 = (AliITShit *) (fHitsM->At(hitindex)); if(h1->StatusEntering()){ // if track entering volume, get index for next // step - hitindex0 = hitindex; return kFALSE; } // end if StatusEntering() // else stepping - h0 = (AliITShit *) (fHitsM->At(hitindex0)); de = h1->GetIonization(); - h0->GetPositionG(a,c,e); + h1->GetPositionG0(a,c,e,t); h1->GetPositionG(b,d,f); b = b - a; d = d - c; f = f - e; - hitindex0 = hitindex; return kTRUE; } //___________________________________________________________________________ @@ -297,27 +219,24 @@ Bool_t AliITSmodule::LineSegmentL(Int_t hitindex,Double_t &a,Double_t &b, Double_t &e,Double_t &f, Double_t &de,Int_t &track){ // line segmente - static Int_t hitindex0; - AliITShit *h0,*h1; + AliITShit *h1; + Double_t t; if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE; h1 = (AliITShit *) (fHitsM->At(hitindex)); if(h1->StatusEntering()){ // if track entering volume, get index for next // step - hitindex0 = hitindex; track = h1->GetTrack(); return kFALSE; } // end if StatusEntering() // else stepping - h0 = (AliITShit *) (fHitsM->At(hitindex0)); de = h1->GetIonization(); - h0->GetPositionL(a,c,e); + h1->GetPositionL0(a,c,e,t); h1->GetPositionL(b,d,f); b = b - a; d = d - c; f = f - e; - hitindex0 = hitindex; track = h1->GetTrack(); return kTRUE; } @@ -327,35 +246,108 @@ Bool_t AliITSmodule::LineSegmentG(Int_t hitindex,Double_t &a,Double_t &b, Double_t &e,Double_t &f, Double_t &de,Int_t &track){ // line segment - static Int_t hitindex0; - AliITShit *h0,*h1; + AliITShit *h1; + Double_t t; if(hitindex>= fHitsM->GetEntriesFast()) return kFALSE; h1 = (AliITShit *) (fHitsM->At(hitindex)); if(h1->StatusEntering()){ // if track entering volume, get index for next // step - hitindex0 = hitindex; track = h1->GetTrack(); return kFALSE; } // end if StatusEntering() // else stepping - h0 = (AliITShit *) (fHitsM->At(hitindex0)); de = h1->GetIonization(); - h0->GetPositionG(a,c,e); + h1->GetPositionG0(a,c,e,t); h1->GetPositionG(b,d,f); b = b - a; d = d - c; f = f - e; - hitindex0 = hitindex; track = h1->GetTrack(); return kTRUE; } +//______________________________________________________________________ +Bool_t AliITSmodule::MedianHitG(AliITShit *h1,AliITShit *h2, + Float_t &x,Float_t &y,Float_t &z){ + // Computes the mean hit location for a set of hits that make up a track + // passing through a volume. Returns kFALSE untill the the track leaves + // the volume. + // median hit + AliITSgeom *gm = fITS->GetITSgeom(); + Float_t x1l=0.,y1l=0.,z1l=0.; + Float_t x2l=0.,y2l=0.,z2l=0.; + Float_t xMl,yMl=0,zMl; + Float_t l[3], g[3]; + + h1->GetPositionG(x1l,y1l,z1l); + h2->GetPositionG(x2l,y2l,z2l); + + if((y2l*y1l)<0.) { + xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l; + zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l; + } else { + xMl = 0.5*(x1l+x2l); + zMl = 0.5*(z1l+z2l); + } + + l[0] = xMl; + l[1] = yMl; + l[2] = zMl; + gm->LtoG(h1->GetModule(),l,g); + x = g[0]; + y = g[1]; + z = g[2]; + return kTRUE; +} +//___________________________________________________________________________ +void AliITSmodule::MedianHitG(Int_t index, + Float_t hitx1,Float_t hity1,Float_t hitz1, + Float_t hitx2,Float_t hity2,Float_t hitz2, + Float_t &xMg, Float_t &yMg, Float_t &zMg){ + // median hit + AliITSgeom *gm = fITS->GetITSgeom(); + Float_t x1l,y1l,z1l; + Float_t x2l,y2l,z2l; + Float_t xMl,yMl=0,zMl; + Float_t l[3], g[3]; + + g[0] = hitx1; + g[1] = hity1; + g[2] = hitz1; + gm->GtoL(index,g,l); + x1l = l[0]; + y1l = l[1]; + z1l = l[2]; + + g[0] = hitx2; + g[1] = hity2; + g[2] = hitz2; + gm->GtoL(index,g,l); + x2l = l[0]; + y2l = l[1]; + z2l = l[2]; + + if((y2l*y1l)<0.) { + xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l; + zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l; + } else { + xMl = 0.5*(x1l+x2l); + zMl = 0.5*(z1l+z2l); + } + + l[0] = xMl; + l[1] = yMl; + l[2] = zMl; + gm->LtoG(index,l,g); + xMg = g[0]; + yMg = g[1]; + zMg = g[2]; +} //___________________________________________________________________________ -void AliITSmodule::MedianHitL(Int_t index, - AliITShit *itsHit1, +Bool_t AliITSmodule::MedianHitL( AliITShit *itsHit1, AliITShit *itsHit2, - Float_t &xMl, Float_t &yMl, Float_t &zMl){ + Float_t &xMl, Float_t &yMl, Float_t &zMl) const{ // median hit Float_t x1l,y1l,z1l; Float_t x2l,y2l,z2l; @@ -363,9 +355,15 @@ void AliITSmodule::MedianHitL(Int_t index, itsHit1->GetPositionL(x1l,y1l,z1l); itsHit2->GetPositionL(x2l,y2l,z2l); - xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l; yMl = 0.0; - zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l; + if((y2l*y1l)<0.) { + xMl = (-y1l / (y2l-y1l))*(x2l-x1l) + x1l; + zMl = (-y1l / (y2l-y1l))*(z2l-z1l) + z1l; + } else { + xMl = 0.5*(x1l+x2l); + zMl = 0.5*(z1l+z2l); + } + return kTRUE; } //___________________________________________________________________________ void AliITSmodule::MedianHit(Int_t index, @@ -376,17 +374,16 @@ void AliITSmodule::MedianHit(Int_t index, // median hit static Float_t x1,y1,z1; - if (status == 66){ // entering + if ((status&0x0002)!=0){ // entering x1 = xg; y1 = yg; z1 = zg; flag = 1; - } // end if - if (status == 68){ // exiting + } else if ((status&0x0004)!=0){ // exiting MedianHitG(index,x1,y1,z1,xg,yg,zg,xMg,yMg,zMg); flag = 0; } // end if - if ((status != 66) && (status != 68)) flag = 1; + else flag = 1; } //___________________________________________________________________________ void AliITSmodule::GetID(Int_t &lay,Int_t &lad,Int_t &det){