Chip number information added to segmentation mother class and to SDD segmentation...
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 22 Feb 2008 17:21:46 +0000 (17:21 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 22 Feb 2008 17:21:46 +0000 (17:21 +0000)
ITS/AliITSDetTypeRec.cxx
ITS/AliITSDetTypeSim.cxx
ITS/AliITSsegmentation.cxx
ITS/AliITSsegmentation.h
ITS/AliITSsegmentationSDD.cxx
ITS/AliITSsegmentationSDD.h

index b300246..9be191d 100644 (file)
@@ -344,7 +344,7 @@ void AliITSDetTypeRec::SetDefaults(){
 
   for(Int_t dettype=0;dettype<fgkNdettypes;dettype++){
     if(dettype==0){
-      seg = new AliITSsegmentationSPD(GetITSgeom());
+      seg = new AliITSsegmentationSPD();
       SetSegmentationModel(dettype,seg);
       SetDigitClassName(dettype,"AliITSdigitSPD");
       SetClusterClassName(dettype,"AliITSRawClusterSPD");
@@ -352,7 +352,7 @@ void AliITSDetTypeRec::SetDefaults(){
     }
     if(dettype==1){
       AliITSCalibrationSDD* res=(AliITSCalibrationSDD*) GetCalibrationModel(GetITSgeom()->GetStartSDD()); 
-      seg = new AliITSsegmentationSDD(GetITSgeom());
+      seg = new AliITSsegmentationSDD();
       SetSegmentationModel(dettype,seg);
       const char *kopt = ((AliITSresponseSDD*)res->GetResponse())->ZeroSuppOption();
       if((!strstr(kopt,"2D"))&&(!strstr(kopt,"1D"))) SetDigitClassName(dettype,"AliITSdigit");
@@ -361,7 +361,7 @@ void AliITSDetTypeRec::SetDefaults(){
 
     }
     if(dettype==2){
-      AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD(GetITSgeom());
+      AliITSsegmentationSSD* seg2 = new AliITSsegmentationSSD();
       seg2->SetAngles(0.0075,0.0275); // strip angels rad P and N side.
       seg2->SetAnglesLay5(0.0075,0.0275); // strip angels rad P and N side.
       seg2->SetAnglesLay6(0.0275,0.0075); // strip angels rad P and N side.
index 0654715..a072235 100644 (file)
@@ -278,11 +278,11 @@ void AliITSDetTypeSim::SetDefaultSegmentation(Int_t idet){
     if(GetSegmentationModel(idet))
        delete (AliITSsegmentation*)fSegmentation->At(idet);
     if(idet==0){
-       seg = new AliITSsegmentationSPD(GetITSgeom());
+       seg = new AliITSsegmentationSPD();
     }else if(idet==1){
-       seg = new AliITSsegmentationSDD(GetITSgeom());
+       seg = new AliITSsegmentationSDD();
     }else {
-       seg = new AliITSsegmentationSSD(GetITSgeom());
+       seg = new AliITSsegmentationSSD();
     }
     SetSegmentationModel(idet,seg);
 }
index 44d71cb..ead24e6 100644 (file)
@@ -18,7 +18,6 @@ AliITSsegmentation::AliITSsegmentation():
 fDx(0),
 fDz(0),
 fDy(0),
-fGeom(0),
 fCorr(0){
   // Default constructor
  
@@ -28,10 +27,9 @@ AliITSsegmentation::AliITSsegmentation(AliITSgeom* geom):
 fDx(0),
 fDz(0),
 fDy(0),
-fGeom(0),
 fCorr(0){
   // Default constructor
-   fGeom=geom;
+  AliWarning(Form("AliITSgeom (%X) no longer needed in ITS segmentation. Use default constructor\n",geom))
 }
 
 
@@ -47,7 +45,6 @@ void AliITSsegmentation::Copy(TObject &obj) const {
   ((AliITSsegmentation& ) obj).fDz      = fDz;
   ((AliITSsegmentation& ) obj).fDx      = fDx;
   ((AliITSsegmentation& ) obj).fDy      = fDy;
-  ((AliITSsegmentation& ) obj).fGeom    = fGeom; // copy only the pointer
   if(fCorr){
     ((AliITSsegmentation& ) obj).fCorr    = new TF1(*fCorr); // make a proper copy
   }
@@ -70,7 +67,6 @@ AliITSsegmentation::AliITSsegmentation(const AliITSsegmentation &source):
 fDx(0),
 fDz(0),
 fDy(0),
-fGeom(0),
 fCorr(0){
     // copy constructor
   source.Copy(*this);
index 76eadb9..360793b 100644 (file)
@@ -31,41 +31,47 @@ public TObject {
     virtual Int_t   GetNPads() const = 0;
     // Set layer
     virtual void SetLayer(Int_t) {MayNotUse("SetLayer");}
+    // Number of Chips
+    virtual Int_t    GetNumberOfChips() const {MayNotUse("GetNumberOfChips"); return 0;}
+    // Chip number from local coordinates
+    virtual Int_t    GetChipFromLocal(Float_t, Float_t) const {MayNotUse("GetChipFromLocal"); return 0;}
+    // Chip number from channel number
+    virtual Int_t    GetChipFromChannel(Int_t, Int_t) const {MayNotUse("GetChipFromChannel"); return 0;}
+
     // Transform from real to cell coordinates
     virtual void    GetPadIxz(Float_t,Float_t,Int_t &,Int_t &) const = 0;
     // Transform from cell to real coordinates
     virtual void    GetPadCxz(Int_t,Int_t,Float_t &,Float_t &) const = 0;
+    // Local transformation of real local coordinates -
+    virtual void    GetPadTxz(Float_t &,Float_t &) const = 0;
+    // Transformation from Geant cm detector center local coordinates
+    // to detector segmentation/cell coordiantes starting from (0,0).
+    virtual Bool_t LocalToDet(Float_t,Float_t,Int_t &,Int_t &) const = 0;
+    // Transformation from detector segmentation/cell coordiantes starting
+    // from (0,0) to Geant cm detector center local coordinates.
+    virtual void    DetToLocal(Int_t,Int_t,Float_t &,Float_t &) const = 0;
 
     // Transform from real global to local coordinates
-    void GetLocal(Int_t module,Float_t *g ,Float_t *l) const {
-      if(!fGeom) {
+    void GetLocal(Int_t module,Float_t *g ,Float_t *l, AliITSgeom *geom) const {
+      if(!geom) {
        AliFatal("Pointer to ITS geometry class (AliITSgeom) is null\n");
         return;
       }
-      fGeom->GtoL(module,g,l);      
+      geom->GtoL(module,g,l);      
     }
     // Transform from real local to global coordinates
-    void GetGlobal(Int_t module,Float_t *l ,Float_t *g) const {
-      if(!fGeom) {
+    void GetGlobal(Int_t module,Float_t *l ,Float_t *g, AliITSgeom *geom) const {
+      if(!geom) {
        AliFatal("Pointer to ITS geometry class (AliITSgeom) is null\n");
       }
-      fGeom->LtoG(module,l,g);
+      geom->LtoG(module,l,g);
     }
-    // Local transformation of real local coordinates -
-    virtual void    GetPadTxz(Float_t &,Float_t &) const = 0;
-    // Transformation from Geant cm detector center local coordinates
-    // to detector segmentation/cell coordiantes starting from (0,0).
-    virtual Bool_t LocalToDet(Float_t,Float_t,Int_t &,Int_t &) const = 0;
-    // Transformation from detector segmentation/cell coordiantes starting
-    // from (0,0) to Geant cm detector center local coordinates.
-    virtual void    DetToLocal(Int_t,Int_t,Float_t &,Float_t &) const = 0;
+
     // Initialisation
     virtual void Init() = 0;
     //
     // Get member data
     //
-    // Detector type geometry
-    virtual AliITSgeom* Geometry() const {return fGeom;}
     // Detector length
     virtual Float_t Dx() const {return fDx;}
     // Detector width
@@ -114,7 +120,6 @@ public TObject {
     Float_t fDy;    //SPD:  Full thickness of the detector (y axis) -um 
                     //SDD: Full thickness of the detector (y axis) - microns
                     //SSD: Full thickness of the detector (y axis) -um 
-    AliITSgeom *fGeom;  //! pointer to the geometry class
     TF1*       fCorr;   // correction function
 
     ClassDef(AliITSsegmentation,2) //Segmentation virtual base class 
index 456dd0d..8a8162e 100644 (file)
@@ -51,12 +51,14 @@ const Float_t AliITSsegmentationSDD::fgkPitchDefault = 294.;
 const Float_t AliITSsegmentationSDD::fgkClockDefault = 40.;
 const Int_t AliITSsegmentationSDD::fgkHalfNanodesDefault = 256; 
 const Int_t AliITSsegmentationSDD::fgkNsamplesDefault = 256;
+const Int_t AliITSsegmentationSDD::fgkNchipsPerHybrid = 4;
+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(geom),
+AliITSsegmentation(),
 fNsamples(0),
 fNanodes(0),
 fPitch(0),
@@ -64,11 +66,7 @@ fTimeStep(0),
 fDriftSpeed(0),
 fSetDriftSpeed(0){
   // constructor
-   fDriftSpeed=AliITSresponseSDD::DefaultDriftSpeed();
-   fCorr=0;
-   SetDetSize(fgkDxDefault,fgkDzDefault,fgkDyDefault);
-   SetPadSize(fgkPitchDefault,fgkClockDefault);
-   SetNPads(fgkHalfNanodesDefault,fgkNsamplesDefault);
+  InitFromGeom(geom);
 }
 //______________________________________________________________________
 AliITSsegmentationSDD::AliITSsegmentationSDD() : AliITSsegmentation(),
@@ -79,10 +77,7 @@ fTimeStep(0),
 fDriftSpeed(0),
 fSetDriftSpeed(0){
   // Default constructor
-   fDriftSpeed=0;  
-   SetDetSize(fgkDxDefault,fgkDzDefault,fgkDyDefault);
-   SetPadSize(fgkPitchDefault,fgkClockDefault);
-   SetNPads(fgkHalfNanodesDefault,fgkNsamplesDefault);
+  Init();
 }
 
 //______________________________________________________________________
@@ -120,17 +115,27 @@ fSetDriftSpeed(0){
 
 //----------------------------------------------------------------------
 void AliITSsegmentationSDD::Init(){
-  // Standard initilisation routine
-
-   if(!fGeom) {
-     AliFatal("Pointer to ITS geometry class (AliITSgeom) is null\n");
-     return;
-   }
-   AliITSgeomSDD *gsdd = (AliITSgeomSDD *) (fGeom->GetShape(3,1,1));
-
-   fDz = 2.*fgkCm2Micron*gsdd->GetDz();
-   fDx = fgkCm2Micron*gsdd->GetDx();
-   fDy = 2.*fgkCm2Micron*gsdd->GetDy();
+// Standard initilisation routine
+   fDriftSpeed=AliITSresponseSDD::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();
 }
 
 //----------------------------------------------------------------------
@@ -184,6 +189,35 @@ Float_t AliITSsegmentationSDD::GetLocalZFromAnode(Float_t zAnode) const{
   return zloc;
 }
 //----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipFromChannel(Int_t ix, Int_t iz) const {
+  if(iz>=fNanodes  || iz<0 || ix>fNsamples){
+    AliError("Bad cell number");
+    return -1;
+  }
+  Int_t theChip=iz/fgkNanodesPerChip;
+  return theChip;
+}
+//----------------------------------------------------------------------
+Int_t AliITSsegmentationSDD::GetChipFromLocal(Float_t xloc, Float_t zloc) const {  
+  Float_t detsize=fDz*fgkMicron2Cm;
+  Float_t chipsize=detsize/(Float_t)fgkNchipsPerHybrid;
+  zloc+=detsize/2.;
+  if(zloc<-0.01 || zloc>detsize+0.01){ // 100 micron tolerance around edges
+    AliError("Z local value out of sensitive SDD area");
+    return -1;
+  }
+  Int_t iChip=int(zloc/chipsize);
+  if(zloc<0.) iChip=0;  
+  if(zloc>=detsize) iChip=fgkNchipsPerHybrid-1;
+  if(iChip>=fgkNchipsPerHybrid || iChip<0){ 
+    AliError(Form("Bad chip number %d",iChip));
+    return -1;
+  }
+  Int_t iSide=GetSideFromLocalX(xloc);
+  if(iSide==1) iChip=fgkNchipsPerHybrid-iChip+3;   // i.e. 7-iChip
+  return iChip;
+}
+//----------------------------------------------------------------------
 void AliITSsegmentationSDD::GetPadIxz(Float_t x,Float_t z,
                                      Int_t &timebin,Int_t &anode) const {
 // Returns cell coordinates (time sample,anode)
index 57bb617..6d52b35 100644 (file)
@@ -66,9 +66,15 @@ public AliITSsegmentation {
     virtual Float_t GetDriftTimeFromTb(Float_t xtb) const {
       return xtb*fTimeStep;
     }
-    //
+    virtual Int_t    GetNumberOfChips() const {
+      return fgkNchipsPerHybrid;
+    }
+    virtual Int_t    GetChipFromLocal(Float_t xloc, Float_t zloc) const;
+    virtual Int_t    GetChipFromChannel(Int_t ix, Int_t iz) const; 
+
     // Initialisation
     virtual void Init();
+    void InitFromGeom(AliITSgeom *geom);
     //
     // Get member data
     //
@@ -113,9 +119,11 @@ public AliITSsegmentation {
     static const Float_t fgkClockDefault; //Default value for the clock freq.
     static const Int_t fgkHalfNanodesDefault; //Default value for fNanodes/2
     static const Int_t fgkNsamplesDefault; //Default value for fNsamples
+    static const Int_t fgkNchipsPerHybrid;    //number of chips per hybrid
+    static const Int_t fgkNanodesPerChip;    //number of chips per hybrid
     static const Float_t fgkCm2Micron;  // conversion from cm to micron
     static const Float_t fgkMicron2Cm;  // conversion from micron to cm
-    ClassDef(AliITSsegmentationSDD,5) // SDD segmentation
+    ClassDef(AliITSsegmentationSDD,6) // SDD segmentation
 };
 
 #endif