X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PHOS%2FAliPHOS.cxx;h=34b1634e9fd81099855c0c06ec70f84db3b2cc39;hb=39f9963faf67a511516c176c9a9112a156cd8ceb;hp=443e1ddc9e56846309ce6d89884864e5cde0a486;hpb=e84be1eb692949ff6b5b116a63b2ce10c5336ad3;p=u%2Fmrichter%2FAliRoot.git diff --git a/PHOS/AliPHOS.cxx b/PHOS/AliPHOS.cxx index 443e1ddc9e5..34b1634e9fd 100644 --- a/PHOS/AliPHOS.cxx +++ b/PHOS/AliPHOS.cxx @@ -12,1138 +12,517 @@ * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ +/* $Id$ */ + +//_________________________________________________________________________ +// Base Class for PHOS description: +// PHOS consists of a PbWO4 calorimeter (EMCA) and a gazeous charged +// particles detector (CPV or PPSD). +// The only provided method here is CreateMaterials, +// which defines the materials common to all PHOS versions. +// +//*-- Author: Laurent Aphecetche & Yves Schutz (SUBATECH) +////////////////////////////////////////////////////////////////////////////// -/* -$Log$ -Revision 1.10 1999/12/09 14:57:51 fca -Removal of obsolete PHOS code - -Revision 1.9 1999/11/08 07:12:31 fca -Minor corrections thanks to I.Hrivnacova - -Revision 1.8 1999/09/29 09:24:23 fca -Introduction of the Copyright and cvs Log - -*/ -//////////////////////////////////////////////// -// Manager and hits classes for set:PHOS // -//////////////////////////////////////////////// - // --- ROOT system --- -#include "TH1.h" -#include "TRandom.h" -#include "TFile.h" -#include "TTree.h" -#include "TBRIK.h" -#include "TNode.h" -#include "TMath.h" +class TFile; +#include +#include +#include // --- Standard library --- -#include -#include -#include -#include -// --- galice header files --- +// --- AliRoot header files --- +#include "AliMagF.h" +#include "AliESDtrack.h" +#include "AliESD.h" #include "AliPHOS.h" +#include "AliPHOSGetter.h" +#include "AliPHOSQAChecker.h" #include "AliRun.h" - -//______________________________________________________________________________ - - +#include "AliPHOSDigitizer.h" +#include "AliPHOSSDigitizer.h" +#include "AliPHOSReconstructor.h" ClassImp(AliPHOS) - -//______________________________________________________________________________ - -AliPHOS::~AliPHOS(void) +//____________________________________________________________________________ +AliPHOS:: AliPHOS() : AliDetector() { - delete fHits; // 28.12.1998 - delete fTreePHOS; // 28.12.1998 - fCradles->Delete(); - delete fCradles; + // Default ctor + fName="PHOS"; + fQATask = 0; + fTreeQA = 0; + fDebug = kFALSE ; } -//______________________________________________________________________________ - -AliPHOS::AliPHOS() : - fDebugLevel (0), - fTreePHOS (NULL), - fBranchNameOfCradles ("AliPHOSCradles"), - fTreeName ("PHOS") -{ - fIshunt = 0; - - if( NULL==(fCradles=new TObjArray) ) - { - Error("AliPHOS","Can not create fCradles"); - exit(1); - } - DefPars(); -} - -//______________________________________________________________________________ - -AliPHOS::AliPHOS(const char *name, const char *title) - : AliDetector (name,title), - fDebugLevel (0), - fTreePHOS (NULL), - fBranchNameOfCradles ("AliPHOSCradles"), - fTreeName ("PHOS") +//____________________________________________________________________________ +AliPHOS::AliPHOS(const char* name, const char* title): AliDetector(name, title) { -//Begin_Html -/* - -*/ -//End_Html - - fHits = new TClonesArray("AliPHOShit", 405); - - fIshunt = 0; - - SetMarkerColor(kGreen); - SetMarkerStyle(2); - SetMarkerSize(0.4); - - if( NULL==(fCradles=new TObjArray) ) { - Error("AliPHOS","Can not create fCradles"); - exit(1); - } - DefPars(); -} - -//______________________________________________________________________________ - -void AliPHOS::DefPars() -{ - PHOSflags[0]=0; - PHOSflags[1]=1; - PHOSflags[2]=0; - PHOSflags[3]=0; - PHOSflags[4]=0; - PHOSflags[5]=0; - PHOSflags[6]=0; - PHOSflags[7]=0; - PHOSflags[8]=0; - PHOScell[0]=2.2; - PHOScell[1]=18.; - PHOScell[2]=0.01; - PHOScell[3]=0.01; - PHOScell[4]=1.0; - PHOScell[5]=0.1; - PHOScell[6]=0.; - PHOScell[7]=0.; - PHOScell[8]=0.; - PHOSradius=460.; - PHOSsize[0]=104; - PHOSsize[1]=88; - PHOSsize[2]=4; - PHOScradlesA=0.; - PHOSextra[0]=0.001; - PHOSextra[1]=6.95; - PHOSextra[2]=4.; - PHOSextra[3]=5.; - PHOSextra[4]=2.; - PHOSextra[5]=0.06; - PHOSextra[6]=10.; - PHOSextra[7]=3.; - PHOSextra[8]=1.; - PHOSTXW[0]=209.; - PHOSTXW[1]=71.; - PHOSTXW[2]=250.; - PHOSAIR[0]=206.; - PHOSAIR[1]=66.; - PHOSAIR[2]=244.; - PHOSFTI[0]=214.6; - PHOSFTI[1]=80.; - PHOSFTI[2]=260.; - PHOSFTI[3]=467.; + // ctor : title is used to identify the layout + + fQATask = 0; + fTreeQA = 0; + fDebug = kFALSE ; } -//______________________________________________________________________________ -void AliPHOS::AddHit(Int_t track, Int_t *vol, Float_t *hits) -{ - TClonesArray &lhits = *fHits; - new(lhits[fNhits++]) AliPHOShit(fIshunt,track,vol,hits); +//____________________________________________________________________________ +AliPHOS::~AliPHOS() +{ + } - -//___________________________________________ -void AliPHOS::BuildGeometry() -{ - TNode *Node, *Top; - - const int kColorPHOS = kRed; - // - Top=gAlice->GetGeometry()->GetNode("alice"); - - - // PHOS - Float_t pphi=12.9399462; - new TRotMatrix("rot988","rot988",90,-3*pphi,90,90-3*pphi,0,0); - new TRotMatrix("rot989","rot989",90,- pphi,90,90- pphi,0,0); - new TRotMatrix("rot990","rot990",90, pphi,90,90+ pphi,0,0); - new TRotMatrix("rot991","rot991",90, 3*pphi,90,90+3*pphi,0,0); - new TBRIK("S_PHOS","PHOS box","void",107.3,40,130); - Top->cd(); - Node = new TNode("PHOS1","PHOS1","S_PHOS",-317.824921,-395.014343,0,"rot988"); - Node->SetLineColor(kColorPHOS); - fNodes->Add(Node); - Top->cd(); - Node = new TNode("PHOS2","PHOS2","S_PHOS",-113.532333,-494.124908,0,"rot989"); - fNodes->Add(Node); - Node->SetLineColor(kColorPHOS); - Top->cd(); - Node = new TNode("PHOS3","PHOS3","S_PHOS", 113.532333,-494.124908,0,"rot990"); - Node->SetLineColor(kColorPHOS); - fNodes->Add(Node); - Top->cd(); - Node = new TNode("PHOS4","PHOS4","S_PHOS", 317.824921,-395.014343,0,"rot991"); - Node->SetLineColor(kColorPHOS); - fNodes->Add(Node); -} - -//___________________________________________ -void AliPHOS::CreateMaterials() +//____________________________________________________________________________ +void AliPHOS::Copy(AliPHOS & phos) { -// *** DEFINITION OF AVAILABLE PHOS MATERIALS *** - -// CALLED BY : PHOS_MEDIA -// ORIGIN : NICK VAN EIJNDHOVEN - - - - Int_t ISXFLD = gAlice->Field()->Integ(); - Float_t SXMGMX = gAlice->Field()->Max(); - -// --- The PbWO4 crystals --- - Float_t ax[3] = { 207.19,183.85,16. }; - Float_t zx[3] = { 82.,74.,8. }; - Float_t wx[3] = { 1.,1.,4. }; - Float_t dx = 8.28; -// --- Stainless Steel --- - Float_t as[5] = { 55.847,12.011,51.9961,58.69,28.0855 }; - Float_t zs[5] = { 26.,6.,24.,28.,14. }; - Float_t ws[5] = { .6392,8e-4,.2,.14,.02 }; - Float_t ds = 8.; -// --- The polysterene scintillator (CH) --- - Float_t ap[2] = { 12.011,1.00794 }; - Float_t zp[2] = { 6.,1. }; - Float_t wp[2] = { 1.,1. }; - Float_t dp = 1.032; -// --- Tyvek (CnH2n) - Float_t at[2] = { 12.011,1.00794 }; - Float_t zt[2] = { 6.,1. }; - Float_t wt[2] = { 1.,2. }; - Float_t dt = .331; -// --- Polystyrene foam --- - Float_t af[2] = { 12.011,1.00794 }; - Float_t zf[2] = { 6.,1. }; - Float_t wf[2] = { 1.,1. }; - Float_t df = .12; -//--- Foam thermo insulation (actual chemical composition unknown yet!) --- - Float_t ati[2] = { 12.011,1.00794 }; - Float_t zti[2] = { 6.,1. }; - Float_t wti[2] = { 1.,1. }; - Float_t dti = .1; -// --- Textolit (actual chemical composition unknown yet!) --- - Float_t atx[2] = { 12.011,1.00794 }; - Float_t ztx[2] = { 6.,1. }; - Float_t wtx[2] = { 1.,1. }; - Float_t dtx = 1.83; - - Int_t *idtmed = fIdtmed->GetArray()-699; - - AliMixture( 0, "PbWO4$", ax, zx, dx, -3, wx); - AliMixture( 1, "Polystyrene$", ap, zp, dp, -2, wp); - AliMaterial( 2, "Al$", 26.98, 13., 2.7, 8.9, 999); -// --- Absorption length^ is ignored --- - AliMixture( 3, "Tyvek$", at, zt, dt, -2, wt); - AliMixture( 4, "Foam$", af, zf, df, -2, wf); - AliMixture( 5, "Stainless Steel$", as, zs, ds, 5, ws); - AliMaterial( 6, "Si$", 28.09, 14., 2.33, 9.36, 42.3); - AliMixture( 7, "Thermo Insul.$", ati, zti, dti, -2, wti); - AliMixture( 8, "Textolit$", atx, ztx, dtx, -2, wtx); - AliMaterial(99, "Air$", 14.61, 7.3, .001205, 30420., 67500); - - AliMedium(0, "PHOS Xtal $", 0, 1, ISXFLD, SXMGMX, 10., .1, .1, .1, .1); - AliMedium(2, "Al parts $", 2, 0, ISXFLD, SXMGMX, 10., .1, .1, .001, .001); - AliMedium(3, "Tyvek wrapper$", 3, 0, ISXFLD, SXMGMX, 10., .1, .1, .001, .001); - AliMedium(4, "Polyst. foam $", 4, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1); - AliMedium(5, "Steel cover $", 5, 0, ISXFLD, SXMGMX, 10., .1, .1, 1e-4, 1e-4); - AliMedium(6, "Si PIN $", 6, 0, ISXFLD, SXMGMX, 10., .1, .1, .01, .01); - AliMedium(7, "Thermo Insul.$", 7, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1); - AliMedium(8, "Textolit $", 8, 0, ISXFLD, SXMGMX, 10., .1, .1, .1, .1); - AliMedium(99, "Air $",99, 0, ISXFLD, SXMGMX, 10., 1., .1, .1, 10); - -// --- Generate explicitly delta rays in the steel cover --- - gMC->Gstpar(idtmed[704], "LOSS", 3.); - gMC->Gstpar(idtmed[704], "DRAY", 1.); -// --- and in aluminium parts --- - gMC->Gstpar(idtmed[701], "LOSS", 3.); - gMC->Gstpar(idtmed[701], "DRAY", 1.); + TObject::Copy(phos) ; + // fQATask = AliPHOSQAChecker::Copy(*(phos.fQATask)) ; + phos.fTreeQA = fTreeQA->CloneTree() ; } - -//______________________________________________________________________________ -void AliPHOS::AddPHOSCradles() +//____________________________________________________________________________ +AliDigitizer* AliPHOS::CreateDigitizer(AliRunDigitizer* manager) const { - Int_t i; - for(i=0;iGetEntries(); - fCradles->Add(new AliPHOSCradle( IsVersion(), // geometry. - GetCrystalSideSize (), - GetCrystalLength (), - GetWrapThickness (), - GetAirThickness (), - GetPIN_SideSize (), - GetPIN_Length (), - GetRadius (), - GetNz (), - GetNphi (), - GetCradleAngle (i))); - - if( n+1 != fCradles->GetEntries() || NULL == fCradles->At(n) ) - { - cout << " Can not create or add AliPHOSCradle.\n"; - exit(1); - } - } + return new AliPHOSDigitizer(manager); } -//______________________________________________________________________________ - -Int_t AliPHOS::DistancetoPrimitive(Int_t , Int_t ) -{ - return 9999; -} - -//___________________________________________ -void AliPHOS::Init() -{ - Int_t i; - // - printf("\n"); - for(i=0;i<35;i++) printf("*"); - printf(" PHOS_INIT "); - for(i=0;i<35;i++) printf("*"); - printf("\n"); - // - // Here the ABSO initialisation code (if any!) - for(i=0;i<80;i++) printf("*"); - printf("\n"); -} - -//______________________________________________________________________________ - -void AliPHOS::MakeBranch(Option_t *) +//____________________________________________________________________________ +void AliPHOS::CreateMaterials() { -// ROOT output initialization to ROOT file. -// -// AliDetector::MakeBranch() is always called. -// -// There will be also special tree "PHOS" with one branch "AliPHOSCradles" -// if it was set next flag in the galice card file: -// * PHOSflags: YES: X<>0 NO: X=0 -// * PHOSflags(1) : -----X. Create branch for TObjArray of AliPHOSCradle -// Examples: -// PHOSflags 1. -// PHOSflags 636301. -// In that case special bit CradlesBranch_Bit will be set for AliPHOS - - AliDetector::MakeBranch(); - - int i; - float t = GetPHOS_flag(0)/10; - i = (int) t; - i = (int) ((t-i)*10); - if( !i ) - return; - - SetBit(CradlesBranch_Bit); - - if( NULL==(fTreePHOS=new TTree(fTreeName.Data(),"PHOS events tree")) ) - { - Error("MakeBranch","Can not create TTree"); - exit(1); - } + // Definitions of materials to build PHOS and associated tracking media. + // media number in idtmed are 699 to 798. - if( NULL==fTreePHOS->GetCurrentFile() ) - { - Error("MakeBranch","There is no opened ROOT file"); - exit(1); - } + // --- The PbWO4 crystals --- + Float_t aX[3] = {207.19, 183.85, 16.0} ; + Float_t zX[3] = {82.0, 74.0, 8.0} ; + Float_t wX[3] = {1.0, 1.0, 4.0} ; + Float_t dX = 8.28 ; - // Create a new branch in the current Root Tree. + AliMixture(0, "PbWO4$", aX, zX, dX, -3, wX) ; - if( NULL==fTreePHOS->Branch(fBranchNameOfCradles.Data(),"TObjArray",&fCradles,4000,0) ) - { - Error("MakeBranch","Can not create branch"); - exit(1); - } - printf("The branch %s has been created\n",fBranchNameOfCradles.Data()); -} + // --- The polysterene scintillator (CH) --- + Float_t aP[2] = {12.011, 1.00794} ; + Float_t zP[2] = {6.0, 1.0} ; + Float_t wP[2] = {1.0, 1.0} ; + Float_t dP = 1.032 ; -//______________________________________________________________________________ + AliMixture(1, "Polystyrene$", aP, zP, dP, -2, wP) ; -void AliPHOS::SetTreeAddress(void) -{ -// ROOT input initialization. -// -// AliDetector::SetTreeAddress() is always called. -// -// If CradlesBranch_Bit is set (see AliPHOS::MakeBranch) than fTreePHOS is -// initilized. - - AliDetector::SetTreeAddress(); - - if( !TestBit(CradlesBranch_Bit) ) - return; - - if( NULL==(fTreePHOS=(TTree*)gDirectory->Get((char*)(fTreeName.Data())) ) ) - { - Error("SetTreeAddress","Can not find Tree \"%s\"\n",fTreeName.Data()); - exit(1); - } + // --- Aluminium --- + AliMaterial(2, "Al$", 26.98, 13., 2.7, 8.9, 999., 0, 0) ; + // --- Absorption length is ignored ^ - TBranch *branch = fTreePHOS->GetBranch(fBranchNameOfCradles.Data()); - if( NULL==branch ) - { - Error("SetTreeAddress","Can not find branch %s in TTree:%s",fBranchNameOfCradles.Data(),fTreeName.Data()); - exit(1); - } + // --- Tyvek (CnH2n) --- + Float_t aT[2] = {12.011, 1.00794} ; + Float_t zT[2] = {6.0, 1.0} ; + Float_t wT[2] = {1.0, 2.0} ; + Float_t dT = 0.331 ; - branch->SetAddress(&fCradles); -} + AliMixture(3, "Tyvek$", aT, zT, dT, -2, wT) ; -//______________________________________________________________________________ + // --- Polystyrene foam --- + Float_t aF[2] = {12.011, 1.00794} ; + Float_t zF[2] = {6.0, 1.0} ; + Float_t wF[2] = {1.0, 1.0} ; + Float_t dF = 0.12 ; -AliPHOSCradle *AliPHOS::GetCradleOfTheParticle(const TVector3 &p,const TVector3 &v) const -{ -// For a given direction 'p' and source point 'v' returns pointer to AliPHOSCradle -// in that direction or NULL if AliPHOSCradle was not found. + AliMixture(4, "Foam$", aF, zF, dF, -2, wF) ; - for( int m=0; mGetEntries(); m++ ) - { - AliPHOS *PHOS = (AliPHOS *)this; // Removing 'const'... - AliPHOSCradle *cradle = (AliPHOSCradle *)PHOS->fCradles->operator[](m); + // --- Titanium --- + Float_t aTIT[3] = {47.88, 26.98, 54.94} ; + Float_t zTIT[3] = {22.0, 13.0, 25.0} ; + Float_t wTIT[3] = {69.0, 6.0, 1.0} ; + Float_t dTIT = 4.5 ; - float x,y,l; - const float d = cradle->GetRadius(); - cradle->GetXY(p,v,d,x,y,l); + AliMixture(5, "Titanium$", aTIT, zTIT, dTIT, -3, wTIT); - if( l>0 && TMath::Abs(x)GetNz ()*cradle->GetCellSideSize()/2 - && TMath::Abs(y)GetNphi()*cradle->GetCellSideSize()/2 ) - return cradle; - } + // --- Silicon --- + AliMaterial(6, "Si$", 28.0855, 14., 2.33, 9.36, 42.3, 0, 0) ; - return NULL; -} -//______________________________________________________________________________ -void AliPHOS::Reconstruction(Float_t signal_step, UInt_t min_signal_reject) -{ -// Call AliPHOSCradle::Reconstruction(Float_t signal_step, UInt_t min_signal_reject) -// for all AliPHOSCradles. + // --- Foam thermo insulation --- + Float_t aTI[2] = {12.011, 1.00794} ; + Float_t zTI[2] = {6.0, 1.0} ; + Float_t wTI[2] = {1.0, 1.0} ; + Float_t dTI = 0.04 ; - for( int i=0; iGetEntries(); i++ ) - GetCradle(i).Reconstruction(signal_step,min_signal_reject); -} + AliMixture(7, "Thermo Insul.$", aTI, zTI, dTI, -2, wTI) ; -//______________________________________________________________________________ + // --- Textolitn --- + Float_t aTX[4] = {16.0, 28.09, 12.011, 1.00794} ; + Float_t zTX[4] = {8.0, 14.0, 6.0, 1.0} ; + Float_t wTX[4] = {292.0, 68.0, 462.0, 736.0} ; + Float_t dTX = 1.75 ; -void AliPHOS::ResetDigits(void) -{ - AliDetector::ResetDigits(); + AliMixture(8, "Textolit$", aTX, zTX, dTX, -4, wTX) ; - for( int i=0; iGetEntries(); i++ ) - ((AliPHOSCradle*)(*fCradles)[i]) -> Clear(); -} + //--- FR4 --- + Float_t aFR[3] = {28.0855, 15.9994, 17.749} ; + Float_t zFR[3] = {14., 8., 8.875} ; + Float_t wFR[3] = {.28, .32, .4} ; + Float_t dFR = 1.8 ; -//______________________________________________________________________________ + AliMixture(9, "FR4$", aFR, zFR, dFR, -3, wFR) ; -void AliPHOS::FinishEvent(void) -{ -// Called at the end of each 'galice' event. + // --- The Composite Material for micromegas (so far polyetylene) --- + Float_t aCM[2] = {12.01, 1.} ; + Float_t zCM[2] = {6., 1.} ; + Float_t wCM[2] = {1., 2.} ; + Float_t dCM = 0.935 ; - if( NULL!=fTreePHOS ) - fTreePHOS->Fill(); -} + AliMixture(10, "Compo Mat$", aCM, zCM, dCM, -2, wCM) ; -//______________________________________________________________________________ + // --- Copper --- + AliMaterial(11, "Cu$", 63.546, 29, 8.96, 1.43, 14.8, 0, 0) ; + + // --- G10 : Printed Circuit material --- + Float_t aG10[4] = { 12., 1., 16., 28.} ; + Float_t zG10[4] = { 6., 1., 8., 14.} ; + Float_t wG10[4] = { .259, .288, .248, .205} ; + Float_t dG10 = 1.7 ; + + AliMixture(12, "G10$", aG10, zG10, dG10, -4, wG10); -void AliPHOS::FinishRun(void) -{ -} + // --- Lead --- + AliMaterial(13, "Pb$", 207.2, 82, 11.35, 0.56, 0., 0, 0) ; -//______________________________________________________________________________ + // --- The gas mixture --- + // Co2 + Float_t aCO[2] = {12.0, 16.0} ; + Float_t zCO[2] = {6.0, 8.0} ; + Float_t wCO[2] = {1.0, 2.0} ; + Float_t dCO = 0.001977 ; -void AliPHOS::Print(Option_t *opt) -{ -// Print PHOS information. -// For each AliPHOSCradle the function AliPHOSCradle::Print(opt) is called. + AliMixture(14, "CO2$", aCO, zCO, dCO, -2, wCO); - AliPHOS &PHOS = *(AliPHOS *)this; // Removing 'const'... + // Ar + Float_t dAr = 0.001782 ; + AliMaterial(15, "Ar$", 39.948, 18.0, dAr, 14.0, 0., 0, 0) ; + + // ArCo2 + Char_t namate[21]=""; + Float_t aGM[2] ; + Float_t zGM[2] ; + Float_t wGM[2] ; + Float_t dGM ; - for( int i=0; iGetEntries(); i++ ) - { - printf("PHOS cradle %d from %d\n",i+1, fCradles->GetEntries()); - PHOS.GetCradle(i).Print(opt); - printf( "---------------------------------------------------\n"); - } -} + Float_t absL, radL, density ; + Float_t buf[1] ; + Int_t nbuf ; -//______________________________________________________________________________ -void AliPHOS::SetFlags(Float_t p1,Float_t p2,Float_t p3,Float_t p4, - Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9) -{ - PHOSflags[0]=p1; - PHOSflags[1]=p2; - PHOSflags[2]=p3; - PHOSflags[3]=p4; - PHOSflags[4]=p5; - PHOSflags[5]=p6; - PHOSflags[6]=p7; - PHOSflags[7]=p8; - PHOSflags[8]=p9; -} + gMC->Gfmate((*fIdmate)[15], namate, aGM[0], zGM[0], density, radL, absL, buf, nbuf) ; // Get properties of Ar + gMC->Gfmate((*fIdmate)[14], namate, aGM[1], zGM[1], density, radL, absL, buf, nbuf) ; // Get properties of CO2 -//______________________________________________________________________________ -void AliPHOS::SetCell(Float_t p1,Float_t p2,Float_t p3,Float_t p4, - Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9) -{ - PHOScell[0]=p1; - PHOScell[1]=p2; - PHOScell[2]=p3; - PHOScell[3]=p4; - PHOScell[4]=p5; - PHOScell[5]=p6; - PHOScell[6]=p7; - PHOScell[7]=p8; - PHOScell[8]=p9; -} -//______________________________________________________________________________ -void AliPHOS::SetRadius(Float_t radius) -{ - PHOSradius=radius; -} + // Create gas mixture -//______________________________________________________________________________ -void AliPHOS::SetCradleSize(Int_t nz, Int_t nphi, Int_t ncradles) -{ - PHOSsize[0]=nz; - PHOSsize[1]=nphi; - PHOSsize[2]=ncradles; -} - -//______________________________________________________________________________ -void AliPHOS::SetCradleA(Float_t angle) -{ - PHOScradlesA=angle; -} + Float_t arContent = 0.80 ; // Ar-content of the Ar/CO2-mixture (80% / 20%) + + wGM[0] = arContent; + wGM[1] = 1. - arContent ; + dGM = wGM[0] * dAr + wGM[1] * dCO; -//______________________________________________________________________________ -void AliPHOS::SetExtra(Float_t p1,Float_t p2,Float_t p3,Float_t p4, - Float_t p5,Float_t p6,Float_t p7,Float_t p8,Float_t p9) -{ - PHOSextra[0] = p1; - PHOSextra[1] = p2; - PHOSextra[2] = p3; - PHOSextra[3] = p4; - PHOSextra[4] = p5; - PHOSextra[5] = p6; - PHOSextra[6] = p7; - PHOSextra[7] = p8; - PHOSextra[8] = p9; -} + AliMixture(16, "ArCO2$", aGM, zGM, dGM, 2, wGM) ; -//______________________________________________________________________________ -void AliPHOS::SetTextolitWall(Float_t dx, Float_t dy, Float_t dz) -{ - PHOSTXW[0] = dx; - PHOSTXW[1] = dy; - PHOSTXW[2] = dz; -} + // --- Stainless steel (let it be pure iron) --- + AliMaterial(17, "Steel$", 55.845, 26, 7.87, 1.76, 0., 0, 0) ; -//______________________________________________________________________________ -void AliPHOS::SetInnerAir(Float_t dx, Float_t dy, Float_t dz) -{ - PHOSAIR[0] = dx; - PHOSAIR[1] = dy; - PHOSAIR[2] = dz; -} -//______________________________________________________________________________ -void AliPHOS::SetFoam(Float_t dx, Float_t dy, Float_t dz, Float_t dr) -{ - PHOSFTI[0] = dx; - PHOSFTI[1] = dy; - PHOSFTI[2] = dz; - PHOSFTI[3] = dr; -} + // --- Fiberglass --- + Float_t aFG[4] = {16.0, 28.09, 12.011, 1.00794} ; + Float_t zFG[4] = {8.0, 14.0, 6.0, 1.0} ; + Float_t wFG[4] = {292.0, 68.0, 462.0, 736.0} ; + Float_t dFG = 1.9 ; -ClassImp(AliPHOSCradle) - -//______________________________________________________________________________ - -AliPHOSCradle::AliPHOSCradle(void) {} - -//______________________________________________________________________________ - -AliPHOSCradle::AliPHOSCradle( int Geometry , - float CrystalSideSize , - float CrystalLength , - float WrapThickness , - float AirThickness , - float PIN_SideSize , - float PIN_Length , - float Radius , - int Nz , - int Nphi , - float Angle ) : - fGeometry (Geometry), -// fCellEnergy (), -// fChargedTracksInPIN (), - fCrystalSideSize (CrystalSideSize), - fCrystalLength (CrystalLength), - fWrapThickness (WrapThickness), - fAirThickness (AirThickness), - fPIN_SideSize (PIN_SideSize), - fPIN_Length (PIN_Length), - fRadius (Radius), - fNz (Nz), - fNphi (Nphi), - fPhi (Angle) -{ - fCellEnergy = TH2F("CellE","Energy deposition in a cells",fNz,0,fNz,fNphi,0,fNphi); - fCellEnergy .SetDirectory(0); - fChargedTracksInPIN = TH2S("PINCtracks","Amount of charged tracks in PIN",fNz,0,fNz,fNphi,0,fNphi); - fChargedTracksInPIN .SetDirectory(0); -} + AliMixture(18, "Fibergla$", aFG, zFG, dFG, -4, wFG) ; -//______________________________________________________________________________ + // --- Cables in Air box --- + // SERVICES -AliPHOSCradle::~AliPHOSCradle(void) // 28.12.1998 -{ - fGammasReconstructed.Delete(); - fParticles .Delete(); -} + Float_t aCA[4] = { 1.,12.,55.8,63.5 }; + Float_t zCA[4] = { 1.,6.,26.,29. }; + Float_t wCA[4] = { .014,.086,.42,.48 }; + Float_t dCA = 0.8 ; //this density is raw estimation, if you know better - correct -//______________________________________________________________________________ + AliMixture(19, "Cables $", aCA, zCA, dCA, -4, wCA) ; -void AliPHOSCradle::Clear(Option_t *) -{ -// Clear digit. information. - fCellEnergy .Reset(); - fChargedTracksInPIN .Reset(); - GetParticles() .Delete(); - GetParticles() .Compress(); - GetGammasReconstructed() .Delete(); - GetGammasReconstructed() .Compress(); -} + + // --- Air --- + AliMaterial(99, "Air$", 14.61, 7.3, 0.001205, 30420., 67500., 0, 0) ; + + + // DEFINITION OF THE TRACKING MEDIA -//______________________________________________________________________________ + // for PHOS: idtmed[699->798] equivalent to fIdtmed[0->100] + Int_t * idtmed = fIdtmed->GetArray() - 699 ; + Int_t isxfld = gAlice->Field()->Integ() ; + Float_t sxmgmx = gAlice->Field()->Max() ; -void AliPHOSCradle::GetXY(const TVector3 &p,const TVector3 &v,float R,float &x,float &y,float &l) const -{ -// This function calculates hit position (x,y) in the CRADLE cells plain from particle in -// the direction given by 'p' (not required to be normalized) and start point -// given by 3-vector 'v'. So the particle trajectory is t(l) = v + p*l -// were 'l' is a number (distance from 'v' to CRADLE cells plain) and 't' is resulting -// three-vector of trajectory point. -// -// After the call to this function user should test that l>=0 (the particle HITED the -// plain) and (x,y) are in the region of CRADLE: -// -// Example: -// AliPHOSCradle cradle(......); -// TVector3 p(....), v(....); -// Float_t x,y,l; -// cradle.GetXY(p,v,x,y,l); -// if( l<0 || TMath::Abs(x)>cradle.GetNz() *cradle.GetCellSideSize()/2 -// || TMath::Abs(y)>cradle.GetNphi()*cradle.GetCellSideSize()/2 ) -// cout << "Outside the CRADLE.\n"; - - // We have to create three vectors: - // s - central point on the PHOS surface - // n1 - first vector in CRADLE plain - // n2 - second vector in CRADLE plain - // This three vectors are orthonormalized. - - double phi = fPhi/180*TMath::Pi(); - TVector3 n1( 0.0 , 0.0 , 1.0 ), // Z direction (X) - n2( -sin(phi) , cos(phi) , 0 ), // around beam (Y) - s ( R*cos(phi) , R*sin(phi) , 0 ); // central point - - const double l1_min = 1e-2; - double l1, - p_n1 = p*n1, // * - scalar product. - p_n2 = p*n2, - v_n1 = v*n1, - v_n2 = v*n2, - s_n1 = s*n1, // 0 - s_n2 = s*n2; // 0 - - if ( TMath::Abs(l1=p.X()-n1.X()*p_n1-n2.X()*p_n2)>l1_min ) - { l = (-v.X()+s.X()+n1.X()*(v_n1-s_n1)+n2.X()*(v_n2-s_n2))/l1; } - else if ( TMath::Abs(l1=p.Y()-n1.Y()*p_n1-n2.Y()*p_n2)>l1_min ) - { l = (-v.Y()+s.Y()+n1.Y()*(v_n1-s_n1)+n2.Y()*(v_n2-s_n2))/l1; } - else if ( TMath::Abs(l1=p.Z()-n1.Z()*p_n1-n2.Z()*p_n2)>l1_min ) - { l = (-v.Z()+s.Z()+n1.Z()*(v_n1-s_n1)+n2.Z()*(v_n2-s_n2))/l1; } - -// double lx = (-v.X()+s.X()+n1.X()*(v.dot(n1)-s.dot(n1))+n2.X()*(v.dot(n2)-s.dot(n2)))/ -// (p.X()-n1.X()*p.dot(n1)-n2.X()*p.dot(n2)), -// ly = (-v.Y()+s.Y()+n1.Y()*(v.dot(n1)-s.dot(n1))+n2.Y()*(v.dot(n2)-s.dot(n2)))/ -// (p.Y()-n1.Y()*p.dot(n1)-n2.Y()*p.dot(n2)), -// lz = (-v.Z()+s.Z()+n1.Z()*(v.dot(n1)-s.dot(n1))+n2.Z()*(v.dot(n2)-s.dot(n2)))/ -// (p.Z()-n1.Z()*p.dot(n1)-n2.Z()*p.dot(n2)); -// cout.form("x: %g %g %g %g\n",lx,-v.X()+s.X()+n1.X()*(v.dot(n1)-s.dot(n1))+n2.X()*(v.dot(n2)-s.dot(n2)),p.X()-n1.X()*p.dot(n1)-n2.X()*p.dot(n2)); -// cout.form("y: %g %g %g %g\n",lx,-v.Y()+s.Y()+n1.Y()*(v.dot(n1)-s.dot(n1))+n2.Y()*(v.dot(n2)-s.dot(n2)),p.Y()-n1.Y()*p.dot(n1)-n2.Y()*p.dot(n2)); -// cout.form("z: %g %g %g %g\n",lx,-v.Z()+s.Z()+n1.Z()*(v.dot(n1)-s.dot(n1))+n2.Z()*(v.dot(n2)-s.dot(n2)),p.Z()-n1.Z()*p.dot(n1)-n2.Z()*p.dot(n2)); -// cout.form("lx,ly,lz = %g,%g,%g\n",lx,ly,lz); - - x = p_n1*l + v_n1 - s_n1; - y = p_n2*l + v_n2 - s_n2; -} + // The scintillator of the calorimeter made of PBW04 -> idtmed[699] + AliMedium(0, "PHOS Xtal $", 0, 1, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; -//______________________________________________________________________________ + // The scintillator of the CPV made of Polystyrene scintillator -> idtmed[700] + AliMedium(1, "CPV scint. $", 1, 1, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; -void AliPHOSCradle::Print(Option_t *opt) -{ -// Print AliPHOSCradle information. -// -// options: 'd' - print energy deposition for EVERY cell -// 'p' - print particles list that hit the cradle -// 'r' - print list of reconstructed particles - - AliPHOSCradle *cr = (AliPHOSCradle *)this; // Removing 'const'... - - printf("AliPHOSCradle: Nz=%d Nphi=%d, fPhi=%f, E=%g\n",fNz,fNphi,fPhi, - cr->fCellEnergy.GetSumOfWeights()); - - if( NULL!=strchr(opt,'d') ) - { - printf("\n\nCells Energy (in MeV):\n\n |"); - for( int x=0; x=0; y-- ) - { - printf("%3d|",y+1); - for( int x=0; xfCellEnergy.GetBinContent(cr->fCellEnergy.GetBin(x,y))*1000)); - printf("\n"); - } - printf("\n"); - } + // Various Aluminium parts made of Al -> idtmed[701] + AliMedium(2, "Al parts $", 2, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ; - if( NULL!=strchr(opt,'p') ) - { - printf("This cradle was hit by %d particles\n", - ((AliPHOSCradle*)this)->GetParticles().GetEntries()); - TObjArray &p=((AliPHOSCradle*)this)->GetParticles(); - for( int i=0; iPrint(); - } + // The Tywek which wraps the calorimeter crystals -> idtmed[702] + AliMedium(3, "Tyvek wrapper$", 3, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ; - if( NULL!=strchr(opt,'p') ) - { - printf("Amount of reconstructed gammas is %d\n", - ((AliPHOSCradle*)this)->GetGammasReconstructed().GetEntries()); + // The Polystyrene foam around the calorimeter module -> idtmed[703] + AliMedium(4, "Polyst. foam $", 4, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - TObjArray &p=((AliPHOSCradle*)this)->GetGammasReconstructed(); - for( int i=0; iPrint(); - } -} + // The Titanium around the calorimeter crystal -> idtmed[704] + AliMedium(5, "Titan. cover $", 5, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.0001, 0.0001, 0, 0) ; -//______________________________________________________________________________ + // The Silicon of the pin diode to read out the calorimeter crystal -> idtmed[705] + AliMedium(6, "Si PIN $", 6, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.01, 0.01, 0, 0) ; -void AliPHOSCradle::Distortion(const TH2F *Noise, const TH2F *Stochastic, const TH2F *Calibration) -{ -// This function changes histogram of cell energies fCellEnergy on the base of input -// histograms Noise, Stochastic, Calibration. The histograms must have -// size Nz x Nphi. + // The thermo insulating material of the box which contains the calorimeter module -> idtmed[706] + AliMedium(7, "Thermo Insul.$", 7, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - ////////////////////////////////// - // Testing the histograms size. // - ////////////////////////////////// - - if( fNz!=fCellEnergy.GetNbinsX() || fNphi!=fCellEnergy.GetNbinsY() ) - { - printf ("Bad size of CellEnergy! Must be: Nz x Nphi = %d x %d\n" - "but size of CellEnergy is: %d x %d\n", - fNz,fNphi,fCellEnergy.GetNbinsX(),fCellEnergy.GetNbinsY()); - exit(1); - } + // The Textolit which makes up the box which contains the calorimeter module -> idtmed[707] + AliMedium(8, "Textolit $", 8, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - if( fNz!=fChargedTracksInPIN.GetNbinsX() || fNphi!=fChargedTracksInPIN.GetNbinsY() ) - { - printf ("Bad size of ChargedTracksInPIN! Must be: Nz x Nphi = %d x %d\n" - "but size of ChargedTracksInPIN is: %d x %d\n", - fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY()); - exit(1); - } + // FR4: The Plastic which makes up the frame of micromegas -> idtmed[708] + AliMedium(9, "FR4 $", 9, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ; - if( NULL!=Noise && (fNz!=Noise->GetNbinsX() || fNphi!=Noise->GetNbinsX()) ) - { - printf ("Bad size of Noise! Must be: Nz x Nphi = %d x %d\n" - "but size of Noise is: %d x %d\n", - fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY()); - exit(1); - } - if( NULL!=Stochastic && (fNz!=Stochastic->GetNbinsX() || fNphi!=Stochastic->GetNbinsX()) ) - { - printf ("Bad size of Stochastic! Must be: Nz x Nphi = %d x %d\n" - "but size of Stochastic is: %d x %d\n", - fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY()); - exit(1); - } + // The Composite Material for micromegas -> idtmed[709] + AliMedium(10, "CompoMat $", 10, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - if( NULL!=Calibration && (fNz!=Calibration->GetNbinsX() || fNphi!=Calibration->GetNbinsX()) ) - { - printf ("Bad size of Calibration! Must be: Nz x Nphi = %d x %d\n" - "but size of Calibration is: %d x %d\n", - fNz,fNphi,fChargedTracksInPIN.GetNbinsX(),fChargedTracksInPIN.GetNbinsY()); - exit(1); - } + // Copper -> idtmed[710] + AliMedium(11, "Copper $", 11, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ; - //////////////////// - // Do distortion! // - //////////////////// + // G10: Printed Circuit material -> idtmed[711] + + AliMedium(12, "G10 $", 12, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ; - for( int y=0; y idtmed[712] + + AliMedium(13, "Lead $", 13, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - if( NULL!=Stochastic ) - E_new = r.Gaus(E_old,sqrt(E_old)*GetDistortedValue(Stochastic,n)); + // The gas mixture: ArCo2 -> idtmed[715] + + AliMedium(16, "ArCo2 $", 16, 1, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.01, 0, 0) ; + + // Stainless steel -> idtmed[716] + AliMedium(17, "Steel $", 17, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.0001, 0, 0) ; - if( NULL!=Calibration ) - E_new *= GetDistortedValue(Calibration,n); + // Fibergalss -> idtmed[717] + AliMedium(18, "Fiberglass$", 18, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - if( NULL!=Noise ) - E_new += GetDistortedValue(Noise,n); + // Cables in air -> idtmed[718] + AliMedium(19, "Cables $", 19, 0, + isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; - fCellEnergy.SetBinContent(n,E_new); - } -} + // Air -> idtmed[798] + AliMedium(99, "Air $", 99, 0, + isxfld, sxmgmx, 10.0, 1.0, 0.1, 0.1, 10.0, 0, 0) ; -//////////////////////////////////////////////////////////////////////////////// + // --- Set decent energy thresholds for gamma and electron tracking -TH2F* AliPHOSCradle::CreateHistForDistortion(const char *name, const char *title, - Int_t Nx, Int_t Ny, - Float_t MU_mu, Float_t MU_sigma, - Float_t SIGMA_mu, Float_t SIGMA_sigma) -{ -// Create (new TH2F(...)) histogram with information (for every bin) that will -// be used for VALUE creation. -// Two values will be created for each bin: -// MU = TRandom::Gaus(MU_mu,MU_sigma) -// and -// SIGMA = TRandom::Gaus(SIGMA_mu,SIGMA_sigma) -// The VALUE in a particluar bin will be equal -// VALUE = TRandom::Gaus(MU,SIGMA) -// -// Do not forget to delete the histogram at the end of the work. + // Tracking threshold for photons and electrons in the scintillator crystal + gMC->Gstpar(idtmed[699], "CUTGAM",0.5E-4) ; + gMC->Gstpar(idtmed[699], "CUTELE",1.0E-4) ; + + // --- Generate explicitly delta rays in the titan cover --- + gMC->Gstpar(idtmed[704], "LOSS",3.) ; + gMC->Gstpar(idtmed[704], "DRAY",1.) ; + // --- and in aluminium parts --- + gMC->Gstpar(idtmed[701], "LOSS",3.) ; + gMC->Gstpar(idtmed[701], "DRAY",1.) ; + // --- and in PIN diode + gMC->Gstpar(idtmed[705], "LOSS",3) ; + gMC->Gstpar(idtmed[705], "DRAY",1) ; + // --- and in the passive convertor + gMC->Gstpar(idtmed[712], "LOSS",3) ; + gMC->Gstpar(idtmed[712], "DRAY",1) ; + // Tracking threshold for photons and electrons in the gas ArC02 + gMC->Gstpar(idtmed[715], "CUTGAM",1.E-5) ; + gMC->Gstpar(idtmed[715], "CUTELE",1.E-5) ; + gMC->Gstpar(idtmed[715], "CUTNEU",1.E-5) ; + gMC->Gstpar(idtmed[715], "CUTHAD",1.E-5) ; + gMC->Gstpar(idtmed[715], "CUTMUO",1.E-5) ; + gMC->Gstpar(idtmed[715], "BCUTE",1.E-5) ; + gMC->Gstpar(idtmed[715], "BCUTM",1.E-5) ; + gMC->Gstpar(idtmed[715], "DCUTE",1.E-5) ; + gMC->Gstpar(idtmed[715], "DCUTM",1.E-5) ; + gMC->Gstpar(idtmed[715], "PPCUTM",1.E-5) ; + gMC->Gstpar(idtmed[715], "LOSS",2.) ; + gMC->Gstpar(idtmed[715], "DRAY",0.) ; + gMC->Gstpar(idtmed[715], "STRA",2.) ; + +} + +//____________________________________________________________________________ +void AliPHOS::FillESD(AliESD* esd) const +{ + // Called by AliReconstruct after Reconstruct() and global tracking and vertxing + + //Creates the tracksegments and Recparticles + AliPHOSReconstructor * rec = new AliPHOSReconstructor((fLoader->GetRunLoader()->GetFileName()).Data()) ; + TList * taskslist = rec->GetListOfTasks() ; + Int_t index ; + TTask * task ; + TString name ; + // set clusterizer task inactive + for (index = 0; index < taskslist->GetSize(); index++) { + task = dynamic_cast(taskslist->At(index)) ; + name = task->GetName() ; + if ( name.Contains(AliConfig::Instance()->GetReconstructionerTaskName())) + task->SetActive(kFALSE) ; + if ( name.Contains(AliConfig::Instance()->GetTrackerTaskName())) + (dynamic_cast (task))->SetESD(esd) ; + } - TH2F *h = new TH2F( name,title, Nx,1,Nx, Ny,1,Ny ); - if( h==NULL ) - { - Error("CreateHistForDistortion","Can not create the histogram"); - exit(1); + AliPHOSGetter *gime = AliPHOSGetter::Instance( (fLoader->GetRunLoader()->GetFileName()).Data() ) ; + Int_t eventNumber = gime->EventNumber(); + rec->SetEventRange(eventNumber, eventNumber) ; // do current event; the loop over events is done by AliReconstruction::Run() + if ( Debug() ) + rec->ExecuteTask("deb all") ; + else + rec->ExecuteTask("") ; + + // Creates AliESDtrack from AliPHOSRecParticles + gime->Event(eventNumber, "P") ; + TClonesArray *recParticles = gime->RecParticles(); + Int_t nOfRecParticles = recParticles->GetEntries(); + for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) { + AliPHOSRecParticle * rp = dynamic_cast(recParticles->At(recpart)); + if (Debug()) + rp->Print(); + AliESDtrack * et = new AliESDtrack() ; + // fills the ESDtrack + Double_t xyz[3]; + for (Int_t ixyz=0; ixyz<3; ixyz++) xyz[ixyz] = rp->GetPos()[ixyz]; + et->SetPHOSposition(xyz) ; + et->SetPHOSsignal (rp->Energy()) ; + et->SetPHOSpid (rp->GetPID()) ; + // add the track to the esd object + esd->AddTrack(et); + delete et; } - h->SetDirectory(0); +} - for( int y=0; yGetBin(x,y); - h->SetBinContent(n,r.Gaus( MU_mu, MU_sigma)); - h->SetBinError (n,r.Gaus(SIGMA_mu,SIGMA_sigma)); - } +//____________________________________________________________________________ +void AliPHOS::Hits2SDigits() +{ +// create summable digits - return h; + AliPHOSSDigitizer* phosDigitizer = + new AliPHOSSDigitizer(fLoader->GetRunLoader()->GetFileName().Data()) ; + phosDigitizer->SetEventRange(0, -1) ; // do all the events + phosDigitizer->ExecuteTask("all") ; } -//////////////////////////////////////////////////////////////////////////////// - -Float_t AliPHOSCradle::GetDistortedValue(const TH2F *h, UInt_t n) +//____________________________________________________________________________ +AliLoader* AliPHOS::MakeLoader(const char* topfoldername) { - return r.Gaus(((TH2F*)h)->GetBinContent(n),n); +//different behaviour than standard (singleton getter) +// --> to be discussed and made eventually coherent + fLoader = new AliPHOSLoader(GetName(),topfoldername); + return fLoader; } -//////////////////////////////////////////////////////////////////////////////// -//______________________________________________________________________________ - -#ifdef WIN32 - #define common_for_event_storing COMMON_FOR_EVENT_STORING -#else - #define common_for_event_storing common_for_event_storing_ -#endif - -/* extern "C" */ struct -{ - enum { crystals_matrix_amount_max=4, crystals_in_matrix_amount_max=40000 }; - - // Event-independent information - UShort_t crystals_matrix_amount_PHOS, - crystal_matrix_type, - amount_of_crystals_on_Z, - amount_of_crystals_on_PHI; - Float_t radius, - crystal_size, - crystal_length, - matrix_coordinate_Z [crystals_matrix_amount_max], - matrix_coordinate_PHI [crystals_matrix_amount_max]; - UInt_t event_number; - UShort_t crystals_amount_with_amplitudes [crystals_matrix_amount_max], - crystals_amplitudes_Iad [crystals_matrix_amount_max] - [crystals_in_matrix_amount_max][2]; -} common_for_event_storing; - -// integer*4 crystals_amount_max,crystals_in_matrix_amount_max, -// + crystals_matrix_amount_max -// parameter (crystals_matrix_amount_max=4) -// parameter (crystals_in_matrix_amount_max=40000) -// parameter (crystals_amount_max =crystals_matrix_amount_max* -// + crystals_in_matrix_amount_max) -// -// * All units are in GeV, cm, radian -// real crystal_amplitudes_unit, radius_unit, -// + crystal_size_unit, crystal_length_unit, -// + matrix_coordinate_Z_unit, matrix_coordinate_PHI_unit -// integer crystal_amplitudes_in_units_min -// parameter (crystal_amplitudes_in_units_min = 1) -// parameter (crystal_amplitudes_unit = 0.001 ) ! 1.0 MeV -// parameter (radius_unit = 0.1 ) ! 0.1 cm -// parameter (crystal_size_unit = 0.01 ) ! 0.01 cm -// parameter (crystal_length_unit = 0.01 ) ! 0.01 cm -// parameter (matrix_coordinate_Z_unit = 0.1 ) ! 0.1 cm -// parameter (matrix_coordinate_PHI_unit = 1e-4 ) ! 1e-4 radian -// -// integer*2 crystals_matrix_amount_PHOS, crystal_matrix_type, -// + amount_of_crystals_on_Z, amount_of_crystals_on_PHI, -// + crystals_amount_with_amplitudes, crystals_amplitudes_Iad -// integer*4 event_number -// -// real radius, crystal_size, crystal_length, -// + matrix_coordinate_Z, matrix_coordinate_PHI -// -// real crystals_amplitudes, crystals_energy_total -// integer event_file_unit_number -// -// common /common_for_event_storing/ -// + ! Event-independent information -// + crystals_matrix_amount_PHOS, -// + crystal_matrix_type, -// + amount_of_crystals_on_Z, -// + amount_of_crystals_on_PHI, -// + radius, -// + crystal_size, -// + crystal_length, -// + matrix_coordinate_Z (crystals_matrix_amount_max), -// + matrix_coordinate_PHI (crystals_matrix_amount_max), -// + -// + ! Event-dependent information -// + event_number, -// + crystals_amount_with_amplitudes -// + (crystals_matrix_amount_max), -// + crystals_amplitudes_Iad (2,crystals_in_matrix_amount_max, -// + crystals_matrix_amount_max), -// + -// + ! These information don't store in data file -// + crystals_amplitudes (crystals_amount_max), -// + crystals_energy_total, -// + event_file_unit_number - - -// parameter (NGp=1000,nsps=10,nvertmax=1000) -// COMMON /GAMMA/KG,MW(ngp),ID(ngp),JD(ngp),E(ngp),E4(ngp), -// , XW(ngp),YW(ngp),ES(nsps,ngp),ET(nsps,ngp),ISsd(ngp), -// , IGDEV(ngp),ZGDEV(ngp),sigexy(3,ngp),Emimx(2,nsps,ngp), -// , kgfix,igfix(ngp),cgfix(3,ngp),sgfix(3,ngp),hiw(ngp), -// , wsw(nsps,ngp),h1w(ngp),h0w(ngp),raxay(5,ngp), -// , sigmaes0(nsps,ngp),dispeces(nsps,ngp), -// , igamvert(ngp) - - -#ifdef WIN32 -#define rcgamma RCGAMMA -#else -#define rcgamma rcgamma_ -#endif - -/* extern "C" */ struct -{ - enum {NGP=1000, nsps=10, nvertmax=1000}; - int recons_gammas_amount, mw[NGP],ID[NGP],JD[NGP]; - float E[NGP], E4[NGP], XW[NGP], YW[NGP], ES[NGP][nsps],ET[NGP][nsps],ISsd[NGP], - igdev[NGP],Zgdev[NGP]; -// sigexy(3,ngp),Emimx(2,nsps,ngp), -// , kgfix,igfix(ngp),cgfix(3,ngp),sgfix(3,ngp),hiw(ngp), -// , wsw(nsps,ngp),h1w(ngp),h0w(ngp),raxay(5,ngp), -// , sigmaes0(nsps,ngp),dispeces(nsps,ngp), -// , igamvert(ngp) -} rcgamma; - -/* -#ifdef WIN32 -#define reconsfirst RECONSFIRST -#define type_of_call _stdcall -#else -#define reconsfirst reconsfirst_ -#define type_of_call -#endif - -extern "C" void type_of_call reconsfirst(const float &,const float &); -*/ - -void AliPHOSCradle::Reconstruction(Float_t signal_step, UInt_t min_signal_reject) -{ -// Call of PHOS reconstruction program. -// signal_step=0.001 GeV (1MeV) -// min_signal_reject = 15 or 30 MeV - - - common_for_event_storing.event_number = 0; // We do not know event number? - common_for_event_storing.crystals_matrix_amount_PHOS = 1; - common_for_event_storing.crystal_matrix_type = 1; // 1 - rectangular - common_for_event_storing.amount_of_crystals_on_Z = fNz; - common_for_event_storing.amount_of_crystals_on_PHI = fNphi; - - common_for_event_storing.radius = fRadius; - common_for_event_storing.crystal_size = GetCellSideSize(); - common_for_event_storing.crystal_length = fCrystalLength; - - common_for_event_storing.matrix_coordinate_Z [0] = 0; - common_for_event_storing.matrix_coordinate_PHI [0] = fPhi; - - #define k common_for_event_storing.crystals_amount_with_amplitudes[0] - k=0; - - for( int y=0; y=min_signal_reject ) - { - common_for_event_storing.crystals_amplitudes_Iad[0][k][0] = signal; - common_for_event_storing.crystals_amplitudes_Iad[0][k][1] = x + y*fNz; - k++; - } - } - #undef k - - GetGammasReconstructed().Delete(); - GetGammasReconstructed().Compress(); - - const float stochastic_term = 0.03, // per cents over sqrt(E); E in GeV - electronic_noise = 0.01; // GeV -// reconsfirst(stochastic_term,electronic_noise); // Call of reconstruction program. - - for( int i=0; iGetBranch(branchname); + if (branch) + { + if (fHits == 0x0) fHits= new TClonesArray("AliPHOSHit",1000); + //Info("SetTreeAddress","<%s> Setting Hits Address",GetName()); + branch->SetAddress(&fHits); + } } } -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ - -ClassImp(AliPHOSgamma) - -//______________________________________________________________________________ - -void AliPHOSgamma::Print(Option_t *) -{ - float mass = fE*fE - fPx*fPx - fPy*fPy - fPz*fPz; - - if( mass>=0 ) - mass = sqrt( mass); - else - mass = -sqrt(-mass); - - printf("XY=(%+7.2f,%+7.2f) (%+7.2f,%+7.2f,%+7.2f;%7.2f) mass=%8.4f Ipart=%2d\n", - fX,fY,fPx,fPy,fPz,fE,mass,fIpart); +//____________________________________________________________________________ +void AliPHOS::Reconstruct() const +{ + // method called by AliReconstruction; it should not be called otherwise but the AliPHOSReconstructionner + // should be called for stand alone reconstruction. + // Only the clusterization is performed,; the rest of the reconstruction is done in FillESD because the track + // segment maker needs access to the AliESD object to retrieve the tracks reconstructed by + // the global tracking. + + AliPHOSReconstructor * rec = new AliPHOSReconstructor((fLoader->GetRunLoader()->GetFileName()).Data()) ; + TList * taskslist = rec->GetListOfTasks() ; + Int_t index ; + TTask * task ; + TString name ; + // set all tasks inactive except clusterizer + for (index = 0; index < taskslist->GetSize(); index++) { + task = dynamic_cast(taskslist->At(index)) ; + name = task->GetName() ; + if ( !name.Contains(AliConfig::Instance()->GetReconstructionerTaskName())) + task->SetActive(kFALSE) ; + } + rec->SetEventRange(0, -1) ; // do all the events + if ( Debug() ) + rec->ExecuteTask("deb all") ; + else + rec->ExecuteTask("") ; + } -//______________________________________________________________________________ - -AliPHOSgamma &AliPHOSgamma::operator=(const AliPHOSgamma &g) +//____________________________________________________________________________ +void AliPHOS::WriteQA() { - fX = g.fX; - fY = g.fY; - fE = g.fE; - fPx = g.fPx; - fPy = g.fPy; - fPz = g.fPz; - fIpart = g.fIpart; - - return *this; -} -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ -//______________________________________________________________________________ + // Make TreeQA in the output file. -ClassImp(AliPHOShit) + if(fTreeQA == 0) + fTreeQA = new TTree("TreeQA", "QA Alarms") ; + // Create Alarms branches + Int_t bufferSize = 32000 ; + Int_t splitlevel = 0 ; -//______________________________________________________________________________ - -AliPHOShit::AliPHOShit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits): -AliHit(shunt, track) -{ - Int_t i; - for (i=0;i<5;i++) fVolume[i] = vol[i]; - fX = hits[0]; - fY = hits[1]; - fZ = hits[2]; - fELOS = hits[3]; -} + 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() ; +}