]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSsegmentationSDD.cxx
Coverity (Melinda)
[u/mrichter/AliRoot.git] / ITS / AliITSsegmentationSDD.cxx
index 553b68e67c58810d3ed361a7a12274f33dcc7f06..f50fa6fae688fcbd6b6447350c66941b28f3cc33 100644 (file)
  **************************************************************************/
 #include <Riostream.h>
 #include <TMath.h>
-
+#include <TGeoManager.h>
+#include <TGeoVolume.h>
+#include <TGeoBBox.h>
 #include "AliITSsegmentationSDD.h"
-#include "AliITSgeomSDD.h"
-#include "AliITSresponseSDD.h"
+#include "AliITSDriftSpeedSDD.h"
 
 /////////////////////////////////////////////////////////////////////////////
 // Segmentation class for drift detectors                                  //
@@ -44,7 +45,7 @@
 //                               Z                                         //
 /////////////////////////////////////////////////////////////////////////////
 
-/* $Id:$ */
+/* $Id$ */
 
 const Float_t AliITSsegmentationSDD::fgkDxDefault = 35085.;
 const Float_t AliITSsegmentationSDD::fgkDzDefault = 75264.;
@@ -58,20 +59,9 @@ const Int_t AliITSsegmentationSDD::fgkNanodesPerChip = 64;
 const Float_t AliITSsegmentationSDD::fgkCm2Micron = 10000.;
 const Float_t AliITSsegmentationSDD::fgkMicron2Cm = 1.0E-04;
 ClassImp(AliITSsegmentationSDD)
-//----------------------------------------------------------------------
-AliITSsegmentationSDD::AliITSsegmentationSDD(AliITSgeom* geom):
-AliITSsegmentation(),
-fNsamples(0),
-fNanodes(0),
-fPitch(0),
-fTimeStep(0),
-fDriftSpeed(0),
-fSetDriftSpeed(0){
-  // constructor
-  InitFromGeom(geom);
-}
+
 //______________________________________________________________________
-AliITSsegmentationSDD::AliITSsegmentationSDD() : AliITSsegmentation(),
+AliITSsegmentationSDD::AliITSsegmentationSDD(Option_t *opt) : AliITSsegmentation(),
 fNsamples(0),
 fNanodes(0),
 fPitch(0),
@@ -80,6 +70,21 @@ fDriftSpeed(0),
 fSetDriftSpeed(0){
   // Default constructor
   Init();
+  if(strstr(opt,"TGeo")){
+    if(!gGeoManager){
+      AliError("Geometry is not initialized\n");
+      return;
+    }
+    TGeoVolume *v=NULL;
+    v = gGeoManager->GetVolume("ITSsddSensitivL3");
+    if(!v){
+      AliWarning("TGeo volume ITSsddSensitivL3 not found (hint: use v11Hybrid geometry)\n Using hardwired default values"); 
+    }
+    else {
+      TGeoBBox *s=(TGeoBBox*)v->GetShape();
+      SetDetSize(s->GetDX()*10000.,s->GetDZ()*20000.,s->GetDY()*20000.);
+    }
+  }
 }
 
 //______________________________________________________________________
@@ -118,27 +123,12 @@ fSetDriftSpeed(0){
 //----------------------------------------------------------------------
 void AliITSsegmentationSDD::Init(){
 // Standard initilisation routine
-   fDriftSpeed=AliITSresponseSDD::DefaultDriftSpeed();
+   fDriftSpeed=AliITSDriftSpeedSDD::DefaultDriftSpeed();
    fCorr=0;
    SetDetSize(fgkDxDefault,fgkDzDefault,fgkDyDefault);
    SetPadSize(fgkPitchDefault,fgkClockDefault);
    SetNPads(fgkHalfNanodesDefault,fgkNsamplesDefault);
 }
-//----------------------------------------------------------------------
-void AliITSsegmentationSDD::InitFromGeom(AliITSgeom *geom){
-// Inizialization from geometry
-  Init();
-  if(!geom) {
-    AliFatal("Pointer to ITS geometry class (AliITSgeom) is null\n");
-    return;
-  }
-  AliITSgeomSDD *gsdd = (AliITSgeomSDD *) (geom->GetShape(3,1,1));
-  
-  fDz = 2.*fgkCm2Micron*gsdd->GetDz();
-  fDx = fgkCm2Micron*gsdd->GetDx();
-  fDy = 2.*fgkCm2Micron*gsdd->GetDy();
-}
 
 //----------------------------------------------------------------------
 void AliITSsegmentationSDD::
@@ -222,6 +212,50 @@ Int_t AliITSsegmentationSDD::GetChipFromLocal(Float_t xloc, Float_t zloc) const
   return iChip;
 }
 //----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipsInLocalWindow(Int_t* array, Float_t zmin, Float_t zmax, Float_t xmin, Float_t xmax) const {
+  // returns the numbers of the chips that read channels in a given region
+  // of the module defined in local coordinates by zmin-zmax, xmin-max
+
+  Int_t nChipInW = 0;
+  Float_t zminDet=-fDz*fgkMicron2Cm/2.;
+  Float_t zmaxDet=fDz*fgkMicron2Cm/2.;
+  if(zmin<zminDet) zmin=zminDet;
+  if(zmax>zmaxDet) zmax=zmaxDet;
+  Float_t xminDet=-fDx*fgkMicron2Cm;
+  Float_t xmaxDet=fDx*fgkMicron2Cm;
+  if(xmin<xminDet) xmin=xminDet;
+  if(xmax>xmaxDet) xmax=xmaxDet;
+  Int_t n1=GetChipFromLocal(xmin,zmin);
+  array[nChipInW]=n1;
+  nChipInW++;
+  Int_t n2=GetChipFromLocal(xmin,zmax);
+  if(n2!=n1){
+    Int_t imin=TMath::Min(n1,n2);
+    Int_t imax=TMath::Max(n1,n2);
+    for(Int_t ichip=imin; ichip<=imax; ichip++){
+      if(ichip==n1) continue;
+      array[nChipInW]=ichip;
+      nChipInW++;    
+    }
+  }
+  Int_t n3=GetChipFromLocal(xmax,zmin);
+  if(n3!=n1){
+    array[nChipInW]=n3;
+    nChipInW++;
+    Int_t n4=GetChipFromLocal(xmax,zmax);
+    if(n4!=n3){
+      Int_t imin=TMath::Min(n3,n4);
+      Int_t imax=TMath::Max(n3,n4);
+      for(Int_t ichip=imin; ichip<=imax; ichip++){
+       if(ichip==n3) continue;
+       array[nChipInW]=ichip;
+       nChipInW++;    
+      }
+    }
+  }
+  return nChipInW;
+}
+//----------------------------------------------------------------------
 void AliITSsegmentationSDD::GetPadIxz(Float_t x,Float_t z,
                                      Int_t &timebin,Int_t &anode) const {
 // Returns cell coordinates (time sample,anode)