X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EMCAL%2FAliEMCALReconstructor.cxx;h=9d3dc7239c166d0076c101d38dd2c6f495e0b02e;hb=9bde52f15b68bec576e5180de434123962c3681b;hp=60a574cbabe9208c065f1e6ae96dbffc199e325c;hpb=ee6023764bf072d28f95029b6be9c248fbb3de5d;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCALReconstructor.cxx b/EMCAL/AliEMCALReconstructor.cxx index 60a574cbabe..9d3dc7239c1 100644 --- a/EMCAL/AliEMCALReconstructor.cxx +++ b/EMCAL/AliEMCALReconstructor.cxx @@ -1,5 +1,4 @@ /************************************************************************** -#/eliza17/alice/esdfiles/data/2011/LHC11a/000146805/ESDs/pass2_without_SDD/11000146805038.550/root_archive.zip#AliESDs.root * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * @@ -104,7 +103,7 @@ AliEMCALReconstructor::AliEMCALReconstructor() if(!fCalibData) { AliCDBEntry *entry = (AliCDBEntry*) - AliCDBManager::Instance()->Get("EMCAL/Calib/Data"); + AliCDBManager::Instance()->Get("EMCAL/Calib/Data"); if (entry) fCalibData = (AliEMCALCalibData*) entry->GetObject(); } @@ -115,7 +114,7 @@ AliEMCALReconstructor::AliEMCALReconstructor() if(!fPedestalData) { AliCDBEntry *entry = (AliCDBEntry*) - AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals"); + AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals"); if (entry) fPedestalData = (AliCaloCalibPedestal*) entry->GetObject(); } @@ -136,8 +135,10 @@ AliEMCALReconstructor::AliEMCALReconstructor() //Init temporary list of digits fgDigitsArr = new TClonesArray("AliEMCALDigit",1000); fgClustersArr = new TObjArray(1000); - fgTriggerDigits = new TClonesArray("AliEMCALTriggerRawDigit",1000); + const int kNTRU = fGeom->GetNTotalTRU(); + fgTriggerDigits = new TClonesArray("AliEMCALTriggerRawDigit", kNTRU * 96); + //Track matching fMatches = new TList(); fMatches->SetOwner(kTRUE); @@ -150,30 +151,31 @@ AliEMCALReconstructor::~AliEMCALReconstructor() //AliDebug(2, "Mark."); - if(fGeom) delete fGeom; + ////RS if(fGeom) delete fGeom; //No need to delete, recovered from OCDB //if(fCalibData) delete fCalibData; //if(fPedestalData) delete fPedestalData; - if(fgDigitsArr){ - fgDigitsArr->Clear("C"); - delete fgDigitsArr; - } + if(fgDigitsArr) fgDigitsArr->Clear("C"); + delete fgDigitsArr; + fgDigitsArr = 0; - if(fgClustersArr){ - fgClustersArr->Clear(); - delete fgClustersArr; - } + if(fgClustersArr) fgClustersArr->Clear(); + delete fgClustersArr; + fgClustersArr = 0; - if(fgTriggerDigits){ - fgTriggerDigits->Clear(); - delete fgTriggerDigits; - } + if(fgTriggerDigits) fgTriggerDigits->Clear(); + delete fgTriggerDigits; + fgTriggerDigits = 0; + + delete fgRawUtils; + fgRawUtils = 0; + delete fgClusterizer; + fgClusterizer = 0; - if(fgRawUtils) delete fgRawUtils; - if(fgClusterizer) delete fgClusterizer; - if(fgTriggerProcessor) delete fgTriggerProcessor; + delete fgTriggerProcessor; + fgTriggerProcessor = 0; if(fMatches) { fMatches->Delete(); delete fMatches; fMatches = 0;} @@ -290,7 +292,8 @@ void AliEMCALReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits if(fgDigitsArr) fgDigitsArr->Clear("C"); - TClonesArray *digitsTrg = new TClonesArray("AliEMCALTriggerRawDigit", 32 * 96); + const int kNTRU = fGeom->GetNTotalTRU(); + TClonesArray *digitsTrg = new TClonesArray("AliEMCALTriggerRawDigit", kNTRU * 96); Int_t bufsize = 32000; digitsTree->Branch("EMCAL", &fgDigitsArr, bufsize); @@ -312,7 +315,8 @@ void AliEMCALReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits fgRawUtils->SetRemoveBadChannels(GetRecParam()->GetRemoveBadChannels()); if (!fgRawUtils->GetFittingAlgorithm()) fgRawUtils->SetFittingAlgorithm(GetRecParam()->GetFittingAlgorithm()); fgRawUtils->SetFALTROUsage(GetRecParam()->UseFALTRO()); - + // fgRawUtils->SetFALTROUsage(0); + //fgRawUtils->SetTimeMin(GetRecParam()->GetTimeMin()); //fgRawUtils->SetTimeMax(GetRecParam()->GetTimeMax()); @@ -355,18 +359,15 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, if (esdV0) { - for (Int_t i = 0; i < 32; i++) - { - v0M[0] += (Int_t)esdV0->GetAdcV0C(i); - v0M[1] += (Int_t)esdV0->GetAdcV0A(i); - } + v0M[0] = esdV0->GetTriggerChargeC(); + v0M[1] = esdV0->GetTriggerChargeA(); } else { - AliWarning("Cannot retrieve V0 ESD! Run w/ null V0 charges"); + AliWarning("No V0 ESD! Run trigger processor w/ null V0 charges"); } - if (fgTriggerDigits) fgTriggerDigits->Clear(); + if (fgTriggerDigits && fgTriggerDigits->GetEntriesFast()) fgTriggerDigits->Delete(); TBranch *branchtrg = digitsTree->GetBranch("EMTRG"); @@ -392,7 +393,8 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, for (Int_t i = 0; i < fgTriggerDigits->GetEntriesFast(); i++) { AliEMCALTriggerRawDigit* rdig = (AliEMCALTriggerRawDigit*)fgTriggerDigits->At(i); - + if (AliDebugLevel() > 999) rdig->Print(""); + Int_t px, py; if (fGeom->GetPositionInEMCALFromAbsFastORIndex(rdig->GetId(), px, py)) { @@ -400,14 +402,15 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, rdig->GetMaximum(a, t); rdig->GetL0Times(times); - + trgESD->Add(px, py, a, t, times, rdig->GetNL0Times(), rdig->GetL1TimeSum(), rdig->GetTriggerBits()); } } - trgESD->SetL1Threshold(0, fTriggerData->GetL1GammaThreshold()); - - trgESD->SetL1Threshold(1, fTriggerData->GetL1JetThreshold() ); + for (int i = 0; i < 2; i++) { + trgESD->SetL1Threshold(2 * i , fTriggerData->GetL1JetThreshold( i)); + trgESD->SetL1Threshold(2 * i + 1, fTriggerData->GetL1GammaThreshold(i)); + } Int_t v0[2]; fTriggerData->GetL1V0(v0); @@ -417,7 +420,7 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, if (!saveOnce && fTriggerData->GetL1DataDecoded()) { - int type[8] = {0}; + int type[15] = {0}; fTriggerData->GetL1TriggerType(type); esd->SetCaloTriggerType(type); @@ -438,23 +441,54 @@ void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree, Int_t nDigits = fgDigitsArr->GetEntries(), idignew = 0 ; AliDebug(1,Form("%d digits",nDigits)); + AliESDCaloCells &emcCells = *(esd->GetEMCALCells()); emcCells.CreateContainer(nDigits); emcCells.SetType(AliVCaloCells::kEMCALCell); + Float_t energy = 0; Float_t time = 0; - for (Int_t idig = 0 ; idig < nDigits ; idig++) { + for (Int_t idig = 0 ; idig < nDigits ; idig++) + { const AliEMCALDigit * dig = (const AliEMCALDigit*)fgDigitsArr->At(idig); time = dig->GetTime(); // Time already calibrated in clusterizer energy = dig->GetAmplitude(); // energy calibrated in clusterizer - if(energy > 0 ){ + + if(energy > 0 ) + { fgClusterizer->Calibrate(energy,time,dig->GetId()); //Digits already calibrated in clusterizers - if(energy > 0){ //Digits tagged as bad (dead, hot, not alive) are set to 0 in calibrate, remove them - emcCells.SetCell(idignew,dig->GetId(),energy, time); + + if(energy > 0) //Digits tagged as bad (dead, hot, not alive) are set to 0 in calibrate, remove them + { + // Only for MC + // Get the label of the primary particle that generated the cell + // Assign the particle that deposited more energy + Int_t nprimaries = dig->GetNprimary() ; + Int_t digLabel =-1 ; + Float_t edep =-1.; + if ( nprimaries > 0 ) + { + Int_t jndex ; + for ( jndex = 0 ; jndex < nprimaries ; jndex++ ) { // all primaries in digit + + if(edep < dig->GetDEParent(jndex+1)) + { + digLabel = dig->GetIparent (jndex+1); + edep = dig->GetDEParent(jndex+1); + } + + } // all primaries in digit + } // select primary label + + Bool_t highGain = kFALSE; + if( dig->GetType() == AliEMCALDigit::kHG ) highGain = kTRUE; + + emcCells.SetCell(idignew,dig->GetId(),energy, time,digLabel,0.,highGain); idignew++; } } } + emcCells.SetNumberOfCells(idignew); emcCells.Sort(); @@ -646,10 +680,25 @@ void AliEMCALReconstructor::FillMisalMatrixes(AliESDEvent* esd)const{ const Int_t bufsize = 255; char path[bufsize] ; TGeoHMatrix * m = 0x0; + Int_t tmpType = -1; + Int_t SMOrder = 0; + TString SMName; for(Int_t sm = 0; sm < fGeom->GetNumberOfSuperModules(); sm++){ - snprintf(path,bufsize,"/ALIC_1/XEN1_1/SMOD_%d",sm+1) ; //In Geometry modules numbered 1,2,.,5 - if(sm >= 10) snprintf(path,bufsize,"/ALIC_1/XEN1_1/SM10_%d",sm-10+1) ; - + if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_Standard ) SMName = "SMOD"; + else if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_Half ) SMName = "SM10"; + else if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_3rd ) SMName = "SM3rd"; + else if( fGeom->GetSMType(sm) == AliEMCALGeometry::kDCAL_Standard ) SMName = "DCSM"; + else if( fGeom->GetSMType(sm) == AliEMCALGeometry::kDCAL_Ext ) SMName = "DCEXT"; + else AliError("Unkown SM Type!!"); + + if(fGeom->GetSMType(sm) == tmpType) { + SMOrder++; + } else { + tmpType = fGeom->GetSMType(sm); + SMOrder = 1; + } + snprintf(path,bufsize,"/ALIC_1/XEN1_1/%s_%d", SMName.Data(), SMOrder) ; + if (gGeoManager->CheckPath(path)){ gGeoManager->cd(path); m = gGeoManager->GetCurrentMatrix() ; @@ -702,18 +751,28 @@ Bool_t AliEMCALReconstructor::CalculateResidual(AliESDtrack *track, AliESDCaloCl // Otherwise use the TPCInner point dEta = -999, dPhi = -999; + Bool_t ITSTrackSA = 0; AliExternalTrackParam *trkParam = 0; + const AliESDfriendTrack* friendTrack = track->GetFriendTrack(); if(friendTrack && friendTrack->GetTPCOut()) trkParam = const_cast(friendTrack->GetTPCOut()); - else + else if(track->GetInnerParam()) trkParam = const_cast(track->GetInnerParam()); + else{ + trkParam = new AliExternalTrackParam(*track); //If there is ITSSa track + ITSTrackSA = 1; + } if(!trkParam) return kFALSE; - + AliExternalTrackParam trkParamTmp (*trkParam); - if(!AliEMCALRecoUtils::ExtrapolateTrackToCluster(&trkParamTmp, cluster, track->GetMass(), GetRecParam()->GetExtrapolateStep(), dEta, dPhi)) return kFALSE; + if(!AliEMCALRecoUtils::ExtrapolateTrackToCluster(&trkParamTmp, cluster, track->GetMass(kTRUE), GetRecParam()->GetExtrapolateStep(), dEta, dPhi)){ + if(ITSTrackSA) delete trkParam; + return kFALSE; + } + if(ITSTrackSA) delete trkParam; return kTRUE; } @@ -743,7 +802,14 @@ AliEMCALReconstructor::AliEMCALMatch::AliEMCALMatch(const AliEMCALMatch& copy) { //copy ctor } +//_____________________________________________________________________ +AliEMCALReconstructor::AliEMCALMatch& AliEMCALReconstructor::AliEMCALMatch::AliEMCALMatch::operator = (const AliEMCALMatch &source) +{ // assignment operator; use copy ctor + if (&source == this) return *this; + new (this) AliEMCALMatch(source); + return *this; +} // //================================================================================== //