]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
- change handling of decimal places for charge in MCM simulation
authorjklein <jklein@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 17 Aug 2011 09:52:11 +0000 (09:52 +0000)
committerjklein <jklein@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 17 Aug 2011 09:52:11 +0000 (09:52 +0000)
- extend debug output
- extend output of ADC data for SCSN writing
- add wrapping of projected alpha in GTU
- change order of z-channel merging

TRD/AliTRDgtuTMU.cxx
TRD/AliTRDmcmSim.cxx
TRD/AliTRDmcmSim.h
TRD/AliTRDtrackGTU.cxx

index 1e2464e7ecd85a0347b95c8fc5bfb2799ec2fa81..f8bfd49d7c021034954be06833e0a46696940072 100644 (file)
@@ -264,7 +264,14 @@ Bool_t AliTRDgtuTMU::RunInputUnit(Int_t layer)
 
     Int_t alpha = (trk->GetYbin() >> fGtuParam->GetBitExcessY()) * fGtuParam->GetCiAlpha(layer);
     alpha = ( 2 * trk->GetdY() - (alpha >> fGtuParam->GetBitExcessAlpha()) + 1 ) >> 1;
-    trk->SetAlpha(alpha);
+    // wrapping projected alpha as in hardware
+    if ((alpha < -64) || (alpha > 63))
+      AliError(Form("alpha out of range: %i", alpha));
+    alpha = alpha & 0x7f;
+    if (alpha & 0x40)
+      trk->SetAlpha(0xffffffc0 | alpha);
+    else
+      trk->SetAlpha(alpha);
 
     Int_t yproj = trk->GetdY() * (fGtuParam->GetCiYProj(layer)); //??? sign?
     yproj = ( ( ( (yproj >> fGtuParam->GetBitExcessYProj()) + trk->GetYbin() ) >> 2) + 1) >> 1;
@@ -716,7 +723,7 @@ Bool_t AliTRDgtuTMU::RunTrackMerging(TList* ListOfTracks)
     do {
        done = kTRUE;
        trkStage0 = 0x0;
-       for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) {
+        for (Int_t zch = fGtuParam->GetNZChannels() - 1; zch > -1; zch--) {
            AliTRDtrackGTU *trk = (AliTRDtrackGTU*) tracksRefUnique[zch]->First();
            if (trk == 0) {
                continue;
@@ -935,9 +942,9 @@ Bool_t AliTRDgtuTMU::CalculatePID(AliTRDtrackGTU *track)
       }
     }
 
-    ULong64_t sumExt = (sum << 1) & 0xfff; // 11 bit -> 12 bit vector
-    ULong64_t prod   = (sumExt * coeff) & 0xfffffffffull; // 18x18 signed -> 36
-    ULong64_t prodFinal = ((prod >> 18) + ((prod >> 17) & 1)) & 0xff; // rounding term is equivalent to adding 5 to sum_ext
+    sum = sum & 0x7ff;
+    ULong64_t prod   = (sum * coeff) & 0xfffffffffull;
+    ULong64_t prodFinal = ((prod >> 17) + ((prod >> 16) & 1)) & 0xff;
 
     track->SetPID(prodFinal & 0xff);
 
@@ -988,7 +995,7 @@ Bool_t AliTRDgtuTMU::CalculateTrackParams(AliTRDtrackGTU *track)
       AliError(Form("Could not get tracklet in layer %i\n", layer));
       continue;
     }
-    AliDebug(10,Form("  trk yprime: %6i, aki: %6i", trk->GetYPrime(), (Int_t) (2048 * fGtuParam->GetAki(track->GetTrackletMask(), layer))));
+    AliDebug(10,Form("  layer %i trk yprime: %6i, aki: %6i", layer, trk->GetYPrime(), (Int_t) (2048 * fGtuParam->GetAki(track->GetTrackletMask(), layer))));
     a += (((Int_t) (2048 * fGtuParam->GetAki(track->GetTrackletMask(), layer))) * trk->GetYPrime() + 1) >> 8;
     b += fGtuParam->GetBki(track->GetTrackletMask(), layer) * trk->GetYPrime() * fGtuParam->GetBinWidthY();
     c += fGtuParam->GetCki(track->GetTrackletMask(), layer) * trk->GetYPrime() * fGtuParam->GetBinWidthY();
index 3bb189c9a0697aa0b57ee64756c1d4e1b78cffb2..df54db993d51863c3234e73e5a6038b238f5d000 100644 (file)
@@ -573,7 +573,9 @@ void AliTRDmcmSim::SetData(AliTRDarrayADC* const adcArray, AliTRDdigitsManager *
   for (Int_t iTimeBin = 0; iTimeBin < fNTimeBin; iTimeBin++) {
     for (Int_t iAdc = 0; iAdc < fgkNADC; iAdc++) {
       Int_t value = adcArray->GetDataByAdcCol(GetRow(), offset - iAdc, iTimeBin);
-      if (value < 0 || (offset - iAdc < 1) || (offset - iAdc > 165)) {
+      // treat 0 as suppressed,
+      // this is not correct but reported like that from arrayADC
+      if (value <= 0 || (offset - iAdc < 1) || (offset - iAdc > 165)) {
         fADCR[iAdc][iTimeBin] = fTrapConfig->GetTrapReg(AliTRDtrapConfig::kFPNP, fDetector, fRobPos, fMcmPos) + (fgAddBaseline << fgkAddDigits);
         fADCF[iAdc][iTimeBin] = fTrapConfig->GetTrapReg(AliTRDtrapConfig::kTPFP, fDetector, fRobPos, fMcmPos) + (fgAddBaseline << fgkAddDigits);
       }
@@ -1182,6 +1184,9 @@ void AliTRDmcmSim::AddHitToFitreg(Int_t adc, UShort_t timebin, UShort_t qtot, Sh
     fFitReg[adc].fSumY  += ypos;
     fFitReg[adc].fSumY2 += ypos*ypos;
     fFitReg[adc].fSumXY += timebin*ypos;
+    AliDebug(10, Form("fitreg[%2i] in timebin %2i: X=%i, X2=%i, N=%i, Y=%i, Y2=%i, XY=%i, Q0=%i, Q1=%i",
+                     adc, timebin, fFitReg[adc].fSumX, fFitReg[adc].fSumX2, fFitReg[adc].fNhits,
+                     fFitReg[adc].fSumY, fFitReg[adc].fSumY2, fFitReg[adc].fSumXY, fFitReg[adc].fQ0, fFitReg[adc].fQ1));
   }
 
   // register hits (MC info)
@@ -1358,7 +1363,7 @@ void AliTRDmcmSim::CalcFitreg()
         // checking for adcCentral != 0 (in case of "bad" configuration)
         if (adcCentral == 0)
           continue;
-        ypos = 128*(adcLeft - adcRight) / adcCentral;
+        ypos = 128*(adcRight - adcLeft) / adcCentral;
         if (ypos < 0) ypos = -ypos;
         // make the correction using the position LUT
         ypos = ypos + fTrapConfig->GetTrapReg((AliTRDtrapConfig::TrapReg_t) (AliTRDtrapConfig::kTPL00 + (ypos & 0x7F)),
@@ -1409,7 +1414,7 @@ void AliTRDmcmSim::CalcFitreg()
         }
 
         // add the hit to the fitregister
-        AddHitToFitreg(adcch, timebin, qTotal[adcch], ypos, mcLabel);
+        AddHitToFitreg(adcch, timebin, qTotal[adcch] >> fgkAddDigits, ypos, mcLabel);
       }
     }
   }
@@ -1564,7 +1569,7 @@ void AliTRDmcmSim::FitTracklet()
       nHits   = fit0->fNhits + fit1->fNhits; // number of hits
       sumX    = fit0->fSumX  + fit1->fSumX;
       sumX2   = fit0->fSumX2 + fit1->fSumX2;
-      denom   = ((Long64_t) nHits)*((Long64_t) sumX2) - ((Long64_t) sumX)*((Long64_t) sumX);
+      denom   = nHits * sumX2 - sumX * sumX;
 
       mult    = mult / denom; // exactly like in the TRAP program
       q0      = fit0->fQ0    + fit1->fQ0;
@@ -1642,7 +1647,7 @@ void AliTRDmcmSim::FitTracklet()
           AliWarning("Overflow in offset");
         offset  = offset & 0x1FFF; // 13 bit
 
-       pid = GetPID(q0 >> fgkAddDigits, q1 >> fgkAddDigits);  // divided by 4 because in simulation there are two additional decimal places
+       pid = GetPID(q0, q1);
 
         if (pid > 0xff)
           AliWarning("Overflow in PID");
@@ -1704,8 +1709,8 @@ void AliTRDmcmSim::FitTracklet()
         ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetNHits(fit0->fNhits + fit1->fNhits);
        ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetNHits0(nHits0);
         ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetNHits1(nHits1);
-        ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetQ0(q0 >> fgkAddDigits);
-        ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetQ1(q1 >> fgkAddDigits);
+        ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetQ0(q0);
+        ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetQ1(q1);
         ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetSlope(fitSlope);
         ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetOffset(fitOffset);
         ((AliTRDtrackletMCM*) (*fTrackletArray)[fTrackletArray->GetEntriesFast()-1])->SetError(TMath::Sqrt(TMath::Abs(fitError)/nHits));
@@ -2352,7 +2357,7 @@ void AliTRDmcmSim::PrintAdcDatXml(ostream& os) const
 
 
 
-void AliTRDmcmSim::PrintAdcDatDatx(ostream& os, Bool_t broadcast) const
+void AliTRDmcmSim::PrintAdcDatDatx(ostream& os, Bool_t broadcast, Int_t timeBinOffset) const
 {
   // print ADC data in datx format (to send to FEE)
 
@@ -2364,13 +2369,21 @@ void AliTRDmcmSim::PrintAdcDatDatx(ostream& os, Bool_t broadcast) const
    Int_t addrOffsetEBSIA = 0x20;
 
    for (Int_t iTimeBin = 0; iTimeBin < fNTimeBin; iTimeBin++) {
-      for (Int_t iChannel = 0; iChannel < fgkNADC; iChannel++) {
+     for (Int_t iChannel = 0; iChannel < fgkNADC; iChannel++) {
+       if ((iTimeBin < timeBinOffset) || (iTimeBin >= fNTimeBin+timeBinOffset)) {
         if(broadcast==kFALSE)
-           fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, (fADCF[iChannel][iTimeBin]/4), GetRobPos(),  GetMcmPos());
+          fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, 10, GetRobPos(),  GetMcmPos());
         else
-           fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, (fADCF[iChannel][iTimeBin]/4), 0, 127);
-      }
-      os << std::endl;
+          fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, 10, 0, 127);
+       }
+       else {
+        if(broadcast==kFALSE)
+          fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, (fADCF[iChannel][iTimeBin-timeBinOffset]/4), GetRobPos(),  GetMcmPos());
+        else
+          fTrapConfig->PrintDatx(os, addrOffset+iChannel*addrStep+addrOffsetEBSIA+iTimeBin, (fADCF[iChannel][iTimeBin-timeBinOffset]/4), 0, 127);
+       }
+     }
+     os << std::endl;
    }
 }
 
index 53665411841c46cac6fef63beae8dbe60b47d17e..3b59d3dcd0859d4d7ae87ea4cc48db3d9fbeea90 100644 (file)
@@ -128,7 +128,7 @@ class AliTRDmcmSim : public TObject {
          void PrintTrackletsXml(ostream& os) const;
          void PrintAdcDatHuman(ostream& os) const;
          void PrintAdcDatXml(ostream& os) const;
-         void PrintAdcDatDatx(ostream& os, Bool_t broadcast=kFALSE) const;
+         void PrintAdcDatDatx(ostream& os, Bool_t broadcast=kFALSE, Int_t timeBinOffset = -1) const;
 
  protected:
          Bool_t    CheckInitialized() const;           // Check whether the class is initialized
index 4a7a52ab0dda2e682f243629676ebf21d34bdb6e..90d32ad81207cbc98a6e0a08f11fd5b6566f3c1c 100644 (file)
@@ -163,6 +163,7 @@ AliESDTrdTrack* AliTRDtrackGTU::CreateTrdTrack() const
   for (Int_t iLayer = 0; iLayer < AliTRDgtuParam::GetNLayers(); iLayer++) {
     AliTRDtrackletGTU *trklGTU = GetTracklet(iLayer);
     if (trklGTU) {
+      trk->SetTrackletIndex(trklGTU->GetIndex(), iLayer);
       AliESDTrdTracklet *trkl = trklGTU->GetTrackletESD();
       if (trkl)
        trk->AddTrackletReference(trkl, iLayer);