#include <TFolder.h>
#include <TTree.h>
#include <TVirtualMC.h>
+#include <TRandom.h>
// --- Standard library ---
// --- AliRoot header files ---
#include "AliMagF.h"
#include "AliPHOS.h"
-#include "AliPHOSLoader.h"
+#include "AliPHOSGetter.h"
#include "AliRun.h"
#include "AliPHOSDigitizer.h"
#include "AliPHOSSDigitizer.h"
fQATask = 0;
fTreeQA = 0;
fDebug = 0;
+ fRan = new TRandom(123456) ;
}
//____________________________________________________________________________
fQATask = 0;
fTreeQA = 0;
- fDebug = 0;
+ fDebug = 0;
+ fRan = new TRandom(123456) ;
}
//____________________________________________________________________________
AliPHOS::~AliPHOS()
{
-
+ delete fRan ;
}
//____________________________________________________________________________
}
-//____________________________________________________________________________
-void AliPHOS::Hits2SDigits()
-{
-// create summable digits
-
- AliPHOSSDigitizer* phosDigitizer =
- new AliPHOSSDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
- phosDigitizer->SetEventRange(0, -1) ; // do all the events
- phosDigitizer->ExecuteTask("all") ;
-}
-
-//____________________________________________________________________________
-AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
-{
-//different behaviour than standard (singleton getter)
-// --> to be discussed and made eventually coherent
- fLoader = new AliPHOSLoader(GetName(),topfoldername);
- return fLoader;
-}
-
-//____________________________________________________________________________
-void AliPHOS::SetTreeAddress()
-{
- // Links Hits in the Tree to Hits array
- TBranch *branch;
- char branchname[20];
- sprintf(branchname,"%s",GetName());
-
- // Branch address for hit tree
- TTree *treeH = TreeH();
- if (treeH) {
- branch = treeH->GetBranch(branchname);
- if (branch)
- {
- if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
- //Info("SetTreeAddress","<%s> Setting Hits Address",GetName());
- branch->SetAddress(&fHits);
- }
- }
-}
-
-//____________________________________________________________________________
-void AliPHOS::WriteQA()
-{
-
- // Make TreeQA in the output file.
-
- if(fTreeQA == 0)
- fTreeQA = new TTree("TreeQA", "QA Alarms") ;
- // Create Alarms branches
- Int_t bufferSize = 32000 ;
- Int_t splitlevel = 0 ;
-
- TFolder* topfold = GetLoader()->GetTopFolder(); //get top aliroot folder; skowron
- TString phosqafn(AliConfig::Instance()->GetQAFolderName()+"/"); //get name of QAaut folder relative to top event; skowron
- phosqafn+=GetName(); //hard wired string!!! add the detector name to the pathname; skowron
- TFolder * alarmsF = (TFolder*)topfold->FindObjectAny(phosqafn); //get the folder
-
- if (alarmsF == 0x0)
- {
- Error("WriteQA","Can not find folder with qa alarms");
- return;
- }
- TString branchName(alarmsF->GetName());
- TBranch * alarmsBranch = fTreeQA->Branch(branchName,"TFolder", &alarmsF, bufferSize, splitlevel);
- TString branchTitle = branchName + " QA alarms" ;
- alarmsBranch->SetTitle(branchTitle);
- alarmsBranch->Fill() ;
-
- //fTreeQA->Fill() ;
-}
-
//____________________________________________________________________________
void AliPHOS::Digits2Raw()
{
// convert digits of the current event to raw data
// get the digits
- ((AliPHOSLoader*) fLoader)->LoadDigits();
- TClonesArray* digits = ((AliPHOSLoader*) fLoader)->Digits();
+ AliPHOSGetter * gime = AliPHOSGetter::Instance(AliRunLoader::GetGAliceName()) ;
+ if (!gime) {
+ Error("Digits2Raw", "PHOS Getter not instantiated") ;
+ return ;
+ }
+ gime->Event(gime->EventNumber(), "D") ;
+ TClonesArray* digits = gime->Digits() ;
+
if (!digits) {
- Error("Digits2Raw", "no digits");
+ Error("Digits2Raw", "no digits found !");
return;
}
// get the geometry
- AliPHOSGeometry* geom = GetGeometry();
+ AliPHOSGeometry* geom = gime->PHOSGeometry();
if (!geom) {
- Error("Digits2Raw", "no geometry");
+ Error("Digits2Raw", "no geometry found !");
return;
}
// loop over digits (assume ordered digits)
for (Int_t iDigit = 0; iDigit < digits->GetEntries(); iDigit++) {
- AliPHOSDigit* digit = (AliPHOSDigit*) digits->At(iDigit);
- if (digit->GetAmp() < kThreshold) continue;
+ AliPHOSDigit* digit = gime->Digit(iDigit);
+ if (digit->GetAmp() < kThreshold)
+ continue;
Int_t relId[4];
geom->AbsToRelNumbering(digit->GetId(), relId);
Int_t module = relId[0];
- if (relId[1] != 0) continue; // ignore digits from CPV
+
+ // Begin FIXME
+ if (relId[1] != 0)
+ continue; // ignore digits from CPV
+ // End FIXME
+
+ // PHOS EMCA has 4 DDL per module. Splitting is done based on the row number
Int_t iDDL = 4 * (module - 1) + (4 * (relId[2] - 1)) / geom->GetNPhi();
// new DDL
}
// open new file and write dummy header
- char fileName[256];
- sprintf(fileName, "PHOS_%d.ddl", iDDL + kDDLOffset);
- buffer = new AliAltroBuffer(fileName, 1);
+ TString fileName("PHOS_") ;
+ fileName += (iDDL + kDDLOffset) ;
+ fileName += ".ddl" ;
+ buffer = new AliAltroBuffer(fileName.Data(), 1);
buffer->WriteDataHeader(kTRUE, kFALSE); //Dummy;
prevDDL = iDDL;
} else {
Bool_t highGain = kFALSE;
- // fill time bin values
+ // fill time bin values :
+ // 1. the signal starts at the time given by the digit
+ // 2. the rise is linear and the maximum is reached kTimePeak after start
+ // 3. the decay is gaussian with a sigma of kTimeRes
+ // 4. the signal is binned into kTimeBins bins
for (Int_t iTime = 0; iTime < kTimeBins; iTime++) {
Double_t time = iTime * kTimeMax/kTimeBins;
Int_t signal = 0;
- if (time < digit->GetTime() + kTimePeak) {
- signal = Int_t(0.5 + digit->GetAmp() *
+ if (time < digit->GetTime() + kTimePeak) { // signal is rising
+ signal = static_cast<Int_t>(fRan->Rndm() + digit->GetAmp() *
(time - digit->GetTime()) / kTimePeak);
- } else {
- signal = Int_t(0.5 + digit->GetAmp() *
+ } else { // signal is decaying
+ signal = static_cast<Int_t>(fRan->Rndm() + digit->GetAmp() *
TMath::Gaus(time, digit->GetTime() + kTimePeak, kTimeRes));
}
- if (signal < 0) signal = 0;
+ if (signal < 0)
+ signal = 0;
adcValuesLow[iTime] = signal;
- if (signal > 0x3FF) adcValuesLow[iTime] = 0x3FF;
+ if (signal > 0x3FF) // larger than 10 bits
+ adcValuesLow[iTime] = 0x3FF;
adcValuesHigh[iTime] = signal / kHighGainFactor;
- if (adcValuesHigh[iTime] > 0) highGain = kTRUE;
+ if (adcValuesHigh[iTime] > 0)
+ highGain = kTRUE;
}
// write low and eventually high gain channel
delete buffer;
}
- fLoader->UnloadDigits();
+ gime->PhosLoader()->UnloadDigits();
+}
+
+//____________________________________________________________________________
+void AliPHOS::Hits2SDigits()
+{
+// create summable digits
+
+ AliPHOSSDigitizer* phosDigitizer =
+ new AliPHOSSDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ;
+ phosDigitizer->SetEventRange(0, -1) ; // do all the events
+ phosDigitizer->ExecuteTask("all") ;
+}
+
+//____________________________________________________________________________
+AliLoader* AliPHOS::MakeLoader(const char* topfoldername)
+{
+//different behaviour than standard (singleton getter)
+// --> to be discussed and made eventually coherent
+ fLoader = new AliPHOSLoader(GetName(),topfoldername);
+ return fLoader;
+}
+
+//____________________________________________________________________________
+void AliPHOS::SetTreeAddress()
+{
+ // Links Hits in the Tree to Hits array
+ TBranch *branch;
+ char branchname[20];
+ sprintf(branchname,"%s",GetName());
+
+ // Branch address for hit tree
+ TTree *treeH = TreeH();
+ if (treeH) {
+ branch = treeH->GetBranch(branchname);
+ if (branch)
+ {
+ if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000);
+ //Info("SetTreeAddress","<%s> Setting Hits Address",GetName());
+ branch->SetAddress(&fHits);
+ }
+ }
+}
+
+//____________________________________________________________________________
+void AliPHOS::WriteQA()
+{
+
+ // Make TreeQA in the output file.
+
+ if(fTreeQA == 0)
+ fTreeQA = new TTree("TreeQA", "QA Alarms") ;
+ // Create Alarms branches
+ Int_t bufferSize = 32000 ;
+ Int_t splitlevel = 0 ;
+
+ TFolder* topfold = GetLoader()->GetTopFolder(); //get top aliroot folder; skowron
+ TString phosqafn(AliConfig::Instance()->GetQAFolderName()+"/"); //get name of QAaut folder relative to top event; skowron
+ phosqafn+=GetName(); //hard wired string!!! add the detector name to the pathname; skowron
+ TFolder * alarmsF = (TFolder*)topfold->FindObjectAny(phosqafn); //get the folder
+
+ if (alarmsF == 0x0)
+ {
+ Error("WriteQA","Can not find folder with qa alarms");
+ return;
+ }
+ TString branchName(alarmsF->GetName());
+ TBranch * alarmsBranch = fTreeQA->Branch(branchName,"TFolder", &alarmsF, bufferSize, splitlevel);
+ TString branchTitle = branchName + " QA alarms" ;
+ alarmsBranch->SetTitle(branchTitle);
+ alarmsBranch->Fill() ;
+
+ //fTreeQA->Fill() ;
}