X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=ITS%2FAliITS.cxx;h=ae9d9b566e9624a347377379a041e545ee8e0b29;hp=89817ee41c9f11a79dd93566145a7ae8a3e997f1;hb=d61bec568340edeecb665ad40aa609ff301d8870;hpb=a0d769122fd53c6548b3cfc630890d5ece41290c diff --git a/ITS/AliITS.cxx b/ITS/AliITS.cxx index 89817ee41c9..ae9d9b566e9 100644 --- a/ITS/AliITS.cxx +++ b/ITS/AliITS.cxx @@ -72,6 +72,7 @@ the AliITS class. #include #include #include +#include #include "AliDetector.h" #include "AliITS.h" #include "AliITSDetTypeSim.h" @@ -87,6 +88,9 @@ the AliITS class. #include "AliITSRecPoint.h" #include "AliITSsegmentationSPD.h" #include "AliITSsegmentationSDD.h" +#include "AliITSsimulationSDD.h" +#include "AliITSCalibrationSDD.h" +#include "AliITSCalibrationSSD.h" #include "AliITSsegmentationSSD.h" #include "AliITSRawStreamSPD.h" #include "AliITSRawStreamSSD.h" @@ -108,7 +112,10 @@ fIdN(0), fIdSens(0), fIdName(0), fITSmodules(0), -fTiming(kFALSE) +fTiming(kFALSE), +fSimuParam(0), +fModA(0), +fpSDigits(0) { // Default initializer for ITS // The default constructor of the AliITS class. In addition to @@ -119,17 +126,22 @@ fTiming(kFALSE) // SetDetectors(); // default to fOpt="All". This variable not written out. //PH SetMarkerColor(kRed); + for (int i=fgkNTYPES;i--;) fkRawID2ClusID[i] = 0; } //______________________________________________________________________ -AliITS::AliITS(const Char_t *title):AliDetector("ITS",title), -fDetTypeSim(0), -fEuclidOut(0), -fOpt("All"), -fIdN(0), -fIdSens(0), -fIdName(0), -fITSmodules(0), -fTiming(kFALSE) +AliITS::AliITS(const Char_t *title): + AliDetector("ITS",title), + fDetTypeSim(0), + fEuclidOut(0), + fOpt("All"), + fIdN(0), + fIdSens(0), + fIdName(0), + fITSmodules(0), + fTiming(kFALSE), + fSimuParam(0), + fModA(0), + fpSDigits(0) { // The standard Constructor for the ITS class. // It also zeros the variables @@ -155,17 +167,22 @@ fTiming(kFALSE) //PH SetMarkerColor(kRed); if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName()); fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + for (int i=fgkNTYPES;i--;) fkRawID2ClusID[i] = 0; } //______________________________________________________________________ -AliITS::AliITS(const char *name, const char *title):AliDetector(name,title), -fDetTypeSim(0), -fEuclidOut(0), -fOpt("All"), -fIdN(0), -fIdSens(0), -fIdName(0), -fITSmodules(0), -fTiming(kFALSE) +AliITS::AliITS(const char *name, const char *title): + AliDetector(name,title), + fDetTypeSim(0), + fEuclidOut(0), + fOpt("All"), + fIdN(0), + fIdSens(0), + fIdName(0), + fITSmodules(0), + fTiming(kFALSE), + fSimuParam(0), + fModA(0), + fpSDigits(0) { // The standard Constructor for the ITS class. // It also zeros the variables @@ -184,11 +201,10 @@ fTiming(kFALSE) SetDetectors(); // default to fOpt="All". This variable not written out. fDetTypeSim = new AliITSDetTypeSim(); - //PH SetMarkerColor(kRed); if(!fLoader) MakeLoader(AliConfig::GetDefaultEventFolderName()); fDetTypeSim->SetLoader((AliITSLoader*)fLoader); - + for (int i=fgkNTYPES;i--;) fkRawID2ClusID[i] = 0; } //______________________________________________________________________ AliITS::~AliITS(){ @@ -216,25 +232,43 @@ AliITS::~AliITS(){ delete[] fIdName; // Array of TStrings delete[] fIdSens; - + Int_t size = AliITSgeomTGeo::GetNModules(); if (fDetTypeSim){ delete fDetTypeSim; fDetTypeSim = 0; - } + } + if(fSimuParam){ + delete fSimuParam; + fSimuParam=0; + } + if(fModA){ + if(size>0){ + for(Int_t j=0; jDelete(); + delete fModA[j]; + } + } + delete []fModA; + } + if(fpSDigits){ + fpSDigits->Delete(); + delete fpSDigits; + } } + //______________________________________________________________________ -AliDigitizer* AliITS::CreateDigitizer(AliRunDigitizer* manager)const{ +AliDigitizer* AliITS::CreateDigitizer(AliDigitizationInput* digInput)const{ // Creates the AliITSDigitizer in a standard way for use via AliModule. // This function can not be included in the .h file because of problems // with the order of inclusion (recursive). // Inputs: - // AliRunDigitizer *manager The Manger class for Digitization + // AliDigitizationInput* digInput The Manger class for Digitization // Output: // none. // Return: // A new AliITSRunDigitizer (cast as a AliDigitizer). - return new AliITSDigitizer(manager); + return new AliITSDigitizer(digInput); } //______________________________________________________________________ void AliITS::Init(){ @@ -252,7 +286,7 @@ void AliITS::Init(){ // none. Int_t i; // Array of TStrings - if(gMC) for(i=0;iVolId(fIdName[i]); + if(TVirtualMC::GetMC()) for(i=0;iVolId(fIdName[i]); } //______________________________________________________________________ @@ -271,7 +305,7 @@ void AliITS::SetDefaults(){ } fDetTypeSim->SetDefaults(); - + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); } //______________________________________________________________________ @@ -289,6 +323,7 @@ void AliITS::SetDefaultSimulation(){ } fDetTypeSim->SetDefaultSimulation(); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); } @@ -337,10 +372,10 @@ void AliITS::MakeBranchS(const char* fl){ Error("MakeBranchS","fDetTypeSim is 0!"); } Int_t buffersize = 4000; - char branchname[30]; + char branchname[31]; // only one branch for SDigits. - sprintf(branchname,"%s",GetName()); + snprintf(branchname,30,"%s",GetName()); if(fLoader->TreeS()){ TClonesArray* sdig = (TClonesArray*)fDetTypeSim->GetSDigits(); @@ -356,6 +391,7 @@ void AliITS::MakeBranchD(const char* file){ return; } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); MakeBranchInTreeD(fLoader->TreeD(),file); } @@ -367,11 +403,12 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){ Error("MakeBranchS","fDetTypeSim is 0!"); } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); const Char_t *det[3] = {"SPD","SDD","SSD"}; const Char_t* digclass; Int_t buffersize = 4000; - Char_t branchname[30]; + Char_t branchname[31]; if(!fDetTypeSim->GetDigits()){ fDetTypeSim->SetDigits(new TObjArray(fgkNTYPES)); @@ -383,7 +420,7 @@ void AliITS:: MakeBranchInTreeD(TTree* treeD, const char* file){ (fDetTypeSim->GetDigits())->AddAt(new TClonesArray(classn.Data(),1000),i); } else ResetDigits(i); - if(fgkNTYPES==3) sprintf(branchname,"%sDigits%s",GetName(),det[i]); + if(fgkNTYPES==3) snprintf(branchname,30,"%sDigits%s",GetName(),det[i]); else sprintf(branchname,"%sDigits%d",GetName(),i+1); TObjArray* dig = DigitsAddress(i); if(GetDigits() && treeD) AliDetector::MakeBranchInTree(treeD,branchname, &dig,buffersize,file); @@ -406,6 +443,7 @@ void AliITS::SetTreeAddress(){ } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); TTree *treeS = fLoader->TreeS(); TTree *treeD = fLoader->TreeD(); @@ -438,7 +476,7 @@ void AliITS::AddHit(Int_t track, Int_t *vol, Float_t *hits){ } //______________________________________________________________________ -void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules, +void AliITS::FillModules(Int_t /* evnt */,Int_t bgrev,Int_t /* nmodules */, Option_t *option, const char *filename){ // fill the modules with the sorted by module hits; add hits from // background if option=Add. @@ -448,7 +486,6 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules, static TFile *file; const char *addBgr = strstr(option,"Add"); - evnt = nmodules; // Dummy use of variables to remove warnings if (addBgr ) { if(first) { file=new TFile(filename); @@ -460,8 +497,8 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules, if(trH1) delete trH1; trH1=0; - char treeName[20]; - sprintf(treeName,"TreeH%d",bgrev); + char treeName[21]; + snprintf(treeName,20,"TreeH%d",bgrev); trH1 = (TTree*)gDirectory->Get(treeName); if (!trH1) { Error("FillModules","cannot find Hits Tree for event:%d",bgrev); @@ -475,8 +512,10 @@ void AliITS::FillModules(Int_t evnt,Int_t bgrev,Int_t nmodules, FillModules(trH1,10000000); // Default mask 10M. TTree *fAli=fLoader->GetRunLoader()->TreeK(); TFile *fileAli=0; - if (fAli) fileAli =fAli->GetCurrentFile(); - fileAli->cd(); + if (fAli) { + fileAli =fAli->GetCurrentFile(); + fileAli->cd(); + } } // end if add @@ -497,13 +536,14 @@ void AliITS::FillModules(TTree *treeH, Int_t mask) { if (treeH == 0x0) { - Error("FillModules","Tree is NULL"); + AliError("Tree H is NULL"); + return; } Int_t lay,lad,det,index; AliITShit *itsHit=0; AliITSmodule *mod=0; - char branchname[20]; - sprintf(branchname,"%s",GetName()); + char branchname[21]; + snprintf(branchname,20,"%s",GetName()); TBranch *branch = treeH->GetBranch(branchname); if (!branch) { Error("FillModules","%s branch in TreeH not found",branchname); @@ -553,6 +593,7 @@ Bool_t AliITS::InitModules(Int_t size,Int_t &nmodules){ Error("InitModules","fDetTypeSim is null!"); return kFALSE; } + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); Int_t nl,indexMAX,index; @@ -597,6 +638,8 @@ void AliITS::Hits2SDigits(){ fLoader->LoadSDigits("recreate"); AliRunLoader* rl = fLoader->GetRunLoader(); fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); + for (Int_t iEvent = 0; iEvent < rl->GetNumberOfEvents(); iEvent++) { // Do the Hits to Digits operation. Use Standard input values. // Event number from file, no background hit merging , use size from @@ -622,6 +665,7 @@ void AliITS::Hits2Digits(){ } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); SetDefaults(); fLoader->LoadHits("read"); @@ -667,6 +711,7 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size, return; } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); if(!GetITSgeom()) return; // need transformations to do digitization. AliITSgeom *geom = GetITSgeom(); @@ -706,16 +751,10 @@ void AliITS::HitsToDigits(Int_t evNumber,Int_t bgrev,Int_t size, ClearModules(); - // Add random noise to FO signals - if (all || det[0]) { // SPD present - fDetTypeSim->ProcessNoiseForFastOr(); - } - // Add Fast-OR signals to event (only one object per event) if (all || det[0]) { // SPD present - fDetTypeSim->WriteFOSignals(); + WriteFOSignals(); } - fLoader->TreeD()->GetEntries(); fLoader->TreeD()->AutoSave(); @@ -732,6 +771,7 @@ void AliITS::Hits2PreDigits(){ } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); SetDefaults(); HitsToPreDigits(fLoader->GetRunLoader()->GetEventNumber(), @@ -766,6 +806,7 @@ void AliITS::HitsToPreDigits(Int_t evNumber,Int_t bgrev,Int_t size, return; } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); if(!GetITSgeom()){ Error("HitsToPreDigits","fGeom is null!"); @@ -875,7 +916,7 @@ void AliITS::HitsToFastRecPoints(Int_t evNumber,Int_t bgrev,Int_t size, sim = (AliITSsimulation*)GetSimulationModel(id); if (!sim) { Error("HitsToFastPoints","The simulation class was not " - "instanciated for module %d type %x!",module, + "instantiated for module %d type %s!",module, geom->GetModuleTypeName(module)); exit(1); } // end if !sim @@ -919,7 +960,7 @@ Int_t AliITS::Hits2Clusters(TTree *hTree, TTree *cTree) { points->Clear(); } - Info("Hits2Clusters","Number of found fast clusters : %d",ncl); + AliDebug(1,Form("Number of found fast clusters : %d",ncl)); //cTree->Write(); @@ -966,7 +1007,6 @@ void AliITS::SDigitsToDigits(Option_t *opt){ AliError("fDetTypeSim is 0!"); return; } - const char *all = strstr(opt,"All"); const char *det[3] ={strstr(opt,"SPD"),strstr(opt,"SDD"), strstr(opt,"SSD")}; @@ -976,15 +1016,12 @@ void AliITS::SDigitsToDigits(Option_t *opt){ fDetTypeSim->SetLoader((AliITSLoader*)fLoader); SetDefaults(); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); fDetTypeSim->SDigitsToDigits(opt,(Char_t*)GetName()); - // Add random noise to FO signals - if (all || det[0]) { // SPD present - fDetTypeSim->ProcessNoiseForFastOr(); - } // Add Fast-OR signals to event (only one object per event) if (all || det[0]) { // SPD present - fDetTypeSim->WriteFOSignals(); + WriteFOSignals(); } } @@ -1095,6 +1132,7 @@ void AliITS::Digits2Raw(){ } fDetTypeSim->SetLoader((AliITSLoader*)fLoader); SetDefaults(); + if(fSimuParam) fDetTypeSim->SetSimuParam(fSimuParam); fDetTypeSim->GetLoader()->LoadDigits(); TTree* digits = fDetTypeSim->GetLoader()->TreeD(); if (!digits) { @@ -1125,10 +1163,10 @@ void AliITS::Digits2Raw(){ AliITSDDLModuleMapSDD* ddlsdd=fDetTypeSim->GetDDLModuleMapSDD(); - Bool_t isHLTmodeC=fDetTypeSim->IsHLTmodeC(); + Char_t rawSDD=fDetTypeSim->GetSimuParam()->GetSDDRawDataFormat(); AliITSDDLRawData rawWriter; - if(isHLTmodeC) rawWriter.SetUseCompressedSDDFormat(kTRUE); - else rawWriter.SetUseCompressedSDDFormat(kFALSE); + + rawWriter.SetSDDRawFormat(rawSDD); //Verbose level // 0: Silent // 1: cout messages @@ -1140,16 +1178,16 @@ void AliITS::Digits2Raw(){ rawWriter.SetVerbose(0); //SILICON PIXEL DETECTOR - Info("Digits2Raw", "Formatting raw data for SPD"); + AliDebug(1,"Formatting raw data for SPD"); rawWriter.RawDataSPD(digits->GetBranch("ITSDigitsSPD"),foSignals); if(deleteFOsignalsLater) delete foSignals; //SILICON DRIFT DETECTOR - Info("Digits2Raw", "Formatting raw data for SDD"); + AliDebug(1,Form("Formatting raw data for SDD - Format code =%d",rawSDD)); rawWriter.RawDataSDD(digits->GetBranch("ITSDigitsSDD"),ddlsdd); //SILICON STRIP DETECTOR - Info("Digits2Raw", "Formatting raw data for SSD"); + AliDebug(1,"Formatting raw data for SSD"); rawWriter.RawDataSSD(digits->GetBranch("ITSDigitsSSD")); fLoader->UnloadDigits(); @@ -1172,148 +1210,196 @@ Bool_t AliITS::Raw2SDigits(AliRawReader* rawReader) // // Get TreeS // - Int_t last = -1; - Int_t size = GetITSgeom()->GetIndexMax(); - TClonesArray** modA = new TClonesArray*[size]; - for (Int_t mod = 0; mod < size; mod++) modA[mod] = new TClonesArray("AliITSpListItem", 10000); - - AliLoader* loader = (AliRunLoader::Instance())->GetLoader("ITSLoader"); - if (!loader){ - Error("Open","Can not get ITS loader from Run Loader"); - return kFALSE; - } + Int_t last = -1; + Int_t size = AliITSgeomTGeo::GetNModules(); + if(!fModA) { + fModA = new TClonesArray*[size]; + for (Int_t mod = 0; mod < size; mod++) fModA[mod] = new TClonesArray("AliITSpListItem", 10000); + } + AliLoader* loader = (AliRunLoader::Instance())->GetLoader("ITSLoader"); + if (!loader){ + Error("Open","Can not get ITS loader from Run Loader"); + return kFALSE; + } - TTree* tree = 0; + TTree* tree = 0; + tree = loader->TreeS(); + if (!tree){ + loader->MakeTree("S"); tree = loader->TreeS(); - if (!tree){ - loader->MakeTree("S"); - tree = loader->TreeS(); - } - // - // Array for SDigits - // - TClonesArray aSDigits("AliITSpListItem",10000), *itsSDigits=&aSDigits; - Int_t bufsize = 32000; - tree->Branch("ITS", &itsSDigits, bufsize); - Int_t npx = 0; - // - // SPD - // - AliITSsegmentationSPD* segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0); - if(!segSPD){ - AliWarning("Set AliITS defaults"); - SetDefaults(); - segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0); + } + // + // Array for SDigits + // + if(!fpSDigits){ + fpSDigits = new TClonesArray("AliITSpListItem",10000); + } + TClonesArray& aSDigits = *fpSDigits; + Int_t bufsize = 32000; + tree->Branch("ITS", &fpSDigits, bufsize); + Int_t npx = 0; + // + // SPD + // + AliITSsegmentationSPD* segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0); + if(!segSPD){ + AliWarning("Set AliITS defaults"); + SetDefaults(); + segSPD = (AliITSsegmentationSPD*) fDetTypeSim->GetSegmentationModel(0); + } + npx = segSPD->Npx(); + Double_t thr, sigma; + + Int_t countRW = -1; // RS counter for raw -> cluster ID's (used in embedding) + const TArrayI* rawID2clusID = fkRawID2ClusID[kSPD]; + AliITSRawStreamSPD inputSPD(rawReader); + while(1){ + Bool_t next = inputSPD.Next(); + if (!next) break; + + countRW++; // RS + Int_t module = inputSPD.GetModuleID(); + Int_t column = inputSPD.GetColumn(); + Int_t row = inputSPD.GetRow(); + Int_t index = npx * column + row; + + if (module >= size) continue; + + last = (fModA[module])->GetEntries(); + TClonesArray& dum = *fModA[module]; + fDetTypeSim->GetSimuParam()->SPDThresholds(module,thr,sigma); + thr += 1.; + int label = kMaxLabel; + if (rawID2clusID) { // RS If the raw->cluster ID is set (filled by cluster finder) store cluster ID's in SDigits + if (rawID2clusID->GetSize()<=countRW) {AliError(Form("The buffer of rawSPD to clusSPD ID's is shorter than current rawSPD ID=%d",countRW));} + else label = (*rawID2clusID)[countRW]; } - npx = segSPD->Npx(); - Double_t thr, sigma; - - AliITSRawStreamSPD inputSPD(rawReader); - while(1){ - Bool_t next = inputSPD.Next(); - if (!next) break; - - Int_t module = inputSPD.GetModuleID(); - Int_t column = inputSPD.GetColumn(); - Int_t row = inputSPD.GetRow(); - Int_t index = npx * column + row; + new (dum[last]) AliITSpListItem(label, -1, module, index, thr); + } + rawReader->Reset(); - if (module >= size) continue; - - last = (modA[module])->GetEntries(); - TClonesArray& dum = *modA[module]; - fDetTypeSim->GetSimuParam()->SPDThresholds(module,thr,sigma); - thr += 1.; - new (dum[last]) AliITSpListItem(-1, -1, module, index, thr); + // + // SDD + // + AliITSsegmentationSDD* segSDD = (AliITSsegmentationSDD*) fDetTypeSim->GetSegmentationModel(1); + npx = segSDD->Npx(); + Int_t scalef=AliITSsimulationSDD::ScaleFourier(segSDD); + Int_t firstSDD=AliITSgeomTGeo::GetModuleIndex(3,1,1); + Int_t firstSSD=AliITSgeomTGeo::GetModuleIndex(5,1,1); + // + countRW = -1; // RS + rawID2clusID = fkRawID2ClusID[kSDD]; + AliITSRawStream* inputSDD=AliITSRawStreamSDD::CreateRawStreamSDD(rawReader); + for(Int_t iMod=firstSDD; iModGetCalibrationModel(iMod); + Bool_t isZeroSupp=cal->GetZeroSupp(); + if(isZeroSupp){ + for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,cal->GetZSLowThreshold(iSid)); + }else{ + for(Int_t iSid=0; iSid<2; iSid++) inputSDD->SetZeroSuppLowThreshold(iMod-firstSDD,iSid,0); } - rawReader->Reset(); - - // - // SDD - // - AliITSsegmentationSDD* segSDD = (AliITSsegmentationSDD*) fDetTypeSim->GetSegmentationModel(1); - npx = segSDD->Npx(); - AliITSRawStreamSDD inputSDD(rawReader); - AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD(); - inputSDD.SetDDLModuleMap(ddlmap); - while(1){ - Bool_t next = inputSDD.Next(); - if (!next) break; - - Int_t module = inputSDD.GetModuleID(); - Int_t anode = inputSDD.GetAnode(); - Int_t time = inputSDD.GetTime(); - Int_t signal10 = inputSDD.GetSignal(); - Int_t index = npx * anode + time; - - if (module >= size) continue; - last = modA[module]->GetEntries(); - TClonesArray& dum = *modA[module]; - new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal10)); - ((AliITSpListItem*) dum.At(last))->AddSignalAfterElect(module, index, Double_t(signal10)); - + } + + AliITSDDLModuleMapSDD* ddlmap=fDetTypeSim->GetDDLModuleMapSDD(); + inputSDD->SetDDLModuleMap(ddlmap); + while(inputSDD->Next()){ + countRW++; // RS + if(inputSDD->IsCompletedModule()==kFALSE && + inputSDD->IsCompletedDDL()==kFALSE){ + + Int_t module = inputSDD->GetModuleID(); + Int_t anode = inputSDD->GetCoord1()+segSDD->NpzHalf()*inputSDD->GetChannel(); + Int_t time = inputSDD->GetCoord2(); + Int_t signal10 = inputSDD->GetSignal(); + Int_t index = AliITSpList::GetIndex(anode,time,scalef*npx); + + if (module >= size) continue; + last = fModA[module]->GetEntries(); + TClonesArray& dum = *fModA[module]; + int label = kMaxLabel; + if (rawID2clusID) { // RS If the raw->cluster ID is set (filled by cluster finder) store cluster ID's in SDigits + if (rawID2clusID->GetSize()<=countRW) {AliError(Form("The buffer of rawSDD to clusSDD ID's is shorter than current rawSDD ID=%d",countRW));} + else label = (*rawID2clusID)[countRW]; + } + new (dum[last]) AliITSpListItem(label, -1, module, index, Double_t(signal10)); + ((AliITSpListItem*) dum.At(last))->AddSignalAfterElect(module, index, Double_t(signal10)); } - rawReader->Reset(); - - // - // SSD - // - AliITSsegmentationSSD* segSSD = (AliITSsegmentationSSD*) fDetTypeSim->GetSegmentationModel(2); - npx = segSSD->Npx(); - AliITSRawStreamSSD inputSSD(rawReader); - while(1){ - Bool_t next = inputSSD.Next(); - if (!next) break; - - Int_t module = inputSSD.GetModuleID(); - Int_t side = inputSSD.GetSideFlag(); - Int_t strip = inputSSD.GetStrip(); - Int_t signal = inputSSD.GetSignal(); - Int_t index = npx * side + strip; - - if (module >= size) continue; + } + delete inputSDD; + rawReader->Reset(); + + // + // SSD + // + AliITSsegmentationSSD* segSSD = (AliITSsegmentationSSD*) fDetTypeSim->GetSegmentationModel(2); + npx = segSSD->Npx(); + AliITSRawStreamSSD inputSSD(rawReader); + countRW = -1; + rawID2clusID = fkRawID2ClusID[kSSD]; + while(1){ + Bool_t next = inputSSD.Next(); + if (!next) break; + countRW++; // RS + Int_t module = inputSSD.GetModuleID(); + if(module<0)AliError(Form("Invalid SSD module %d \n",module)); + if(module<0)continue; + Int_t side = inputSSD.GetSideFlag(); + Int_t strip = inputSSD.GetStrip(); + Int_t signal = inputSSD.GetSignal(); + Int_t index = npx * side + strip; + + if (module >= size) continue; - last = modA[module]->GetEntries(); - TClonesArray& dum = *modA[module]; - new (dum[last]) AliITSpListItem(-1, -1, module, index, Double_t(signal)); - } - rawReader->Reset(); - AliITSpListItem* sdig = 0; + last = fModA[module]->GetEntries(); + TClonesArray& dum = *fModA[module]; + int label = kMaxLabel; + if (rawID2clusID) { // RS If the raw->cluster ID is set (filled by cluster finder) store cluster ID's in SDigits + if (rawID2clusID->GetSize()<=countRW) {AliError(Form("The buffer of rawSSD to clusSSD ID's is shorter than current rawSSD ID=%d",countRW));} + else label = (*rawID2clusID)[countRW]; + } + new (dum[last]) AliITSpListItem(label, -1, module, index, Double_t(signal)); + } + rawReader->Reset(); + AliITSpListItem* sdig = 0; - for (Int_t mod = 0; mod < size; mod++) + Int_t firstssd = GetITSgeom()->GetStartDet(kSSD); + Double_t adcToEv = 1.; + for (Int_t mod = 0; mod < size; mod++) { - Int_t nsdig = modA[mod]->GetEntries(); - for (Int_t ie = 0; ie < nsdig; ie++) { - sdig = (AliITSpListItem*) (modA[mod]->At(ie)); - new (aSDigits[ie]) AliITSpListItem(-1, -1, mod, sdig->GetIndex(), sdig->GetSignal()); - Float_t sig = sdig->GetSignalAfterElect(); - if (sig > 0.) { - sdig = (AliITSpListItem*)aSDigits[ie]; - sdig->AddSignalAfterElect(mod, sdig->GetIndex(), Double_t(sig)); - } + if(mod>=firstssd) { + AliITSCalibrationSSD* calssd = (AliITSCalibrationSSD*)fDetTypeSim->GetCalibrationModel(mod); + adcToEv = 1./calssd->GetSSDDEvToADC(1.); + } + Int_t nsdig = fModA[mod]->GetEntries(); + for (Int_t ie = 0; ie < nsdig; ie++) { + sdig = (AliITSpListItem*) (fModA[mod]->At(ie)); + Double_t digsig = sdig->GetSignal(); + if(mod>=firstssd) digsig*=adcToEv; // for SSD: convert back charge from ADC to electron + new (aSDigits[ie]) AliITSpListItem(sdig->GetTrack(0), -1, mod, sdig->GetIndex(), digsig); + Float_t sig = sdig->GetSignalAfterElect(); + if(mod>=firstssd) sig*=adcToEv; + if (sig > 0.) { + sdig = (AliITSpListItem*)aSDigits[ie]; + sdig->AddSignalAfterElect(mod, sdig->GetIndex(), Double_t(sig)); } + } - tree->Fill(); - aSDigits.Clear(); - modA[mod]->Clear(); + tree->Fill(); + aSDigits.Clear(); + fModA[mod]->Clear(); } - loader->WriteSDigits("OVERWRITE"); - delete modA; - return kTRUE; + loader->WriteSDigits("OVERWRITE"); + return kTRUE; } - //______________________________________________________________________ void AliITS::UpdateInternalGeometry(){ - //reads new geometry from TGeo // AliDebug(1,"Delete ITSgeom and create a new one reading TGeo"); AliITSVersion_t version = (AliITSVersion_t)IsVersion(); - Int_t minor = 0; - if(version==kvPPRasymmFMD) minor=2; // default minor version for this geom. AliITSInitGeometry initgeom; - AliITSgeom* geom = initgeom.CreateAliITSgeom(version,minor); + AliITSgeom* geom = initgeom.CreateAliITSgeom(version); SetITSgeom(geom); } //______________________________________________________________________ @@ -1321,4 +1407,13 @@ AliTriggerDetector* AliITS::CreateTriggerDetector() const { // create an AliITSTrigger object (and set trigger conditions as input) return new AliITSTrigger(fDetTypeSim->GetTriggerConditions()); } +//______________________________________________________________________ +void AliITS::WriteFOSignals(){ +// This method write FO signals in Digits tree both in Hits2Digits +// or SDigits2Digits + + fDetTypeSim->ProcessNoiseForFastOr(); + fDetTypeSim->WriteFOSignals(); +} +