]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSmodule.cxx
New ITS code replacing the old structure and simulations code.
[u/mrichter/AliRoot.git] / ITS / AliITSmodule.cxx
index 1c9a87b31c1cad341ef0c2ff4bb6e217b8fb1066..eebe390208dc47119c2457dbc7c6f5fc03437ae1 100644 (file)
@@ -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.              *
  *                                                                        *
 
 /*
 $Log$
+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... .
+
+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
+
+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 "AliRun.h"
+#include "AliITS.h"
+#include "AliITShit.h"
 
 ClassImp(AliITSmodule)
 
@@ -29,86 +55,339 @@ ClassImp(AliITSmodule)
 //
 // Impementation of class AliITSmodule
 //
-// created by: A. Bouchm, W. Peryt, S. Radomski, P. Skowronski
+// created by: A. Bouchm, W. Peryt, S. Radomski, P. Skowronski 
 //             R. Barbers, B. Batyunia, B. S. Nilsen
 // ver 1.0     CERN 16.09.1999
 //_______________________________________________________________________
-//
-
 //________________________________________________________________________
 // 
 // Constructors and deconstructor
 //________________________________________________________________________
 //
+AliITSmodule::AliITSmodule() {
+  // constructor
+    fIndex       = 0;
+    fHitsM       = 0;
+    fTrackIndex  = 0;
+    fHitIndex    = 0;
+    fITS         = 0;
 
+}
+//_________________________________________________________________________
+AliITSmodule::AliITSmodule(Int_t index) {
+  // constructor
 
-AliITSmodule::AliITSmodule() {
+    fIndex      = index;
+    fHitsM      = new TObjArray();
+    fTrackIndex = new TArrayI(16);
+    fHitIndex   = new TArrayI(16);
+    fITS        = (AliITS*)(gAlice->GetDetector("ITS"));
+}
+//__________________________________________________________________________
+AliITSmodule::~AliITSmodule() {
+    // The destructor for AliITSmodule. Before destoring AliITSmodule
+    // we must first destroy all of it's members.
 
-    fIndex  = 0;
-    fHitsM  = new TObjArray();
-    fNhitsM = 0;
-    fITS    = (AliITS*)(gAlice->GetDetector("ITS"));
+    fIndex   = 0;
+    Int_t i;
+    if(fHitsM){
+       for(i=0;i<fHitsM->GetEntriesFast();i++) 
+           delete ((AliITShit *)(fHitsM->At(i)));
+       // must delete each object in the TObjArray.
+       delete fHitsM;
+    } // 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){
+////////////////////////////////////////////////////////////////////////
+//     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);
+} 
 
 //_________________________________________________________________________
+// 
+// Hits management
+//__________________________________________________________________________
+Int_t AliITSmodule::AddHit(AliITShit* hit,Int_t t,Int_t h) {
+// Hits management
 
-AliITSmodule::AliITSmodule(Int_t index) {
+    Int_t i;
+    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;i<fTrackIndex->GetSize();i++) 
+           (*p)[i] = fTrackIndex->At(i);
+       delete fTrackIndex;
+       fTrackIndex = p;
+    } // end if
+    if(fNhitsM-1>=fHitIndex->GetSize()){ // need to expand the TArrayI
+       TArrayI *p = new TArrayI(fNhitsM+64);
+       for(i=0;i<fHitIndex->GetSize();i++) 
+           (*p)[i] = fHitIndex->At(i);
+       delete fHitIndex;
+       fHitIndex = p;
+    } // 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;
 
-    fIndex  = index;
-    fHitsM  = new TObjArray();
-    fNhitsM = 0;
-    fITS    = (AliITS*)(gAlice->GetDetector("ITS"));
+   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){
+  // path lenght
+   Float_t  x1g,y1g,z1g;   
+   Float_t  x2g,y2g,z2g;
+   Double_t s;
 
+   itsHit1->GetPositionG(x1g,y1g,z1g);
+   itsHit2->GetPositionG(x2g,y2g,z2g);
 
-//__________________________________________________________________________
+   s = TMath::Sqrt( ((Double_t)(x2g-x1g)*(Double_t)(x2g-x1g)) +
+                   ((Double_t)(y2g-y1g)*(Double_t)(y2g-y1g)) +
+                   ((Double_t)(z2g-z1g)*(Double_t)(z2g-z1g))  );
+   return s;
+}
+//___________________________________________________________________________
+void AliITSmodule::PathLength(Int_t index,
+                             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){
+  // path length
+    static Float_t x0,y0,z0;
 
-AliITSmodule::~AliITSmodule() {
-    if(fHitsM) delete fHitsM;
-    fNhitsM = 0;
+    if (status == 66){ // entering
+       x0 = x;
+       y0 = y;
+       z0 = z;
+       nseg = 0;
+       flag = 1;
+    }else{
+       x1 = x0;
+       y1 = y0;
+       z1 = z0;
+       dx1 = x-x1;
+       dy1 = y-y1;
+       dz1 = z-z1;
+       nseg++;
+       if (status == 68) flag = 0; //exiting
+       else flag = 2; //inside
+       x0 = x;
+       y0 = y;
+       z0 = z;
+    } // end if
 }
+//___________________________________________________________________________
+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;
 
-//_________________________________________________________________________
-// 
-// Hits menagement
-//__________________________________________________________________________
+    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->GetPositionL(b,d,f);
+    b = b - a;
+    d = d - c;
+    f = f - e;
+    hitindex0 = hitindex;
+    return kTRUE;
+}
+//___________________________________________________________________________
+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;
 
-Int_t AliITSmodule::AddHit(AliITShit* hit ) {
-    fHitsM->AddLast(hit);
-    fNhitsM = fHitsM->GetEntriesFast();
-    return fNhitsM;
+    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->GetPositionG(b,d,f);
+    b = b - a;
+    d = d - c;
+    f = f - e;
+    hitindex0 = hitindex;
+    return kTRUE;
+}
+//___________________________________________________________________________
+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,Int_t &track){
+  // line segmente
+    static Int_t hitindex0;
+    AliITShit *h0,*h1;
+
+    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->GetPositionL(b,d,f);
+    b = b - a;
+    d = d - c;
+    f = f - e;
+    hitindex0 = hitindex;
+    track = h1->GetTrack();
+    return kTRUE;
+}
+//___________________________________________________________________________
+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,Int_t &track){
+  // line segment
+    static Int_t hitindex0;
+    AliITShit *h0,*h1;
+
+    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->GetPositionG(b,d,f);
+    b = b - a;
+    d = d - c;
+    f = f - e;
+    hitindex0 = hitindex;
+    track = h1->GetTrack();
+    return kTRUE;
 }
+//___________________________________________________________________________
+void AliITSmodule::MedianHitL(Int_t index, 
+                                    AliITShit *itsHit1, 
+                            AliITShit *itsHit2, 
+                            Float_t &xMl, Float_t &yMl, Float_t &zMl){
+  // median hit
+   Float_t x1l,y1l,z1l;
+   Float_t x2l,y2l,z2l;
+
+   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;        
+}
 //___________________________________________________________________________
-void AliITSmodule::Streamer(TBuffer & /*R__b*/){
-   // Stream an object of class AliITSmodule.
-
-    return;
-// This class is not to be written out to any file.
-//   if (R__b.IsReading()) {
-//      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
-//      TObject::Streamer(R__b);
-//      R__b >> fITS;
-//      R__b >> fIndex;
-//      R__b >> fHitsM;
-//      R__b >> fNhitsM;
-//      R__b >> fIDigits;
-//      R__b >> fNdigits;
-//      R__b >> fIPoints;
-//      R__b >> fNpoints;
-//   } else {
-//      R__b.WriteVersion(AliITSmodule::IsA());
-//      TObject::Streamer(R__b);
-//      R__b << fITS;
-//      R__b << fIndex;
-//      R__b << fHitsM;
-//      R__b << fNhitsM;
-//      R__b << fIDigits;
-//      R__b << fNdigits;
-//      R__b << fIPoints;
-//      R__b << fNpoints;
-//   }
+void AliITSmodule::MedianHit(Int_t index,
+                            Float_t xg,Float_t yg,Float_t zg,
+                            Int_t status,
+                            Float_t &xMg,Float_t &yMg,Float_t &zMg,
+                            Int_t &flag){
+  // median hit
+   static Float_t x1,y1,z1;
+
+   if (status == 66){ // entering
+       x1 = xg;
+       y1 = yg;
+       z1 = zg;
+       flag = 1;
+   } // end if
+   if (status == 68){ // exiting
+       MedianHitG(index,x1,y1,z1,xg,yg,zg,xMg,yMg,zMg);
+       flag = 0;
+   } // end if
+   if ((status != 66) && (status != 68)) flag = 1;
 }
-//______________________________________________________________________
+//___________________________________________________________________________
+void AliITSmodule::GetID(Int_t &lay,Int_t &lad,Int_t &det){
+  // get ID
+       fITS->GetITSgeom()->GetModuleId(fIndex,lay,lad,det);
+       return ;
+}
+