Developping framework for real electronic mapping for rawdata & fixing some bugs...
authormartinez <martinez@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 19 May 2005 05:20:02 +0000 (05:20 +0000)
committermartinez <martinez@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 19 May 2005 05:20:02 +0000 (05:20 +0000)
15 files changed:
MUON/AliMUONCommonGeometryBuilder.cxx
MUON/AliMUONDigit.h
MUON/AliMUONFactoryV2.cxx
MUON/AliMUONGeometrySegmentation.cxx
MUON/AliMUONGeometrySegmentation.h
MUON/AliMUONRawData.cxx
MUON/AliMUONRawData.h
MUON/AliMUONSegmentManuIndex.h
MUON/AliMUONSt12QuadrantSegmentation.h
MUON/AliMUONSt1GeometryBuilderV2.cxx
MUON/AliMUONSt345SlatSegmentation.cxx
MUON/AliMUONSt345SlatSegmentation.h
MUON/AliMUONTriggerSegmentation.h
MUON/AliMUONVGeometryDESegmentation.h
MUON/AliMUONv1.cxx

index 8629a1c..1bb97bb 100644 (file)
@@ -131,6 +131,11 @@ void AliMUONCommonGeometryBuilder::CreateMaterials()
   // --- Define the various materials for GEANT --- 
   fMUON->AliMaterial(9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
   fMUON->AliMaterial(10, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2);
+  fMUON->AliMaterial(49, "Kapton$", 12.01,6,1.42,-28.6,999);          // from DPG
+  fMUON->AliMaterial(42, "Copper$", 63.546,29.,8.96,-1.43,9.6);
+  fMUON->AliMaterial(43, "FR4$", 17.749, 8.875, 1.7, -19.4, 999.);    // from DPG
+  fMUON->AliMaterial(44, "FrameEpoxy",12.24,6.0,1.85,-19.14,999);// use 16.75cm
+
   // Air
   Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
   Float_t zAir[4]={6.,7.,8.,18.};
@@ -236,6 +241,19 @@ void AliMUONCommonGeometryBuilder::CreateMaterials()
                   maxStepAlu, maxDestepAlu, epsil, stmin);
   fMUON->AliMedium(17, "Nomex bulk        ", 37, 0, iSXFLD, sXMGMX, tmaxfd, 
                   maxStepAlu, maxDestepAlu, epsil, stmin);
+
+  // for station 2 only
+                  // was med: 4  mat: 9
+  fMUON->AliMedium(22, "COPPER_II        ", 42, 0, iSXFLD, sXMGMX, 
+                   tmaxfd, maxStepAlu, maxDestepAlu, epsil, stmin);
+                  // was med: 10  mat: 30
+  fMUON->AliMedium(23, "FR4_CH           ", 43, 0, iSXFLD, sXMGMX, 
+                   10.0, 0.01, 0.1, 0.003, 0.003);
+  fMUON->AliMedium(24, "FrameCH$",   44, 1, iSXFLD, sXMGMX, 
+                   10.0, 0.001, 0.001, 0.001, 0.001);
+  fMUON->AliMedium(29, "Kapton            ", 49, 0, iSXFLD, sXMGMX,  
+                   10.0, 0.01, 1.0, 0.003, 0.003);
+                  // was med: 18  mat: 34 
 }
 
 
index 9428501..37cf08b 100644 (file)
@@ -32,9 +32,17 @@ class AliMUONDigit : public TObject {
     virtual Int_t    Hit() const          {return fHit;}    
     virtual Int_t    Cathode() const      {return fCathode;}
     virtual Int_t    Track(Int_t i) const {return fTracks[i];}
-    virtual Int_t    TrackCharge(Int_t i) const {return fTcharges[i];}    
-    virtual void     AddSignal(Int_t q)   {fSignal += q;}
-    virtual void     AddPhysicsSignal(Int_t q)   {fPhysics += q;}          
+    virtual Int_t    TrackCharge(Int_t i) const {return fTcharges[i];} 
+
+    virtual void     SetDetElemId(Int_t id)    {fDetElemId = id;}
+    virtual void     SetPadX(Int_t pad)        {fPadX = pad;}
+    virtual void     SetPadY(Int_t pad)        {fPadY = pad;}
+    virtual void     AddSignal(Int_t q)        {fSignal += q;}
+    virtual void     AddPhysicsSignal(Int_t q) {fPhysics += q;}
+    virtual void     SetHit(Int_t n)           {fHit = n;}    
+    virtual void     SetCathode(Int_t c)       {fCathode = c;}
+  
+           
  private:
     Int_t     fPadX;          // Pad number along x
     Int_t     fPadY;          // Pad number along y
index be1ee59..eb54727 100644 (file)
@@ -466,7 +466,7 @@ void AliMUONFactoryV2::BuildStation4()
   slatsegB[3]->SetPcbBoards(n7);
   slatsegB[3]->Init(0); // 0 detection element id
   slatsegNB[3]->SetPcbBoards(n7);
-  slatsegNB[4]->Init(0); // 0 detection element id
+  slatsegNB[3]->Init(0); // 0 detection element id
     
   // Type 223300 for 704, 709, 717, 722 in Ch7 (similar for Ch8) 
   // for the futur official numbering
index a8bec81..47532dc 100644 (file)
@@ -33,7 +33,7 @@
 #include "AliMUONGeometryModule.h"
 #include "AliMUONGeometryDetElement.h"
 #include "AliMUONGeometryStore.h"
-
+#include "AliMUONSegmentManuIndex.h"
 
 ClassImp(AliMUONGeometrySegmentation)
 
@@ -242,6 +242,55 @@ Bool_t  AliMUONGeometrySegmentation::GetPadC(Int_t detElemId,
   return true;
 }
 
+//______________________________________________________________________________
+Bool_t  AliMUONGeometrySegmentation::GetPadE(Int_t detElemId,
+                                        Int_t &ix, Int_t &iy, 
+                                        AliMUONSegmentManuIndex* connect)
+{
+// Get pads for a given electronic connection
+// ---
+
+  if (!OwnNotify(detElemId)) return false;
+
+  if (!fCurrentSegmentation->HasPad(ix, iy)) return false;
+
+  fCurrentSegmentation->GetPadE(ix, iy, connect);
+  return true;
+}
+
+//______________________________________________________________________________
+AliMUONSegmentManuIndex* AliMUONGeometrySegmentation:: GetMpConnection(Int_t detElemId,
+                                                              Int_t ix, Int_t iy)
+{                                      
+// Get electronic connection for given pads
+// ---
+
+  if (!OwnNotify(detElemId)) return 0x0;
+
+  AliMUONSegmentManuIndex* connect;
+
+  connect = fCurrentSegmentation->GetMpConnection(ix, iy);
+  if (connect == 0x0) return 0x0;
+
+  Int_t busPatchId = connect->GetBusPatchId(); 
+
+  Int_t dBusPatch = 0;
+  // not very clean way, to be changed (Ch.F.)
+
+  if (detElemId/100 > 4 && detElemId/100 < 11) 
+    dBusPatch = 4; 
+  else if (detElemId/100 < 5) 
+    dBusPatch = 25; 
+
+  if (detElemId % 100 < 50)
+    busPatchId+= (detElemId/100 - 1)*100 + (detElemId % 100)*dBusPatch;
+  else 
+    busPatchId+= (detElemId/100 - 1)*100 + ((detElemId-50) % 100)*dBusPatch + 50;
+
+  connect->SetBusPatchId(busPatchId); 
+  return connect;
+}
+
 
 //______________________________________________________________________________
 void AliMUONGeometrySegmentation::Init(Int_t chamber)
index 915157c..0082f63 100644 (file)
@@ -26,6 +26,7 @@ class AliMUONGeometryModule;
 class AliMUONGeometryStore;
 class AliMUONGeometryDetElement;
 class AliMUONVGeometryDESegmentation;
+class AliMUONSegmentManuIndex;
 
 class AliMUONGeometrySegmentation : public TObject
 {
@@ -67,7 +68,10 @@ class AliMUONGeometrySegmentation : public TObject
                           Int_t ix, Int_t iy,
                           Float_t& x, Float_t& y, Float_t& z);
                        // Transform from real to pad coordinates
-
+                       // get pad for a given connection
+    virtual Bool_t     GetPadE(Int_t detElemId, Int_t &ix, Int_t &iy,  AliMUONSegmentManuIndex* connect);
+    virtual AliMUONSegmentManuIndex*     GetMpConnection(Int_t detElemId, Int_t ix, Int_t iy); 
+                       // get electronics connection for given pad
     // Initialisation
     //
     virtual void Init(Int_t chamber);
index e846c14..892f3f3 100644 (file)
@@ -31,6 +31,8 @@
 #include "AliMUONRawData.h"
 #include "AliMUONDigit.h"
 
+#include "AliMUON.h"
+#include "AliMUONChamber.h"
 #include "AliMUONConstants.h"
 #include "AliMUONData.h"
 #include "AliLoader.h"
 
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONGlobalTrigger.h"
+
+#include "AliMUONGeometrySegmentation.h"
+#include "AliMUONSegmentManuIndex.h"
 #include "AliLog.h"
+#include "AliRun.h"
 
 const Int_t AliMUONRawData::fgkDefaultPrintLevel = 0;
 
@@ -224,14 +230,27 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
   Int_t index;
   Int_t indexDsp;
   Int_t indexBlk;
-
+  Int_t padX;
+  Int_t padY;
+  Int_t cathode = 0;
+  Int_t detElemId;
   Int_t nDigits;
   const AliMUONDigit* digit;
 
-   if (fPrintLevel == 1)
-      printf("WriteDDL chamber %d\n", iCh+1);
+  AliMUON *pMUON;
+  AliMUONChamber* iChamber = 0x0;
+  AliMUONGeometrySegmentation* segmentation2[2];
+
+  segmentation2[0]=iChamber->SegmentationModel2(1); // cathode 0
+  segmentation2[1]=iChamber->SegmentationModel2(2); // cathode 1
+
+   pMUON = (AliMUON*) gAlice->GetModule("MUON");
+   iChamber =  &(pMUON->Chamber(iCh));
 
-  for (Int_t iCath = 0; iCath < 2; iCath++) {
+
+   AliDebug(1, Form("WriteDDL chamber %d\n", iCh+1));
+
+   for (Int_t iCath = 0; iCath < 2; iCath++) {
 
     fMUONData->ResetDigits();
     fMUONData->GetCathode(iCath);
@@ -247,9 +266,32 @@ Int_t AliMUONRawData::WriteTrackerDDL(Int_t iCh)
 
       digit = (AliMUONDigit*) muonDigits->UncheckedAt(idig);
 
+      padX = digit->PadX();
+      padY = digit->PadY();
+      charge = digit->Signal();
+      charge &= 0xFFF;
+      cathode = digit->Cathode();
+      detElemId = digit->DetElemId();
+
       // mapping
-      GetDummyMapping(iCh, iCath, digit, busPatchId, manuId, channelId, charge);
+      if (detElemId == 0) {
+       AliWarning("\ndetElemId = 0, old segmentation !\n");
+       GetDummyMapping(iCh, iCath, digit, busPatchId, manuId, channelId);
+      } else {
+      // mapping (not far from real one)
+       AliMUONSegmentManuIndex* connect = segmentation2[iCath]->GetMpConnection(detElemId, padX, padY);
+       if (connect != 0x0) {
+         busPatchId = connect->GetBusPatchId(); 
+         manuId     = connect->GetManuId();
+         channelId  = connect->GetManuChannelId();
+         AliDebug(3,Form("busPatchId %d, manuId: %d, channelId: %d\n", busPatchId, manuId, channelId));
+       } else {
+         busPatchId = 0; 
+         manuId     = 0;
+         channelId  = 0;
+       }
 
+      }
       //packing word
       AliBitPacking::PackWord((UInt_t)parity,word,29,31);
       AliBitPacking::PackWord((UInt_t)manuId,word,18,28);
@@ -573,7 +615,7 @@ Int_t AliMUONRawData::WriteTriggerDDL()
 }
 //____________________________________________________________________
 void AliMUONRawData::GetDummyMapping(Int_t iCh, Int_t iCath, const AliMUONDigit* digit,
-                                    Int_t &busPatchId, UShort_t &manuId, UChar_t &channelId, UShort_t &charge)
+                                    Int_t &busPatchId, UShort_t &manuId, UChar_t &channelId)
 {
 // Dummy mapping for tracker
 
@@ -624,16 +666,12 @@ void AliMUONRawData::GetDummyMapping(Int_t iCh, Int_t iCath, const AliMUONDigit*
       channelId = (id % chPerBus) % 64; //start at zero 
       channelId &= 0x3F; // 6 bits
 
-      if (fPrintLevel == 2)
-       printf("id: %d, busPatchId %d, manuId: %d, channelId: %d, maxchannel: %d, chPerBus %d\n",
-              id, busPatchId, manuId, channelId, maxChannel, chPerBus);
-      // charge
-      charge = digit->Signal();
-      charge &= 0xFFF;
+     
+      AliDebug(2,Form("id: %d, busPatchId %d, manuId: %d, channelId: %d, maxchannel: %d, chPerBus %d\n",
+                     id, busPatchId, manuId, channelId, maxChannel, chPerBus));
 
-      if (fPrintLevel == 2)
-       printf("id: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d, charge %d\n",
-              id, busPatchId, manuId, channelId, digit->PadX(), digit->PadY(), digit->Signal());
+      AliDebug(2,Form("id: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d, charge %d\n",
+                     id, busPatchId, manuId, channelId, digit->PadX(), digit->PadY(), digit->Signal()));
 
 }
 
index 850feb1..7c296f3 100644 (file)
@@ -42,7 +42,7 @@ class AliMUONRawData : public TObject
   }
 
   void GetDummyMapping(Int_t iCh, Int_t iCath, const AliMUONDigit* digit, Int_t &busPatchId,
-                      UShort_t &manuId, UChar_t &channelId, UShort_t &charge);
+                      UShort_t &manuId, UChar_t &channelId);
 
   Int_t GetGlobalTriggerPattern(const AliMUONGlobalTrigger* gloTrg);
 
index 6897ab4..ed80474 100644 (file)
@@ -35,6 +35,7 @@ class AliMUONSegmentManuIndex : public TNamed {
 
   static TString Name(Int_t manuId, Int_t manuchannel);
   
+  void   SetBusPatchId(Int_t b) {fBusPatchId = b;}
   void   Print(const char* opt="") const;
 
  private:
index cf224bb..c6c5010 100644 (file)
@@ -25,6 +25,7 @@ class AliMpSector;
 class AliMpSectorSegmentation;
 class AliMpVPadIterator;
 class AliMpPad;
+class AliMUONSegmentManuIndex;
 
 class AliMUONChamber;
 
@@ -70,8 +71,10 @@ class AliMUONSt12QuadrantSegmentation : public AliMUONVGeometryDESegmentation
     virtual void  GetPadC(Int_t ix, Int_t iy, Float_t& x, Float_t& y, Float_t& z);
     virtual void  GetPadC(Int_t ix, Int_t iy, Float_t& x, Float_t& y);
                        // Transform from real to pad coordinates
-                      
-
+                       // get pad for a given connection
+    virtual void  GetPadE(Int_t &/*ix*/, Int_t &/*iy*/,  AliMUONSegmentManuIndex* /*connect*/) {return;}
+    virtual AliMUONSegmentManuIndex*     GetMpConnection(Int_t /*ix*/, Int_t /*iy*/) {return 0x0;}
+                       // get electronics connection for given pad
     // Initialisation
     //
     virtual void Init(Int_t chamber);
index 11429cd..b6ff1b9 100644 (file)
@@ -2302,18 +2302,6 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials()
        // was id: 9
        // from PDG and "The Particle Detector BriefBook", Bock and Vasilescu, P.18  
         // ??? same but the last but one argument < 0 
-  
-  fMUON->AliMaterial(42, "Copper$", 63.546,29.,8.96,-1.43,9.6);
-       // was id: 30
-
-  fMUON->AliMaterial(43, "FR4$", 17.749, 8.875, 1.7, -19.4, 999.);    // from DPG
-       // was id: 31
-
-  fMUON->AliMaterial(44, "FrameEpoxy",12.24,6.0,1.85,-19.14,999);// use 16.75cm
-        // was id: 36
-        // Density of FrameEpoxy only from manufacturer's specifications
-        // Frame composite epoxy , X0 in g/cm**2 (guestimation!)
-  
   //
   // --- Define mixtures for GEANT ---
   //
@@ -2355,7 +2343,6 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials()
  
   // Not used, to be removed
   //
-  fMUON->AliMaterial(49, "Kapton$", 12.01,6,1.42,-28.6,999);          // from DPG
        // was id: 34
 
   // Inox/Stainless Steel (18%Cr, 9%Ni)
@@ -2387,12 +2374,7 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials()
 
   fMUON->AliMedium(21, "ALU_II$",    41, 0, iSXFLD, sXMGMX, 
                    tmaxfd, maxStepAlu, maxDestepAlu, epsil, stmin);
-                  // was med: 4  mat: 9
-  fMUON->AliMedium(22, "COPPER_II$", 42, 0, iSXFLD, sXMGMX, 
-                   tmaxfd, maxStepAlu, maxDestepAlu, epsil, stmin);
-                  // was med: 10  mat: 30
-  fMUON->AliMedium(23, "FR4_CH$",    43, 0, iSXFLD, sXMGMX, 
-                   10.0, 0.01, 0.1, 0.003, 0.003);
+
                   // was med: 15  mat: 31 
   fMUON->AliMedium(24, "FrameCH$",   44, 1, iSXFLD, sXMGMX, 
                    10.0, 0.001, 0.001, 0.001, 0.001);
@@ -2412,9 +2394,7 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials()
 
   // Not used, to be romoved
   //
-  fMUON->AliMedium(29, "Kapton$",    49, 0, iSXFLD, sXMGMX,  
-                   10.0, 0.01, 1.0, 0.003, 0.003);
-                  // was med: 18  mat: 34 
+
   fMUON->AliMedium(30, "InoxBolts$", 50, 1, iSXFLD, sXMGMX, 
                    10.0, 0.01, 1.0, 0.003, 0.003);
                   // was med: 21  mat: 37
index ff49a97..b6b2048 100644 (file)
 //  and the differents PCB densities. 
 //  (from old AliMUONSegmentationSlatModule)
 //  Gines, Subatech, Nov04
+//  Add electronics mapping
+//  Christian, Subatech, Mai 05
 //*********************************************************
 
 #include <TArrayI.h>
 #include <TArrayF.h>
 #include "AliMUONSt345SlatSegmentation.h"
+#include "AliMUONSegmentationDetectionElement.h"
+#include "AliMUONSegmentManuIndex.h"
+#include "AliMUONSegmentIndex.h"
+
 #include "AliLog.h"
 
 ClassImp(AliMUONSt345SlatSegmentation)
 
 
 AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation() 
-  : AliMUONVGeometryDESegmentation(),
+  :     AliMUONVGeometryDESegmentation(),
        fBending(0),
        fId(0),
         fNsec(0),
@@ -55,7 +61,9 @@ AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation()
        fIxmin(0),
        fIxmax(0),
        fIymin(0),
-       fIymax(0)
+        fIymax(0),
+       fInitDone(kFALSE),
+       fSegmentationDetectionElement(0x0)
 {
   // default constructor
 
@@ -84,7 +92,11 @@ AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation(Bool_t bending)
        fIxmin(0),
        fIxmax(0),
        fIymin(0),
-       fIymax(0)
+       fIymax(0),
+       fInitDone(kFALSE),
+       fSegmentationDetectionElement(0x0)
+
+
 {
   // Non default constructor
   fNsec = 4;  // 4 sector densities at most per slat 
@@ -93,7 +105,9 @@ AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation(Bool_t bending)
   fDpyD = new TArrayF(fNsec);      
   (*fNDiv)[0]=(*fNDiv)[1]=(*fNDiv)[2]=(*fNDiv)[3]=0;     
   (*fDpxD)[0]=(*fDpxD)[1]=(*fDpxD)[2]=(*fDpxD)[3]=0;       
-  (*fDpyD)[0]=(*fDpyD)[1]=(*fDpyD)[2]=(*fDpyD)[3]=0;       
+  (*fDpyD)[0]=(*fDpyD)[1]=(*fDpyD)[2]=(*fDpyD)[3]=0;   
+
+
 }
 //----------------------------------------------------------------------
 AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation(const AliMUONSt345SlatSegmentation& rhs) 
@@ -114,7 +128,8 @@ AliMUONSt345SlatSegmentation::AliMUONSt345SlatSegmentation(const AliMUONSt345Sla
        fIxmin(0),
        fIxmax(0),
        fIymin(0),
-       fIymax(0)
+       fIymax(0),
+       fSegmentationDetectionElement(0x0)
 {
   // default constructor
 }
@@ -125,6 +140,7 @@ AliMUONSt345SlatSegmentation::~AliMUONSt345SlatSegmentation()
   if (fNDiv) delete fNDiv;
   if (fDpxD) delete fDpxD;
   if (fDpyD) delete fDpyD;
+  // if (fSegmentationDetectionElement) fSegmentationDetectionElement->Delete();
 }
 //----------------------------------------------------------------------
 AliMUONSt345SlatSegmentation& AliMUONSt345SlatSegmentation::operator=(const AliMUONSt345SlatSegmentation& rhs)
@@ -228,6 +244,45 @@ void AliMUONSt345SlatSegmentation::GetPadI(Float_t x, Float_t y , Float_t /*z*/,
 {
   GetPadI(x, y, ix, iy);
 }
+
+//-------------------------------------------------------------------------
+void AliMUONSt345SlatSegmentation::GetPadE(Int_t &ix, Int_t &iy,  AliMUONSegmentManuIndex* manuIndex)
+{
+  //
+  // return Padx and Pady
+  // input value: electronic connection number
+
+  Int_t icathode = (fBending == 1) ? 0 : 1; // cathode 0 == bending
+
+  //  Int_t busPatchId     = manuIndex->GetBusPatchId(); //
+  Int_t manuId         = manuIndex->GetManuId();
+  Int_t manuChannelId  = manuIndex->GetManuChannelId();
+  //  Int_t channelId      = manuIndex->GetChannelId();
+
+  AliMUONSegmentIndex* index = fSegmentationDetectionElement->GetIndex(manuId,  manuChannelId);
+
+  ix = index->GetPadX();
+  iy = index->GetPadY();
+  swap(ix,iy); // swap cos origin in segmentation and mapping file are different for iy (temporary solution)
+
+  if (index->GetCathode() != icathode)
+    AliWarning("Wrong cathode number !");
+
+}
+
+//-------------------------------------------------------------------------
+ AliMUONSegmentManuIndex* AliMUONSt345SlatSegmentation::GetMpConnection(Int_t ix, Int_t iy)
+{
+  //
+  // return electronic connection number
+  // input value: Padx and Pady
+
+  Int_t icathode = (fBending == 1) ? 0 : 1; // cathode 0 == bending
+
+  return fSegmentationDetectionElement->GetManuIndex(ix, iy, icathode);
+  
+}
+
 //_______________________________________________________________
 void AliMUONSt345SlatSegmentation::SetPadDivision(Int_t ndiv[4])
 {
@@ -252,9 +307,13 @@ void AliMUONSt345SlatSegmentation::SetPcbBoards(Int_t n[4])
 {
   //
   // Set PcbBoard segmentation zones for each density
-  // n[0] PcbBoards for maximum density sector fNDiv[0]
-  // n[1] PcbBoards for next density sector fNDiv[1] etc ...
+  // n[0] slat type parameter
+  // n[1] PcbBoards for highest density sector fNDiv[1] etc ...
+
+  fRtype = n[0];
+  n[0] = 0;
   for (Int_t i=0; i<4; i++) fPcbBoards[i]=n[i];
+
 }
 //-------------------------------------------------------------------------
 void AliMUONSt345SlatSegmentation::SetPad(Int_t ix, Int_t iy)
@@ -472,6 +531,7 @@ void AliMUONSt345SlatSegmentation::Init(Int_t detectionElementId)
   
   //  printf(" fBending: %d \n",fBending);
 
+  if (fInitDone) return; // security if init is already done in AliMUONFactory
   fDxPCB=40;
   fDyPCB=40;
 
@@ -515,15 +575,100 @@ void AliMUONSt345SlatSegmentation::Init(Int_t detectionElementId)
   fCy = fDyPCB/2.;
   //
   fId = detectionElementId;
+
+  //
+  // initalize mapping
+  //
+//   Int_t icathode = (fBending == 1) ? 0 : 1; // cathode 0 == bending
+//   Char_t name[15];
+//   GetMpFileName(name);
+//   fSegmentationDetectionElement = new AliMUONSegmentationDetectionElement();
+//   fSegmentationDetectionElement->Init(name, icathode);
+  fInitDone = kTRUE;
 }
 
+//--------------------------------------------------------------------------
+void AliMUONSt345SlatSegmentation::GetMpFileName(Char_t* name) const
+{
+  //
+  // Get mapping file name
+  //
 
+   strcpy(name,"slat");
+
+   for (Int_t isec = 1; isec < 4; isec++) {
+
+     switch(isec) {
+     case 1:
+       for (Int_t i = 0; i < fPcbBoards[isec]; i++)
+        strcat(name,"1");
+       break;
+     case 2 :
+       for (Int_t i = 0; i < fPcbBoards[isec]; i++)
+        strcat(name,"2");
+       break;
+     case 3:
+       for (Int_t i = 0; i < fPcbBoards[isec]; i++)
+        strcat(name,"3");
+       break;
+     }
+   }
+
+   while (strlen(name) < 10)
+     strcat(name,"0");
+   
+   switch(fRtype) {
+   case 0:
+     strcat(name, "N");
+     break;
+   case 1:
+     strcat(name, "NR1");
+     break;
+   case 2:
+     strcat(name, "NR2");
+     break;
+   case 3:
+     strcat(name, "NR3");
+     break;
+   case 4:
+     strcat(name, "S");
+     break;
+   case -1:
+     strcat(name, "SR1");
+     break;
+   case -2:
+     strcat(name, "SR2");
+     break;
+   case -3:
+     strcat(name, "SR3"); // should not exist
+     AliFatal("SR3 Slat type does not exist !!");
+     break;
+   }
+}
 
+//--------------------------------------------------------------------------
+void AliMUONSt345SlatSegmentation::Swap(Int_t padX, Int_t &padY)
+{
 
+  // swap the numbering between segmentation (i.e. pady = [0,40]) 
+  // and mapping file  (i.e. pady = [-20,20]) 
 
 
+  if (fBending == 1) {
+    if (padY < 0) 
+      padY += fNpy + 1; 
+    else
+      padY += fNpy; 
+  }
 
 
+  if (fBending == 0) {
+    if (padY < 0) 
+      padY += fNpyS[Sector(padX, padY)] + 1; 
+    else
+      padY += fNpyS[Sector(padX, padY)]; 
+  }
 
+}
 
 
index f51f5e2..c88b76f 100644 (file)
@@ -17,6 +17,8 @@
 
 class TArrayF;
 class TArrayI;
+class AliMUONSegmentManuIndex;
+class AliMUONSegmentationDetectionElement;
 
 class AliMUONSt345SlatSegmentation : public AliMUONVGeometryDESegmentation 
 {
@@ -43,7 +45,10 @@ class AliMUONSt345SlatSegmentation : public AliMUONVGeometryDESegmentation
     virtual void     GetPadI(Float_t x, Float_t y , Float_t z, Int_t &ix, Int_t &iy);
     virtual void     GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y);
     virtual void     GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y, Float_t &z) {z=0; GetPadC(ix, iy, x , y);}
+
+    virtual void     GetPadE(Int_t &ix, Int_t &iy,  AliMUONSegmentManuIndex* connect); // get pad for a given connection
+    virtual AliMUONSegmentManuIndex*     GetMpConnection(Int_t ix, Int_t iy); // get electronics connection for given pad
+
  
     virtual void     IntegrationLimits(Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2); //Current integration limits
     virtual Int_t    ISector()  {return fSector;} // Current Pad during Integration (current sector)
@@ -83,7 +88,9 @@ class AliMUONSt345SlatSegmentation : public AliMUONVGeometryDESegmentation
 
     AliMUONSt345SlatSegmentation(const AliMUONSt345SlatSegmentation& rhs);
     AliMUONSt345SlatSegmentation& operator=(const AliMUONSt345SlatSegmentation& rhs);
-    
+    void GetMpFileName(Char_t* name) const;
+    void Swap(Int_t padX, Int_t &padY);
+
  private:
     //  Internal geometry of the slat 
     Bool_t      fBending;        // 0: Bending or 1:Non Bending segmentation
@@ -97,6 +104,7 @@ class AliMUONSt345SlatSegmentation : public AliMUONVGeometryDESegmentation
     Int_t       fNpx;            // Number of pads in x
     Int_t       fNpy;            // Number of pads in y
     Float_t     fWireD;          // wire pitch
+    Int_t       fRtype;          // type of the slat: rounded R=1,2,3, rounded short R=-1,-2,-3, short R=4, normal R=0
     // 
     Int_t       fSector;         // Current density sector
     Float_t     fDxPCB;          // x-size of PCB board
@@ -132,7 +140,12 @@ class AliMUONSt345SlatSegmentation : public AliMUONVGeometryDESegmentation
     Float_t     fYmin;           // upper right x
     Float_t     fYmax;           // upper right y 
 
-    ClassDef(AliMUONSt345SlatSegmentation,1) 
+    Bool_t      fInitDone;       // flag for initialization
+
+    // electronics mapping
+    AliMUONSegmentationDetectionElement* fSegmentationDetectionElement; //! pointer to the electronics mapping
+
+    ClassDef(AliMUONSt345SlatSegmentation,3) 
 };
 #endif
 
index 1f4e431..6c09c0d 100644 (file)
@@ -6,6 +6,7 @@
 /* $Id: */
 
 #include  "AliMUONVGeometryDESegmentation.h"
+class AliMUONSegmentManuIndex;
 
 class AliMUONTriggerSegmentation : public AliMUONVGeometryDESegmentation 
 {
@@ -27,11 +28,15 @@ class AliMUONTriggerSegmentation : public AliMUONVGeometryDESegmentation
     virtual Bool_t   HasPad(Int_t ix, Int_t iy);
     virtual AliMUONGeometryDirection  GetDirection() { return kDirUndefined; } 
 
-   virtual Float_t  GetAnod(Float_t /*xhit*/) const {return 0; }  // Anod wire coordinate closest to xhit
+    virtual Float_t  GetAnod(Float_t /*xhit*/) const {return 0; }  // Anod wire coordinate closest to xhit
     virtual void     GetPadI(Float_t x ,Float_t y ,Int_t   &ix,Int_t &iy);  // Transform from pad to real coordinates
     virtual void     GetPadI(Float_t x, Float_t y , Float_t z, Int_t &ix, Int_t &iy);
     virtual void     GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y);
     virtual void     GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y, Float_t &z) {z=0; GetPadC(ix, iy, x , y);}
+                     
+    virtual void  GetPadE(Int_t &/*ix*/, Int_t &/*iy*/,  AliMUONSegmentManuIndex* /*connect*/) {return;} // get pad for a given connection
+    virtual AliMUONSegmentManuIndex*     GetMpConnection(Int_t /*ix*/, Int_t /*iy*/) {return 0x0;} // get electronics connection for given pad
+                       
     virtual void GetPadLoc2Glo(Int_t ixLoc, Int_t iyLoc, Int_t &ixGlo, Int_t &iyGlo);
     virtual void GetPadGlo2Loc(Int_t ixLoc, Int_t iyLoc, Int_t &ixGlo, Int_t &iyGlo);
     virtual void     IntegrationLimits(Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2); //Current integration limits
index a6e2110..f002cd8 100644 (file)
@@ -19,6 +19,8 @@
 #include "AliSegmentation.h"
 #include "AliMUONGeometryDirection.h"
 
+class AliMUONSegmentManuIndex;
+
 class AliMUONVGeometryDESegmentation : public AliSegmentation
 {
   public:
@@ -39,6 +41,9 @@ class AliMUONVGeometryDESegmentation : public AliSegmentation
                       // for the bending plane and kDirX with cathode segmentation 
                       // for the non bending plane
 
+    virtual void     GetPadE(Int_t &ix, Int_t &iy,  AliMUONSegmentManuIndex* connect) = 0;
+    virtual AliMUONSegmentManuIndex*     GetMpConnection(Int_t ix, Int_t iy) = 0;
+
   protected:
     AliMUONVGeometryDESegmentation(const AliMUONVGeometryDESegmentation& rhs);
   
index 44ce3a7..75c06e5 100644 (file)
@@ -178,12 +178,12 @@ void AliMUONv1::Init()
 
    if (fSegmentationType == 1) {
      fFactory = new AliMUONFactory("Old MUON Factory");
-     printf("\n Old Segmentation \n");
+     printf("\n Old Segmentation \n\n");
    }
 
    if (fSegmentationType == 2) {
      fFactory = new AliMUONFactoryV2("New MUON Factory");
-     printf("\n New Segmentation \n");
+     printf("\n New Segmentation \n\n");
    } 
 
    fFactory->Build(this, "default");