]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITS.cxx
updated
[u/mrichter/AliRoot.git] / ITS / AliITS.cxx
index 36df1727d56c32a6b00b1adc20f5721bc6c994bb..8b03e10cb83882657ab0d655522721d4453df2f9 100644 (file)
@@ -85,13 +85,31 @@ the AliITS class.
 #include "AliMC.h"
 #include "AliITSDigitizer.h"
 #include "AliITSRecPoint.h"
+#include "AliITSsegmentationSPD.h"
+#include "AliITSsegmentationSDD.h"
+#include "AliITSsegmentationSSD.h"
+#include "AliITSRawStreamSPD.h"
+#include "AliITSRawStreamSSD.h"
+#include "AliITSRawStreamSDD.h"
+#include "AliITSresponseSDD.h" 
+#include "AliRawReader.h"
 #include "AliRun.h"
 #include "AliLog.h"
+#include "AliITSInitGeometry.h"
 
 ClassImp(AliITS)
 
 //______________________________________________________________________
-AliITS::AliITS() : AliDetector(){
+AliITS::AliITS() : AliDetector(),
+fDetTypeSim(0),
+fEuclidOut(0),
+fOpt("All"),
+fIdN(0),
+fIdSens(0),
+fIdName(0),
+fITSmodules(0),
+fTiming(kFALSE)
+{
   // Default initializer for ITS
   //      The default constructor of the AliITS class. In addition to
   // creating the AliITS class it zeros the variables fIshunt (a member
@@ -99,21 +117,56 @@ AliITS::AliITS() : AliDetector(){
   // fIdSens, and fIdName. The AliDetector default constructor
   // is also called.
   
-  fEuclidOut=0;
-  fOpt="All";
-  fIdSens=0;
-  fIdName=0;
-  fDetTypeSim=0;
-  fIshunt     = 0;   // not zeroed in AliDetector.
-  fHits =0;
-  fNhits=0;
-  fITSmodules=0;
 //    SetDetectors(); // default to fOpt="All". This variable not written out.
-    SetMarkerColor(kRed);
+//PH    SetMarkerColor(kRed);
+}
+//______________________________________________________________________
+AliITS::AliITS(const Char_t *title):AliDetector("ITS",title),
+fDetTypeSim(0),
+fEuclidOut(0),
+fOpt("All"),
+fIdN(0),
+fIdSens(0),
+fIdName(0),
+fITSmodules(0),
+fTiming(kFALSE)
+{
+    //     The standard Constructor for the ITS class. 
+    // It also zeros the variables
+    // fIshunt (a member of AliDetector class), fEuclidOut, and zeros
+    // the pointers fIdSens and fIdName. To help in displaying hits via the
+    // ROOT macro display.C AliITS also sets the marker color to red. The
+    // variables passes with this constructor, const char *name and *title,
+    // are used by the constructor of AliDetector class. See AliDetector
+    // class for a description of these parameters and its constructor
+    // functions.
+    // Inputs:
+    //   Char_t *title  Simulation title for the ITS
+    // Outputs:
+    //   none.
+    // Return:
+    //   none.
+  
+    fHits = new TClonesArray("AliITShit",1560); // from AliDetector
+    if(gAlice->GetMCApp()) gAlice->GetMCApp()->AddHitList(fHits);
+    //fNhits=0;  //done in AliDetector(name,title)
+    SetDetectors(); // default to fOpt="All". This variable not written out.
+    fDetTypeSim   = new AliITSDetTypeSim();
+    //PH  SetMarkerColor(kRed);
+    if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
+    fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 }
 //______________________________________________________________________
-AliITS::AliITS(const char *name, const char *title):AliDetector(name,title){
+AliITS::AliITS(const char *name, const char *title):AliDetector(name,title),
+fDetTypeSim(0),
+fEuclidOut(0),
+fOpt("All"),
+fIdN(0),
+fIdSens(0),
+fIdName(0),
+fITSmodules(0),
+fTiming(kFALSE)
+{
   //     The standard Constructor for the ITS class. 
   // It also zeros the variables
   // fIshunt (a member of AliDetector class), fEuclidOut, and zeros
@@ -124,28 +177,17 @@ AliITS::AliITS(const char *name, const char *title):AliDetector(name,title){
   // class for a description of these parameters and its constructor
   // functions.
   
-  fEuclidOut=0;
-  fOpt="All";
-  fIdSens=0;
-  fIdName=0;
-  fDetTypeSim=0;
   fHits = new TClonesArray("AliITShit",1560);
   if(gAlice->GetMCApp()) gAlice->GetMCApp()->AddHitList(fHits);
-  fNhits=0;
-  fITSmodules = 0;
-
-  fIshunt     = 0;  // not zeroed in AliDetector
-  // Not done in AliDetector.
+  //fNhits=0;  //done in AliDetector(name,title)
 
-  fEuclidOut  = 0;
   SetDetectors(); // default to fOpt="All". This variable not written out.
-  
-  fIdName     = 0;
-  fIdSens     = 0;
-  
+    
   fDetTypeSim   = new AliITSDetTypeSim();
   
-  SetMarkerColor(kRed);
+  //PH  SetMarkerColor(kRed);
+  if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 
 }
 //______________________________________________________________________
@@ -160,6 +202,7 @@ AliITS::~AliITS(){
     //      none.
     // Return:
     //      none.
+
     if (fHits) {
       fHits->Delete();
       delete fHits;
@@ -180,38 +223,6 @@ AliITS::~AliITS(){
     }
 }
 //______________________________________________________________________
-AliITS::AliITS(const AliITS &source) : AliDetector(source){
-    // Copy constructor. This is a function which is not allowed to be
-    // done to the ITS. It exits with an error.
-    // Inputs:
-    //      AliITS &source  An AliITS class.
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
-
-    if(this==&source) return;
-    Error("Copy constructor",
-          "You are not allowed to make a copy of the AliITS");
-    exit(1);
-}
-//______________________________________________________________________
-AliITS& AliITS::operator=(const AliITS &source){
-    // Assignment operator. This is a function which is not allowed to be
-    // done to the ITS. It exits with an error.
-    // Inputs:
-    //      AliITS &source  An AliITS class.
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
-
-    if(this==&source) return *this;
-    Error("operator=","You are not allowed to make a copy of the AliITS");
-    exit(1);
-    return *this; //fake return
-}
-//______________________________________________________________________
 AliDigitizer* AliITS::CreateDigitizer(AliRunDigitizer* manager)const{
     // Creates the AliITSDigitizer in a standard way for use via AliModule.
     // This function can not be included in the .h file because of problems
@@ -240,26 +251,11 @@ void AliITS::Init(){
     // Return:
     //      none.
     Int_t i;
-
-    SetDefaults();
     // Array of TStrings
     if(gMC) for(i=0;i<fIdN;i++) fIdSens[i] = gMC->VolId(fIdName[i]);
  
-    WriteGeometry();
 }
 
-//______________________________________________________________________
-void AliITS::WriteGeometry(){
-  
-  //Writes ITS geomtry on gAlice
-
-  if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName());
-  AliRunLoader* rl  = fLoader->GetRunLoader();
-  rl->CdGAFile();
-  AliITSgeom* geom = GetITSgeom();
-  geom->Write();
-
-}
 
 //______________________________________________________________________
 void AliITS::SetDefaults(){
@@ -270,8 +266,7 @@ void AliITS::SetDefaults(){
     //      none.
     // Return:
     //      none.
-  AliInfoClass("Setting Defaults");
-
+    AliInfoClass("AliITS::Setting Defaults");
     if(!fDetTypeSim) { 
      Error("SetDefaults()","fDetTypeSim is 0!"); 
      return;
@@ -350,7 +345,6 @@ void AliITS::MakeBranchS(const char* fl){
   sprintf(branchname,"%s",GetName());
 
   if(fLoader->TreeS()){
-    if(fDetTypeSim->GetSDigits()==0x0) fDetTypeSim->SetSDigits(new TClonesArray("AliITSpListItem",1000));
     TClonesArray* sdig = (TClonesArray*)fDetTypeSim->GetSDigits();
     MakeBranchInTree(fLoader->TreeS(),branchname,&sdig,buffersize,fl);
   } 
@@ -363,7 +357,7 @@ void AliITS::MakeBranchD(const char* file){
     Warning("MakeBranchD","fDetTypeSim is 0!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   MakeBranchInTreeD(fLoader->TreeD(),file);
 }
 
@@ -374,7 +368,7 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){
   if(!fDetTypeSim){
     Error("MakeBranchS","fDetTypeSim is 0!");
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 
   const Char_t *det[3] = {"SPD","SDD","SSD"};
   Char_t* digclass;
@@ -407,13 +401,13 @@ void AliITS::SetTreeAddress(){
     //      none.
     // Return:
     //      none.
-
+    
   if(!fDetTypeSim) {
     Error("SetTreeAddress","fDetTypeSim is 0!");
     return;
   }
 
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 
   TTree *treeS = fLoader->TreeS();
   TTree *treeD = fLoader->TreeD();
@@ -424,8 +418,6 @@ void AliITS::SetTreeAddress(){
 
   fDetTypeSim->SetTreeAddressS(treeS, (Char_t*)GetName());
   fDetTypeSim->SetTreeAddressD(treeD, (Char_t*)GetName());
-
-
 }
 //______________________________________________________________________
 void AliITS::AddHit(Int_t track, Int_t *vol, Float_t *hits){
@@ -545,7 +537,7 @@ void AliITS::FillModules(TTree *treeH, Int_t mask) {
 }
 
 //______________________________________________________________________
-void AliITS::InitModules(Int_t size,Int_t &nmodules){
+Bool_t AliITS::InitModules(Int_t size,Int_t &nmodules){
     // Initialize the modules array.
     // Inputs:
     //      Int_t size  Size of array of the number of modules to be
@@ -563,7 +555,7 @@ void AliITS::InitModules(Int_t size,Int_t &nmodules){
 
     if(!fDetTypeSim) {
       Error("InitModules","fDetTypeSim is null!");
-      return;
+      return kFALSE;
     }
 
     Int_t nl,indexMAX,index;
@@ -571,7 +563,7 @@ void AliITS::InitModules(Int_t size,Int_t &nmodules){
     if(size<=0){ // default to using data stored in AliITSgeom
         if(fDetTypeSim->GetITSgeom()==0) {
             Error("InitModules","fITSgeom not defined");
-            return;
+            return kFALSE;
         } // end if fITSgeom==0
         nl = fDetTypeSim->GetITSgeom()->GetNlayers();
         indexMAX = fDetTypeSim->GetITSgeom()->GetIndexMax();
@@ -588,6 +580,7 @@ void AliITS::InitModules(Int_t size,Int_t &nmodules){
 
         nmodules = size;
     } // end i size<=0
+    return kTRUE;
 }
 //______________________________________________________________________
 void AliITS::Hits2SDigits(){
@@ -608,7 +601,7 @@ void AliITS::Hits2SDigits(){
   fLoader->LoadHits("read");
   fLoader->LoadSDigits("recreate");
   AliRunLoader* rl = fLoader->GetRunLoader(); 
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   for (Int_t iEvent = 0; iEvent < rl->GetNumberOfEvents(); iEvent++) {
         // Do the Hits to Digits operation. Use Standard input values.
         // Event number from file, no background hit merging , use size from
@@ -633,7 +626,7 @@ void AliITS::Hits2Digits(){
     return;
   }
    
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   SetDefaults();
 
   fLoader->LoadHits("read");
@@ -678,7 +671,7 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     Error("HitsToDigits","fDetTypeSim is null!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   if(!GetITSgeom()) return; // need transformations to do digitization.
   AliITSgeom *geom = GetITSgeom();
 
@@ -729,7 +722,7 @@ void AliITS::Hits2PreDigits(){
     return;
   }
    
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   SetDefaults();
   
   HitsToPreDigits(fLoader->GetRunLoader()->GetEventNumber(),
@@ -763,7 +756,7 @@ void AliITS::HitsToPreDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     Error("HitsToPreDigits","fDetTypeSim is null!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 
   if(!GetITSgeom()){
     Error("HitsToPreDigits","fGeom is null!");
@@ -866,8 +859,7 @@ void AliITS::HitsToFastRecPoints(Int_t evNumber,Int_t bgrev,Int_t size,
   TBranch* branch = (TBranch*)lTR->Branch("ITSRecPointsF",&ptarray);
   branch->SetAddress(&ptarray);
   //m.b. : this change is nothing but a nice way to make sure
-  //the CPU goes up !
-  AliDebug(1,Form("N mod = %d",geom->GetIndexMax()));    
+  //the CPU goes up !    
   for(module=0;module<geom->GetIndexMax();module++){
     id       = geom->GetModuleType(module);
     if (!all && !det[id]) continue;
@@ -965,7 +957,7 @@ void AliITS::SDigitsToDigits(Option_t *opt){
       return;
     }
    
-    fDetTypeSim->SetLoader(fLoader);
+    fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
     SetDefaults();
     fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName());
 
@@ -1060,7 +1052,7 @@ void AliITS::AddSimDigit(Int_t branch, AliITSdigit *d){
 }
 //______________________________________________________________________
 void AliITS::AddSimDigit(Int_t branch,Float_t phys,Int_t *digits,Int_t *tracks,
-                         Int_t *hits,Float_t *charges){
+                         Int_t *hits,Float_t *charges, Int_t sigexpanded){
   //   Add a simulated digit to the list.
   // Inputs:
   //      Int_t id        Detector type number.
@@ -1084,7 +1076,7 @@ void AliITS::AddSimDigit(Int_t branch,Float_t phys,Int_t *digits,Int_t *tracks,
       Error("AddSimDigit","fDetTypeSim is 0!");
       return;
     }
-    fDetTypeSim->AddSimDigit(branch,phys,digits,tracks,hits,charges);
+    fDetTypeSim->AddSimDigit(branch,phys,digits,tracks,hits,charges,sigexpanded);
 
 }
 //______________________________________________________________________
@@ -1095,7 +1087,7 @@ void AliITS::Digits2Raw(){
     Error("Digits2Raw","fDetTypeSim is 0!");
     return;
   }
-  fDetTypeSim->SetLoader(fLoader);
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   SetDefaults();
   fDetTypeSim->GetLoader()->LoadDigits();
   TTree* digits = fDetTypeSim->GetLoader()->TreeD();
@@ -1104,6 +1096,7 @@ void AliITS::Digits2Raw(){
       return;
   }
   fDetTypeSim->SetTreeAddressD(digits,(Char_t*)GetName());
+  AliITSDDLModuleMapSDD* ddlsdd=fDetTypeSim->GetDDLModuleMapSDD();
 
   AliITSDDLRawData rawWriter;
   //Verbose level
@@ -1122,29 +1115,181 @@ void AliITS::Digits2Raw(){
     
   //SILICON DRIFT DETECTOR
   Info("Digits2Raw", "Formatting raw data for SDD");
-  rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"));
+  rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"),ddlsdd);
     
   //SILICON STRIP DETECTOR
   Info("Digits2Raw", "Formatting raw data for SSD");
   rawWriter.RawDataSSD(digits->GetBranch("ITSDigitsSSD"));
 
   fLoader->UnloadDigits();
-  
-
-
-  
 }
-
-
-
-
 //______________________________________________________________________
 AliLoader* AliITS::MakeLoader(const char* topfoldername){ 
     //builds ITSgetter (AliLoader type)
     //if detector wants to use castomized getter, it must overload this method
 
-    Info("MakeLoader","Creating AliITSLoader. Top folder is %s.",
-         topfoldername);
+    AliDebug(1,Form("Creating AliITSLoader. Top folder is %s.",
+         topfoldername));
     fLoader = new AliITSLoader(GetName(),topfoldername);
     return fLoader;
 }
+
+Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
+{
+  //
+  // Converts RAW data to SDigits
+  //
+  // Get TreeS
+  //
+    Int_t last   = -1;
+    Int_t size   = GetITSgeom()->GetIndexMax();
+    TClonesArray** modA = new TClonesArray*[size];
+    for (Int_t mod = 0; mod < size; mod++) modA[mod] = new TClonesArray("AliITSpListItem", 10000);
+    
+    AliLoader* loader =  (gAlice->GetRunLoader())->GetLoader("ITSLoader");
+    if (!loader)
+    {
+       Error("Open","Can not get ITS loader from Run Loader");
+       return kFALSE;
+    }
+
+    TTree* tree = 0;
+    tree = loader->TreeS();
+    if (!tree)
+    {
+       loader->MakeTree("S");
+       tree = loader->TreeS();
+    }
+    //
+    // Array for SDigits
+    // 
+    TClonesArray aSDigits("AliITSpListItem",10000), *itsSDigits=&aSDigits;
+    Int_t bufsize = 32000;
+    tree->Branch("ITS", &itsSDigits, bufsize);
+    Int_t npx = 0;
+    //
+    // SPD
+    //
+    AliITSsegmentationSPD* segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0);
+    if(!segSPD){
+      AliWarning("Set AliITS defaults");
+      SetDefaults();
+      segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0);
+    }
+    npx = segSPD->Npx();
+    Double_t thr, sigma; 
+    
+    AliITSRawStreamSPD inputSPD(rawReader);
+    while(1){
+       Bool_t next  = inputSPD.Next();
+       if (!next) break;
+
+       Int_t module = inputSPD.GetModuleID();
+       Int_t column = inputSPD.GetColumn();
+       Int_t row    = inputSPD.GetRow();
+       Int_t index  = npx * column + row;
+
+       if (module >= size) continue;
+       last = (modA[module])->GetEntries();
+       TClonesArray& dum = *modA[module];
+       fDetTypeSim->GetCalibrationModel(module)->Thresholds(thr,sigma);
+       thr += 1.;
+       new (dum[last]) AliITSpListItem(-1, -1, module, index, thr);
+    }
+    rawReader->Reset();
+
+    //
+    // SDD
+    // 
+    AliITSsegmentationSDD* segSDD = (AliITSsegmentationSDD*) fDetTypeSim->GetSegmentationModel(1);
+    npx = segSDD->Npx();
+    AliITSRawStreamSDD inputSDD(rawReader);
+    AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD();
+    inputSDD.SetDDLModuleMap(ddlmap);
+    while(1){
+       Bool_t next  = inputSDD.Next();
+       if (!next) break;
+
+       Int_t module = inputSDD.GetModuleID();
+       Int_t anode  = inputSDD.GetAnode();
+       Int_t time   = inputSDD.GetTime();
+       Int_t signal10 = inputSDD.GetSignal();
+       Int_t index  = npx * anode + time;
+
+       if (module >= size) continue;
+       /* 8->10 bit expansion is done in AliITSRawStreamSDD
+       // 8bit -> 10 bit
+       AliITSresponseSDD *resSDD = (AliITSresponseSDD*) fDetTypeSim->GetResponse(1);
+       Int_t signal10 = resSDD->Convert8to10(signal);  // signal is a 8 bit value (if the compression is active)
+       */
+       last = modA[module]->GetEntries();
+       TClonesArray& dum = *modA[module];
+       new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal10));
+       ((AliITSpListItem*) dum.At(last))->AddSignalAfterElect(module, index, Double_t(signal10));
+       
+    }
+    rawReader->Reset();
+
+    //
+    // SSD
+    // 
+    AliITSsegmentationSSD* segSSD = (AliITSsegmentationSSD*) fDetTypeSim->GetSegmentationModel(2);
+    npx = segSSD->Npx();
+    AliITSRawStreamSSD inputSSD(rawReader);
+    while(1){
+       Bool_t next  = inputSSD.Next();
+       if (!next) break;
+
+       Int_t module  = inputSSD.GetModuleID();
+       Int_t side    = inputSSD.GetSideFlag();
+       Int_t strip   = inputSSD.GetStrip();
+       Int_t signal  = inputSSD.GetSignal();
+       Int_t index  = npx * side + strip;
+
+       if (module >= size) continue;
+       
+       last = modA[module]->GetEntries();
+       TClonesArray& dum = *modA[module];
+       new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal));
+    }
+    rawReader->Reset();
+     AliITSpListItem* sdig = 0;
+    
+    for (Int_t mod = 0; mod < size; mod++)
+    {
+       Int_t nsdig =  modA[mod]->GetEntries();
+       for (Int_t ie = 0; ie < nsdig; ie++) {
+           sdig = (AliITSpListItem*) (modA[mod]->At(ie));
+           new (aSDigits[ie]) AliITSpListItem(-1, -1, mod, sdig->GetIndex(), sdig->GetSignal());
+           Float_t sig = sdig->GetSignalAfterElect();
+           if (sig > 0.) {
+               sdig = (AliITSpListItem*)aSDigits[ie];
+               sdig->AddSignalAfterElect(mod, sdig->GetIndex(), Double_t(sig));
+           }
+       }
+       
+       tree->Fill();
+       aSDigits.Clear();
+       modA[mod]->Clear();
+    }
+    loader->WriteSDigits("OVERWRITE");    
+    delete modA;
+    return kTRUE;
+}
+
+
+//______________________________________________________________________
+void AliITS::UpdateInternalGeometry(){
+
+  //reads new geometry from TGeo 
+//   AliDebug(1,"Delete ITSgeom and create a new one reading TGeo");
+
+  AliITSVersion_t version = (AliITSVersion_t)IsVersion();
+  Int_t minor = 0;
+  if(version==kvPPRasymmFMD) minor=2;  // default minor version for this geom.
+  AliITSInitGeometry initgeom;
+  AliITSgeom* geom = initgeom.CreateAliITSgeom(version,minor);
+  SetITSgeom(geom);
+}
+