/* $Id$ */
+
#include "AliMUONResponseTrigger.h"
-#include "AliSegmentation.h"
-#include <TMath.h>
-#include <TRandom.h>
-#include <Riostream.h>
+
+#include "AliLog.h"
+#include "AliMUON.h"
+#include "AliMUONDigit.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONHit.h"
+#include "AliMUONSegmentation.h"
+#include "AliMpPad.h"
+#include "AliMpPlaneType.h"
+#include "AliMpVSegmentation.h"
+#include "AliRun.h"
+#include "TList.h"
+#include "AliMUONTriggerSegmentationV2.h"
ClassImp(AliMUONResponseTrigger)
-//------------------------------------------------------------------
-Int_t AliMUONResponseTrigger::SetGenerCluster(){
-// nothing to be done except return 0
- return 0;
-}
+namespace
+{
+ AliMUON* muon()
+ {
+ return static_cast<AliMUON*>(gAlice->GetModule("MUON"));
+ }
+
+ void Global2Local(Int_t detElemId, Double_t xg, Double_t yg, Double_t zg,
+ Double_t& xl, Double_t& yl, Double_t& zl)
+ {
+ // ideally should be :
+ // Double_t x,y,z;
+ // AliMUONGeometry::Global2Local(detElemId,xg,yg,zg,x,y,z);
+ // but while waiting for this geometry singleton, let's go through
+ // AliMUON still.
+
+ const AliMUONGeometryTransformer* transformer = muon()->GetGeometryTransformer();
+ transformer->Global2Local(detElemId,xg,yg,zg,xl,yl,zl);
+ }
+
+ AliMUONSegmentation* Segmentation()
+ {
+ static AliMUONSegmentation* segmentation = muon()->GetSegmentation();
+ return segmentation;
+ }
+}
+
+const Float_t
+AliMUONResponseTrigger::fgkTofLimit = 75E-9;
//------------------------------------------------------------------
-Int_t AliMUONResponseTrigger::DigitResponse(Int_t digit,
- AliMUONTransientDigit* where){
-// only digital (0/1) information available
- if (digit) digit=1;
- return digit;
+AliMUONResponseTrigger::AliMUONResponseTrigger()
+ : AliMUONResponse()
+{
+// Default constructor
}
+//_____________________________________________________________________________
+void
+AliMUONResponseTrigger::DisIntegrate(const AliMUONHit& hit, TList& digits)
+{
+ //
+ // Generate 2 digits (one on each cathode) from 1 hit, i.e. no cluster-size
+ // generation (simplest response case).
+ //
+
+ digits.Clear();
+
+ Float_t xhit = hit.X();
+ Float_t yhit = hit.Y();
+ Float_t zhit = 0; // FIXME : should it be hit.Z() ?
+ Int_t detElemId = hit.DetElemId();
+
+ Double_t x,y,z;
+ Global2Local(detElemId,xhit,yhit,zhit,x,y,z);
+
+ Float_t tof = hit.Age();
+ Int_t twentyNano(100);
+ if (tof<fgkTofLimit)
+ {
+ twentyNano=1;
+ }
+
+ for ( Int_t cath = 0; cath < 2; ++cath )
+ {
+ const AliMpVSegmentation* seg = Segmentation()->GetMpSegmentation(detElemId,cath);
+
+ AliMpPad pad = seg->PadByPosition(TVector2(x,y),kFALSE);
+ Int_t ix = pad.GetIndices().GetFirst();
+ Int_t iy = pad.GetIndices().GetSecond();
+
+ AliDebug(1,Form("xhit,yhit=%e,%e lx,ly,lz=%e,%e,%e ix,iy=%d,%d",
+ xhit,yhit,x,y,z,ix,iy));
+
+ if ( !pad.IsValid() )
+ {
+ AliWarning(Form("hit w/o strip %d-%d xhit,yhit=%e,%e local x,y,z "
+ "%e,%e,%e ix,iy=%d,%d",detElemId,
+ cath,
+ xhit,yhit,x,y,z,ix,iy));
+ continue;
+ }
+ AliMUONDigit* d = new AliMUONDigit;
+ d->SetDetElemId(detElemId);
+/* pc 09/02/06 no need for that anymore : trigger is in local numbering
+
+ //FIXME: >> the following code to get the ixGlo and iyGlo is a bad hack
+ // because trigger has not yet switched to local numbering of its indices !
+ // We should be able to use directly the (local) ix,iy from the pad !
+ const AliMUONTriggerSegmentationV2* old =
+ dynamic_cast<const AliMUONTriggerSegmentationV2*>
+ (Segmentation()->GetDESegmentation(detElemId,cath));
+ if ( !old )
+ {
+ AliFatal("Got a wrong TriggerSegmentation object! Check that!");
+ }
+ Int_t ixGlo;
+ Int_t iyGlo;
+ old->ILoc2IGlo(ix,iy,ixGlo,iyGlo);
+ if ( xhit < 0 ) ixGlo = -ixGlo;
+ // << end of bad hack.
+ d->SetPadX(ixGlo);
+ d->SetPadY(iyGlo);
+*/
+ d->SetPadX(ix);
+ d->SetPadY(iy);
+
+ d->SetSignal(twentyNano);
+ d->AddPhysicsSignal(d->Signal());
+ d->SetCathode(cath);
+ digits.Add(d);
+ // AliDebug(1,Form("Adding digit DE %d Cathode %d (%d,%d) signal %d",
+// detElemId,cath,ixGlo,iyGlo,twentyNano));
+ }
+
+// StdoutToAliDebug(1,digits.Print(););
+// AliDebug(1,Form("Number of digits for detelem %d track %d : %d",
+// hit.DetElemId(),hit.Track(),digits.GetSize()));
+//
+}