#include <TTree.h>
#include "AliMUON.h"
#include "AliMUONSDigitizerV2.h"
#include "AliMUONDigitizerV3.h"
#include "AliMUONDigitMaker.h"
#include "AliMUONDigit.h"
#include "AliMUONCalibrationData.h"
#include "AliMUONDigitStoreV1.h"
#include "AliMUONTriggerStoreV1.h"
#include "AliMUONHitStoreV1.h"
#include "AliMUONChamberTrigger.h"
#include "AliMUONConstants.h"
#include "AliMUONGeometry.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONGeometryBuilder.h"
#include "AliMUONVGeometryBuilder.h"
#include "AliMUONCommonGeometryBuilder.h"
#include "AliMUONSt1GeometryBuilderV2.h"
#include "AliMUONSt2GeometryBuilderV2.h"
#include "AliMUONSlatGeometryBuilder.h"
#include "AliMUONTriggerGeometryBuilder.h"
#include "AliMUONDigitCalibrator.h"
#include "AliMUONRecoParam.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliMUONRawWriter.h"
#include "AliLoader.h"
#include "AliCDBManager.h"
#include "AliDigitizationInput.h"
#include "AliMC.h"
#include "AliRun.h"
#include "AliRawDataHeaderSim.h"
#include "AliLog.h"
#include <TObjArray.h>
ClassImp(AliMUON)
AliMUON::AliMUON()
: AliDetector(),
fNCh(0),
fNTrackingCh(0),
fSplitLevel(0),
fChambers(0),
fGeometryBuilder(0),
fAccCut(kFALSE),
fAccMin(0.),
fAccMax(0.),
fMaxStepGas(0.),
fMaxStepAlu(0.),
fMaxDestepGas(0.),
fMaxDestepAlu(0.),
fMaxIterPad(0),
fCurIterPad(0),
fIsMaxStep(kTRUE),
fTriggerScalerEvent(kFALSE),
fTriggerResponseV1(0),
fTriggerCoinc44(0),
fTriggerEffCells(kTRUE),
fDigitizerWithNoise(1),
fDigitizerNSigmas(4.0),
fIsTailEffect(kTRUE),
fConvertTrigger(kFALSE),
fRawWriter(0x0),
fDigitMaker(0x0),
fHitStore(0x0),
fDigitStoreConcreteClassName(),
fCalibrationData(0x0),
fDigitCalibrator(0x0)
{
AliDebug(1,Form("default (empty) ctor this=%p",this));
fIshunt = 0;
}
AliMUON::AliMUON(const char *name, const char* title)
: AliDetector(name, title),
fNCh(AliMUONConstants::NCh()),
fNTrackingCh(AliMUONConstants::NTrackingCh()),
fSplitLevel(0),
fChambers(0),
fGeometryBuilder(0),
fAccCut(kFALSE),
fAccMin(0.),
fAccMax(0.),
fMaxStepGas(0.1),
fMaxStepAlu(0.1),
fMaxDestepGas(-1),
fMaxDestepAlu(-1),
fMaxIterPad(0),
fCurIterPad(0),
fIsMaxStep(kTRUE),
fTriggerScalerEvent(kFALSE),
fTriggerResponseV1(0),
fTriggerCoinc44(0),
fTriggerEffCells(kTRUE),
fDigitizerWithNoise(1),
fDigitizerNSigmas(4.0),
fIsTailEffect(kTRUE),
fConvertTrigger(kFALSE),
fRawWriter(0x0),
fDigitMaker(new AliMUONDigitMaker),
fHitStore(0x0),
fDigitStoreConcreteClassName("AliMUONDigitStoreV2S"),
fCalibrationData(),
fDigitCalibrator(0x0)
{
AliDebug(1,Form("ctor this=%p",this));
fIshunt = 0;
fGeometryBuilder = new AliMUONGeometryBuilder(this);
fGeometryBuilder
->AddBuilder(new AliMUONCommonGeometryBuilder(this));
AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
Int_t ch;
fChambers = new TObjArray(AliMUONConstants::NCh());
fChambers->SetOwner(kTRUE);
for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
for (Int_t stCH = 0; stCH < 2; stCH++) {
ch = 2 * st + stCH;
if (ch < AliMUONConstants::NTrackingCh()) {
fChambers->AddAt(new AliMUONChamber(ch),ch);
} else {
fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
}
}
}
Int_t runnumber = AliCDBManager::Instance()->GetRun();
fCalibrationData = new AliMUONCalibrationData(runnumber);
}
AliMUON::~AliMUON()
{
AliDebug(1,Form("dtor this=%p",this));
delete fChambers;
delete fGeometryBuilder;
delete fRawWriter;
delete fDigitMaker;
delete fHitStore;
delete fCalibrationData;
delete fDigitCalibrator;
}
void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
{
fGeometryBuilder->AddBuilder(geomBuilder);
}
const AliMUONGeometry* AliMUON::GetGeometry() const
{
if ( !fGeometryBuilder) {
AliWarningStream() << "GeometryBuilder not defined." << std::endl;
return 0;
}
return fGeometryBuilder->GetGeometry();
}
const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
{
const AliMUONGeometry* kGeometry = GetGeometry();
if ( !kGeometry) return 0;
return kGeometry->GetTransformer();
}
void
AliMUON::MakeBranch(Option_t* opt)
{
AliDebug(1,"");
TString sopt(opt);
if ( sopt != "H" ) return;
if (!fHitStore)
{
fHitStore = new AliMUONHitStoreV1;
if ( gAlice->GetMCApp() )
{
if ( gAlice->GetMCApp()->GetHitLists() )
{
gAlice->GetMCApp()->AddHitList(fHitStore->Collection());
}
}
}
TTree* treeH = fLoader->TreeH();
if (!treeH)
{
AliFatal("No TreeH");
}
fHitStore->Connect(*treeH);
}
void
AliMUON::SetTreeAddress()
{
}
void
AliMUON::ResetHits()
{
AliDebug(1,"");
if (fHitStore) fHitStore->Clear();
}
void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
{
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetChargeSlope(p1);
}
void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
{
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
}
void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
{
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
}
void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
{
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
}
void AliMUON::SetMaxStepGas(Float_t p1)
{
fMaxStepGas=p1;
}
void AliMUON::SetMaxStepAlu(Float_t p1)
{
fMaxStepAlu=p1;
}
void AliMUON::SetMaxDestepGas(Float_t p1)
{
fMaxDestepGas=p1;
}
void AliMUON::SetMaxDestepAlu(Float_t p1)
{
fMaxDestepAlu=p1;
}
Float_t AliMUON::GetMaxStepGas() const
{
return fMaxStepGas;
}
Float_t AliMUON::GetMaxStepAlu() const
{
return fMaxStepAlu;
}
Float_t AliMUON::GetMaxDestepGas() const
{
return fMaxDestepGas;
}
Float_t AliMUON::GetMaxDestepAlu() const
{
return fMaxDestepAlu;
}
void AliMUON::SetAlign(Bool_t align)
{
fGeometryBuilder->SetAlign(align);
}
void AliMUON::SetAlign(const TString& fileName, Bool_t align)
{
fGeometryBuilder->SetAlign(fileName, align);
}
void AliMUON::SetResponseModel(Int_t id, const AliMUONResponse& response)
{
((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
}
AliDigitizer* AliMUON::CreateDigitizer(AliDigitizationInput* digInput) const
{
AliMUONDigitizerV3* digitizer = new AliMUONDigitizerV3(digInput, fDigitizerWithNoise);
AliMUONDigitizerV3::SetNSigmas(fDigitizerNSigmas);
digitizer->SetCalibrationData(fCalibrationData,GetRecoParam());
return digitizer;
}
void AliMUON::SDigits2Digits()
{
char hname[30];
fLoader->TreeD()->Write(hname,TObject::kOverwrite);
fLoader->TreeD()->Reset();
}
void AliMUON::Hits2SDigits()
{
AliMUONSDigitizerV2 sdigitizer;
sdigitizer.Digitize();
}
void AliMUON::Digits2Raw()
{
AliRawDataHeaderSim header;
if (!fRawWriter)
{
fRawWriter = new AliMUONRawWriter;
AliDebug(1,Form("Creating %s",fRawWriter->ClassName()));
if (fTriggerScalerEvent == kTRUE)
{
fRawWriter->SetScalersNumbers();
}
}
fLoader->LoadDigits("READ");
TTree* treeD = fLoader->TreeD();
if (!treeD)
{
AliError("Could not get TreeD");
return;
}
AliMUONVTriggerStore* triggerStore = AliMUONVTriggerStore::Create(*treeD);
AliMUONVDigitStore* digitStore = AliMUONVDigitStore::Create(*treeD);
triggerStore->Connect(*treeD,kFALSE);
digitStore->Connect(*treeD,kFALSE);
treeD->GetEvent(0);
fRawWriter->SetHeader(header);
if (!fRawWriter->Digits2Raw(digitStore,triggerStore))
{
AliError("pb writting raw data");
}
delete triggerStore;
delete digitStore;
fLoader->UnloadDigits();
}
Bool_t AliMUON::Raw2SDigits(AliRawReader* rawReader)
{
if (!fLoader->TreeS()) fLoader->MakeSDigitsContainer();
TTree* treeS = fLoader->TreeS();
AliMUONVDigitStore* sDigitStore = AliMUONVDigitStore::Create(DigitStoreClassName());
AliMUONVTriggerStore* triggerStore = 0x0;
sDigitStore->Connect(*treeS);
if (!fDigitMaker) fDigitMaker = new AliMUONDigitMaker;
if (fConvertTrigger) {
triggerStore = new AliMUONTriggerStoreV1;
triggerStore->Connect(*treeS,true);
fDigitMaker->SetMakeTriggerDigits(true);
}
if (!fDigitCalibrator)
{
AliMUONRecoParam* recoParam = GetRecoParam();
if (!recoParam)
{
AliFatal("Cannot work without recoparams !");
}
fDigitCalibrator = new AliMUONDigitCalibrator(*fCalibrationData,recoParam);
}
fDigitMaker->Raw2Digits(rawReader,sDigitStore,triggerStore);
fDigitCalibrator->Calibrate(*sDigitStore);
TIter next(sDigitStore->CreateIterator());
AliMUONDigit* sdigit;
while ( ( sdigit = static_cast<AliMUONDigit*>(next()) ) )
{
sdigit->Calibrated(kFALSE);
}
treeS->Fill();
fLoader->WriteSDigits("OVERWRITE");
fLoader->UnloadSDigits();
delete sDigitStore;
delete triggerStore;
return kTRUE;
}
AliLoader* AliMUON::MakeLoader(const char* topfoldername)
{
AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
GetName(),topfoldername));
fLoader = new AliLoader(GetName(),topfoldername);
return fLoader;
}
void
AliMUON::ResetGeometryBuilder()
{
delete fGeometryBuilder;
fGeometryBuilder = new AliMUONGeometryBuilder(this);
fGeometryBuilder
->AddBuilder(new AliMUONCommonGeometryBuilder(this));
}
Int_t AliMUON::GetTriggerResponseV1() const
{
return fTriggerResponseV1;
}
Int_t AliMUON::GetTriggerCoinc44() const
{
return fTriggerCoinc44;
}
Bool_t AliMUON::GetTriggerEffCells() const
{
return fTriggerEffCells;
}
Int_t AliMUON::GetDigitizerWithNoise() const
{
return fDigitizerWithNoise;
}
AliMUONRecoParam* AliMUON::GetRecoParam() const
{
AliMUONRecoParam* recoParam = 0x0;
AliCDBEntry* entry = AliCDBManager::Instance()->Get("MUON/Calib/RecoParam");
if (entry)
{
if (!(recoParam = dynamic_cast<AliMUONRecoParam*>(entry->GetObject())))
{
TObjArray* recoParamArray = static_cast<TObjArray*>(entry->GetObject());
for(Int_t i = 0; i < recoParamArray->GetEntriesFast(); ++i)
{
recoParam = static_cast<AliMUONRecoParam*>(recoParamArray->UncheckedAt(i));
if (recoParam && recoParam->IsDefault()) break;
recoParam = 0x0;
}
}
}
return recoParam;
}