// $Id$
#include <TClonesArray.h>
+#include <TParticle.h>
+#include <TTree.h>
#include "AliMUONSDigitizerV2.h"
-#include "AliLog.h"
#include "AliMUON.h"
#include "AliMUONChamber.h"
#include "AliMUONVDigit.h"
#include "AliMUONHit.h"
-#include "AliMpDEManager.h"
+#include "AliMUONVDigitStore.h"
+#include "AliMUONVHitStore.h"
+#include "AliMUONResponseTrigger.h"
+#include "AliMUONConstants.h"
+
#include "AliMpCDB.h"
+#include "AliMpDEManager.h"
+
+#include "AliLog.h"
+#include "AliCDBManager.h"
#include "AliLoader.h"
#include "AliRun.h"
#include "AliRunLoader.h"
-#include "AliMUONVDigitStore.h"
-#include "AliMUONVHitStore.h"
-#include "AliCDBManager.h"
-#include "AliMUONCalibrationData.h"
-#include "AliMUONResponseTrigger.h"
+#include "AliHeader.h"
+#include "AliGenCocktailEventHeader.h"
//-----------------------------------------------------------------------------
/// The sdigitizer performs the transformation from hits (energy deposits by
ClassImp(AliMUONSDigitizerV2)
+Float_t AliMUONSDigitizerV2::fgkMaxIntTime = 10.0;
+Float_t AliMUONSDigitizerV2::fgkMaxPosTimeDif = 1.22E-6;
+Float_t AliMUONSDigitizerV2::fgkMaxNegTimeDif = -3.5E-6;
+Float_t AliMUONSDigitizerV2::fgkMinTimeDif = 25E-9;
+
//_____________________________________________________________________________
AliMUONSDigitizerV2::AliMUONSDigitizerV2()
-: TTask("AliMUONSDigitizerV2","From Hits to SDigits for MUON")
+: TNamed("AliMUONSDigitizerV2","From Hits to SDigits for MUON")
{
///
/// ctor.
///
- if ( ! AliMpCDB::LoadMpSegmentation() )
- {
+
+ // Load mapping
+ if ( ! AliMpCDB::LoadMpSegmentation() ) {
AliFatal("Could not access mapping from OCDB !");
}
}
//_____________________________________________________________________________
void
-AliMUONSDigitizerV2::Exec(Option_t*)
+AliMUONSDigitizerV2::Digitize(Option_t*)
{
///
/// Go from hits to sdigits.
AliDebug(1,"");
- AliRunLoader* runLoader = AliRunLoader::GetRunLoader();
+ AliRunLoader* runLoader = AliRunLoader::Instance();
AliLoader* loader = runLoader->GetDetectorLoader("MUON");
-
+
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());
AliFatal(Form("Could not create digitstore of class %s",classname.Data()));
}
- AliInfo(Form("Will use digitStore of type %s",sDigitStore->ClassName()));
-
+ AliDebug(1,Form("Will use digitStore of type %s",sDigitStore->ClassName()));
+
+ // average arrival time to chambers, for pileup studies
+
for ( Int_t iEvent = 0; iEvent < nofEvents; ++iEvent )
{
// Loop over events.
AliDebug(1,Form("iEvent=%d",iEvent));
runLoader->GetEvent(iEvent);
-
+
+ // for pile up studies
+ float t0=fgkMaxIntTime; int aa=0;
+ AliHeader* header = runLoader->GetHeader();
+ AliGenCocktailEventHeader* cocktailHeader =
+ dynamic_cast<AliGenCocktailEventHeader*>(header->GenEventHeader());
+ if (cocktailHeader) {
+ AliGenCocktailEventHeader* genEventHeader = (AliGenCocktailEventHeader*) (header->GenEventHeader());
+ TList* headers = genEventHeader->GetHeaders();
+ TIter nextH(headers);
+ AliGenEventHeader *entry;
+ while((entry = (AliGenEventHeader*)nextH())) {
+ float t = entry->InteractionTime();
+ if (TMath::Abs(t)<TMath::Abs(t0)) t0 = t;
+ aa++;
+ }
+ } else {
+ AliGenEventHeader* evtHeader =
+ (AliGenEventHeader*)(header->GenEventHeader());
+ if (evtHeader)
+ {
+ float t = evtHeader->InteractionTime();
+ if (TMath::Abs(t)<TMath::Abs(t0)) t0 = t;
+ aa++;
+ }
+ else
+ {
+ // some generators may not offer a header, if which
+ // case we cannot get the interaction time, so we assume zero
+ t0 = 0.;
+ }
+ }
+
loader->MakeSDigitsContainer();
-
+
TTree* treeS = loader->TreeS();
-
+
if ( !treeS )
{
AliFatal("");
}
-
+
sDigitStore->Connect(*treeS);
TTree* treeH = loader->TreeH();
-
+
AliMUONVHitStore* hitStore = AliMUONVHitStore::Create(*treeH);
hitStore->Connect(*treeH);
{
// Loop over the tracks of this event.
treeH->GetEvent(iTrack);
-
+
AliMUONHit* hit;
TIter next(hitStore->CreateIterator());
Int_t ihit(0);
while ( ( hit = static_cast<AliMUONHit*>(next()) ) )
{
Int_t chamberId = hit->Chamber()-1;
+ Float_t age = hit->Age()-t0;
+
AliMUONChamber& chamber = muon->Chamber(chamberId);
AliMUONResponse* response = chamber.ResponseModel();
// This is the heart of this method : the dis-integration
TList digits;
- response->DisIntegrate(*hit,digits);
+ if (aa>1){ // if there are pileup events
+ Float_t chamberTime = AliMUONConstants::AverageChamberT(chamberId);
+ Float_t timeDif=age-chamberTime;
+ if (timeDif>fgkMaxPosTimeDif || timeDif<fgkMaxNegTimeDif) {
+ continue;
+ }
+ if(TMath::Abs(timeDif)>fgkMinTimeDif){
+ response->DisIntegrate(*hit,digits,timeDif);
+ }
+ else{
+ response->DisIntegrate(*hit,digits,0.);
+ }
+ }
+ else{
+ response->DisIntegrate(*hit,digits,0.);
+ }
- TIter next(&digits);
+ TIter nextd(&digits);
AliMUONVDigit* d;
- while ( ( d = (AliMUONVDigit*)next() ) )
+ while ( ( d = (AliMUONVDigit*)nextd() ) )
{
// Update some sdigit information that could not be known
// by the DisIntegrate method
d->SetHit(ihit);
- d->AddTrack(iTrack,d->Charge());
+ d->SetTime(age);
+ d->AddTrack(hit->GetTrack(),d->Charge());
tdlist.Add(d);
}
++ihit;
while ( ( d = static_cast<AliMUONVDigit*>(next()) ) )
{
- if ( d->Charge() > 0 ) // that check would be better in the disintegrate
- // method, but to compare with old sdigitizer, it has to be there.
+ d->ChargeInFC(kTRUE);
+
+ AliMUONVDigit* added = sDigitStore->Add(*d,AliMUONVDigitStore::kMerge);
+ if (!added)
{
- AliMUONVDigit* added = sDigitStore->Add(*d,AliMUONVDigitStore::kMerge);
- if (!added)
- {
- AliError("Could not add digit to digitStore");
- }
+ AliError("Could not add digit to digitStore");
}
}
-
+
treeS->Fill();
loader->WriteSDigits("OVERWRITE");
loader->UnloadHits();
delete sDigitStore;
-
- if(calibrationData) delete calibrationData;
+
}