* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
-$Log$
-Revision 1.1.2.1 2000/06/09 21:48:28 morsch
-Code from AliMUONSegResTrigger.cxx
+/* $Id$ */
-*/
-#include "AliMUONResponseTrigger.h"
-#include "AliMUONSegmentation.h"
-#include <TMath.h>
-#include <TRandom.h>
-#include <iostream.h>
+//-----------------------------------------------------------------------------
+// Class AliMUONResponseTrigger
+// -------------------------------
+// Implementation
+// of RPC response
+//-----------------------------------------------------------------------------
+#include "AliMUONResponseTrigger.h"
+#include "AliMUON.h"
+#include "AliMUONDigit.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONHit.h"
+#include "AliMUONConstants.h"
+
+#include "AliMpPad.h"
+#include "AliMpCathodType.h"
+#include "AliMpPlaneType.h"
+#include "AliMpSegmentation.h"
+#include "AliMpVSegmentation.h"
+
+#include "AliRun.h"
+#include "AliLog.h"
+#include "TList.h"
+
+/// \cond CLASSIMP
ClassImp(AliMUONResponseTrigger)
+/// \endcond
-//------------------------------------------------------------------
-Float_t AliMUONResponseTrigger::IntXY(AliMUONSegmentation * segmentation){
-// Returns 1 or 0 if the current strip is fired or not according
-// to the cluster size and the width of the main strip.
-// For the time being the probability to fire a neighbour depends
-// only on the width of the main strip and is limited to a maximum
-// cluster-size of 2.
-// The corresponding probabilities are given below (O.Roig PhD Thesis)
-// This will be improved in the future by including a parametrization
-// of the cluster size as a function of the position of the physical
-// hit with respect to the center of the strip.
-//------------------------------------------------------------------
-// clust. size = 1 2 3 4 5 >5
-// strip width = 1 | 54.7 | 44.5 | 0.7 | 0.06 | 0.04 | 0.0 |
-// strip width = 2 | 89.0 | 10.7 | 0.2 | 0.1 | 0.0 | 0.0 |
-// strip width = 4 | 99.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 |
-//------------------------------------------------------------------
-
-// cout << "in AliMUONResponseTrigger::IntXY" << "\n";
-
- // get the "parameters" needed to evaluate the strip response
- // x1 : hit x(y) position
- // x2 : x(y) coordinate of the main strip
- // x3 : current strip real x(y) coordinate
- // width : width of the main strip
- Float_t x1,x2,x3,width;
- segmentation->IntegrationLimits(x1,x2,x3,width);
- // cout << " x or y main & current = " << x2 << " , " << x3
- // << " width main = " << width << "\n";
-
- /*
- if (TMath::Abs(x3-x1)<TMath::Abs(x3-x2)) { // find neighbour candidate
- Int_t iwidth=Int_t(width);
- Float_t rand = gRandom->Rndm()*100.;
- if (iwidth==1) {
- if (rand<44.5) { return 1.; }
- else { return 0.; }
- } else if (iwidth==2) {
- if (rand<10.7) { return 1.; }
- else { return 0.; }
- } else if (iwidth==4) {
- if (rand<1.) { return 1.; }
- else { return 0.; }
- }
- } else { return 0.;}
- return -1;
- */
- 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);
+ }
}
-
//------------------------------------------------------------------
-Int_t AliMUONResponseTrigger::DigitResponse(Int_t digit)
+AliMUONResponseTrigger::AliMUONResponseTrigger()
+ : AliMUONResponse()
{
-//
-// only digital (0/1) information available
- if (digit) digit=1;
- return digit;
+/// Default constructor
}
+//------------------------------------------------------------------
+AliMUONResponseTrigger::~AliMUONResponseTrigger()
+{
+/// Destructor
+}
-
-
-
-
+//_____________________________________________________________________________
+void
+AliMUONResponseTrigger::DisIntegrate(const AliMUONHit& hit, TList& digits, Float_t /*timeDif*/)
+{
+ /// 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 = 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<AliMUONConstants::TriggerTofLimit())
+ {
+ twentyNano=1;
+ }
+
+ Int_t nboard=0;
+
+ for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; ++cath )
+ {
+ const AliMpVSegmentation* seg
+ = AliMpSegmentation::Instance()
+ ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cath));
+
+ AliMpPad pad = seg->PadByPosition(x,y,kFALSE);
+ Int_t ix = pad.GetIx();
+ Int_t iy = pad.GetIy();
+
+ 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;
+ }
+
+ if ( cath == AliMp::kCath0 ) nboard = pad.GetLocalBoardId(0);
+
+ AliMUONDigit* d = new AliMUONDigit(detElemId,nboard,
+ pad.GetLocalBoardChannel(0),cath);
+ d->SetPadXY(ix,iy);
+
+ //FIXME : a trigger digit can have several locations.
+ //this is not currently supported by the digit class. Change that or not ?
+ d->SetCharge(twentyNano);
+
+
+ digits.Add(d);
+ }
+}