]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITS.cxx
Getter and Setter for ESDpid
[u/mrichter/AliRoot.git] / ITS / AliITS.cxx
index 64b386e8bb18e26fba84146ca74724cbbaca21cd..9a7b54119a9ea4ac0712de5c6be82a200433682c 100644 (file)
@@ -91,11 +91,11 @@ the AliITS class.
 #include "AliITSRawStreamSPD.h"
 #include "AliITSRawStreamSSD.h"
 #include "AliITSRawStreamSDD.h"
-#include "AliITSresponseSDD.h" 
 #include "AliRawReader.h"
 #include "AliRun.h"
 #include "AliLog.h"
 #include "AliITSInitGeometry.h"
+#include "AliITSFOSignalsSPD.h"
 
 ClassImp(AliITS)
 
@@ -108,7 +108,8 @@ fIdN(0),
 fIdSens(0),
 fIdName(0),
 fITSmodules(0),
-fTiming(kFALSE)
+fTiming(kFALSE),
+fSimuParam(0)
 {
   // Default initializer for ITS
   //      The default constructor of the AliITS class. In addition to
@@ -121,15 +122,17 @@ fTiming(kFALSE)
 //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)
+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),
+  fSimuParam(0)
 {
     //     The standard Constructor for the ITS class. 
     // It also zeros the variables
@@ -157,15 +160,17 @@ fTiming(kFALSE)
     fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
 }
 //______________________________________________________________________
-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)
+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),
+  fSimuParam(0)
 {
   //     The standard Constructor for the ITS class. 
   // It also zeros the variables
@@ -184,7 +189,6 @@ fTiming(kFALSE)
   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);
@@ -221,6 +225,10 @@ AliITS::~AliITS(){
       delete fDetTypeSim;
       fDetTypeSim = 0;
     }
+    if(fSimuParam){
+      delete fSimuParam;
+      fSimuParam=0;
+    }
 }
 //______________________________________________________________________
 AliDigitizer* AliITS::CreateDigitizer(AliRunDigitizer* manager)const{
@@ -255,8 +263,6 @@ void AliITS::Init(){
     if(gMC) for(i=0;i<fIdN;i++) fIdSens[i] = gMC->VolId(fIdName[i]);
  
 }
-
-
 //______________________________________________________________________
 void AliITS::SetDefaults(){
     // sets the default segmentation, response, digit and raw cluster classes.
@@ -273,7 +279,7 @@ void AliITS::SetDefaults(){
     }
 
     fDetTypeSim->SetDefaults();
-
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
 }
 //______________________________________________________________________
@@ -291,6 +297,7 @@ void AliITS::SetDefaultSimulation(){
     }
 
     fDetTypeSim->SetDefaultSimulation();
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
 }
 
@@ -345,7 +352,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);
   } 
@@ -359,6 +365,7 @@ void AliITS::MakeBranchD(const char* file){
     return;
   }
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   MakeBranchInTreeD(fLoader->TreeD(),file);
 }
 
@@ -370,9 +377,10 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){
     Error("MakeBranchS","fDetTypeSim is 0!");
   }
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   const Char_t *det[3] = {"SPD","SDD","SSD"};
-  Char_t* digclass;
+  const Char_t* digclass;
   Int_t buffersize = 4000;
   Char_t branchname[30];
   
@@ -409,6 +417,7 @@ void AliITS::SetTreeAddress(){
   }
 
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   TTree *treeS = fLoader->TreeS();
   TTree *treeD = fLoader->TreeD();
@@ -484,8 +493,6 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules,
   
   
 }
-
-
 //______________________________________________________________________
 void AliITS::FillModules(TTree *treeH, Int_t mask) {
     // fill the modules with the sorted by module hits; 
@@ -558,6 +565,7 @@ Bool_t AliITS::InitModules(Int_t size,Int_t &nmodules){
       Error("InitModules","fDetTypeSim is null!");
       return kFALSE;
     }
+    if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
     Int_t nl,indexMAX,index;
 
@@ -594,8 +602,7 @@ void AliITS::Hits2SDigits(){
 
    if(!fDetTypeSim) {
      Error("Hits2SDigits","fDetTypeSim is null!");
-     return;
-    
+     return; 
   } 
      
   SetDefaults();
@@ -603,6 +610,8 @@ void AliITS::Hits2SDigits(){
   fLoader->LoadSDigits("recreate");
   AliRunLoader* rl = fLoader->GetRunLoader(); 
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
+
   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
@@ -628,6 +637,7 @@ void AliITS::Hits2Digits(){
   }
    
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   SetDefaults();
 
   fLoader->LoadHits("read");
@@ -673,6 +683,7 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     return;
   }
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   if(!GetITSgeom()) return; // need transformations to do digitization.
   AliITSgeom *geom = GetITSgeom();
 
@@ -686,6 +697,9 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
   Int_t nmodules;
   InitModules(size,nmodules);
   FillModules(evNumber,bgrev,nmodules,option,filename);
+  // Reset Fast-OR signals for this event
+  fDetTypeSim->ResetFOSignals();
 
   AliITSsimulation *sim      = 0;
   AliITSmodule     *mod      = 0;
@@ -708,6 +722,17 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size,
   } // end for module
   
   ClearModules();
+  // Add random noise to FO signals
+  if (all || det[0]) { // SPD present
+    fDetTypeSim->ProcessNoiseForFastOr();
+  }
+
+  // Add Fast-OR signals to event (only one object per event)
+  if (all || det[0]) { // SPD present
+    fDetTypeSim->WriteFOSignals();
+  }
+
   
   fLoader->TreeD()->GetEntries();
   fLoader->TreeD()->AutoSave();
@@ -724,6 +749,7 @@ void AliITS::Hits2PreDigits(){
   }
    
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   SetDefaults();
   
   HitsToPreDigits(fLoader->GetRunLoader()->GetEventNumber(),
@@ -758,6 +784,7 @@ void AliITS::HitsToPreDigits(Int_t evNumber,Int_t bgrev,Int_t size,
     return;
   }
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
 
   if(!GetITSgeom()){
     Error("HitsToPreDigits","fGeom is null!");
@@ -874,6 +901,7 @@ void AliITS::HitsToFastRecPoints(Int_t evNumber,Int_t bgrev,Int_t size,
     mod      = (AliITSmodule *)fITSmodules->At(module);
     sim->CreateFastRecPoints(mod,module,gRandom,ptarray);
     lTR->Fill();
+    ptarray->Clear();
   } // end for module
 
   ClearModules();
@@ -910,7 +938,7 @@ Int_t AliITS::Hits2Clusters(TTree *hTree, TTree *cTree) {
     points->Clear();
   }
 
-  Info("Hits2Clusters","Number of found fast clusters : %d",ncl);
+  AliDebug(1,Form("Number of found fast clusters : %d",ncl));
 
   //cTree->Write();
 
@@ -948,20 +976,36 @@ void AliITS::CheckLabels(Int_t lab[3]) const {
 
 //______________________________________________________________________
 void AliITS::SDigitsToDigits(Option_t *opt){
-    // Standard Summable digits to Digits function.
-    // Inputs:
-    //      none.
-    // Outputs:
-    //      none.
-    if(!fDetTypeSim) {
-      Error("SDigitsToSDigits","fDetTypeSim is 0!");
-      return;
-    }
-   
-    fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
-    SetDefaults();
-    fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName());
+  // Standard Summable digits to Digits function.
+  // Inputs:
+  //      none.
+  // Outputs:
+  //      none.
+  if (!fDetTypeSim) {
+    AliError("fDetTypeSim is 0!");
+    return;
+  }
 
+  const char *all = strstr(opt,"All");
+  const char *det[3] ={strstr(opt,"SPD"),strstr(opt,"SDD"),
+                      strstr(opt,"SSD")};
+
+  // Reset Fast-OR signals for this event
+  fDetTypeSim->ResetFOSignals();
+
+  fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
+  SetDefaults();
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
+  fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName());
+
+  // Add random noise to FO signals
+  if (all || det[0]) { // SPD present
+    fDetTypeSim->ProcessNoiseForFastOr();
+  }
+  // Add Fast-OR signals to event (only one object per event)
+  if (all || det[0]) { // SPD present
+    fDetTypeSim->WriteFOSignals();
+  }
 }
 
 //______________________________________________________________________
@@ -1012,25 +1056,6 @@ void AliITS::AddSumDigit(AliITSpListItem &sdig){
     }
     fDetTypeSim->AddSumDigit(sdig);
     
-}
-//______________________________________________________________________
-void AliITS::AddRealDigit(Int_t branch, Int_t *digits){
-    //   Add a real digit - as coming from data.
-    // Inputs:
-    //      Int_t id        Detector type number.
-    //      Int_t *digits   Integer array containing the digits info. See 
-    //                      AliITSdigit.h
-    // Outputs:
-    //      none.
-    // Return:
-    //      none.
-
-    if(!fDetTypeSim) {
-      Error("AddRealDigit","fDetTypeSim is 0!");
-      return;
-    }
-    fDetTypeSim->AddRealDigit(branch,digits);
-
 }
 //______________________________________________________________________
 void AliITS::AddSimDigit(Int_t branch, AliITSdigit *d){
@@ -1053,7 +1078,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.
@@ -1077,7 +1102,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);
 
 }
 //______________________________________________________________________
@@ -1090,6 +1115,7 @@ void AliITS::Digits2Raw(){
   }
   fDetTypeSim->SetLoader((AliITSLoader*)fLoader);
   SetDefaults();
+  if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam);
   fDetTypeSim->GetLoader()->LoadDigits();
   TTree* digits = fDetTypeSim->GetLoader()->TreeD();
   if (!digits) {
@@ -1097,9 +1123,33 @@ void AliITS::Digits2Raw(){
       return;
   }
   fDetTypeSim->SetTreeAddressD(digits,(Char_t*)GetName());
+  
+   // Get the FO signals for this event
+  AliITSFOSignalsSPD* foSignals = NULL;
+  AliRunLoader* runLoader = AliRunLoader::Instance();
+  AliITSLoader* itsLoader = (AliITSLoader*) runLoader->GetLoader("ITSLoader");
+  if (!itsLoader) {
+    AliError("ITS loader is NULL.");
+  }
+   else {
+      if(!itsLoader->TreeD()) AliError("   !!! No TreeD available !!!");
+      foSignals = (AliITSFOSignalsSPD*)itsLoader->TreeD()->GetUserInfo()->FindObject("AliITSFOSignalsSPD");
+      if(!foSignals) AliError("FO signals not retrieved");
+     }
+  Bool_t deleteFOsignalsLater = kFALSE;
+  if (!foSignals) {
+    AliError("FO signals not available. No FO bits will be written.");
+    foSignals = new AliITSFOSignalsSPD(); // make a temporary dummy signals object
+    deleteFOsignalsLater = kTRUE;
+  }
+  
+  
   AliITSDDLModuleMapSDD* ddlsdd=fDetTypeSim->GetDDLModuleMapSDD();
-
+  Char_t rawSDD=fDetTypeSim->GetSimuParam()->GetSDDRawDataFormat();
   AliITSDDLRawData rawWriter;
+  
+  rawWriter.SetSDDRawFormat(rawSDD);
   //Verbose level
   // 0: Silent
   // 1: cout messages
@@ -1111,15 +1161,16 @@ void AliITS::Digits2Raw(){
   rawWriter.SetVerbose(0);
     
   //SILICON PIXEL DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SPD");
-  rawWriter.RawDataSPD(digits->GetBranch("ITSDigitsSPD"));
+  AliDebug(1,"Formatting raw data for SPD");
+  rawWriter.RawDataSPD(digits->GetBranch("ITSDigitsSPD"),foSignals);
+  if(deleteFOsignalsLater) delete foSignals;
     
   //SILICON DRIFT DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SDD");
+  AliDebug(1,Form("Formatting raw data for SDD - Format code =%d",rawSDD));
   rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"),ddlsdd);
     
   //SILICON STRIP DETECTOR
-  Info("Digits2Raw", "Formatting raw data for SSD");
+  AliDebug(1,"Formatting raw data for SSD");
   rawWriter.RawDataSSD(digits->GetBranch("ITSDigitsSSD"));
 
   fLoader->UnloadDigits();
@@ -1134,7 +1185,7 @@ AliLoader* AliITS::MakeLoader(const char* topfoldername){
     fLoader = new AliITSLoader(GetName(),topfoldername);
     return fLoader;
 }
-
+//______________________________________________________________________
 Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
 {
   //
@@ -1147,17 +1198,15 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
     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)
-    {
+    AliLoader* loader =  (AliRunLoader::Instance())->GetLoader("ITSLoader");
+    if (!loader){
        Error("Open","Can not get ITS loader from Run Loader");
        return kFALSE;
     }
 
     TTree* tree = 0;
     tree = loader->TreeS();
-    if (!tree)
-    {
+    if (!tree){
        loader->MakeTree("S");
        tree = loader->TreeS();
     }
@@ -1194,7 +1243,7 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
  
        last = (modA[module])->GetEntries();
        TClonesArray& dum = *modA[module];
-       fDetTypeSim->GetCalibrationModel(module)->Thresholds(thr,sigma);
+       fDetTypeSim->GetSimuParam()->SPDThresholds(module,thr,sigma);
        thr += 1.;
        new (dum[last]) AliITSpListItem(-1, -1, module, index, thr);
     }
@@ -1205,33 +1254,32 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
     // 
     AliITSsegmentationSDD* segSDD = (AliITSsegmentationSDD*) fDetTypeSim->GetSegmentationModel(1);
     npx = segSDD->Npx();
-    AliITSRawStreamSDD inputSDD(rawReader);
+    AliITSRawStream* inputSDD=AliITSRawStreamSDD::CreateRawStreamSDD(rawReader);
     AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD();
-    inputSDD.SetDDLModuleMap(ddlmap);
+    inputSDD->SetDDLModuleMap(ddlmap);
     while(1){
-       Bool_t next  = inputSDD.Next();
+       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(inputSDD->IsCompletedModule()==kFALSE && 
+          inputSDD->IsCompletedDDL()==kFALSE){
 
-       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));
-       
+         Int_t module = inputSDD->GetModuleID();
+         Int_t anode  = inputSDD->GetCoord1();
+         Int_t time   = inputSDD->GetCoord2();
+         Int_t signal10 = inputSDD->GetSignal();
+         Int_t index  = npx * anode + time;
+
+         if (module >= size) continue;
+         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));
+       }
     }
+    delete inputSDD;
     rawReader->Reset();
-
+    
     //
     // SSD
     // 
@@ -1293,4 +1341,9 @@ void AliITS::UpdateInternalGeometry(){
   AliITSgeom* geom = initgeom.CreateAliITSgeom(version,minor);
   SetITSgeom(geom);
 }
+//______________________________________________________________________
+AliTriggerDetector* AliITS::CreateTriggerDetector() const {
+  // create an AliITSTrigger object (and set trigger conditions as input)
+  return new AliITSTrigger(fDetTypeSim->GetTriggerConditions());
+}