#include <TObjArray.h>
#include <TPDGCode.h>
#include <TTree.h>
+#include <TMath.h>
#include "AliMUON.h"
#include "AliMUONChamber.h"
#include "AliMUONTransientDigit.h"
#include "AliRun.h"
#include "AliRunDigitizer.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
ClassImp(AliMUONDigitizerv1)
//___________________________________________
-AliMUONDigitizerv1::AliMUONDigitizerv1() :AliDigitizer()
+AliMUONDigitizerv1::AliMUONDigitizerv1() :
+ AliDigitizer(),
+ fHitMap(0),
+ fTDList(0),
+ fTDCounter(0),
+ fDebug(0),
+ fMask(0),
+ fSignal(0)
{
// Default ctor - don't use it
- fHitMap = 0;
- fTDList = 0;
if (GetDebug()>2)
cerr<<"AliMUONDigitizerv1::AliMUONDigitizerv1"
<<"(AliRunDigitizer* manager) was processed"<<endl;
}
//___________________________________________
-AliMUONDigitizerv1::AliMUONDigitizerv1(AliRunDigitizer* manager)
- :AliDigitizer(manager)
+AliMUONDigitizerv1::AliMUONDigitizerv1(AliRunDigitizer* manager):
+ AliDigitizer(manager),
+ fHitMap(0),
+ fTDList(0),
+ fTDCounter(0),
+ fDebug(0),
+ fMask(0),
+ fSignal(0)
{
// ctor which should be used
- fHitMap = 0;
- fTDList = 0;
- fDebug = 0;
- fHits = new TClonesArray("AliMUONHit",1000);
if (GetDebug()>2)
cerr<<"AliMUONDigitizerv1::AliMUONDigitizerv1"
<<"(AliRunDigitizer* manager) was processed"<<endl;
AliMUONDigitizerv1::~AliMUONDigitizerv1()
{
// Destructor
- delete fHits;
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Bool_t AliMUONDigitizerv1::Init()
{
+
// Initialization
+ if (GetDebug()>2) Info("Init","AliMUONDigitizerv1::Init() starts");
+
+ //Loaders (We assume input0 to be the output too)
+ AliRunLoader * runloader; // Input loader
+ AliLoader * gime;
+
+ // Getting runloader
+ runloader = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
+ if (runloader == 0x0) {
+ Error("Init","RunLoader is not in input file 0");
+ return kFALSE; // RunDigitizer is not working.
+ }
+ // Getting MUONloader
+ gime = runloader->GetLoader("MUONLoader");
+ gime->LoadHits("READ");
+ gime->LoadDigits("RECREATE");
+
return kTRUE;
}
pdigit->AddPhysicsSignal(iqpad);
// update list of tracks
//
- Int_t charge;
+ Int_t charge;
track=+ fMask;
if (fSignal) charge = iqpad;
- else charge = kBgTag;
+ //else charge = kBgTag;
+ else charge = iqpad + fMask;
+
pdigit->UpdateTrackList(track,charge);
}
"Charge " << digits[3] <<" " <<
"Hit " << digits[5] << endl;
// list of tracks
- Int_t charge;
+ Int_t charge;
track += fMask;
if (fSignal) charge = digits[3];
- else charge = kBgTag;
+ //else charge = kBgTag;
+ else charge = digits[3] + fMask;
+
if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::MakeTransientDigit Creating AliMUONTransientDigit"<<endl;
AliMUONTransientDigit * mTD = new AliMUONTransientDigit(ichamber, digits);
mTD->AddToTrackList(track,charge);
-
if (!ExistTransientDigit(mTD)) {
AddTransientDigit(mTD);
if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::MakeTransientDigit Adding TransientDigit"<<endl;
{
TString optionString = option;
if (optionString.Data() == "deb") {
- cout<<"AliMUONDigitizerv1::Exec: called with option deb "<<endl;
+ Info("Digitize","Called with option deb ");
fDebug = 3;
}
AliSegmentation* c1Segmentation; //Cathode plane c1 of the chamber
AliSegmentation* c2Segmentation; //Cathode place c2 of the chamber
- if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() starts"<<endl;
+ if (GetDebug()>2) Info("Digitize","AliMUONDigitizerv1::Digitize() starts");
fTDList = new TObjArray;
- // Getting Module MUON
- AliMUON *pMUON = (AliMUON *) gAlice->GetModule("MUON");
+ //Loaders (We assume input0 to be the output too)
+ AliRunLoader * runloader; // Input loader
+ AliLoader * gime;
+
+ // Getting runloader
+ runloader = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
+ if (runloader == 0x0) {
+ Error("Digitize","RunLoader is not in input file 0");
+ return; // RunDigitizer is not working.
+ }
+ // Getting MUONloader
+ gime = runloader->GetLoader("MUONLoader");
+ if (gime->TreeH()==0x0) {
+ if (GetDebug()>2) Info("Digitize","TreeH is not loaded yet. Loading...");
+ gime->LoadHits("READ");
+ if (GetDebug()>2) Info("Digitize","Now treeH is %#x. MUONLoader is %#x",gime->TreeH(),gime);
+ }
+
+ if (GetDebug()>2) Info("Digitize","Loaders ready");
+
+ if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
+ gAlice = runloader->GetAliRun();
+
+ // Getting Module MUON
+ AliMUON *pMUON = (AliMUON *) gAlice->GetDetector("MUON");
if (!pMUON) {
- cerr<<"AliMUONDigitizerv1::Digitize Error:"
- <<" module MUON not found in the input file"<<endl;
+ Error("Digitize","Module MUON not found in the input file");
return;
}
- // New branch for MUON digit in the tree of digits
- pMUON->MakeBranchInTreeD(fManager->GetTreeD());
+ // Getting Muon data
+ AliMUONData * muondata = pMUON->GetMUONData();
+ muondata->SetLoader(gime);
+ muondata->SetTreeAddress("H");
+
+ // Loading Event
+ Int_t currentevent = fManager->GetOutputEventNr();
+
+ if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() Event Number is "<<currentevent <<endl;
+ if ( (currentevent<10) ||
+ (Int_t(TMath::Log10(currentevent)) == TMath::Log10(currentevent) ) )
+ cout <<"ALiMUONDigitizerv1::Digitize() Event Number is "<< currentevent <<endl;
+
+ // Output file for digits same as hits
+ // AliRunLoader * runloaderout = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
+ //AliLoader * gimeout = runloaderout->GetLoader("MUONLoader");
+ // New branch per chamber for MUON digit in the tree of digits
+ if (gime->TreeD() == 0x0) {
+ gime->MakeDigitsContainer();
+ }
+ TTree* treeD = gime->TreeD();
+ muondata->MakeBranch("D");
+ muondata->SetTreeAddress("D");
// Array of pointer of the AliMUONHitMapA1:
// two HitMaps per chamber, or one HitMap per cahtode plane
// Loop over files to merge and to digitize
fSignal = kTRUE;
for (Int_t inputFile=0; inputFile<fManager->GetNinputs(); inputFile++) {
+ if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() Input File is "<<inputFile<<endl;
+
+
// Connect MUON Hit branch
- if (inputFile > 0 ) fSignal = kFALSE;
- TBranch *branchHits = 0;
- TTree *treeH = fManager->GetInputTreeH(inputFile);
+ if (inputFile > 0 ) {
+ fSignal = kFALSE;
+ runloader = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
+ if (runloader == 0x0) {
+ cerr<<"AliMUONDigitizerv1::Digitize() RunLoader for inputFile "<<inputFile<< " not found !!! "<<endl;
+ }
+ gime = runloader->GetLoader("MUONLoader");
+ if (gime->TreeH() == 0x0) gime->LoadHits("READ");
+ muondata->SetLoader(gime);
+ muondata->SetTreeAddress("H");
+ }
+
+ // Setting the address
+ TTree *treeH = gime->TreeH();
+ if (treeH == 0x0) {
+ Error("Digitize","Can not get TreeH from input %d",inputFile);
+ Info("Digitize","Now treeH is %#x. MUONLoader is %#x",gime->TreeH(),gime);
+ return;
+ }
if (GetDebug()>2) {
cerr<<"AliMUONDigitizerv1::Exec inputFile is "<<inputFile<<" "<<endl;
- cerr<<"AliMUONDigitizerv1::Exec treeH, fHits "<<treeH<<" "<<fHits<<endl;
- }
- if (treeH && fHits) {
- branchHits = treeH->GetBranch("MUON");
- if (branchHits) {
- fHits->Delete();
- branchHits->SetAddress(&fHits);
- }
- else
- Error("Exec","branch MUON was not found");
+ cerr<<"AliMUONDigitizerv1::Exec treeH" << treeH <<endl;
}
- if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec branchHits = "<<branchHits<<endl;
+
+ if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec Setting tree addresses"<<endl;
fMask = fManager->GetMask(inputFile);
//
Int_t ntracks = (Int_t) treeH->GetEntries();
for (itrack = 0; itrack < ntracks; itrack++) {
if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec itrack = "<<itrack<<endl;
- fHits->Clear();
- branchHits->GetEntry(itrack);
+ muondata->ResetHits();
+ treeH->GetEvent(itrack);
//
// Loop over hits
Int_t ihit, ichamber;
AliMUONHit* mHit;
- for(ihit = 0; ihit < fHits->GetEntriesFast(); ihit++) {
- mHit = static_cast<AliMUONHit*>(fHits->At(ihit));
+ TClonesArray* hits = muondata->Hits();
+ for(ihit = 0; ihit < hits->GetEntriesFast(); ihit++) {
+ mHit = static_cast<AliMUONHit*>(hits->At(ihit));
ichamber = mHit->Chamber()-1; // chamber number
if (ichamber > AliMUONConstants::NCh()-1) {
cerr<<"AliMUONDigitizer: ERROR: "
} // end file loop
if (GetDebug()>2) cerr<<"AliMUONDigitizer::Exec End of hits, track and file loops"<<endl;
- //
- // Filling Digit List
- Int_t tracks[kMAXTRACKS];
- Int_t charges[kMAXTRACKS];
- Int_t nentries = fTDList->GetEntriesFast();
- Int_t digits[6];
- for (Int_t nent = 0; nent < nentries; nent++) {
- AliMUONTransientDigit *address = (AliMUONTransientDigit*)fTDList->At(nent);
- if (address == 0) continue;
- Int_t ich = address->Chamber();
- Int_t q = address->Signal();
- chamber = &(pMUON->Chamber(ich));
+ // Loop on cathodes
+ Int_t icat;
+ for(icat=0; icat<2; icat++) {
//
- // Digit Response (noise, threshold, saturation, ...)
- AliMUONResponse * response = chamber->ResponseModel();
- q = response->DigitResponse(q,address);
-
- if (!q) continue;
-
- digits[0] = address->PadX();
- digits[1] = address->PadY();
- digits[2] = address->Cathode();
- digits[3] = q;
- digits[4] = address->Physics();
- digits[5] = address->Hit();
-
- Int_t nptracks = address->GetNTracks();
-
- if (nptracks > kMAXTRACKS) {
- if (GetDebug() >0) {
- cerr<<"AliMUONDigitizer:Exec nptracks > 10 "<<nptracks;
- cerr<<"reset to max value "<<kMAXTRACKS<<endl;
+ // Filling Digit List
+ Int_t tracks[kMAXTRACKS];
+ Int_t charges[kMAXTRACKS];
+ Int_t nentries = fTDList->GetEntriesFast();
+ Int_t digits[6];
+ for (Int_t nent = 0; nent < nentries; nent++) {
+ AliMUONTransientDigit *address = (AliMUONTransientDigit*)fTDList->At(nent);
+ if (address == 0) continue;
+ Int_t ich = address->Chamber();
+ Int_t q = address->Signal();
+ chamber = &(pMUON->Chamber(ich));
+ //
+ // Digit Response (noise, threshold, saturation, ...)
+ AliMUONResponse * response = chamber->ResponseModel();
+ q = response->DigitResponse(q,address);
+
+ if (!q) continue;
+
+ digits[0] = address->PadX();
+ digits[1] = address->PadY();
+ digits[2] = address->Cathode()-1;
+ digits[3] = q;
+ digits[4] = address->Physics();
+ digits[5] = address->Hit();
+
+ Int_t nptracks = address->GetNTracks();
+
+ if (nptracks > kMAXTRACKS) {
+ if (GetDebug() >0) {
+ cerr<<"AliMUONDigitizer:Exec nptracks > 10 "<<nptracks;
+ cerr<<"reset to max value "<<kMAXTRACKS<<endl;
+ }
+ nptracks = kMAXTRACKS;
}
- nptracks = kMAXTRACKS;
- }
- if (nptracks > 2 && GetDebug() >2) {
- cerr<<"AliMUONDigitizer::Exec nptracks > 2 "<<nptracks<<endl;
- // printf("cat,ich,ix,iy,q %d %d %d %d %d \n",icat,ich,digits[0],digits[1],q);
- }
- for (Int_t tr = 0; tr < nptracks; tr++) {
- tracks[tr] = address->GetTrack(tr);
- charges[tr] = address->GetCharge(tr);
- } //end loop over list of tracks for one pad
- // Sort list of tracks according to charge
- if (nptracks > 1) {
- SortTracks(tracks,charges,nptracks);
- }
- if (nptracks < kMAXTRACKS ) {
- for (Int_t i = nptracks; i < kMAXTRACKS; i++) {
- tracks[i] = 0;
- charges[i] = 0;
+ if (nptracks > 2 && GetDebug() >2) {
+ cerr<<"AliMUONDigitizer::Exec nptracks > 2 "<<nptracks<<endl;
+ // printf("cat,ich,ix,iy,q %d %d %d %d %d \n",icat,ich,digits[0],digits[1],q);
+ }
+ for (Int_t tr = 0; tr < nptracks; tr++) {
+ tracks[tr] = address->GetTrack(tr);
+ charges[tr] = address->GetCharge(tr);
+ } //end loop over list of tracks for one pad
+ // Sort list of tracks according to charge
+ if (nptracks > 1) {
+ SortTracks(tracks,charges,nptracks);
+ }
+ if (nptracks < kMAXTRACKS ) {
+ for (Int_t i = nptracks; i < kMAXTRACKS; i++) {
+ tracks[i] = -1;
+ charges[i] = 0;
+ }
}
+
+ // Add digits
+ if (GetDebug()>3) cerr<<"AliMUONDigitzerv1::Exex TransientDigit to Digit"<<endl;
+ if ( digits[2] == icat ) muondata->AddDigit(ich,tracks,charges,digits);
+// printf("test rm ich %d padX %d padY %d \n",ich, digits[0], digits[1]);
}
-
- // fill digits
- if (GetDebug()>2) cerr<<"AliMUONDigitzerv1::Exex TransientDigit to Digit"<<endl;
- pMUON->AddDigits(ich,tracks,charges,digits);
- }
- fManager->GetTreeD()->Fill();
- pMUON->ResetDigits(); //
- fTDList->Delete();
+ // Filling list of digits per chamber for a given cathode.
+ muondata->Fill("D");
+ muondata->ResetDigits();
+ } // end loop cathode
+ fTDList->Delete();
for(Int_t ii = 0; ii < 2*AliMUONConstants::NCh(); ++ii) {
if (fHitMap[ii]) {
if (GetDebug()>2)
cerr<<"AliMUONDigitizer::Exec: writing the TreeD: "
- <<fManager->GetTreeD()->GetName()<<endl;
- fManager->GetTreeD()->Write(0,TObject::kOverwrite);
+ <<treeD->GetName()<<endl;
+
+ gime->WriteDigits("OVERWRITE");
delete [] fHitMap;
delete fTDList;
-
- if (fHits) fHits->Clear();
+ muondata->ResetHits();
+ gime->UnloadHits();
+ gime->UnloadDigits();
}
-
//------------------------------------------------------------------------
void AliMUONDigitizerv1::SortTracks(Int_t *tracks,Int_t *charges,Int_t ntr)
{
if(qmax > 0) {
idx[i]=jmax;
jch[i]=charges[jmax];
- jtr[i]=tracks[jmax];
+ jtr[i]=tracks[jmax];
}
}