#include "AliMUONDigit.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONHit.h"
+#include "AliMUONConstants.h"
#include "AliMpArea.h"
#include "AliMpDEManager.h"
#include <TMath.h>
#include <TRandom.h>
+using std::endl;
+using std::cout;
/// \cond CLASSIMP
ClassImp(AliMUONResponseV0)
/// \endcond
//______________________________________________________________________________
void
-AliMUONResponseV0::DisIntegrate(const AliMUONHit& hit, TList& digits)
+AliMUONResponseV0::DisIntegrate(const AliMUONHit& hit, TList& digits, Float_t timeDif)
{
/// Go from 1 hit to a list of digits.
/// The energy deposition of that hit is first converted into charge
if(plane == AliMp::kBendingPlane) {
Global2Local(detElemId,hitX,hitY,hitZ,locX,locY,locZ);
- TVector2 hitPoint(locX,locY);
- AliMpPad pad = seg->PadByPosition(hitPoint,kFALSE);
+ AliMpPad pad = seg->PadByPosition(locX,locY,kFALSE);
if(pad.IsValid()){
- Double_t locYCenter = pad.Position().Y();
- Double_t locXCenter = pad.Position().X();
+ Double_t locYCenter = pad.GetPositionY();
+ Double_t locXCenter = pad.GetPositionX();
const AliMUONGeometryTransformer* transformer = muon()->GetGeometryTransformer();
transformer->Local2Global(detElemId,locXCenter,locYCenter,locZ,globXCenter,globYCenter,globZ);
for(Int_t itime = 0; itime<para; itime++)
Double_t x,y,z;
Global2Local(detElemId,hitX,hitY,hitZ,x,y,z);
x = GetAnod(x);
- TVector2 hitPosition(x,y);
- AliMpArea area(hitPosition,TVector2(dx,dy));
+ AliMpArea area(x,y,dx,dy);
// Get pulse height from energy loss.
Float_t qtot = IntPH(hit.Eloss());
+ // If from a pileup event we apply a reduction factor to the charge
+ if (timeDif!=0){
+ qtot = AliMUONConstants::ReducedQTot(qtot,timeDif);
+ }
+
+ // Scale the charge to it'll (roughly) be in fC
+ qtot *= AliMUONConstants::DefaultADC2MV()*AliMUONConstants::DefaultA0()*AliMUONConstants::DefaultCapa();
+
// Get the charge correlation between cathodes.
Float_t currentCorrel = TMath::Exp(gRandom->Gaus(0.0,ChargeCorrel()/2.0));
if ( it->IsDone() )
{
// Exceptional case : iterator is built, but is invalid from the start.
- AliMpPad pad = seg->PadByPosition(area.Position(),kFALSE);
+ AliMpPad pad = seg->PadByPosition(area.GetPositionX(),area.GetPositionY(),
+ kFALSE);
if ( pad.IsValid() )
{
- AliWarning(Form("Got an invalid iterator bug (area.Position() is within "
+ AliDebug(1, Form("Got an invalid iterator bug (area.Position() is within "
" DE but the iterator is void) for detElemId %d cath %d",
detElemId,cath));
}
else
{
- AliError(Form("Got an invalid iterator bug for detElemId %d cath %d."
+ AliDebug(1, Form("Got an invalid iterator bug for detElemId %d cath %d."
"Might be a bad hit ? area.Position()=(%e,%e) "
"Dimensions()=(%e,%e)",
- detElemId,cath,area.Position().X(),area.Position().Y(),
- area.Dimensions().X(),area.Dimensions().Y()));
+ detElemId,cath,area.GetPositionX(),area.GetPositionY(),
+ area.GetDimensionX(),area.GetDimensionY()));
}
delete it;
return;
// For each pad given by the iterator, compute the charge of that
// pad, according to the Mathieson distribution.
AliMpPad pad = it->CurrentItem();
- TVector2 lowerLeft(hitPosition-pad.Position()-pad.Dimensions());
- TVector2 upperRight(lowerLeft + pad.Dimensions()*2.0);
+ TVector2 lowerLeft(TVector2(x,y)-TVector2(pad.GetPositionX(),pad.GetPositionY())-
+ TVector2(pad.GetDimensionX(),pad.GetDimensionY()));
+ TVector2 upperRight(lowerLeft + TVector2(pad.GetDimensionX(),pad.GetDimensionY())*2.0);
Float_t qp = TMath::Abs(fMathieson->IntXY(lowerLeft.X(),lowerLeft.Y(),
upperRight.X(),upperRight.Y()));
- Int_t icharge = Int_t(qp*qcath);
-
- if ( qp > fChargeThreshold )
+ if ( qp > fChargeThreshold &&
+ qp*qcath > AliMUONConstants::DefaultADC2MV()*AliMUONConstants::DefaultA0()*AliMUONConstants::DefaultCapa() )
{
// If we're above threshold, then we create a digit,
// and fill it with relevant information, including electronics.
+
+ // note that the second condition above is to be backward compatible (when
+ // the sdigitizer was making a cut on Int_t(qp*qcath) > 0 and qcath was in ADC, not in fC)
+
AliMUONDigit* d = new AliMUONDigit(detElemId,pad.GetManuId(),
pad.GetManuChannel(),cath);
d->SetPadXY(pad.GetIx(),pad.GetIy());
- d->SetCharge(icharge);
+ d->SetCharge(qp*qcath);
digits.Add(d);
}
it->Next();