]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITS.cxx
Fixes for report #68312: Improper usage of TClonesArrays in ITS
[u/mrichter/AliRoot.git] / ITS / AliITS.cxx
index d602504061f93c40cbc0faf9f422263b615c2b94..d8a7571b5d98c74f72cccdc672ceea87cdfc905f 100644 (file)
@@ -87,6 +87,9 @@ the AliITS class.
 #include "AliITSRecPoint.h"
 #include "AliITSsegmentationSPD.h"
 #include "AliITSsegmentationSDD.h"
+#include "AliITSsimulationSDD.h"
+#include "AliITSCalibrationSDD.h"
+#include "AliITSCalibrationSSD.h"
 #include "AliITSsegmentationSSD.h"
 #include "AliITSRawStreamSPD.h"
 #include "AliITSRawStreamSSD.h"
@@ -1254,28 +1257,43 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
     // 
     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;
+    Int_t scalef=AliITSsimulationSDD::ScaleFourier(segSDD);
+    Int_t firstSDD=AliITSgeomTGeo::GetModuleIndex(3,1,1);
+    Int_t firstSSD=AliITSgeomTGeo::GetModuleIndex(5,1,1);
+
+    AliITSRawStream* inputSDD=AliITSRawStreamSDD::CreateRawStreamSDD(rawReader);
+    for(Int_t iMod=firstSDD; iMod<firstSSD; iMod++){
+      AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)fDetTypeSim->GetCalibrationModel(iMod);
+      Bool_t isZeroSupp=cal->GetZeroSupp();
+      if(isZeroSupp){ 
+       for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,cal->GetZSLowThreshold(iSid));
+     }else{
+       for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,0);
+      }
+    }
 
-       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));
-       
+    AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD();
+    inputSDD->SetDDLModuleMap(ddlmap);
+    while(inputSDD->Next()){
+       if(inputSDD->IsCompletedModule()==kFALSE && 
+          inputSDD->IsCompletedDDL()==kFALSE){
+
+         Int_t module = inputSDD->GetModuleID();
+         Int_t anode  = inputSDD->GetCoord1()+segSDD->NpzHalf()*inputSDD->GetChannel();
+         Int_t time   = inputSDD->GetCoord2();
+         Int_t signal10 = inputSDD->GetSignal();
+         Int_t index = AliITSpList::GetIndex(anode,time,scalef*npx);
+
+         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
     // 
@@ -1299,15 +1317,24 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader)
        new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal));
     }
     rawReader->Reset();
-     AliITSpListItem* sdig = 0;
+    AliITSpListItem* sdig = 0;
     
+    Int_t firstssd = GetITSgeom()->GetStartDet(kSSD);
+    Double_t adcToEv = 1.;
     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());
+      {
+      if(mod>=firstssd) {
+       AliITSCalibrationSSD* calssd = (AliITSCalibrationSSD*)fDetTypeSim->GetCalibrationModel(mod);
+       adcToEv = 1./calssd->GetSSDDEvToADC(1.);
+      }
+      Int_t nsdig =  modA[mod]->GetEntries();
+      for (Int_t ie = 0; ie < nsdig; ie++) {
+       sdig = (AliITSpListItem*) (modA[mod]->At(ie));
+       Int_t digsig = sdig->GetSignal();
+       if(mod>=firstssd) digsig*=adcToEv; // for SSD: convert back charge from ADC to electron
+       new (aSDigits[ie]) AliITSpListItem(-1, -1, mod, sdig->GetIndex(), digsig);
            Float_t sig = sdig->GetSignalAfterElect();
+           if(mod>=firstssd) sig*=adcToEv;
            if (sig > 0.) {
                sdig = (AliITSpListItem*)aSDigits[ie];
                sdig->AddSignalAfterElect(mod, sdig->GetIndex(), Double_t(sig));
@@ -1342,4 +1369,3 @@ AliTriggerDetector* AliITS::CreateTriggerDetector() const {
   // create an AliITSTrigger object (and set trigger conditions as input)
   return new AliITSTrigger(fDetTypeSim->GetTriggerConditions());
 }
-