**************************************************************************/
/*
$Log$
+Revision 1.11 2001/07/20 10:03:14 morsch
+Changes needed to work with Root 3.01 (substitute lhs [] operator). (Jiri Chudoba)
+
+Revision 1.10 2001/03/20 13:17:30 egangler
+fChargeCorrel moved from AliMUONChamber to AliMUONResponse as decided by
+January meeting.
+Setters and Getters are modified accordingly.
+This modification is transparent to the user code
+
+Revision 1.9 2001/01/26 21:35:54 morsch
+All pointers set to 0 in default constructor.
+
+Revision 1.8 2001/01/17 20:53:40 hristov
+Destructors corrected to avoid memory leaks
+
+Revision 1.7 2000/12/20 13:00:22 egangler
+
+Added charge correlation between cathods.
+In Config_slat.C, use
+ MUON->Chamber(chamber-1).SetChargeCorrel(0.11); to set the RMS of
+ q1/q2 to 11 % (number from Alberto)
+ This is stored in AliMUONChamber fChargeCorrel member.
+ At generation time, when a tracks enters the volume,
+ AliMUONv1::StepManager calls
+ AliMUONChamber::ChargeCorrelationInit() to set the current value of
+ fCurrentCorrel which is then used at Disintegration level to scale
+ appropriately the PadHit charges.
+
+Revision 1.6 2000/10/09 14:01:12 morsch
+Double inclusion of AliResponse removed.
+
Revision 1.5 2000/07/03 11:54:57 morsch
AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
Log messages included
*/
+// --- MUON includes ---
#include "AliMUONChamber.h"
+// --- ROOT includes ---
+
+#include "TRandom.h"
#include "TMath.h"
+
ClassImp(AliMUONChamber)
AliMUONChamber::AliMUONChamber()
{
// Default constructor
- fSegmentation = new TObjArray(2);
- (*fSegmentation)[0] = 0;
- (*fSegmentation)[1] = 0;
+ fSegmentation = 0;
fResponse=0;
fnsec=1;
fReconstruction=0;
fId=0;
+ // to avoid mistakes if ChargeCorrelInit is not called
+ fCurrentCorrel =1;
}
AliMUONChamber::AliMUONChamber(Int_t id)
{
// Construtor with chamber id
fSegmentation = new TObjArray(2);
- (*fSegmentation)[0] = 0;
- (*fSegmentation)[1] = 0;
+ fSegmentation->AddAt(0,0);
+ fSegmentation->AddAt(0,1);
fResponse=0;
fnsec=1;
fReconstruction=0;
fId=id;
+ // to avoid mistakes if ChargeCorrelInit is not called
+ fCurrentCorrel =1;
}
AliMUONChamber::~AliMUONChamber()
{
// Destructor
- if (fSegmentation) delete fSegmentation;
+ if (fSegmentation) {
+ fSegmentation->Delete();
+ delete fSegmentation;
+ }
}
AliMUONChamber::AliMUONChamber(const AliMUONChamber& rChamber)
// Initalisation ..
//
// ... for chamber segmentation
- if ((*fSegmentation)[0])
- ((AliSegmentation *) (*fSegmentation)[0])->Init(fId);
+ //PH if ((*fSegmentation)[0])
+ //PH ((AliSegmentation *) (*fSegmentation)[0])->Init(fId);
+ if (fSegmentation->At(0))
+ ((AliSegmentation *) fSegmentation->At(0))->Init(fId);
if (fnsec==2) {
- if ((*fSegmentation)[1])
- ((AliSegmentation *) (*fSegmentation)[1])->Init(fId);
+ //PH if ((*fSegmentation)[1])
+ //PH ((AliSegmentation *) (*fSegmentation)[1])->Init(fId);
+ if (fSegmentation->At(1))
+ ((AliSegmentation *) fSegmentation->At(1))->Init(fId);
}
}
{
// Ask segmentation if signal should be generated
if (fnsec==1) {
- return ((AliSegmentation*) (*fSegmentation)[0])
+ //PH return ((AliSegmentation*) (*fSegmentation)[0])
+ return ((AliSegmentation*) fSegmentation->At(0))
->SigGenCond(x, y, z) ;
} else {
- return (((AliSegmentation*) (*fSegmentation)[0])
+ //PH return (((AliSegmentation*) (*fSegmentation)[0])
+ return (((AliSegmentation*) fSegmentation->At(0))
->SigGenCond(x, y, z)) ||
- (((AliSegmentation*) (*fSegmentation)[1])
+ //PH (((AliSegmentation*) (*fSegmentation)[1])
+ (((AliSegmentation*) fSegmentation->At(1))
->SigGenCond(x, y, z)) ;
}
}
// Initialisation of segmentation for hit
//
if (fnsec==1) {
- ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
+ //PH ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
+ ((AliSegmentation*) fSegmentation->At(0))->SigGenInit(x, y, z) ;
} else {
- ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
- ((AliSegmentation*) (*fSegmentation)[1])->SigGenInit(x, y, z) ;
+ //PH ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
+ //PH ((AliSegmentation*) (*fSegmentation)[1])->SigGenInit(x, y, z) ;
+ ((AliSegmentation*) fSegmentation->At(0))->SigGenInit(x, y, z) ;
+ ((AliSegmentation*) fSegmentation->At(1))->SigGenInit(x, y, z) ;
}
}
+void AliMUONChamber::ChargeCorrelationInit() {
+// Initialisation of charge correlation for current hit
+// the value is stored, and then used by Disintegration
+if (fnsec==1)
+ fCurrentCorrel =1;
+else
+ // exponential is here to avoid eventual problems in 0
+ // factor 2 because chargecorrel is q1/q2 and not q1/qtrue
+ fCurrentCorrel = TMath::Exp(gRandom->Gaus(0,fResponse->ChargeCorrel()/2));
+}
+
void AliMUONChamber::DisIntegration(Float_t eloss, Float_t tof,
Float_t xhit, Float_t yhit, Float_t zhit,
Int_t& nnew,Float_t newclust[6][500])
Float_t qcheck=0, qp;
nnew=0;
+ // Cathode plane loop
for (Int_t i=1; i<=fnsec; i++) {
qcheck=0;
+ Float_t qcath = qtot * (i==1? fCurrentCorrel : 1/fCurrentCorrel);
AliSegmentation * segmentation=
- (AliSegmentation *) (*fSegmentation)[i-1];
+ //PH (AliSegmentation *) (*fSegmentation)[i-1];
+ (AliSegmentation *) fSegmentation->At(i-1);
for (segmentation->FirstPad(xhit, yhit, zhit, dx, dy);
segmentation->MorePads();
segmentation->NextPad())
//
//
if (qp > 1.e-4) {
- qcheck+=qp*qtot;
+ qcheck+=qp*qcath;
//
// --- store signal information
- newclust[0][nnew]=qtot; // total charge
+ newclust[0][nnew]=qcath; // total charge
newclust[1][nnew]=segmentation->Ix(); // ix-position of pad
newclust[2][nnew]=segmentation->Iy(); // iy-position of pad
- newclust[3][nnew]=qp * qtot; // charge on pad
+ newclust[3][nnew]=qp * qcath; // charge on pad
newclust[4][nnew]=segmentation->ISector(); // sector id
newclust[5][nnew]=(Float_t) i; // counter
nnew++;
-// if (i==2) printf("\n i, nnew, q %d %d %f", i, nnew, qp*qtot);
+// if (i==2) printf("\n i, nnew, q %d %d %f", i, nnew, qp*qcath);
}
} // Pad loop