#include "AliMUONConstants.h"
#include "AliMUONDigit.h"
#include "AliMUONLogger.h"
-#include "AliMUONTriggerEfficiencyCells.h"
#include "AliMUONTriggerElectronics.h"
#include "AliMUONTriggerStoreV1.h"
#include "AliMUONVCalibParam.h"
fIsInitialized(kFALSE),
fCalibrationData(0x0),
fTriggerProcessor(0x0),
-fTriggerEfficiency(0x0),
fNoiseFunction(0x0),
fNoiseFunctionTrig(0x0),
fGenerateNoisyDigits(generateNoisyDigits),
digit.SetADC(adc);
}
-//_____________________________________________________________________________
-void
-AliMUONDigitizerV3::ApplyResponseToTriggerDigit(const AliMUONVDigitStore& digitStore,
- AliMUONVDigit& digit)
-{
- /// \todo add comment
-
- if ( !fTriggerEfficiency ) return;
-
- if (digit.IsEfficiencyApplied()) return;
-
- AliMUONVDigit* correspondingDigit = FindCorrespondingDigit(digitStore,digit);
-
- if (!correspondingDigit) return; //reject bad correspondences
-
- Int_t detElemId = digit.DetElemId();
-
- AliMpSegmentation* segmentation = AliMpSegmentation::Instance();
- const AliMpVSegmentation* segment[2] =
- {
- segmentation->GetMpSegmentation(detElemId,AliMp::GetCathodType(digit.Cathode())),
- segmentation->GetMpSegmentation(detElemId,AliMp::GetCathodType(correspondingDigit->Cathode()))
- };
-
- AliMpPad pad[2] =
- {
- segment[0]->PadByIndices(AliMpIntPair(digit.PadX(),digit.PadY()),kTRUE),
- segment[1]->PadByIndices(AliMpIntPair(correspondingDigit->PadX(),correspondingDigit->PadY()),kTRUE)
- };
-
- Int_t p0(1);
- if (digit.Cathode()==0) p0=0;
-
- AliMpIntPair location = pad[p0].GetLocation(0);
- Int_t nboard = location.GetFirst();
-
- Bool_t isTrig[2];
-
- fTriggerEfficiency->IsTriggered(detElemId, nboard,
- isTrig[0], isTrig[1]);
- digit.EfficiencyApplied(kTRUE);
- correspondingDigit->EfficiencyApplied(kTRUE);
-
- if (!isTrig[digit.Cathode()])
- {
- digit.SetCharge(0);
- }
-
- if ( &digit != correspondingDigit )
- {
- if (!isTrig[correspondingDigit->Cathode()])
- {
- correspondingDigit->SetCharge(0);
- }
- }
-}
-
//_____________________________________________________________________________
void
AliMUONDigitizerV3::ApplyResponse(const AliMUONVDigitStore& store,
{
ApplyResponseToTrackerDigit(*digit,kAddNoise);
}
- else
- {
- ApplyResponseToTriggerDigit(store,*digit);
- }
+
if ( digit->ADC() > 0 || digit->Charge() > 0 )
{
filteredStore.Add(*digit,AliMUONVDigitStore::kIgnore);
fOutputDigitStore->Clear();
}
-//_____________________________________________________________________________
-AliMUONVDigit*
-AliMUONDigitizerV3::FindCorrespondingDigit(const AliMUONVDigitStore& digitStore,
- AliMUONVDigit& digit) const
-{
- /// Find, if it exists, the digit corresponding to digit.Hit(), in the
- /// other cathode
-
- AliCodeTimerAuto("")
-
- TIter next(digitStore.CreateIterator());
- AliMUONVDigit* d;
-
- while ( ( d = static_cast<AliMUONVDigit*>(next()) ) )
- {
- if ( d->DetElemId() == digit.DetElemId() &&
- d->Hit() == digit.Hit() &&
- d->Cathode() != digit.Cathode() )
- {
- return d;
- }
- }
- return 0x0;
-}
-
//_____________________________________________________________________________
void
}
fTriggerProcessor = new AliMUONTriggerElectronics(fCalibrationData);
- if ( muon()->GetTriggerEffCells() )
- {
- fTriggerEfficiency = fCalibrationData->TriggerEfficiency();
- if ( fTriggerEfficiency )
- {
- AliDebug(1, "Will apply trigger efficiency");
- }
- else
- {
- AliFatal("I was requested to apply trigger efficiency, but I could "
- "not get it !");
- }
- }
-
AliDebug(1, Form("Will %s generate noise-only digits for tracker",
(fGenerateNoisyDigits ? "":"NOT")));
class AliMUONCalibrationData;
class AliMUONVDigit;
class AliMUONLogger;
-class AliMUONTriggerEfficiencyCells;
class TClonesArray;
class TF1;
class TString;
void ApplyResponse(const AliMUONVDigitStore& store, AliMUONVDigitStore& filteredStore);
void ApplyResponseToTrackerDigit(AliMUONVDigit& digit, Bool_t addNoise);
- void ApplyResponseToTriggerDigit(const AliMUONVDigitStore& digitStore, AliMUONVDigit& digit);
AliLoader* GetLoader(const TString& foldername);
private:
- AliMUONVDigit* FindCorrespondingDigit(const AliMUONVDigitStore& digitStore,
- AliMUONVDigit& digit) const;
-
void GenerateNoisyDigits(AliMUONVDigitStore& digitStore);
void GenerateNoisyDigitsForOneCathode(AliMUONVDigitStore& digitStore,
Int_t detElemId, Int_t cathode);
Bool_t fIsInitialized; ///< are we initialized ?
AliMUONCalibrationData* fCalibrationData; //!< pointer to access calib parameters
AliMUONTriggerElectronics* fTriggerProcessor; ///< pointer to the trigger part of the job
- AliMUONTriggerEfficiencyCells* fTriggerEfficiency; ///< trigger efficiency map
TF1* fNoiseFunction; //!< function to randomly get signal above n*sigma_ped
TF1* fNoiseFunctionTrig; //!< function to get noise disribution on trig. chambers
Int_t fGenerateNoisyDigits; //!< whether or not we should generate noise-only digits for tracker (1) and trigger (2)
#include "AliMUONGeometryTransformer.h"
#include "AliMUONHit.h"
#include "AliMUONConstants.h"
+#include "AliMUONTriggerEfficiencyCells.h"
#include "AliMpPad.h"
#include "AliMpCathodType.h"
//------------------------------------------------------------------
AliMUONResponseTrigger::AliMUONResponseTrigger()
- : AliMUONResponse()
+ : AliMUONResponse(),
+ fTriggerEfficiency(0x0)
{
/// Default constructor
}
{
twentyNano=1;
}
-
+
+ Bool_t isTrig[2]={kTRUE,kTRUE};
+
for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; ++cath )
{
const AliMpVSegmentation* seg
//FIXME : a trigger digit can have several locations.
//this is not currently supported by the digit class. Change that or not ?
d->SetCharge(twentyNano);
+
+ if(fTriggerEfficiency){
+ if(cath==0){
+ Int_t nboard = pad.GetLocation(0).GetFirst();
+ fTriggerEfficiency->IsTriggered(detElemId, nboard,
+ isTrig[0], isTrig[1]);
+ }
+ if(!isTrig[cath]) continue;
+ }
+
digits.Add(d);
}
}
+//_____________________________________________________________________________
+void
+AliMUONResponseTrigger::InitTriggerEfficiency(AliMUONTriggerEfficiencyCells *triggerEfficiency)
+{
+/// Initialize trigger chamber efficiency (on demand)
-
-
+ fTriggerEfficiency = triggerEfficiency;
+ if ( fTriggerEfficiency )
+ {
+ AliDebug(1, "Will apply trigger efficiency");
+ }
+ else
+ {
+ AliFatal("I was requested to apply trigger efficiency, but I could "
+ "not get it !");
+ }
+}
/// \brief Implementation of RPC response
#include "AliMUONResponse.h"
+#include "AliMUONTriggerEfficiencyCells.h"
class AliMUONResponseTrigger : public AliMUONResponse
{
virtual Int_t SetGenerCluster(){return 0;}
virtual void DisIntegrate(const AliMUONHit& hit, TList& digits);
+
+ virtual void InitTriggerEfficiency(AliMUONTriggerEfficiencyCells* triggerEfficiency);
+
+ protected:
+ AliMUONTriggerEfficiencyCells* fTriggerEfficiency; //!< trigger efficiency map
private:
+ /// Not implemented
+ AliMUONResponseTrigger(const AliMUONResponseTrigger& other);
+ /// Not implemented
+ AliMUONResponseTrigger& operator=(const AliMUONResponseTrigger& other); // assignment operator
+
- ClassDef(AliMUONResponseTrigger,1) // Implementation of RPC response
+ ClassDef(AliMUONResponseTrigger,2) // Implementation of RPC response
};
#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
twentyNano=1;
}
+ Bool_t isTrig[2]={kTRUE, kTRUE};
+
for ( Int_t cath = AliMp::kCath0; cath <= AliMp::kCath1; ++cath )
{
const AliMpVSegmentation* seg
d->SetPadXY(ix,iy);
d->SetCharge(twentyNano);
+
+ if(fTriggerEfficiency){
+ if(cath==0){
+ Int_t nboard = pad.GetLocation(0).GetFirst();
+ fTriggerEfficiency->IsTriggered(detElemId, nboard,
+ isTrig[0], isTrig[1]);
+ }
+ if(!isTrig[cath]) continue;
+ }
+
digits.Add(d);
SetGenerCluster(); // 1 randum number per cathode (to be checked)
#include "AliMUONVDigitStore.h"
#include "AliMUONVHitStore.h"
+#include "AliCDBManager.h"
+#include "AliMUONCalibrationData.h"
+#include "AliMUONResponseTrigger.h"
+
//-----------------------------------------------------------------------------
/// The sdigitizer performs the transformation from hits (energy deposits by
/// the transport code) to sdigits (equivalent of charges on pad).
loader->LoadHits("READ");
AliMUON* muon = static_cast<AliMUON*>(gAlice->GetModule("MUON"));
-
+
+ AliMUONCalibrationData *calibrationData = 0x0;
+
+ if(muon->GetTriggerEffCells()){
+ Int_t runnumber = AliCDBManager::Instance()->GetRun();
+ calibrationData = new AliMUONCalibrationData(runnumber);
+ for (Int_t chamber = 10; chamber < 14; chamber++) {
+ ((AliMUONResponseTrigger *) (muon->Chamber(chamber).ResponseModel()))->InitTriggerEfficiency(calibrationData->TriggerEfficiency()); // Init trigger efficiency
+ }
+ }
+
Int_t nofEvents(runLoader->GetNumberOfEvents());
TString classname = muon->DigitStoreClassName();
loader->UnloadHits();
delete sDigitStore;
+
+ if(calibrationData) delete calibrationData;
}