/************************************************************************** * Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ #include #include #include #include #include #include #include #include #include "AliLog.h" #include "AliSTARTDigitizer.h" #include "AliSTART.h" #include "AliSTARThit.h" #include "AliSTARTdigit.h" #include "AliRunDigitizer.h" #include #include "AliRun.h" #include #include #include #include #include #include "AliSTARTParameters.h" #include "AliCDBLocal.h" #include "AliCDBStorage.h" #include "AliCDBManager.h" #include "AliCDBEntry.h" ClassImp(AliSTARTDigitizer) //___________________________________________ AliSTARTDigitizer::AliSTARTDigitizer() :AliDigitizer() { // Default ctor - don't use it ; } //___________________________________________ AliSTARTDigitizer::AliSTARTDigitizer(AliRunDigitizer* manager) :AliDigitizer(manager), fSTART(0), fHits(0), fdigits(0), ftimeCFD(0), ftimeLED(0), fADC(0), fADC0(0) { // ctor which should be used AliDebug(1,"processed"); fSTART = 0; fHits = 0; fdigits = 0; ftimeCFD = new TArrayI(24); fADC = new TArrayI(24); ftimeLED = new TArrayI(24); fADC0 = new TArrayI(24); } //------------------------------------------------------------------------ AliSTARTDigitizer::~AliSTARTDigitizer() { // Destructor AliDebug(1,"START"); delete ftimeCFD; delete fADC; delete ftimeLED; delete fADC0; } //------------------------------------------------------------------------ Bool_t AliSTARTDigitizer::Init() { // Initialization AliDebug(1," Init"); return kTRUE; } //--------------------------------------------------------------------- void AliSTARTDigitizer::Exec(Option_t* /*option*/) { /* Produde digits from hits digits is TObject and includes We are writing array if left & right TDC left & right ADC (will need for slow simulation) TOF first particle left & right mean time and time difference (vertex position) */ //output loader AliRunLoader *outRL = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName()); AliLoader * pOutStartLoader = outRL->GetLoader("STARTLoader"); AliDebug(1,"start..."); //input loader // // From hits to digits // Int_t hit, nhits; Int_t countE[24]; Int_t volume, pmt, trCFD, trLED; Float_t sl, qt; Int_t bestRightTDC, bestLeftTDC, qtCh; Float_t time[24], besttime[24], timeGaus[24] ; //Q->T-> coefficients !!!! should be asked!!! Float_t gain[24],timeDelayCFD[24], timeDelayLED[24]; Int_t threshold =50; //photoelectrons Float_t zdetA, zdetC; Int_t sumMultCoeff = 25; TObjArray slewingLED; TObjArray slewingRec; AliSTARTParameters* param = AliSTARTParameters::Instance(); param->Init(); Int_t ph2Mip = param->GetPh2Mip(); Int_t channelWidth = param->GetChannelWidth() ; Float_t delayVertex = param->GetTimeDelayTVD(); for (Int_t i=0; i<24; i++){ timeDelayCFD[i] = param->GetTimeDelayCFD(i); timeDelayLED[i] = param->GetTimeDelayLED(i); gain[i] = param->GetGain(i); TGraph* gr = param ->GetSlew(i); slewingLED.AddAtAndExpand(gr,i); TGraph* gr1 = param ->GetSlewRec(i); slewingRec.AddAtAndExpand(gr1,i); TGraph* grEff = param ->GetPMTeff(i); fEffPMT.AddAtAndExpand(grEff,i); } zdetC = param->GetZposition(0); zdetA = param->GetZposition(1); AliSTARThit *startHit; TBranch *brHits=0; Int_t nFiles=fManager->GetNinputs(); for (Int_t inputFile=0; inputFile Reset(); fADC -> Reset(); fADC0 -> Reset(); ftimeLED ->Reset(); for (Int_t i0=0; i0<24; i0++) { time[i0]=besttime[i0]=timeGaus[i0]=99999; countE[i0]=0; } AliRunLoader * inRL = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile)); AliLoader * pInStartLoader = inRL->GetLoader("STARTLoader"); if (!inRL->GetAliRun()) inRL->LoadgAlice(); AliSTART *fSTART = (AliSTART*)inRL ->GetAliRun()->GetDetector("START"); //read Hits pInStartLoader->LoadHits("READ");//probably it is necessary to load them before TClonesArray *fHits = fSTART->Hits (); TTree *th = pInStartLoader->TreeH(); brHits = th->GetBranch("START"); if (brHits) { fSTART->SetHitsAddressBranch(brHits); }else{ AliError("Branch START hit not found"); exit(111); } Int_t ntracks = (Int_t) th->GetEntries(); if (ntracks<=0) return; // Start loop on tracks in the hits containers for (Int_t track=0; trackGetEntry(track); nhits = fHits->GetEntriesFast(); for (hit=0;hitUncheckedAt(hit); if (!startHit) { AliError("The unchecked hit doesn't exist"); break; } pmt=startHit->Pmt(); Int_t numpmt=pmt-1; Double_t e=startHit->Etot(); volume = startHit->Volume(); if(e>0 && RegisterPhotoE(numpmt,e)) { countE[numpmt]++; besttime[numpmt] = startHit->Time(); if(besttime[numpmt] threshold) { timeGaus[ipmt]=gRandom->Gaus(time[ipmt],25)+koef; if(timeGaus[ipmt] threshold) { timeGaus[ipmt]=gRandom->Gaus(time[ipmt],25); if(timeGaus[ipmt] 10000. && besttimeleft <15000) bestLeftTDC=Int_t ((besttimeleft+1000*timeDelayCFD[pmtBestLeft]) /channelWidth); if( besttimeright > 10000. && besttimeright <15000) bestRightTDC=Int_t ((besttimeright+1000*timeDelayCFD[pmtBestRight]) /channelWidth); if (bestRightTDC < 99999 && bestLeftTDC < 99999) { timeDiff=Int_t (((besttimeleft-besttimeright)+1000*delayVertex) /channelWidth); meanTime=Int_t (((besttimeright+1000*timeDelayCFD[pmtBestLeft]+ besttimeleft+1000*timeDelayCFD[pmtBestLeft])/2.) /channelWidth); } AliDebug(10,Form(" time right& left %i %i time diff && mean time in channels %i %i",bestRightTDC,bestLeftTDC, timeDiff, meanTime)); for (Int_t i=0; i<24; i++) { Float_t al = countE[i]; if (al>threshold && timeGaus[i]<50000 ) { //fill ADC // QTC procedure: // phe -> mV 0.3; 1MIP ->500phe -> ln (amp (mV)) = 5; // max 200ns, HIJING mean 50000phe -> 15000mv -> ln = 15 (s zapasom) // channel 25ps qt= 50.*al*gain[i]/ph2Mip; // 50mv/Mip amp in mV // fill TDC trCFD = Int_t (timeGaus[i] + 1000.*timeDelayCFD[i])/channelWidth; trLED= Int_t (timeGaus[i] + 1000.*timeDelayLED[i]); sl = ((TGraph*)slewingLED.At(i))->Eval(qt); trLED = Int_t(( trLED + 1000*sl )/channelWidth); qtCh=Int_t (1000.*TMath::Log(qt)) / channelWidth; fADC0->AddAt(0,i); fADC->AddAt(qtCh,i); ftimeCFD->AddAt(Int_t (trCFD),i); ftimeLED->AddAt(trLED,i); // sumMult += Int_t ((al*gain[i]/ph2Mip)*50) ; sumMult += Int_t (qt/sumMultCoeff) ; AliDebug(10,Form(" pmt %i : time in ns %f time in channels %i ", i, timeGaus[i],trCFD )); AliDebug(10,Form(" qt in mV %f qt in ns %f qt in channels %i ",qt, TMath::Log(qt), qtCh)); } } //pmt loop if (sumMult > threshold){ fSumMult = Int_t (1000.* TMath::Log(Double_t(sumMult) / Double_t(sumMultCoeff)) /channelWidth); AliDebug(10,Form("summult mv %i mult in chammens %i in ps %i ", sumMult, fSumMult, fSumMult*channelWidth)); } // if ( besttimeright<99999 || besttimeleft < 99999) { fSTART->AddDigit(bestRightTDC,bestLeftTDC,meanTime,timeDiff,fSumMult, ftimeCFD,fADC,ftimeLED,fADC0); // } AliDebug(10,Form(" Digits wrote bestRightTDC %i bestLeftTDC %i meanTime %i timeDiff %i fSumMult %i ", bestRightTDC,bestLeftTDC,meanTime,timeDiff,fSumMult )); pOutStartLoader->UnloadHits(); } //input streams loop //load digits pOutStartLoader->LoadDigits("UPDATE"); TTree *treeD = pOutStartLoader->TreeD(); if (treeD == 0x0) { pOutStartLoader->MakeTree("D"); treeD = pOutStartLoader->TreeD(); } treeD->Reset(); fSTART = (AliSTART*)outRL ->GetAliRun()->GetDetector("START"); // Make a branch in the tree fSTART->MakeBranch("D"); treeD->Fill(); pOutStartLoader->WriteDigits("OVERWRITE"); fSTART->ResetDigits(); pOutStartLoader->UnloadDigits(); } //------------------------------------------------------------------------ Bool_t AliSTARTDigitizer::RegisterPhotoE(Int_t ipmt,Double_t energy) { // Float_t hc=197.326960*1.e6; //mev*nm Double_t hc=1.973*1.e-6; //gev*nm Float_t lambda=hc/energy; Float_t eff = ((TGraph*) fEffPMT.At(ipmt))->Eval(lambda); Double_t p = gRandom->Rndm(); if (p > eff) return kFALSE; return kTRUE; } //----------------------------------------------------------------------------